Введение
В компьютерном программировании спецификация языка программирования (или стандарт или определение) - это артефакт документации, который определяет язык программирования, чтобы пользователи и реализаторы могли договориться о том, что означают программы на этом языке. Спецификации обычно подробные и формальные, и в основном используются реализаторами, с пользователями, ссылающимися на них в случае двусмысленности; спецификация C++ часто цитируется пользователями, например, из-за сложности. Соответствующая документация включает в себя ссылку на язык программирования, которая специально предназначена для пользователей, и обоснование языка программирования, которое объясняет, почему спецификация написана такой, какая она есть; они, как правило, более неформальны, чем спецификация.
In computer programming, a programming language specification (or standard or definition) is a documentation artifact that defines a programming language so that users and implementors can agree on what programs in that language mean. Specifications are typically detailed and formal, and primarily used by implementors, with users referring to them in case of ambiguity; the C++ specification is frequently cited by users, for instance, due to the complexity. Related documentation includes a programming language reference, which is intended expressly for users, and a programming language rationale, which explains why the specification is written as it is; these are typically more informal than a specification.
Стандартизация
Не все основные языки программирования имеют спецификации, и языки могут существовать и быть популярными в течение десятилетий без спецификации. Язык может иметь одну или несколько реализаций, поведение которых действует как фактический стандарт, без того, чтобы это поведение было задокументировано в спецификации. Perl (через Perl 5) является примером языка без спецификации, в то время как PHP был указан только в 2014 году, после того, как был в использовании в течение 20 лет. Язык может быть реализован, а затем конкретизирован, или конкретизирован, а затем реализован, или они могут развиваться вместе, что является обычной практикой сегодня. Это связано с тем, что реализация и спецификации обеспечивают проверку друг друга: написание спецификации требует точного указания поведения реализации, а реализация проверяет, что спецификация возможна, практична и последовательна. Составление спецификации перед внедрением в значительной степени избегается с ALGOL 68 (1968), из-за неожиданных трудностей в реализации, когда внедрение откладывается. Однако языки все еще иногда реализуются и приобретают популярность без формальной спецификации: реализация необходима для использования, в то время как спецификация желательна, но не является необходимой (неформально, "кодные разговоры"). ALGOL 68 был первым (и, возможно, одним из последних) основным языком, для которого было сделано полное формальное определение до его внедрения.
Естественный язык
Наиболее широко используемые языки определяются с использованием описаний их семантики на естественном языке. Обычно это описание представляет собой справочное пособие по языку. Эти руководства могут занимать сотни страниц, например, печатная версия спецификации языка Java, 3-е издание. длиной 596 страниц. Неточность естественного языка как средства для описания семантики языка программирования может привести к проблемам с интерпретацией спецификации. Например, семантика потоков Java была указана на английском языке, и позже было обнаружено, что спецификация не предоставляет адекватных указаний для реализаторов.
Референтная реализация
Референтная реализация - это единственная реализация языка программирования, которая определена как авторитетная. Поведение этой реализации определяет правильное поведение программы, написанной на языке. Этот подход имеет несколько привлекательных свойств. Во-первых, он точен и не требует человеческой интерпретации: споры о значении программы могут быть урегулированы просто путем выполнения программы на эталонной реализации (при условии, что реализация ведет себя детерминированно для этой программы). С другой стороны, определение семантики языка через эталонную реализацию также имеет несколько потенциальных недостатков. Главная из них заключается в том, что она объединяет ограничения эталонной реализации с свойствами языка. Например, если в эталонной реализации есть ошибка, то эта ошибка должна рассматриваться как авторитетное поведение. Еще один недостаток заключается в том, что программы, написанные на этом языке, могут полагаться на причуды в эталонной реализации, что препятствует переносимости в разных реализациях. Тем не менее, несколько языков успешно использовали эталонный подход к реализации. Например, интерпретатор Perl определяет авторитет поведения программ Perl. В случае с Perl модель распространения программного обеспечения с открытым исходным кодом способствовала тому, что никто никогда не создавал другой реализации языка, поэтому вопросы, связанные с использованием справочной реализации для определения семантики языка, спорны.
Тестирование
Определение семантики языка программирования с точки зрения тестового пакета включает в себя написание ряда примерных программ на языке, а затем описание того, как эти программы должны вести себя, возможно, путем записи их правильных выходов. Программы, а также их выходы называются "тестовым набором" языка. Любая правильная реализация языка должна затем производить точно правильные выходы в программах тестового пакета. Главное преимущество этого подхода к семантическому описанию заключается в том, что легко определить, проходит ли языковая реализация тестовый набор. Пользователь может просто выполнить все программы в тестовом наборе и сравнить выходы с желаемыми выходами. Однако при использовании в одиночку подход к набору тестов также имеет серьезные недостатки. Например, пользователи хотят запускать свои собственные программы, которые не являются частью тестового пакета; действительно, реализация языка, которая могла бы запускать только программы в своем тестовом пакете, была бы в значительной степени бесполезной. Но тестовый набор не описывает сам по себе, как должна вести себя реализация языка в любой программе, не входящей в тестовый набор; определение этого поведения требует некоторой экстраполяции со стороны реализатора, и разные реализаторы могут не согласиться. Кроме того, трудно использовать тестовый пакет для тестирования поведения, которое предназначено или разрешено быть недетерминированным. Поэтому в обычной практике тестовые пакеты используются только в сочетании с одним из других методов спецификации языка, таких как описание на естественном языке или эталонная реализация.