Off-side правило - Off-side rule
Эта статья нужны дополнительные цитаты для проверка.Декабрь 2011 г.) (Узнайте, как и когда удалить этот шаблон сообщения) ( |
Компьютер язык программирования говорят, что придерживаются вне игры если блоки на этом языке выражаются их отступ.[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
. Однако современные приложения для редактирования кода часто предоставляют визуальные индикаторы и такие функции, как складывание чтобы помочь с этими недостатками.
Внешние языки правил
- Языки программирования
- ABC
- Бу
- BuddyScript
- Кобра
- CoffeeScript
- Сходиться
- Карри
- Эликсир (
, делать:
блоки) - Вяз
- F # (в ранних версиях, когда
#свет
указан; в более поздних версиях, когда#выключить свет"
не является[7]) - Джинн
- Haskell[8] (только для
куда
,позволять
,делать
, или жев случае если
предложения, когда фигурные скобки опущены) - Информ 7
- Я ПЛАВАЮ, абстрактный язык, который ввел правило
- LiveScript
- Миранда
- MoonScript[9][10]
- Nemerle
- Ним
- Оккам
- PROMAL
- Python
- Схема, при использовании одного из нескольких Запросы схемы для реализаций, последний из которых SRFI 119
- Вращение
- XL
- Другие языки
- Haml
- Делать (инструмент сборки - вкладки вводят команды в правилах создания)
- reStructuredText[11]
- Sass
- Стилус
- YAML
- Мопс (ранее Джейд), см. Сравнение движков веб-шаблонов
Смотрите также
Рекомендации
- ^ Хаттон, Г. (6 декабря 2012 г.). «Разбор с использованием комбинаторов». В Дэвисе, Кей; Хьюз, Джон (ред.). Функциональное программирование: материалы семинара 1989 г. в Глазго, 21–23 августа 1989 г., Фрейзербург, Шотландия. Springer Science & Business Media. стр. 362–364. Получено 3 сентября, 2015.
- ^ Тернер, Д.А. (13 августа 2013 г.). "Немного истории языков функционального программирования (приглашенный доклад)". В Лойдле, Ганс Вольфганг; Пенья, Рикардо (ред.). Тенденции в функциональном программировании: 13-й Международный симпозиум, TFP 2012, Сент-Эндрюс, Великобритания, 12–14 июня 2012 г., Пересмотренные избранные документы. Springer. п. 8. Получено 3 сентября, 2015.
- ^ Ландин, П. Дж. (Март 1966 г.). «Следующие 700 языков программирования» (PDF). Comm. ACM. 9 (3): 157–166. Дои:10.1145/365230.365257.
- ^ Python FAQ по двоеточиям
- ^ Документация Python, 2. Лексический анализ.: 2.1.8. Отступ
- ^ http://clhs.lisp.se/Body/02_adg.htm
- ^ Сайм, Дон. «Подробные примечания к выпуску F # May 2009 CTP Update и Visual Studio 2010 Beta1». Архивировано из оригинал на 2019-01-21.
- ^ Отчет Haskell - Макет
- ^ MoonScript, язык, который компилируется в Lua
- ^ MoonScript 0.5.0 - Руководство по языку
- ^ Спецификация разметки reStructuredText - отступы
Статья основана на материалах, взятых из Бесплатный онлайн-словарь по вычислительной технике до 1 ноября 2008 г. и зарегистрированы в соответствии с условиями «перелицензирования» GFDL, версия 1.3 или новее.