Jump to content

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

(Перенаправлено со значительного отступа )

Правило оффсайда описывает синтаксис языка программирования , который определяет границы блока кода посредством отступов . [ 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 ]

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

[ редактировать ]

Известные языки программирования с правилом оффсайда:

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

[ редактировать ]

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

См. также

[ редактировать ]
  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 (видео). Ютуб. Событие происходит в 36:35–45:08. Архивировано из оригинала 21 декабря 2021 года . Проверено 25 апреля 2021 г.
  7. ^ Сайм, Дон. «Подробные примечания к выпуску обновления CTP F# за май 2009 г. и выпусков бета-версии 1 Visual Studio 2010» . Архивировано из оригинала 21 января 2019 года.
  8. ^ Отчет Haskell - Макет
  9. ^ Lobster, язык программирования со статической типизацией и управлением памятью во время компиляции для разработки игр и графики.
  10. ^ MoonScript, язык, который компилируется в Lua.
  11. ^ MoonScript 0.5.0 - Языковое руководство
  12. ^ https://docs.duet3d.com/User_manual/Reference/Gcode_meta_commands
  13. ^ Спецификация разметки reStructuredText – Отступы
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: a0eb28f7d5f031aa4421785dbd5eae89__1723063800
URL1:https://arc.ask3.ru/arc/aa/a0/89/a0eb28f7d5f031aa4421785dbd5eae89.html
Заголовок, (Title) документа по адресу, URL1:
Off-side rule - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)