stringtranslate.com

Правило офсайда

Правило «вне игры» описывает синтаксис языка программирования , который определяет границы блока кода с помощью отступов . [1] [2]

Термин был придуман Питером Ландином , возможно, как игра слов на закон о положении «вне игры» в американском футболе .

Язык правил «вне игры» противопоставляется языку свободной формы , в котором отступ не имеет синтаксического значения и является строго вопросом стиля .

Язык правил «вне игры» также описывается как имеющий значительный отступ .

Определение

Питер Ландин в своей статье 1966 года « Следующие 700 языков программирования » определил правило «вне игры» следующим образом: «Любой непробельный токен слева от первого такого токена в предыдущей строке считается началом нового объявления». [3]

Пример

Ниже приведен пример блоков отступов в Python ; популярный язык правил офсайда. В Python правило используется для определения границ операторов, а не объявлений.

def  is_even ( a :  int )  ->  bool : если  %  2 == 0 :    печать ( 'Даже!' ) вернуть  Истину печать ( 'Странно!' ) вернуть  Ложь

Тело функции начинается на строке 2, поскольку оно имеет отступ на один уровень (4 пробела) больше, чем предыдущая строка. ifТело предложения начинается на строке 3, поскольку оно имеет отступ на дополнительный уровень, и заканчивается на строке 4, поскольку строка 5 имеет отступ на уровень меньше, то есть выдвинута.

Двоеточие ( :) в конце строки оператора управления — это синтаксис Python; не аспект правила «вне игры». Правило может быть реализовано без такого синтаксиса двоеточия.

Выполнение

Правило «вне игры» может быть реализовано на этапе лексического анализа , как в Python , где увеличение отступа приводит к выводу лексером токена INDENT, а уменьшение отступа приводит к выводу лексером DEDENTтокена. [4] Эти токены соответствуют открывающей фигурной скобке {и закрывающей фигурной скобке }в языках, которые используют фигурные скобки для блоков, и означают, что грамматика фразы не зависит от того, используются ли фигурные скобки или отступы. Это требует, чтобы лексер удерживал состояние, а именно текущий уровень отступа, и, таким образом, мог обнаруживать изменения в отступе, когда он изменяется, и, таким образом, лексическая грамматика не является контекстно-свободной : INDENTи DEDENTзависит от контекстной информации предыдущего уровня отступа.

Альтернативы

Основная альтернатива разделению блоков отступами, популяризированная широким использованием и влиянием языка C , заключается в игнорировании пробельных символов и явном обозначении блоков фигурными скобками (например, {и }) или каким-либо другим разделителем. Хотя это обеспечивает большую свободу форматирования — разработчик может решить не делать отступы для небольших фрагментов кода, таких как операторы break и continue — небрежно отступованный код может сбить читателя с толку, например, ошибка goto fail .

Lisp и другие языки, основанные на S-выражениях , не различают операторы и выражения, и скобок достаточно для управления областью действия всех операторов в языке. Как и в языках с фигурными скобками, пробелы в основном игнорируются читателем (т. е. функцией чтения). Пробелы используются для разделения токенов. [5] Явная структура кода Lisp допускает автоматический отступ, чтобы сформировать визуальную подсказку для людей, читающих.

Другой альтернативой является начало и конец каждого блока явными ключевыми словами. Например, в ALGOL 60 и его потомке Pascal блоки начинаются с ключевого слова begin и заканчиваются ключевым словом end. В некоторых языках (но не в Pascal) это означает, что переносы строк важны [ требуется ссылка ] (в отличие от языков с фигурными скобками), но отступы не важны. В BASIC и Fortran блоки начинаются с имени блока (например, IF) и заканчиваются именем блока, к которому добавлено END(например, END IF). В Fortran каждый блок также может иметь свое собственное уникальное имя блока, что добавляет еще один уровень явности длинному коду. ALGOL 68 и оболочка Bourne (sh и bash ) похожи, но конец блока обычно задается именем блока, записанным в обратном порядке (например, caseначинает оператор switch и распространяется до соответствующего esac; аналогично условным операторам if ... then...[ elif...[ else...]] fiили циклам for for ... do... odв ALGOL68 или for... do... doneв bash).

Интересный вариант этого встречается в Modula-2 , языке, похожем на Pascal, который устраняет разницу между однострочными и многострочными блоками. Это позволяет пропустить открыватель блока ( {или ) для всех, кроме блока уровня функции, требуя только завершающий блок токен ( или ). Это также исправляет висячий else . Custom — это размещение токена на том же уровне отступа, что и остальная часть блока, что дает очень читаемую структуру блока.BEGIN}ENDend

Одним из преимуществ подхода Fortran является то, что он улучшает читаемость длинного, вложенного или иного сложного кода. Группа выступов или закрывающих скобок сама по себе не дает никаких контекстных подсказок относительно того, какие блоки закрываются, что требует возврата и более тщательного изучения во время отладки . Кроме того, языки, которые допускают суффикс для ключевых слов, подобных END, еще больше улучшают такие подсказки, такие как continueversus continue for x, и маркер конца цикла, указывающий индексную переменную NEXT I versus NEXT, и уникально именованные циклы CYCLE X1 versus CYCLE. Однако современные редакторы исходного кода часто предоставляют визуальные индикаторы, такие как подсветка синтаксиса , и такие функции, как сворачивание кода , чтобы помочь с этими недостатками.

Производительность

В языке Scala ранние версии допускали только фигурные скобки. Scala 3 добавила возможность использовать отступы для структурирования блоков. Дизайнер Мартин Одерски сказал, что это был единственный наиболее важный способ, которым Scala 3 улучшила его собственную производительность, что она делает программы более чем на 10% короче и держит программистов «в потоке», и советует использовать ее. [6]

Известные языки программирования

Известные языки программирования с правилом «вне игры»:

Другие форматы файлов

Известные неязыки программирования, форматы текстовых файлов со значительными отступами:

Смотрите также

Ссылки

  1. ^ Хаттон, Г. (6 декабря 2012 г.). «Анализ с использованием комбинаторов». В Дэвисе, Кей; Хьюзе, Джоне (ред.). Функциональное программирование: Труды семинара в Глазго 1989 г., 21–23 августа 1989 г., Фрейзербург, Шотландия . Springer Science & Business Media. стр. 362–364. ISBN 9781447131663. Получено 3 сентября 2015 г. .
  2. ^ Тернер, ДА (13 августа 2013 г.). «Немного истории языков функционального программирования (приглашенный доклад)». В Лойдл, Ганс Вольфганг; Пенья, Рикардо (ред.). Тенденции в функциональном программировании: 13-й международный симпозиум, TFP 2012, Сент-Эндрюс, Великобритания, 12–14 июня 2012 г., пересмотренные избранные статьи . Springer. стр. 8. ISBN 9783642404474. Получено 3 сентября 2015 г. .
  3. ^ Ландин, П. Дж. (март 1966 г.). «Следующие 700 языков программирования» (PDF) . Сообщения ACM . 9 (3): 157–166. doi :10.1145/365230.365257. S2CID  13409665.
  4. ^ Документация Python, 2. Лексический анализ: 2.1.8. Отступы
  5. ^ "CLHS: Раздел 2.1.4.7".
  6. Одерски, Мартин (17 июня 2020 г.). Мартин Одерски: Обновление Scala 3 (видео). YouTube. Событие происходит в 36:35–45:08. Архивировано из оригинала 21 декабря 2021 г. Получено 25 апреля 2021 г.
  7. Syme, Don (20 мая 2009 г.). «Подробные заметки о выпуске F# May 2009 CTP Update и Visual Studio 2010 Beta1». Архивировано из оригинала 21 января 2019 г.
  8. ^ Отчет Haskell – Макет
  9. ^ Lobster, язык программирования со статической типизацией и управлением памятью во время компиляции для разработки игр/графики
  10. ^ MoonScript, язык, который компилируется в Lua
  11. ^ MoonScript 0.5.0 – Руководство по языку
  12. ^ «Метакоманды GCode».
  13. ^ Спецификация разметки reStructuredText – Отступы