Эволюция синтаксиса языка и сохранение его семантики - PullRequest
0 голосов
/ 23 сентября 2010

Я исследую, как синтаксическая эволюция языка влияет на его семантику. Например, синтаксис java for for в своей версии 5 превратился в компактный. Нужно ли дизайнерам доказывать, что даже с таким синтаксисом семантика все еще сохраняется! Может быть, это тривиальный пример.

Итак, как вообще можно доказать, что семантика языка все еще сохраняется, даже если его синтаксис превратился из очень многословного в компактный?

Большое спасибо заранее за любые идеи / ссылки.

Ketan

Ответы [ 2 ]

2 голосов
/ 23 сентября 2010

Хорошо, ваш последний комментарий гораздо более ответственный.

Некоторые более конкретные детали: у нас есть интерпретатор, который понимает язык A в очень подробном синтаксисе. Теперь мы изобрели новый язык B с очень компактным синтаксисом, который полностью отличается от синтаксиса языка A. Таким образом, пользователь теперь может писать код на компактном языке B, переводить на многословный язык A, используя программу-переводчик, которая у меня есть. написано. Проблема в том, как доказать / гарантировать, что все возможные такие переводы сохранят семантику исходного языка A, понятную переводчику.

Краткий ответ: вы этого не делаете. Во-первых, когда вы добавляете синтаксический сахар, вы обычно просто фиксируете хорошо известный, широко используемый шаблон и присваивает ему особый, более приятный синтаксис - вы не заменяете большую часть синтаксиса языка. Для таких небольших замен перевод может быть сформулирован с информативными описаниями и примерами - например, PEP 343 определяет выражение «с» относительно информативно.

Теперь, когда изменение синтаксиса настолько радикально, новый язык почти не имеет ничего общего с языком бэкэнда, мы не говорим об изменении синтаксиса - мы говорим о компиляторе. Но компиляторы также не являются правильными. Ну, некоторые люди на самом деле пробуют это . Но для реальных компиляторов это случается редко; вместо этого тестирование проверяет правильность бесчисленных пользователей и их программ. И, конечно же, все серьезные языковые реализации имеют широкий диапазон тестовых примеров (читай: примеры программ, от базовых до абсурдных), которые должны запускаться и проходить (или в некоторых случаях генерировать ошибку) по крайней мере в официальных выпусках. Когда они это делают (а набор тестов того стоит), вы все равно не знаете, что ошибок нет, но, по крайней мере, это некоторая уверенность. Как сказал Дейкстра: «Тестирование показывает наличие, а не отсутствие ошибок».

0 голосов
/ 23 сентября 2010

Докажите, что каждое расширение синтаксиса было бы недопустимым в более старых версиях языка.

По очевидным причинам, новые синтаксические элементы должны быть введены таким образом, который был бы синтаксически недопустим встарая версия языка.Из-за этого у большинства языков есть список зарезервированных слов, который выходит за рамки уже используемых ключевых слов.

Например, когда C # ввел ключевое слово var в версии 3.0, это потенциально проблематично, поскольку var былне зарезервированное слово в версии 1.0 C # (возможно, не в 2.0, либо).Таким образом, программа могла бы легально создать тип с именем var в C # 1.0, но она больше не компилируется в C # 3.0 и более поздних версиях.

Неизменная семантика элементов старого языка больше зависит от того, как работает компиляторпостроен, так как спецификация редко меняется.Если это изменится, то семантика не сохранится.Исключение составляют новые спецификации, которые исправляют вещи, которые в предыдущих версиях спецификации представляли собой неопределенное поведение (но все еще допустимо).С приходит мне в голову.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...