Off-side правило - Off-side rule

Компьютер язык программирования говорят, что придерживаются вне игры если блоки на этом языке выражаются их отступ.[1][2] Термин был придуман Питер Дж. Ландин, возможно, как игра слов на офсайд править в футбол. Это контрастирует с языки свободной формы, особенно языки программирования с фигурными скобками, где отступ не имеет смысла и стиль отступа это только вопрос соглашение и форматирование кода.

Определение

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

Примеры кода

Ниже приведен пример блоков отступов в Python.Двоеточия являются частью синтаксиса языка Python для удобства чтения;[4] они не являются необходимыми для реализации правила вне игры.

В Python правило используется для определения границ операторов, а не объявлений.

def даже(а: (int, плавать)) -> bool:    "" "Определить, четно ли число" а "." ""    если int(а % 2) == 0:        Распечатать('Четное!')        возвращаться Истинный    Распечатать('Странный!')    возвращаться Ложь

Python также приостанавливает действие правила вне скобок. Оператор в скобках продолжается до тех пор, пока скобки не совпадут (или не совпадут):

{    "это": Истинный,    "который": Ложь,    "их": [1, 2,3, 4, 5, 6, 7, 8,9, 10, 11, 23]}

В этом толковый словарь, клавиши имеют отступ, а список разделен на две строки.

Выполнение

Правило офсайда может быть реализовано в лексический анализ фаза, как в Python, где увеличение отступа приводит к тому, что лексер выводит токен INDENT, а уменьшение отступа приводит к тому, что лексер выводит токен DEDENT.[5] Эти токены соответствуют открывающей скобке { и закрывающая скобка } в языках, которые используют фигурные скобки для блоков, и означает, что грамматика фразы не зависит от того, используются ли фигурные скобки или отступы. Для этого требуется, чтобы лексер удерживал состояние, а именно текущий уровень отступа, и, таким образом, мог обнаруживать изменения в отступе при его изменении, и, таким образом, лексический грамматика не является контекстно-свободный - ОТНОСИТЕЛЬНОСТЬ / ОТНОСИТЕЛЬНОСТЬ зависит от контекстной информации предыдущего уровня отступа.

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

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

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

Другой вариант - каждый блок начинаться и заканчиваться явными ключевыми словами. Например, в АЛГОЛ 60 и его потомок Паскаль блоки начинаются с ключевого слова начинать и закончить ключевым словом конец. В некоторых языках (но не в Паскале) это означает, что символы новой строки находятся важный[нужна цитата ] (в отличие от языков с фигурными скобками), но отступа нет. БАЗОВЫЙ и Фортран, блоки начинаются с имени блока (например, ЕСЛИ) и в конце имени блока добавляется КОНЕЦ (например., КОНЕЦ ЕСЛИ). В Фортран, каждый блок также может иметь собственное уникальное имя блока, что добавляет дополнительный уровень ясности к длинному коду. АЛГОЛ 68 и Оболочка Борна (ш, и трепать ) аналогичны, но окончание блока обычно дается именем блока, записанным в обратном направлении (например, дело начинает оператор переключения и он длится до совпадения esac; по аналогии условные если...тогда...[Элиф...[еще...]]фи или же за петли за...делать...od в ALGOL68 или за...делать...сделано в баше).

Интересная вариация на этот счет сделана Модула-2, похожий на Паскаль язык, в котором отсутствует разница между однострочными и многострочными блоками. Это позволяет открывателю блоков ({ или же НАЧИНАТЬ) следует пропускать для всех, кроме блока функционального уровня, требуя только токен завершения блока (} или же КОНЕЦ). Он также исправляет болтается еще. Custom предназначен для конец токен должен быть размещен на том же уровне отступа, что и остальная часть блока, что дает структуру блока, которая очень удобочитаема.

Одно преимущество для Фортран подход состоит в том, что он улучшает читаемость длинного, вложенного или иного сложного кода. Группа выходящих или закрывающих скобок сама по себе не дает никаких контекстных подсказок о том, какие блоки закрываются, что требует обратного отслеживания и более тщательного изучения во время отладки. Кроме того, языки, которые позволяют использовать суффикс для ключевых слов типа END, дополнительно улучшают такие подсказки, например Продолжить против продолжить для x. Однако современные приложения для редактирования кода часто предоставляют визуальные индикаторы и такие функции, как складывание чтобы помочь с этими недостатками.

Внешние языки правил

Языки программирования
Другие языки

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

Рекомендации

  1. ^ Хаттон, Г. (6 декабря 2012 г.). «Разбор с использованием комбинаторов». В Дэвисе, Кей; Хьюз, Джон (ред.). Функциональное программирование: материалы семинара 1989 г. в Глазго, 21–23 августа 1989 г., Фрейзербург, Шотландия. Springer Science & Business Media. стр. 362–364. Получено 3 сентября, 2015.
  2. ^ Тернер, Д.А. (13 августа 2013 г.). "Немного истории языков функционального программирования (приглашенный доклад)". В Лойдле, Ганс Вольфганг; Пенья, Рикардо (ред.). Тенденции в функциональном программировании: 13-й Международный симпозиум, TFP 2012, Сент-Эндрюс, Великобритания, 12–14 июня 2012 г., Пересмотренные избранные документы. Springer. п. 8. Получено 3 сентября, 2015.
  3. ^ Ландин, П. Дж. (Март 1966 г.). «Следующие 700 языков программирования» (PDF). Comm. ACM. 9 (3): 157–166. Дои:10.1145/365230.365257.
  4. ^ Python FAQ по двоеточиям
  5. ^ Документация Python, 2. Лексический анализ.: 2.1.8. Отступ
  6. ^ http://clhs.lisp.se/Body/02_adg.htm
  7. ^ Сайм, Дон. «Подробные примечания к выпуску F # May 2009 CTP Update и Visual Studio 2010 Beta1». Архивировано из оригинал на 2019-01-21.
  8. ^ Отчет Haskell - Макет
  9. ^ MoonScript, язык, который компилируется в Lua
  10. ^ MoonScript 0.5.0 - Руководство по языку
  11. ^ Спецификация разметки reStructuredText - отступы

Статья основана на материалах, взятых из Бесплатный онлайн-словарь по вычислительной технике до 1 ноября 2008 г. и зарегистрированы в соответствии с условиями «перелицензирования» GFDL, версия 1.3 или новее.