Введение в теорию программирования. Объектно-ориентированный подход

       

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


  Лекции



Введение в теорию программирования. Объектно-ориентированный подход

0.   Вступительная лекция

1.   Объектно-ориентированный подход ...

2.   Платформа.NET и ее применение д...

3.   Основные понятия языка программ...

4.   Разработка элементарных программ...

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

6.   Основные понятия объектно-ориент...

7.   Объекты и классы

8.   Теория типов и типизация в .NET

9.   Концепция наследования и ее реал...

10.   Концепция инкапсуляции и ее реа...

11.   Концепция полиморфизма и ее реа...

12.   Полиморфные методы

13.   Расширенные возможности полимор...

14.   Расширенные возможности языка пр...

15.   Событийно управляемое программи...

16.   Событийно-ориентированное програ...

17.   Компонентное программирование в ...

18.   Проектирование и реализация гете...

    Экзамен
    Сдать экзамен экстерном
    Литература
    Предметный указатель


Введение в теорию программирования. Объектно-ориентированный подход версия для локальной работы

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

1

|

2

|

вопросы | »

|

учебники

|

для печати и PDA

  Если Вы заметили ошибку - сообщите нам.  
В данной лекции будут рассмотрены вопросы, относящиеся к понятийному аппарату и выразительным возможностям семантического представления формальных теорий и языков программирования. При этом основное внимание будет уделено сопоставлению семантики языков объектно-ориентированного и функционального программирования. В качестве примеров языков программирования будут выступать уже знакомый нам по предыдущему курсу язык SML и изучаемый нами язык C#.
Включить комментарии

|| Настройки

|| Модерация

|| Помощь


Далее, сформулируем вычислительную модель на основе состояний программы языка C#, для наглядности систематизировав ее в виде следующей таблицы:



Таблица 16.1. Вычислительная модель на основе состояний программы языка C#ПараметрДоменСоотношение
СостояниеState (s) State = Memory
ПамятьMemory (m) Memory = Ide
[Value + (unbound)]
ЗначениеValue (v) Value = Int + Bool


Заметим, что состояние программы в произвольный момент времени определяется состоянием "памяти" абстрактной машины той или иной формы. При этом под памятью понимается отображение из домена идентификаторов в домен значений (т.е. аналог связывания переменной со значением в ламбда-исчислении). Для корректной обработки исключительных ситуаций, возникающих в случае свободных переменных, вводится дополнительный элемент unbound. Домен значений представляет собой дизъюнктную сумму доменов, содержащих существующие в языке C# типы Int и Bool.

В соответствии с намеченной схемой рассуждений, перейдем к описанию семантических предложений, которые описывают значение денотатов (т.е. правильно построенных конструкций) языка C#.

Приведем семантические предложения для выражений языка программирования C#:

E : Exp -> [State -> [[Value ( State] + {error}]];

E[E]s = (v,s'),

если

v - значение E в s,

s'- состояние после означивания;

E[E]s = error,

если возникает ошибка несоответствия типов.

Из приведенных соотношений следует, что вычисление значения выражения языка программирования C# приводит к такому изменению состояния, что происходит связывание переменной со значением, либо (в случае невозможности связывания по причине несоответствия типов переменной и значения) вырабатывается ошибка. При этом состояние программы изменяется с s на s'.

Приведем семантическое предложение для команд языка программирования C#:

С:Com->[State->[State+{error}]].

Из приведенного соотношения следует, что вычисление значения команды языка программирования C# приводит, вообще говоря, к изменению состояния, причем возможно возникновение ситуации (например, несоответствия типов в ходе присваивания), при которой вырабатывается ошибка.



В соответствии с намеченной схемой рассуждений, перейдем к описанию семантических предложений, которые описывают значение конкретных денотатов (т.е. правильно построенных конструкций) языка C#. Рассмотрим семантические предложения для денотатов констант целочисленного типа языка C#:

E[0]s=(0,s); E[1]s=(1,s);

Как видно из приведенных соотношений, денотатами констант целочисленного типа являются значения этих констант (в форме упорядоченных пар вида "значение"-"состояние"), причем смены состояния программы не происходит. Рассмотрим семантические предложения для денотатов констант логического типа языка C#:

E[true]s=(true,s); E[false]s=(false,s);

Как видно из приведенных соотношений, денотатами констант логического типа являются значения этих констант (в форме упорядоченных пар вида "значение"-"состояние"), причем смены состояния программы не происходит. Рассмотрим семантическое предложение для денотатов идентификаторов языка C#:

E[I]s=(m,I=unbound) error, -> (m,I,s).

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

Рассмотрим семантические предложения для денотатов выражений языка C#:

E[!E]s = (E [E] s=(v, s')) (isBool -> (not v, s'), error), error; E [E1=E2] s = (E [E1]s = (v1, s1)) -> (E [E2] s1 = (v2, s2)) -> (v1 = v2, s2), error), error; E [E1+E2] s = (E [E1] s=(v1, s1)) -> (E [E2] s1 = (v2, s2)) -> (IsNum v1 and IsNum v2 -> v1 + v2, s2), error),error),error.

Проанализируем полученные соотношения.

Денотатом отрицания выражения является отрицание его значения; причем состояние программы изменяется. В случае несоответствия типов или небулевости выражения генерируется сообщение об ошибке.

Денотатом присваивания является присвоенное значение в новом состоянии.


В случае несоответствия типов генерируется сообщение об ошибке.

Денотатом сложения является значение суммы в новом состоянии. В случае несоответствия типов генерируется сообщение об ошибке.

В качестве упражнения предлагается самостоятельно разработать семантические предложения для денотатов команд языка программирования C#.

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

Важнейший вывод, к которому мы неизбежно приходим к концу лекции, заключается в том, что семантики рассмотренных нами языков программирования SMalL и C# (которые являются подмножествами реальных языков SML и C#) имеют весьма много общего.

Более того, сходство семантики рассмотренных нами конструкций (команд и выражений) языков программирования SMalL и C# весьма прозрачно и очевидно. Для иллюстрации справедливости этого утверждения достаточно сопоставить результаты исследования семантики рассматриваемых языков программирования.

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

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

В завершение лекции хотелось бы указать на аналогию теории вычислений Д. Скотта и ламбда-исчисления (как метатеорий) со средой Microsoft .NET (как метасредой), которые принципиально обеспечивают возможность "погружения" в себя различных языков и подходов к программированию.

Для более подробного самостоятельного ознакомления с тематикой лекции рекомендуется следующий список источников: [ 24, 35, 39, 42, 45, 53, 69, 73].


Содержание раздела