Спецификация языков программирования

Перейти к навигацииПерейти к поиску

Спецификация (стандарт, определение) языка программирования — это предмет документации, который определяет язык программирования, чтобы пользователи и разработчики языка могли согласовывать, что означают программы на данном языке. Спецификации обычно являются подробными и формальными и в основном используются разработчиками языка, в то время как пользователи обращаются к ним в случае двусмысленности: например, спецификация языка 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).

Примечания

  1. Joel Marcey. Announcing a specification for PHP. hhvm.com (30 июля 2014). Дата обращения: 13 сентября 2018. Архивировано 13 июля 2017 года.
  2. Milner, R.; M. Tofte; R. Harper; D. MacQueen. The Definition of Standard ML (Revised) (неопр.). — MIT Press, 1997. — ISBN 0-262-63181-4.
  3. Kelsey, R.; Clinger, W.; Rees J. "Section 7.2 Formal semantics". Revised^5 Report on the Algorithmic Language Scheme (февраль 1998). Дата обращения: 13 сентября 2018. Архивировано 13 октября 2018 года.
  4. Jones, D. Forms of language specification (2008). Дата обращения: 13 сентября 2018. Архивировано 28 ноября 2018 года.