Что такое "формальная семантика"? - PullRequest
7 голосов
/ 01 марта 2010

Я читаю очень глупую статью, и она продолжает говорить о том, как Джотто определяет «формальную семантику».

Giotto имеет формальную семантику, которая определяет значение переключателей режимов, взаимодействия между задачами и взаимодействия с программной средой.

Я на грани, но просто не могу понять, что значит "формальная семантика".

Ответы [ 4 ]

12 голосов
/ 01 марта 2010

Чтобы немного расширить ответ Майкла Мэдсена, примером может служить поведение оператора ++. Неформально мы описываем оператор, используя простой английский. Например:

Если x является переменной типа int, ++x приводит к увеличению x на единицу.

(я предполагаю, что нет целочисленных переполнений, и что ++x ничего не возвращает)

В формальной семантике (и я собираюсь использовать операционную семантику) у нас будет немного работы. Во-первых, нам нужно определить понятие типов. В этом случае я предполагаю, что все переменные имеют тип int. На этом простом языке текущее состояние программы может быть описано хранилищем, которое представляет собой отображение переменных на значения. Например, в какой-то момент в программе x может быть равно 42, а y равно -5351. Хранилище может использоваться как функция - например, если в хранилище s есть переменная x со значением 42, то s(x) = 42.

В текущее состояние программы также включены остальные операторы программы, которые мы должны выполнить. Мы можем связать это как <C, s>, где C - оставшаяся программа, а s - хранилище.

Итак, если у нас есть состояние <++x, {x -> 42, y -> -5351}>, это неофициальное состояние, в котором единственной оставшейся командой для выполнения является ++x, переменная x имеет значение 42, а переменная y имеет значение -5351.

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

<++x, s> --> <skip, s{x -> (s(x) + 1)>

Несколько неофициально, выполнив ++x, следующая команда - skip, которая не имеет никакого эффекта, и переменные в хранилище не изменились, за исключением x, который теперь имеет значение, которое изначально имело плюс один. Еще предстоит проделать определенную работу, например, определить нотацию, которую я использовал для обновления магазина (чего я не сделал, чтобы этот ответ не стал длиннее!). Таким образом, конкретный экземпляр общего правила может быть:

<++x, {x -> 42, y -> -5351}> --> <skip, {x -> 43, y -> -5351}>

Надеюсь, это дает вам идею. Обратите внимание, что это только один пример формальной семантики - наряду с операционной семантикой, есть аксиоматическая семантика (которая часто использует логику Хоара) и денотационная семантика, и, вероятно, еще много, с чем я не знаком.

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

9 голосов
/ 01 марта 2010

Формальная семантика описывает семантику - ну, формально - используя нотацию, которая однозначно выражает смысл вещей.

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

Язык программирования может иметь как формальную, так и неформальную семантику - тогда неформальная семантика будет служить «текстовым» объяснением формальной семантики, а формальная семантика будет подходящим местом для поиска, если вы не уверены, что неформальное объяснение действительно означает.

3 голосов
/ 01 марта 2010

Так же, как синтаксис языка может быть описан формальной грамматикой (например, BNF ), можно использовать различные виды формализмов для сопоставления этого синтаксиса с математическими объектами (т. Е. Смысл синтаксиса ).

Эта страница из Практическое введение в денотационную семантику - хорошее введение в то, как [денотационная] семантика относится к синтаксису. В начале книги также дается краткая история других неденотационных подходов к формальной семантике (хотя ссылка на википедию Майкл дает подробности и, вероятно, более современна).

с сайта автора :

Модели для семантики не имеют в той же степени, что и БНФ и его потомки имеют в синтаксисе. Это может быть потому, что семантика делает кажется, просто сложнее, чем синтаксис. Самая успешная система денотационная семантика, которая описывает все функции, найденные в императиве языки программирования и имеет звук математическая основа. (Все еще активные исследования в системах типов и параллельное программирование.) Многие денотационные определения могут быть выполнено в качестве переводчика или переведено в "компиляторы", но это еще не привело к генераторам эффективного компиляторы, которые могут быть еще одной причиной что денотационная семантика меньше популярнее, чем BNF.

0 голосов
/ 24 февраля 2018

В контексте языка программирования, подобного Джотто, подразумевается, что язык с формальной семантикой имеет математически строгую интерпретацию своих отдельных языковых конструкций.

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

Формально указанный язык, с другой стороны, обычно используется, когда необходимо рассуждать о программном коде, используя, например, проверку модели или доказательство теорем. Языки, которые поддаются этим методам, являются, как правило, функциональными, такими как ML или Haskell, поскольку они определяются с использованием математических функций и преобразований между ними; то есть основы математики.

C или C ++, с другой стороны, неофициально определяются техническими описаниями, хотя существуют научные статьи, которые формализуют аспекты этих языков (например, Майкл Норриш: формальная семантика для C ++, https://publications.csiro.au/rpr/pub?pid=nicta:1203),, но часто это делают не найдут своего пути в официальные стандарты (возможно, из-за недостатка практичности, особенно из-за сложности обслуживания).

...