Россия, Москва |
Семантика основных конструкций языка программирования C#
Представим построение денотационной семантики важнейших конструкций языка программирования C#.
Напомним, что история развития теории и практики семантического анализа языков программирования были рассмотрены во вступительной лекции.
Процедура построения денотационной семантики основных конструкций языка программирования SML изложена в лекции 8.
Поставим задачу формализации семантики языка объектно-ориентированного программирования C#. Заметим сразу, что в рамках данного курса будет рассматриваться не все множество возможных конструкций данного языка, а некоторое весьма ограниченное (хотя и вполне достаточное для иллюстрации основных идей курса) их подмножество, которое условно назовем языком программирования C# и будем именовать так в дальнейшем.
Прежде всего, рассмотрим синтаксис языка C#, т.е. перечислим основные типы составляющих его конструкций.
Язык C# содержит множество выражений E, которые формализуются посредством БНФ в следующем виде:
E ::= true|false|0|1|I|!E|E1==E2|E1+E2
Заметим, что выражения включают логические ( true и false ) и целочисленные (в ограниченном объеме: 0 и 1 ) константы, множество идентификаторов ( I ), а также операции отрицания ( !E ), сравнения ( E1==E2 ) и сложения ( E1+E2 ).
Кроме того, язык C# содержит множество команд С, которые формализуются посредством БНФ в следующем виде:
С::=I=E | if(E)C1 else C2 | while(E) C | C1;C2
Заметим, что команды включают присваивание I=E, условие if(E)C1 else C2, цикл с предусловием while(E) C, а также последовательность команд C1;C2 .
Деление синтаксиса языка C# на выражения и команды во многом является условным и служит иллюстративным целям.
Как и ранее, в качестве математической формализации, моделирующей семантику языков программирования (в частности, языка C#), будет использоваться теория вычислений Д. Скотта.
Приведем порядок построения формальной модели семантики языка программирования C# согласно ранее представленному формальному описанию синтаксиса языка в терминах БНФ.
Прежде всего, необходимо дать определение синтаксических доменов (т.е. доменов, характеризующих основные синтаксические категории) для идентификаторов ( домен Ide ), выражений ( домен Exp ) и команд ( домен Com ).
Далее, следует представить определение вычислительной модели на основе синтаксических доменов.
Затем нужно перейти к определению семантических функций ( E для домена Exp, C для домена Com и т.д.), которые отображают синтаксические конструкции языка программирования в соответствующие им семантические представления.
Наконец, следует сформулировать определение семантических предложений в терминах смены состояний программы.
Заметим, что при выполнении программы (в частности, написанной на языке программирования C#) происходит изменение состояния, состоящего из памяти ( m, memory ), которая в простейшем случае характеризует соответствие идентификаторов и значений (то есть, по сути, связывание переменной со значением ) либо имеет значение unbound (характеризующее отсутствие связи идентификатора со значением, т.е. аналогичное свободной переменной).