Коротко
Мови програмування складаються з синтаксису, який представляє програму як рядки символів, і семантики, яка є цільовим значенням програми.
Формальні мови - це синтаксис без значення. Він має на меті вивчити структуру наборів рядків, визначених формально, не надаючи значення цим рядкам.
Регулярне вираження та інші формалізми (наприклад, граматики без контексту) використовуються для визначення формальних мов, використовуваних як синтаксичний компонент програмування та природних мов, тобто для подання речень структурованим чином. Інші механізми використовуються для зв'язку цієї структури з семантикою мов програмування.
Тут багато чого спрощено, особливо щодо природної мови.
З набагато більше деталей
Щоб відповісти на ваше запитання, ми повинні почати спочатку. Мова у звичному розумінні - це неофіційно засіб передачі інформації чи ідей. У мові зазвичай розрізняють синтаксис і семантику. Семантика - це те, про що ти хочеш поговорити / написати. інформацію, яку ви хочете передати. Синтаксис - це засіб, який ви використовуєте для його передачі, тобто звичайне представлення, яке можна обмінюватися між людьми, а тепер також між людьми та пристроями, або між пристроями (комп'ютерами).
Як правило, ви будете використовувати слово, dog
щоб передати ідею собаки. Слово dog
складається з трьох букв, або якогось еквівалентного звучання, і покликане представляти якусь тварину. Ключова ідея полягає в тому, що спілкування здійснюється через представлення того, що має бути передано. Структури представлення зазвичай називають синтаксисом, тоді як те, що представлено, називається семантикою. Це більше або менше стосується як природної мови, так і мови мов програмування.
Слова - це синтаксичні утворення, які представляють більш-менш елементарні смислові поняття. Але ці елементарні поняття мають бути складені різними способами, щоб надати більш складного значення. Ми пишемо,
the dog
щоб передати, що ми маємо на увазі конкретну собаку, і the dog bites the cat
передати більш складну ідею. Але спосіб організації слів має бути зафіксований правилами, щоб ми могли сказати, хто з собаки та кота насправді кусає іншого.
Тож у нас є такі правила, як такі sentence -> subject verb complement
, які повинні відповідати реченням і розповідати, як ідеї, пов'язані з кожною частиною, артикулюються. Ці правила є синтаксичними правилами, оскільки вони говорять нам про те, як слід організувати представлення нашого повідомлення. Сам subject
кан може бути визначений правилом subject -> article noun
тощо.
2 х + 1 = 23х123
equation -> expression "=" expression
expression -> expression "+" expression
expression -> number
Структура мов програмування однакова. Мови програмування семантично спеціалізуються на вираженні обчислень, які слід виконати, а не на вираженні проблем, що вирішуються, доказі теорем або дружніх стосунків між тваринами. Але це головна відмінність.
Представлення, що використовуються в синтаксисі, зазвичай є рядками символів або звуками для розмовних мов. Семантика зазвичай належить до абстрактного домену або, можливо, до реальності, але все ще абстрагується в наших мисленнєвих процесах, або до поведінкової області пристроїв. Комунікація тягне за собою кодування інформації / ідеї в синтаксис, який передається та розшифровується одержувачем. Потім результат будь-яким чином інтерпретується приймачем.
Тож те, що ми бачимо в мові, - це переважно синтаксис та його структура. Наведений вище приклад - лише один із найпоширеніших способів визначення синтаксичних рядків та їх структурної організації. Є й інші. Для даної мови деяким рядкам може бути призначена структура, і, як кажуть, належать до мови, а інші - ні.
Те саме стосується слів. Деякі послідовності літер (або звукових) є законними словами, а інші - ні.
Формальні мови - це просто синтаксис без семантики. Вони визначають за допомогою набору правил, які послідовності можна побудувати, використовуючи основні елементи алфавіту. Те, що є правила, може бути дуже змінним, іноді складним. Але формальні мови використовуються для багатьох математичних цілей поза лінгвістичним спілкуванням, будь то природні для мов програмування. Набір правил, що визначають рядки в мові, називається граматикою. Але існує багато інших способів визначення мов.
На практиці мова структурована на два рівні. Лексичний рівень визначає слова, побудовані з алфавіту символів. Синтаксичний рівень визначає речення, або програми, побудовані з алфавіту слів (а точніше із сімей слів, щоб він залишався скінченним алфавітом). Це обов'язково дещо спрощується.
Структура слів досить проста у більшості мов (програмова або природна), так що їх зазвичай визначають тим, що зазвичай вважається найпростішим видом формальної мови: звичайними мовами. Їх можна визначити за допомогою регулярних виразів (regexp) і досить легко ототожнювати з запрограмованими пристроями, які називаються автоматизаторами кінцевого стану. У випадках мов програмування приклади слова - це ідентифікатор, ціле число, рядок, дійсне число, зарезервоване слово, таке як if
або repeat
, розділовий символ або відкрита дужка. Прикладами сімей слів є ідентифікатор, рядок, ціле число.
Синтаксичний рівень зазвичай визначається дещо складнішим типом формальної мови: без контекстними мовами, використовуючи слова як алфавіт. Правила, які ми бачили вище, - це контекстні правила для природної мови. У випадку мов програмування правилами можуть бути:
statement -> assignment
statement -> loop
loop -> "while" expression "do" statement
assignment -> "identifier" "=" expression
expression -> "identifier"
expression -> "integer"
expression -> expression "operator" expression
За допомогою таких правил ви можете писати:
while aaa /= bbb do aaa = aaa + bbb / 6
що є твердженням.
А спосіб її отримання може бути представлений структурою дерева, що називається деревом розбору або деревом синтаксису (тут не повне):
statement
|
_______________ loop _______________
/ / \ \
"while" expression "do" statement
__________|_________ |
/ | \ assignment
expression "operator" expression _______|_______
| | | / | \
"identifier" "/=" "identifier" "identifier" "=" expression
| | | |
aaa bbb aaa ... ...
Імена, що з’являються зліва від правила, називаються нетермінальними, тоді як слова називаються також термінальними, оскільки вони є в алфавіті для мови (вище лексичного рівня). Нетермінальні представляють різні синтаксичні структури, які можна використовувати для складання програми.
Такі правила називаються безконтекстними, оскільки нетермінальний термін може бути замінений довільно, використовуючи будь-яке з відповідних правил, незалежно від контексту, в якому він з’являється. Набір правил, що визначають мову, називається граматикою без контексту.
Насправді існують обмеження щодо цього, коли ідентифікатори потрібно спочатку оголосити, або коли вираз повинен відповідати обмеженням типу. Але таке обмеження може розглядатися як семантичне, а не синтаксичне. Насправді деякі фахівці розміщують їх у тому, що вони називають
статичною семантикою .
З огляду на будь-яке речення, будь-яку програму, значення цього речення витягується шляхом аналізу структури, заданої деревом розбору для цього речення. Отже, дуже важливо розробити алгоритми, які називаються парсерами, які можуть відновити структуру дерева, відповідну програмі, коли задано програму.
Розбору передує лексичний аналізатор, який розпізнає слова та визначає родину, до якої вони належать. Потім послідовність слів або лексичних елементів надається аналізатору, який отримує структуру дерева. З цієї структури компілятор може потім визначити, як генерувати код, який є його смисловою частиною програми обробки на стороні компілятора.
Аналізатор компілятора може фактично побудувати структуру даних, що відповідає дереву розбору та передати його на пізніші етапи процесу компіляції, але цього не потрібно. Запуск алгоритму розбору дорівнює розробці обчислювальної стратегії для вивчення синтаксичного дерева, яке міститься в тексті програми. Це дерево синтаксису / синтаксичного розбору може або не може бути виражене в процесі, залежно від стратегії компіляції (кількість етапів). Однак необхідно, що в кінцевому рахунку є хоча б одне дослідження дерева розбору знизу вгору, незалежно від того, чи це експліцитно чи ліво неявно в структурі обчислень.
Інтуїтивно зрозумілою причиною цього є те, що стандартним формальним способом визначення семантики, пов'язаної з синтаксичною структурою дерева, є те, що називається гомоморфізмом. Не бійтеся великого слова. Ідея полягає лише в тому, щоб розглянути сенс цілого будується із значення частин, на основі оператора, який їх з'єднує.
Наприклад, речення the dog bites the cat
можна проаналізувати за допомогою правила sentence -> subject verb complement
. Знаючи зміст 3 Поддер subject
, verb
і complement
, зазвичай , яке складових їх говорять нам про те , що суб'єкт робить дію, і що кішка є той , хто кусає.
Це лише інтуїтивне пояснення, але його можна формалізувати. Семантика побудована вгору від складових. Але це приховує чимало складностей.
Внутрішня робота компілятора може бути розкладена на кілька етапів. Фактичний компілятор може працювати поетапно, використовуючи проміжні подання. Це може також об'єднати деякі етапи. Це залежить від використовуваної технології та від складності складання потрібної мови.