Функциональные языки программирования синтаксис

СИНТАКСИС И СЕМАНТИКА ФУНКЦИОНАЛЬНЫХ ПРОГРАММ

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

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

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

В 1960-х гг. X. Барендрегтом (Hendrik Barendregt) был детально описан синтаксис лямбда-исчисления — математической формализации, поддерживающей языки функционального программирования. Примерно в то же время Дж. Бэкусом (John Backus) были созданы основы формализации синтаксиса языков программирования посредством специального математического языка. Позднее П. Науром (Peter Naur) этот язык (а с точки зрения целевого языка программирования — метаязык) был доработан, в результате чего возникла математическая нотация, известная и сегодня под названием «форм Бэкуса — Наура» (БНФ).

Заметим, что эта нотация была специально разработана с целью формализации синтаксиса языка программирования (в то время это был весьма популярный, прежде всего в математической среде, язык программирования ALGOL 60 с ясным, но довольно пространным синтаксисом). Формы Бэкуса — Наура и в современных условиях являются теоретически адекватным и практически применимым средством формализации синтаксиса языков программирования.

Читайте также:  Методы математического программирования позволяющие решать задачи

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

Забегая вперед, заметим, что значение конструкций языка программирования описывается и исследуется семантикой (о ней речь пойдет в следующем параграфе), а вопросы и ценность практической применимости — прагматикой.

Основной задачей синтаксиса является определение формы и вида допустимых языковых конструкций. Эту задачу возможно решить путем перечисления описаний всех языковых конструкций. Одним из механизмов такого описания является уже упомянутая нотация БНФ.

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

Наконец, в случае, если все конструкции языка, присутствующие в тексте программы, являются синтаксически корректными, а также не выявлено несоответствий типов, запрещенных с точки зрения анализатора корректности типизации, производится преобразование текста программы в промежуточный код (P-код, ассемблер, код той или иной абстрактной машины) или собственно машинный код. Рассмотрим синтаксис языка программирования F# в сравнении с синтаксисом лямбда-исчисления. Для большей наглядности и сопоставимости формализаций синтаксиса обоих языков (языка формальной математической теории и языка программирования) будем использовать единую нотацию, а именно БНФ.

Прежде всего, необходимо договориться об обозначениях. Рассмотрим традиционные обозначения БНФ и поясним смысл каждого из них.

Читайте также:  Среда программирования visual basic основные элементы управления свойства элементов события

Фактически БНФ представляют собой определения одних понятий через другие. При этом понятия заключаются в угловые скобки и используется ряд специализированных символов и соглашений, суть которых поясняется далее. Определяющий символ «::=» разделяет определяемую конструкцию от составляющих ее ранее определенных базовых конструкций. Определяемая конструкция записывается слева от «::=» в угловых скобках « ». Альтернативы (возможные варианты) конструкций перечисляются по вертикали. Цитирование (подобно тому, как мы цитировали специальные символы, заключая их в двойные кавычки) не имеет обозначения.

Проиллюстрируем формализацию синтаксиса формальной системы посредством нотации БНФ, рассмотрев в качестве примера знакомое нам по предыдущим главам лямбда-исчисление:

Поясним смысл приведенных обозначений.

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

  • 1) константы;
  • 2) переменной;
  • 3) двух выражений, заключенных в круглые скобки, г.е. операции аппликации лямбда-выражений;
  • 4) символа к, за которым следует переменная, точка и выражение, т.е. операции абстракции лямбда-выражений.

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

Для иллюстрации перечисленных выше тезисов рассмотрим важнейшие синтаксические категории языка программирования F#. Под выражением будем понимать обозначение конструкции языка, которой может быть присвоено значение (константы, переменной, функции и т.д.). Описанием будем в дальнейшем называть запись, связывающую выражение языка программирования с именем, обозначающим его в программе (идентификатором). Под термином «зарезервированное» (или, иначе, «служебное») слово будем иметь в виду конструкцию языка, однозначно интерпретируемую в качестве инструкции языка программирования (например, «if», «then», «let»). Напомним, что в данной нотации цитирование производится без кавычек или других символов-ограничителей. Комментарием назовем произвольный поясняющий текст к программе, который, согласно синтаксису языка F# положено заключать в ограничители вида «(*» и «*)», а «//» — комментарий до конца строки.

Продолжим обсуждение синтаксических категорий языка программирования F#. В частности, рассмотрим структуру основных синтаксически допустимых типов выражений языка. Приведем соответствующую формализацию в терминах БНФ:

Читайте также:  Пример программы системного программирования

Как видно из БНФ-формализации, синтаксически корректным выражением в языке программирования F# считается:

  • 1) идентификатор (т.е. имя переменной, константы, функции или тина, обычно представляемой в виде алфавитно-цифровой последовательности ограниченной длины и начинающейся с буквенного символа);
  • 2) литерал (литералы будут рассмотрены далее);
  • 3) последовательность из двух выражений;
  • 4) последовательность из двух выражений, соединенных идентификатором.

В дополнение к перечисленным на предыдущем слайде альтернативам синтаксически допустимыми выражениями языка программирования F#, как следует из БНФ

  • 1) три выражения, соединенные зарезервированными словами if («если»), then («тогда») и else («в противном случае»), называемые условным выражением и фактически представляющие собой предикатную функцию, которая реализует выполнение второго выражения в случае истинности первого и выполнение третьего в противном случае;
  • 2) конечную последовательность выражений, заключенную в круглые скобки (или так называемый кортеж) и применяемую для структуризации данных;
  • 3) описание и выражение, соединенные зарезервированным словом in («в»), которые определяют операцию подстановки описания в выражение с учетом всевозможных вхождений в него указанного фрагмента описания;
  • 4) выражение, заключенное в круглые скобки (как мы уже знаем, в лямбда-исчислении и комбинаторной логике эту операцию можно производить без ограничений) и используемое для явного указания приоритета операции.

Перейдем к рассмотрению структуры синтаксически допустимых видов описаний объектов языка. Приведем соответствующую формализацию в терминах БПФ:

let = | let «^последовательность неременных> =

Синтаксически допустимыми описаниями языка программирования F#, как следует из представленной БНФ, являются:

  • 1) идентификатор и выражение, соединенные зарезервированными словами let и =, которые обозначают связывание идентификатора (переменной, константы или другого синтаксически допустимого объекта языка программирования) с тем или иным выражением;
  • 2) идентификатор, последовательность переменных и выражение, соединенные зарезервированными словами let и =, которые обозначают связывание функции (обозначенной первым идентификатором) с выражением, которое определяет порядок вычисления значения.

Перейдем к рассмотрению структуры синтаксически допустимых видов описаний типов объектов языка. Приведем соответствующую формализацию в терминах БНФ:

Sbytel intl6 | uint 16| uint32| int64| uint64|

Источник

Оцените статью