Спецификация языка программирования
В компьютерном программировании спецификация языка программирования (или стандарт , или определение ) — это артефакт документации , который определяет язык программирования , чтобы пользователи и разработчики могли договориться о том, что означают программы на этом языке. Спецификации обычно являются подробными и формальными и в основном используются разработчиками, а пользователи обращаются к ним в случае двусмысленности; спецификация C++ часто упоминается пользователями, например, из-за ее сложности. Сопутствующая документация включает справочник по языку программирования , предназначенный специально для пользователей, и обоснование языка программирования , объясняющее, почему спецификация написана так, как она есть; они обычно более неформальны, чем спецификация.
Стандартизация [ править ]
Не все основные языки программирования имеют спецификации, а языки могут существовать и быть популярными десятилетиями без спецификации. Язык может иметь одну или несколько реализаций, поведение которых действует как стандарт де-факто , причем это поведение не документируется в спецификации. Perl (до Perl 5 ) является ярким примером языка без спецификации, тогда как PHP был указан только в 2014 году, после 20 лет использования. [1] Язык может быть реализован, а затем указан, или указан, а затем реализован, или они могут развиваться вместе, что сегодня является обычной практикой. Это связано с тем, что реализации и спецификации обеспечивают проверку друг друга: написание спецификации требует точного указания поведения реализации, а реализация проверяет, что спецификация возможна, практична и непротиворечива. (1968) в основном избегали написания спецификации до реализации Начиная с АЛГОЛа 68 из-за неожиданных трудностей в реализации, когда реализация откладывается. Однако языки все еще иногда реализуются и набирают популярность без формальной спецификации: реализация необходима для использования, тогда как спецификация желательна, но не обязательна (неформально, «код говорит»).
АЛГОЛ 68 был первым (и, возможно, одним из последних) основных языков, для которого было дано полное формальное определение до его реализации.
— ЦДХ Костер , [2]
Формы [ править ]
Спецификация языка программирования может принимать несколько форм, включая следующие:
- Явное определение синтаксиса и семантики языка . Хотя синтаксис обычно задается с использованием формальной грамматики , семантические определения могут быть написаны на естественном языке (например, подход, использованный для языка C ) или формальной семантики (например, стандарт ML). [3] и схема [4] характеристики). Ярким примером является язык C, который приобрел популярность без формальной спецификации, вместо этого был описан как часть книги « Язык программирования C» (1978 г.) и лишь намного позже был официально стандартизирован в ANSI C (1989 г.).
- Описание поведения компилятора ( иногда называемого «транслятором») для языка (например, языка C++ и Fortran ). Синтаксис и семантика языка должны быть выведены из этого описания, которое может быть написано на естественном или формальном языке.
- модели Пролог Реализация , иногда написанная на указанном языке (например, ) . Синтаксис и семантика языка явны в поведении реализации модели.
Синтаксис [ править ]
Этот раздел нуждается в расширении . Вы можете помочь, добавив к нему . ( февраль 2018 г. ) |
Синтаксис . языка программирования представляет собой определение допустимых слов, т.е. формальных параметров и правил, на основании которых можно решить, действителен ли данный код по отношению к языку В связи с этим синтаксис языка обычно состоит из комбинации следующих трех компонентов конструкции:
- Определенный набор символов (непустой, конечный набор символов)
- Регулярные выражения, описывающие его лексемы (для токенизации по алфавиту)
- Бесконтекстная грамматика , описывающая, как можно комбинировать лексемы для формирования правильной программы.
Спецификация синтаксиса обычно предполагает описание на естественном языке, чтобы обеспечить скромную понятность. Однако формальное представление вышеизложенных компонентов обычно является частью раздела, поскольку оно способствует реализации и утверждению языка и его концепций.
Семантика [ править ]
Формулирование строгой семантики большого, сложного и практичного языка программирования является непростой задачей даже для опытных специалистов, а полученная спецификация может быть трудной для понимания кем-либо, кроме экспертов. Ниже приведены некоторые способы описания семантики языка программирования; все языки используют хотя бы один из этих методов описания, а некоторые языки сочетают в себе более одного [5]
- Естественный язык : Описание на естественном языке человека.
- Формальная семантика : Описание по математике .
- Эталонные реализации : Описание компьютерной программы.
- Тестовые наборы : Описание на примерах программ и их ожидаемого поведения. Хотя немногие языковые спецификации начинаются в такой форме, на эволюцию некоторых языковых спецификаций повлияла семантика набора тестов (например, в прошлом спецификация Ada была изменена, чтобы соответствовать поведению набора тестов Ada Conformity Assessment Test Suite ). .
Естественный язык [ править ]
Наиболее широко используемые языки определяются с использованием описаний их семантики на естественном языке. Это описание обычно принимает форму справочного руководства по языку. Эти руководства могут занимать сотни страниц, например, печатная версия «Спецификации языка Java», 3-е изд. объем 596 страниц.
Неточность естественного языка как средства описания семантики языка программирования может привести к проблемам с интерпретацией спецификации. Например, семантика Java потоков была определена на английском языке, и позже выяснилось, что спецификация не дает адекватных указаний для разработчиков. [6]
Формальная семантика [ править ]
Формальная семантика основана на математике. В результате они могут быть более точными и менее двусмысленными, чем семантика, заданная на естественном языке. Однако для облегчения понимания формальных определений часто включаются дополнительные описания семантики на естественном языке. Например, стандарт ISO для Модулы-2 содержит как формальное, так и определение естественного языка на противоположных страницах.
Языки программирования, семантика которых описана формально, могут принести много преимуществ. Например:
- Формальная семантика позволяет математически доказать корректность программы;
- Формальная семантика облегчает проектирование систем типов и доказательство правильности этих систем типов;
- Формальная семантика может установить однозначные и единые стандарты для реализации языка.
Автоматическая поддержка инструментов может помочь реализовать некоторые из этих преимуществ. Например, автоматизированное средство доказательства или проверки теорем может повысить уверенность программиста (или разработчика языка) в правильности доказательств программ (или самого языка). Мощность и масштабируемость этих инструментов широко варьируются: полная формальная проверка требует больших вычислительных ресурсов и редко выходит за рамки программ, содержащих несколько сотен строк. [ нужна ссылка ] и может потребоваться значительная ручная помощь программиста; более легкие инструменты, такие как средства проверки моделей, требуют меньше ресурсов и используются в программах, содержащих десятки тысяч строк; многие компиляторы применяют статические проверки типов к любой компилируемой программе.
Эталонная реализация [ править ]
Эталонная реализация — это отдельная реализация языка программирования, обозначенная как авторитетная. Считается, что поведение этой реализации определяет правильное поведение программы, написанной на этом языке. Этот подход имеет несколько привлекательных свойств. Во-первых, он точен и не требует человеческой интерпретации: споры относительно смысла программы могут быть разрешены простым выполнением программы в эталонной реализации (при условии, что реализация ведет себя детерминировано для этой программы).
С другой стороны, определение семантики языка посредством эталонной реализации также имеет несколько потенциальных недостатков. Главный из них заключается в том, что он объединяет ограничения эталонной реализации со свойствами языка. Например, если в эталонной реализации есть ошибка, то эту ошибку следует рассматривать как авторитетное поведение. Еще одним недостатком является то, что программы, написанные на этом языке, могут полагаться на особенности эталонной реализации, что затрудняет переносимость между различными реализациями.
Тем не менее, в нескольких языках успешно используется эталонный подход к реализации. Например, Perl считается, что интерпретатор определяет авторитетное поведение программ Perl. В случае Perl модель распространения программного обеспечения с открытым исходным кодом способствовала тому, что никто никогда не создавал другой реализации языка, поэтому вопросы, связанные с использованием эталонной реализации для определения семантики языка, являются спорными.
Набор тестов [ править ]
Определение семантики языка программирования с помощью набора тестов включает в себя написание ряда примеров программ на этом языке, а затем описание того, как эти программы должны вести себя — возможно, путем записи их правильных результатов. Программы вместе с их результатами называются «набором тестов» языка. Любая правильная реализация языка должна затем давать точно правильные выходные данные в программах набора тестов.
Главное преимущество этого подхода к семантическому описанию состоит в том, что легко определить, проходит ли языковая реализация набор тестов. Пользователь может просто выполнить все программы из набора тестов и сравнить результаты с желаемыми результатами. Однако, когда используется сам по себе подход с набором тестов, он также имеет серьезные недостатки. Например, пользователи хотят запускать свои собственные программы, не входящие в набор тестов; действительно, реализация языка, которая могла бы запускать только программы из своего набора тестов, была бы в значительной степени бесполезной. Но набор тестов сам по себе не описывает, как реализация языка должна вести себя в любой программе, не входящей в набор тестов; определение этого поведения требует некоторой экстраполяции со стороны разработчика, и разные разработчики могут не согласиться. Кроме того, сложно использовать набор тестов для проверки поведения, которое задумано или разрешено быть недетерминированным .
Поэтому в обычной практике наборы тестов используются только в сочетании с одним из других методов спецификации языка, например описанием на естественном языке или эталонной реализацией.
См. также [ править ]
Внешние ссылки [ править ]
Языковые характеристики [ править ]
Несколько примеров официальных или проектных спецификаций языка:
- Спецификации, написанные в основном на формальной математике:
- Определение стандарта ML, переработанное издание — формальное определение в стиле операционной семантики .
- Схема R5RS - формальное определение в денотационной семантики. стиле
- Технические характеристики написаны преимущественно на естественном языке:
- Технические характеристики через набор тестов:
Примечания [ править ]
- ^ Анонс спецификации PHP , 30 июля 2014 г., Джоэл Марси.
- ^ «Краткая история Алгола68» . Архивировано из оригинала 10 августа 2006 года . Проверено 15 сентября 2006 г.
- ^ Милнер, Р .; М. Тофте ; Р. Харпер ; Д. МакКуин (1997). Определение стандарта ОД (пересмотренного) . МТИ Пресс. ISBN 0-262-63181-4 .
- ^ Келси, Ричард; Уильям Клингер; Джонатан Рис (февраль 1998 г.). «Раздел 7.2 Формальная семантика» . Пересмотренный 5 Отчет об алгоритмической языковой схеме . Проверено 9 июня 2006 г.
- ^ Джонс, Д. (2008). Формы спецификации языка (PDF) . Проверено 23 июня 2012 г.
- ^ Уильям Пью. Модель памяти Java имеет фатальные недостатки. Параллелизм: практика и опыт 12 (6): 445-455, август 2000 г.