Правило офсайда
Эта статья нуждается в дополнительных цитатах для проверки . ( декабрь 2011 г. ) |
Правило оффсайда описывает синтаксис языка программирования , который определяет границы блока кода посредством отступов . [ 1 ] [ 2 ]
Этот термин был придуман Питером Ландином , возможно, как игра слов на законе «вне игры» в футбольном союзе .
Язык внесторонних правил противопоставляется языку свободной формы , в котором отступы не имеют синтаксического значения, а отступы являются строго вопросом стиля .
Язык сторонних правил также описывается как имеющий значительные отступы .
Определение
[ редактировать ]Питер Ландин в своей статье 1966 года « Следующие 700 языков программирования » определил правило оффсайда следующим образом: «Любой токен без пробелов слева от первого такого токена в предыдущей строке считается началом нового декларация». [ 3 ]
Пример
[ редактировать ]Ниже приведен пример блоков отступов в Python ; популярный язык правила офсайда. В Python правило используется для определения границ операторов, а не деклараций.
def is_even(a: int) -> bool:
if a % 2 == 0:
print('Even!')
return True
print('Odd!')
return False
Тело функции начинается со второй строки, поскольку отступ в ней на один уровень (4 пробела) больше, чем в предыдущей строке. if
Тело предложения начинается со строки 3, поскольку оно имеет дополнительный уровень отступа, и заканчивается на строке 4, поскольку строка 5 имеет отступ на уровень меньше, то есть с отступом.
Двоеточие ( :
) в конце строки оператора управления находится синтаксис Python; это не аспект правила офсайда. Правило может быть реализовано без такого синтаксиса двоеточия.
Выполнение
[ редактировать ]Правило оффсайда может быть реализовано на этапе лексического анализа , как в Python , где увеличение отступа приводит к тому, что лексер выводит INDENT
токен и уменьшение результатов отступа в лексере, выдающем DEDENT
жетон. [ 4 ] Эти токены соответствуют открывающей скобке. {
и закрывающая скобка }
в языках, в которых для блоков используются фигурные скобки, и означает, что грамматика фраз не зависит от того, используются ли фигурные скобки или отступы. Для этого требуется, чтобы лексер удерживал состояние, а именно текущий уровень отступа, и, таким образом, мог обнаруживать изменения отступа при его изменении, и, таким образом, лексическая грамматика не является контекстно-свободной : INDENT
и DEDENT
зависят от контекстной информации предыдущего уровня отступа.
Альтернативы
[ редактировать ]Основная альтернатива разделению блоков с помощью отступов, популяризированная благодаря широкому использованию и влиянию языка C , заключается в игнорировании пробельных символов и явной маркировке блоков фигурными скобками (т. е. {
и }
) или какой-либо другой разделитель. Хотя это дает больше свободы форматирования (разработчик может отказаться от отступов в небольших фрагментах кода, таких как операторы Break и continue ), небрежный код с отступами может ввести читателя в заблуждение, например, ошибка gotofail .
Лисп и другие языки, основанные на S-выражениях , не отличают операторы от выражений, а круглых скобок достаточно, чтобы контролировать область действия всех операторов внутри языка. Как и в языках с фигурными скобками, программа чтения (т. е. функция чтения) в основном игнорирует пробелы. Пробелы используются для разделения токенов. [ 5 ] Явная структура кода Lisp позволяет автоматически делать отступы, чтобы сформировать визуальную подсказку для читателей.
Другой альтернативой является то, чтобы каждый блок начинался и заканчивался явными ключевыми словами. Например, в АЛГОЛе 60 и его потомке Паскале блоки начинаются с ключевого слова begin
и закончить ключевым словом end
. В некоторых языках (кроме Паскаля) это означает, что символы новой строки важны . [ нужна ссылка ] (в отличие от языков с фигурными скобками), но отступов нет. В BASIC и Fortran блоки начинаются с имени блока (например, IF
) и заканчиваться именем блока, к которому добавляется END
(например, END IF
). В Фортране каждый блок также может иметь свое собственное уникальное имя блока, что добавляет еще один уровень ясности к длинному коду. АЛГОЛ 68 и оболочка Борна (sh и bash ) похожи, но конец блока обычно задается именем блока, написанным задом наперед (например, case
запускает оператор переключения и продолжается до тех пор, пока не будет найдено соответствующее esac
; аналогично условные обозначения if
... then
...[ elif
...[ else
...]] fi
или для петель for
... do
... od
в АЛГОЛ68 или for
... do
... done
в Баше).
Интересный вариант этого встречается в Modula-2 , языке, похожем на Паскаль, который устраняет разницу между однострочными и многострочными блоками. Это позволяет открывателю блока ( {
или BEGIN
), чтобы быть пропущенным для всех блоков, кроме блока функционального уровня, требуя только токена завершения блока ( }
или END
). Это также исправляет зависание else . Пользовательский предназначен для end
токен должен быть размещен на том же уровне отступа, что и остальная часть блока, что дает структуру блока, которая очень удобна для чтения.
Одним из преимуществ подхода Фортрана является то, что он улучшает читаемость длинного, вложенного или иного сложного кода. Группа отступов или закрывающих скобок сама по себе не дает контекстных подсказок о том, какие блоки закрываются, что требует возврата и более тщательного изучения во время отладки . Кроме того, языки, которые допускают использование суффикса для ключевых слов, подобных END, еще больше улучшают такие сигналы, например: continue
против continue for x
и маркер конца цикла, задающий индексную переменную NEXT I
против NEXT
и циклы с уникальными именами CYCLE X1
против CYCLE
. Однако современные редакторы исходного кода часто предоставляют визуальные индикаторы, такие как подсветка синтаксиса , и такие функции, как свертывание кода , чтобы помочь устранить эти недостатки.
Производительность
[ редактировать ]В языке Scala ранние версии допускали только фигурные скобки. В Scala 3 добавлена возможность использовать отступы для структурных блоков. Дизайнер Мартин Одерски сказал, что это был самый важный способ, с помощью которого Scala 3 повысил его собственную производительность: он делает программы более чем на 10% короче и держит программистов «в потоке», и советует его использовать. [ 6 ]
Известные языки программирования
[ редактировать ]Известные языки программирования с правилом оффсайда:
- АВС
- приглашенный
- Бу
- БаддиСкрипт
- Кобра
- Кофескрипт
- сходиться
- Карри
- Вяз
- F# в ранних версиях, когда
#light
указано; в более поздних версиях, когда#light "off"
не [ 7 ] - GDScript (движок Godot)
- Хаскелл , [ 8 ] только для
where
,let
,do
, илиcase ... of
предложения, когда фигурные скобки опущены - Информировать 7
- ISWIM , абстрактный язык, который ввел правило
- LiveScript
- Омар [ 9 ]
- Миранда
- МунСкрипт [ 10 ] [ 11 ]
- Nemerle , дополнительный режим
- Nim
- оккам
- PROMAL
- Питон
- Scala , дополнительный режим
- Scheme , при использовании одного из нескольких Scheme Requests for Implementations , последний из которых — SRFI 119.
- Вращаться
- Ты даешь
- XL
Другие форматы файлов
[ редактировать ]Известный язык непрограммирования, форматы текстовых файлов со значительными отступами:
- GCode , диалект RepRapFirmware [ 12 ]
- ветчина
- Make , строка с отступом табуляции означает команду
- Pug (ранее Jade), см. Сравнение движков веб-шаблонов.
- реструктурированныйтекст [ 13 ]
- Сасс
- Стилус
- ЯМЛ
См. также
[ редактировать ]Ссылки
[ редактировать ]- ^ Хаттон, Г. (6 декабря 2012 г.). «Разбор с использованием комбинаторов» . В Дэвисе, Кей; Хьюз, Джон (ред.). Функциональное программирование: материалы семинара в Глазго 1989 г., 21–23 августа 1989 г., Фрейзербург, Шотландия . Springer Science & Business Media. стр. 362–364. ISBN 9781447131663 . Проверено 3 сентября 2015 г.
- ^ Тернер, окружной прокурор (13 августа 2013 г.). «Некоторые истории языков функционального программирования (приглашенный доклад)» . В Лойдле, Ганс Вольфганг; Пенья, Рикардо (ред.). Тенденции в функциональном программировании: 13-й международный симпозиум, TFP 2012, Сент-Эндрюс, Великобритания, 12–14 июня 2012 г., Пересмотренные избранные статьи . Спрингер. п. 8. ISBN 9783642404474 . Проверено 3 сентября 2015 г.
- ^ Ландин, П.Дж. (март 1966 г.). «Следующие 700 языков программирования» (PDF) . Коммуникации АКМ . 9 (3): 157–166. дои : 10.1145/365230.365257 . S2CID 13409665 .
- ^ Документация Python , 2. Лексический анализ : 2.1.8. Отступ
- ^ «CLHS: Раздел 2.1.4.7» .
- ^ Одерский, Мартин (17 июня 2020 г.). Мартин Одерски: Обновление Scala 3 (видео). Ютуб. Событие происходит в 36:35–45:08. Архивировано из оригинала 21 декабря 2021 года . Проверено 25 апреля 2021 г.
- ^ Сайм, Дон. «Подробные примечания к выпуску обновления CTP F# за май 2009 г. и выпусков бета-версии 1 Visual Studio 2010» . Архивировано из оригинала 21 января 2019 года.
- ^ Отчет Haskell - Макет
- ^ Lobster, язык программирования со статической типизацией и управлением памятью во время компиляции для разработки игр и графики.
- ^ MoonScript, язык, который компилируется в Lua.
- ^ MoonScript 0.5.0 - Языковое руководство
- ^ https://docs.duet3d.com/User_manual/Reference/Gcode_meta_commands
- ^ Спецификация разметки reStructuredText – Отступы