stringtranslate.com

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

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

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

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

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

Определение

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

Пример

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

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

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

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

Выполнение

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

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

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

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

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

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

Одним из преимуществ подхода Фортрана является то, что он улучшает читаемость длинного, вложенного или иного сложного кода. Группа отступов или закрывающих скобок сама по себе не дает контекстных подсказок о том, какие блоки закрываются, что требует возврата и более тщательного изучения во время отладки . Кроме того, языки, которые допускают использование суффикса для ключевых слов типа END, дополнительно улучшают такие сигналы, такие как continuevs continue for xи маркер конца цикла, определяющий индексную переменную NEXT I vs NEXT, а также циклы с уникальными именами CYCLE X1 vs 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 г., Пересмотренные избранные статьи . Спрингер. п. 8. ISBN 9783642404474. Проверено 3 сентября 2015 г.
  3. ^ Ландин, П.Дж. (март 1966 г.). «Следующие 700 языков программирования» (PDF) . Коммуникации АКМ . 9 (3): 157–166. дои : 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. ^ Сайм, Дон. «Подробные примечания к выпуску обновления CTP F # за май 2009 г. и выпусков Visual Studio 2010 Beta1». Архивировано из оригинала 21 января 2019 года.
  8. ^ Отчет Haskell - Макет
  9. ^ MoonScript, язык, который компилируется в Lua.
  10. ^ MoonScript 0.5.0 - Языковое руководство
  11. ^ Спецификация разметки reStructuredText – Отступы
  12. ^ https://docs.duet3d.com/User_manual/Reference/Gcode_meta_commands