Спецификация (стандарт, определение) языка программирования — это предмет документации, который определяет язык программирования, чтобы пользователи и разработчики языка могли согласовывать, что означают программы на данном языке. Спецификации обычно являются подробными и формальными и в основном используются разработчиками языка, в то время как пользователи обращаются к ним в случае двусмысленности: например, спецификация языка C++ часто цитируется пользователями из-за сложности. Сопутствующая документация включает справочник по языку программирования[англ.], который специально предназначен для пользователей, и логическое обоснование языка программирования, которое объясняет, почему спецификация написана именно так; последние обычно более неформальны, чем спецификации.
Стандартизация править
Не все основные языки программирования имеют спецификации; языки могут существовать и быть популярными в течение десятилетий без спецификации. Язык может иметь одну или несколько реализаций, поведение которых де-факто является стандартом, но при этом данное поведение не документировано в спецификации. Perl (Perl 5) — известный пример языка без спецификации, тогда как PHP получил спецификацию только в 2014 году, после использования в течение 20 лет[1].
Язык может быть реализован, а затем стандартизован, или стандартизован, а после этого реализован, или же два этих процесса могут развиваться вместе, что является в настоящее время обычной практикой. Это связано с тем, что реализация и спецификация обеспечивают проверку друг друга: для написания спецификации требуется точно указать поведение реализации, а реализация проверяет, что спецификация является возможной, целесообразна и последовательна.
Написания спецификации до реализации зачастую стали избегать после Алгол 68 (1968 г.), из-за неожиданных трудностей в реализации, когда реализация была отложена. Тем не менее, языки всё ещё время от времени используются и приобретают популярность без формальной спецификации: реализация языка необходима для его использования, в то время как спецификация является желательной, но не необходимой.
Формы править
Спецификация языков программирования может принимать несколько форм, среди которых:
- явное определение синтаксиса и семантики языка. Хотя синтаксис обычно задается с использованием формальной грамматики, семантические определения могут быть написаны на естественном языке (например, подход, принятый для языка Си) или в формальной семантике (например, спецификации Standard ML[2] и Scheme[3]. Примечательным примером является язык Си, который приобрёл популярность без формальной спецификации, а был описан вместо этого в части книги, «Язык программирования Си» (1978 г.), и был формально стандартизован намного позже в ANSI C (1989 г.);
- описание поведения компилятора (иногда называемого «транслятором») для языка (например, языки C++ и Фортран). Синтаксис и семантика языка выводятся из этого описания, которое может быть написано на естественном или формальном языке;
- эталонная реализация, иногда написанная на указанном языке (например, Пролог). Синтаксис и семантика языка подробно ясны из поведения реализации модели.
Синтаксис править
Синтаксис языка программирования обычно описывается с использованием комбинации следующих двух компонентов:
- регулярное выражение, описывающее его лексемы (распознанные группы входной последовательности символов), и
- контекстно-свободная грамматика, которая описывает, как лексемы могут быть скомбинированы для формирования синтаксически правильной программы.
Семантика править
Формулирование строгой семантики большого, сложного, практичного языка программирования является сложной задачей даже для опытных специалистов, и получающаяся в результате спецификация может быть трудной для понимания всех, кроме экспертов. Ниже приведены некоторые из способов описания семантики языка программирования; все языки используют по крайней мере один из этих методов описания, а некоторые языки объединяют более одного[4]:
- естественный язык: описание естественным человеческим языком;
- формальная семантика: математическое описание;
- эталонная реализация: описание посредством компьютерной программы;
- набор тестов[англ.]: описание при помощи примеров программ и их ожидаемого поведения. Хотя лишь несколько спецификаций языка начинались с этой формы спецификации, семантика набора тестов влияет на эволюцию некоторых спецификаций языка; например, в прошлом спецификация Ада была изменена в соответствии с поведением Тестового набора для оценки соответствия Ада (Ada Conformity Assessment Test Suite).
Примечания править
- ↑ Joel Marcey. Announcing a specification for PHP . hhvm.com (30 июля 2014). Дата обращения: 13 сентября 2018. Архивировано 13 июля 2017 года.
- ↑ Milner, R.; M. Tofte; R. Harper; D. MacQueen. The Definition of Standard ML (Revised) (неопр.). — MIT Press, 1997. — ISBN 0-262-63181-4.
- ↑ Kelsey, R.; Clinger, W.; Rees J. "Section 7.2 Formal semantics". Revised^5 Report on the Algorithmic Language Scheme (февраль 1998). Дата обращения: 13 сентября 2018. Архивировано 13 октября 2018 года.
- ↑ Jones, D. Forms of language specification (2008). Дата обращения: 13 сентября 2018. Архивировано 28 ноября 2018 года.