Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
shpory-1,5,6.docx
Скачиваний:
5
Добавлен:
17.09.2019
Размер:
857.51 Кб
Скачать

Тема 5. Синтаксис мов програмування

В лекції розглядаються питання, пов'язані з понятійному апарату, історії розвитку та виразним можливостям синтаксичного представлення формальних теорій і мов програмування.

Формалізуємо основні конструкції мови програмування SML допомогою форм Бекуса-Наура або БНФ (історія їх створення викладена у вступній лекції).

Неформально визначимо синтаксис (мови програмування або математичної теорії) як форму конструкцій (програми або теорії) і способів їх комбінування. Більш точне визначення синтаксису буде сформульовано далі в ході лекції.

Визначимо поняття синтаксису більш строго.

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

Забігаючи наперед, зауважимо, що значення конструкцій мови програмування описується і досліджується семантикою (про неї мова піде в наступній лекції), а питання і цінність практичної застосовності - прагматикою.

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

Ми будемо розглядати паралельно БНФ-формалізації синтаксису ламбда-обчислення і мови програмування SML. В останньому випадку ми обмежимося базовим набором конструкцій мови, підкресливши такі суттєві можливості, як кортежі (tuples) і let-вирази.

Для формування правильного розуміння ролі і місця синтаксису в дослідженні мов програмування розглянемо узагальнену схему трансляції вихідного тексту програми (написаної, наприклад, на мові програмування SML) в машинний код.

В ході трансляції програми, перш за все, виконується так звана процедура лексичного аналізу, яка включає в себе виділення в тексті програми елементарних конструкцій мови, або, інакше, лексем (зокрема, імен змінних або ідентифікаторів, спеціальних або ключових слів, значень констант, змінних та ін.)

По завершенні лексичного аналізу виконується так звана процедура синтаксичного розбору тексту програми, яка являє собою перевірку коректності синтаксису тексту, написаного на мові програмування. Ця процедура, можливо, включає виконання перевірки коректності типізації в тій чи іншій формі.

Нарешті, у випадку, якщо всі конструкції мови, присутні в тексті програми, є синтаксично коректними, а також не виявлено невідповідностей типів, заборонених з точки зору аналізатора коректності типізації, виробляється перетворення тексту програми в проміжний код (асемблер, код тієї чи іншої абстрактної машини ) чи власне машинний код.

Розглянемо синтаксис мови програмування SML в порівнянні з синтаксисом ламбда-числення.

Для більшої наочності та порівнянності формалізацій синтаксису обох мов (мови формальної математичної теорії та мови програмування) будемо використовувати єдину нотацію, а саме, БНФ.

Перш за все, необхідно домовитися про позначення.

Розглянемо традиційні позначення БНФ і пояснимо сенс кожного з них.

Фактично БНФ є визначення одних понять через інші. При цьому поняття полягають в кутові дужки, і використовується ряд спеціалізованих символів і угод, суть яких пояснюється далі.

Визначальний символ ":: =" відокремлює визначається конструкцію від складових її раніше визначених базових конструкцій.

Обумовлена ​​конструкція записується зліва від ":: =" в кутових дужках "<" і ">".

Альтернативи (можливі варіанти) конструкцій перераховуються по вертикалі.

Цитування (подібно до того, як ми цитували спеціальні символи, укладаючи їх в подвійні лапки) не має позначення.

Проілюструємо формалізацію синтаксису за допомогою нотації БНФ, розглянувши як приклад формальної системи добре знайоме нам по попередніх лекцій ламбда-числення.

Пояснимо сенс наведених позначень.

У даному прикладі визначається поняття виразу, синтаксичне представлення якого може бути виражене у вигляді однієї з таких альтернатив:

константи;

змінної;

двох виразів, укладених в круглі дужки, тобто знайомої нам операції аплікації ламбда-виразів;

символу, за яким слід змінна, точка і вираз, тобто знайомої нам операції абстракції.

Виявляється, що синтаксис мови програмування SML має ряд очевидних аналогій з синтаксисом ламбда-числення. Ці аналогії є неминучими як в силу функціональної природи розглянутого мови програмування, так і на тій підставі, що мова SML розроблявся як засіб доведення теорем, а, значить, його синтаксис (а, забігаючи наперед, зауважимо, що й семантика) повинен бути прозорий математично .

Для ілюстрації перерахованих вище тез розглянемо найважливіші синтаксичні категорії мови програмування SML.

Під виразом будемо далі розуміти позначення конструкції мови, якою може бути присвоєно значення (константи, змінної, функції і т.д.).

Описом будемо надалі називати запис, що зв'язує вираз мови програмування з ім'ям, що позначає його в програмі (ідентифікатором).

Під терміном "зарезервоване" (або, інакше, службове) слово будемо мати на увазі конструкцію мови, однозначно интерпретируемую в якості інструкції мови програмування (наприклад, "if", "then", "let"). Нагадаємо, що в даній нотації цитування проводиться без лапок або інших символів-обмежувачів.

Коментарем назвемо довільний пояснювальний текст до програми, який, згідно синтаксису мови SML, покладено укладати в обмежувачі виду "(*" і "*)".

Продовжимо обговорення синтаксичних категорій мови програмування SML.

Зокрема, розглянемо структуру основних синтаксично допустимих типів виразів мови.

Наведемо відповідну формалізацію у термінах БНФ.

<выражение> ::= <идентификатор> | <литерал> |

<выражение> <выражение> |

<выражение> <идентификатор> <выражение>

Як видно з БНФ-формалізації, синтаксично коректним вираженням у мові програмування SML вважається:

ідентифікатор (тобто ім'я змінної, константи, функції або типу, зазвичай представляється у вигляді алфавітно-цифровий послідовності обмеженої довжини і починається з літерного символу) або

літерал (літерали будуть розглянуті далі в ході лекції) або

послідовність з двох виразів або

послідовність з двох виразів, з'єднаних ідентифікатором.

Продовжимо обговорення виразів.

На додаток до перерахованих альтернатив, синтаксично допустимими виразами мови програмування SML, також є:

if <выражение> then <выражение>

else <выражение> |

( <выражение> ... <выражение> ) |

let <описание> in <выражение> end |

( <выражение> )

два вирази, з'єднані зарезервованими словами if ("якщо"), then ("тоді") і else ("інакше"), звані умовним вираженням і фактично представляють собою предикатную функцію, яка реалізує виконання другого вираження в разі істинності першого і виконання третього в іншому випадку;

кінцеву послідовність виразів, укладену в круглі дужки (або так званий кортеж) і застосовується для структуризації даних;

опис і вираз, з'єднані зарезервованими словами let ("покладемо"), in ("в") і end ("кінець"), які визначають операцію підстановки опису в вираз з урахуванням всіляких входжень в нього зазначеного фрагмента опису;

вираз, укладену в круглі дужки (як ми вже знаємо, в ламбда-обчисленні і комбінаторної логіки цю операцію можна проводити без обмежень) і використовується для явної вказівки пріоритету операції.

Продовжимо обговорення синтаксичних категорій мови програмування SML.

Перейдемо до розгляду структури синтаксично допустимих видів описів об'єктів мови.

Наведемо відповідну формалізацію у термінах БНФ

<описание> ::=

val < идентификатор > = < выражение > |

fun < идентификатор > < идентификатор > =

< выражение > |

local < описание > in <описание> end

Синтаксично допустимими описами мови програмування SML, як випливає з представленої БНФ, є:

ідентифікатор і вираз, з'єднані зарезервованими словами val і "=", які позначають зв'язування ідентифікатора (змінної, константи або іншого синтаксично допустимого об'єкта мови програмування) з тим чи іншим виразом;

три ідентифікатора і вираз, з'єднані зарезервованими словами fun і "=", які позначають зв'язування функції (позначення перших ідентифікатором) з параметром (позначення другого ідентифікатором) з виразом, що визначає порядок обчислення значення;

два описи, поєднані зарезервованими словами local, in та end, які позначають локальне визначення першого опису в контексті другого.

Продовжимо обговорення синтаксичних категорій мови програмування SML.

Перейдемо до розгляду структури синтаксично допустимих описів типів об'єктів мови.

Наведемо відповідну формалізацію у термінах БНФ.

<тип> ::= int | bool |

<тип> * ... * <тип> |

<тип> -> <тип>

Як випливає з представленої БНФ, синтаксично допустимими типами мови програмування SML є:

цілочисельні величини, що позначаються зарезервованим словом int;

логічні значення, що позначаються зарезервованим словом bool;

кортежі - впорядковані n-ки елементів певних типів;

функції - впорядковані n-ки елементів певних типів, з'єднаних зарезервованими символами "->".

Розглянемо наступний приклад, який ілюструє приписування типів у мові SML.

Константа типа кортеж вида (0,false,1,true) имеет тип (int*bool*int*bool).

Зауважимо, що варіанти типів (1) і (2) є елементарними, тоді як (3) і (4) представляють собою похідні типи не зазначено (або виведеної) структурою, звідки і походить назва "структурований тип".

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

Розглянемо детальніше синтаксичні особливості основних видів літералів.

Наведемо відповідну формалізацію у термінах БНФ.

<литерал> ::= <литерал целого типа> |

<литерал строкового типа> |

<литерал вещественного типа>

Як випливає з представленої БНФ, синтаксично допустимими типами літералів в мові програмування SML є наступні:

цілочисельні літерали, що мають тип int і лежать в діапазоні від -230 до +230 (останнє обставина пов'язана з особливостями машинного представлення даних);

рядкові літерали, що мають тип string і які становлять алфавітно-цифрові послідовності символів в коді формату ASCII;

речові літерали, що мають базовий тип real, узагальнену форму виду M x 10E, де M - мантиса в діапазоні від -1 до +1, а E - порядок у відповідному діапазоні.

Зауважимо, що значення (тобто семантика) літералів повною мірою визначається їх лексичним (а, значить, і синтаксичним) поданням.

Продовжимо обговорення синтаксичних категорій мови програмування SML.

Перейдемо до розгляду фундаментальної з точки зору формалізації мов функціонального програмування - ламбда-числення - операції аплікації функцій.

Наведемо відповідну формалізацію у термінах БНФ:

<Вираз> <вираз>

Як випливає з представленої БНФ, синтаксично допустима конструкція мови програмування SML, що описує операцію аплікації, дуже точно відповідає опису операції аплікації в ламбда-численні.

Проілюструємо аплікацію функції до аргументу в мові програмування SML наступним прикладом.

Розглянемо функцію succ, яка задається визначенням

fun succ n = n +1;

і здійснює додаток одиниці до (целочисленному) аргументу.

Для даної функції succ синтаксично коректна аплікація може мати вигляд succ 2 і обчислюватися в ході виконання програми в значення 3.

Продовжимо обговорення синтаксичних категорій мови програмування SML.

Перейдемо до розгляду синтаксично допустимих конструкцій мови програмування SML, званих умовними виразами.

Наведемо відповідну формалізацію у термінах БНФ:

if <вираз> then <вираз> else <вираз>;

Як видно з БНФ-формалізації, синтаксично коректне умовний вираз складається з трьох подвираженій, з'єднаних зарезервованими словами if, then і else, вже згадуваних нами в ході лекції.

Додамо до сказаного ряд необхідних зауважень. По-перше, результатом обчислення перший вираз має бути логічне значення. По-друге, типи другого і третього виразів повинні збігатися. Нарешті, частина умовного висловлювання, що починається з else, не є обов'язковою.

Зауважимо також, що функції порівняння вбудовані в мову SML і мають вигляд: "=" (дорівнює), "<" (менше), ">" (більше), "<=" (менше або дорівнює), "> =" ( більше або дорівнює), "<>" (не дорівнює). Результатом обчислення будь-якої з цих функцій є логічне значення.

Проілюструємо синтаксис умовного вираження таким прикладом на мові SML:

if n> = 10 then 1 else 0;

Зауважимо, що наведене вираз може використовуватися для аналізу параметра функції, що обчислює, наприклад, кількість розрядів десяткового числа.

Продовжимо обговорення основних синтаксичних категорій мови програмування SML.

Розглянемо структуру синтаксично допустимих конструкцій, відомих під назвою let-виразів.

Наведемо відповідну формалізацію у термінах БНФ:

let <опис> in <вираз> end;

Як видно з БНФ-формалізації, синтаксично коректне let-вираз складається з опису і вирази, з'єднаних зарезервованими словами let, in та end.

Як можна зрозуміти з синтаксису, let-вираз являє собою ні що інше, як підстановку значення в ламбда-абстракцію. Let-вирази використовуються в мові програмування SML для зв'язування значень та оптимізації обчислень, зокрема, для забезпечення багаторазового обчислення повторюваних фрагментів програми.

Проілюструємо синтаксис let-виразів прикладами з мови програмування SML.

Розглянемо наступні let-вирази:

let val n=2 in n+1 end;

let k=9876*8765 in (k-1, k, k+1) end;

Як можна помітити, перше вираз являє собою ні що інше, як підстановку, яку можна формалізувати ламбда-термом виду. Другий вираз дозволяє звести багаторазове обчислення громіздкою операції (множення) до однократному.

В ході лекції неодноразово згадувалося поняття кортежу.

Розглянемо докладніше цей вельми важливий (особливо при реалізації функцій) вид синтаксичних конструкцій мови програмування SML.

Наведемо формалізацію синтаксично допустимого подання кортежу в термінах БНФ:

(<Вираз>, ..., <вираз>)

Виходячи з виду БНФ-формалізації, уточнимо поняття кортежу. Кортежем називається група, що складається, щонайменше, з двох виразів (можливо, мають різні типи), об'єднана в відокремлену сукупність.

Зауважимо, що кортежі використовуються в SML для реалізації багатомісних (що мають більше одного аргументу) функцій, а більш широко в теорії і практиці програмування - у реляційних базах даних (в яких дані представляються у вигляді таблиць), оскільки кортеж являє собою, по суті, рядок такої таблиці.

Проілюструємо синтаксис конструкції кортежу прикладами з мови програмування SML:

Приклад 1: (1, 2 * 1, 2 * 2 * 1)

Приклад 2: (1, true, 0, false)

Зауважимо, що у випадку єдиного вираження кортеж вироджується у вираз в дужках. Природно, що будь-SML-вираз можна укласти в дужки, наприклад для явної вказівки пріоритету аплікацій, арифметичних і логічних операцій.

Отриманий в ході лекції досвід розгляду основних видів синтаксичних конструкцій мови програмування SML дозволяє перейти до формального синтаксису таких фундаментальних мовних конструкцій як опису змінних і функцій.

Розглянемо формалізації синтаксично коректних описів змінних і функцій у термінах БНФ:

<Опис> :: =

val <ідентифікатор> = <вираз>

<Опис> :: =

fun <ідентифікатор> <ідентифікатор> =

<Вираз>

Перше визначення є опис змінної, друге - функції. При цьому обидва визначення мають схожу структуру.

Проілюструємо формальні описи змінних і функцій наступними прикладами:

Приклад 1. val x = 2;

Приклад 2. fun fact n =

if n <2 then 1

else n * fact (n - 1);

Приклад 3. fun f (x, y) = x * x + y * y;

Перший з наведених прикладів являє собою опис (целочисленной) змінної x, другий - рекурсивної (самопріменімой) функції fact обчислення факторіала (твори натуральних чисел від 1 до n), а третій - двомісної функції f, що обчислює суму квадратів аргументів.

Зауважимо на закінчення, що саме при реалізації останньої функції використовуються кортежі (оскільки синтаксис SML в "чистому" вигляді, як випливає з БНФ, допускає застосування тільки одномісних функцій).

Отже, в даній лекції були розглянуті основні види синтаксичних конструкцій мови програмування SML. За підсумками обговорення можна зробити наступні висновки:

синтаксис мов функціонального програмування досить близький до синтаксису формальних теорій, на яких вони засновані (зокрема, це справедливо для ламбда-обчислення і мови SML);

БНФ є актуальною та адекватною формалізацією синтаксису мови;

мова програмування SML, на відміну від ранніх мов функціонального програмування, має ряд розширених конструкцій (кортежі, let-вирази та ін.)

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]