Опубликован: 19.08.2004 | Уровень: для всех | Доступ: платный | ВУЗ: Национальный исследовательский ядерный университет «МИФИ»
Лекция 5:

Семантика основных конструкций языка программирования C#

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