
- •8.1. Определение синтаксиса
- •8.1.1. Схема трансляции программы
- •8.2. Сравнение синтаксиса sml и ламбда-исчисления
- •8.2.1. Обозначения бнф
- •8.2.2. Синтаксис ламбда-исчисления
- •8.2.3. Синтаксис sml
- •9.1. Обобщенные требования к описанию языков программирования
- •9.2. Семантика языка программирования
- •9.3. Теория вычислений д. Скотта
- •9.3.1. Последовательность изложения теории вычислений д. Скотта
- •9.3.2. Определения способов комбинирования доменов
- •9.4. Формализация семантики языка функционального программирования sml
- •9.4.1. Порядок построения формальной модели семантики языка программирования sMalL согласно ранее представленному формальному описанию синтаксиса языка в терминах бнф
- •9.4.2. Вычислительная модель на основе состояний программы языка sMalL
- •9.5. Описание семантических предложений
- •9.5.1. Семантические предложения для выражений
- •9.5.2. Семантические предложения для команд
- •9.5.3. Семантические предложения для денотатов
9.1. Обобщенные требования к описанию языков программирования
1. Соблюдение принципа полноты, т.е. оснастить язык программирования таким набором конструкций, который позволяет описать синтаксис (и семантику) всех допустимых конструкций языка без пропусков существенных аспектов.
2. Язык программирования должен удовлетворять интуитивному требованию ясности, а именно, объективно обеспечивать удобочитаемость программ, а также легкость и результативность поиска ответов на вопросы, возникающие в процессе разработки программных проектов.
3. Естественность, под которой мы будем понимать интуитивную близость языка терминологии разработчика, а также использование унифицированных, стандартных, привычных обозначений.
4. Реализм, который понимается как учет естественных ограничений на среду реализации языка программирования, а именно, объем оперативной памяти, время реакции и целый ряд других существенных факторов.
После обсуждения концептуально важных требований к языкам программирования в целом перейдем к неформальному обсуждению семантического подхода, способного обеспечить реализацию этих требований.
9.2. Семантика языка программирования
Прежде всего, расширим представление о семантике языка программирования (или формальной теории) хотя и предварительным, но более конкретным определением этого понятия.
Семантикой будем называть интерпретацию (или, иначе, смысловое значение) абстрактного синтаксиса (а точнее, множества допустимых видов конструкций языка), представленное в терминах той или иной математически строгой формальной модели.
Все многообразие возможных подходов к семантике можно в основном представить всего двумя типами семантик:
1) семантиками, ориентированными на компиляцию,
2) семантиками, ориентированными на интерпретацию.
1. Под подходами к семантике, ориентированными на компиляцию, будем понимать такие подходы, в которых семантика представляет собой множество преобразований над синтаксической моделью в той или иной форме.
2. Под подходами к семантике, ориентированными на интерпретацию, будем понимать такие подходы, в которых семантика представляет собой множество описанных на специально построенном метаязыке преобразований синтаксически правильных конструкций языка программирования.
Сразу отметим, что целям курса в большей степени соответствует второй подход, как более универсальный в силу того обстоятельства, что в нем используется метатеория, т.е. формализация, моделирующая преобразования текста программ.
Направления в семантике, ориентированной на интерпретацию
Выделим основные направления, существующие в рамках подхода к семантике, ориентированного на интерпретацию, и свяжем их с рассмотренными нами в ходе лекции направлениями исследований.
Оказывается, существует три основных вида семантик, ориентированных на интерпретацию:
1) операционные семантики. Значение конструкций языка в таких семантиках выражается в терминах переходов той или иной абстрактной машины из одного состояния в другое. В качестве показательных примеров абстрактных машин можно привести, в частности, так называемую SECD-машину П. Лендина, а также категориальную абстрактную машину. Обе формализации будут рассмотрены подробнее в ходе дальнейших лекций.
2) пропозиционные семантики. В отличие от операционных семантик, значение конструкций языка в таких семантиках выражается в терминах множества формул, описывающих состояния объектов программы. В качестве примеров можно привести, в частности, аксиоматический метод Хоара и метод индуктивных утверждений Флойда.
3) денотационные семантики, в которых смысл конструкций языка представляется в терминах абстракции функций, оперирующих состояниями программы. В частности, данный подход иллюстрирует теория вычислений Д. Скотта, основанная на семантических доменах, которую мы и предлагаем вниманию читателя.