Вступ
Мавка0.122.0

Стисло, як працює Мавка?

Кроки виконання модуля Мавки такі:

  1. Перекодування
  2. Розбір
  3. Переклад
  4. Виконання

Перекодування

Мавка не розуміє юнікоду, а натомість розуміє КД. Відповідно, щоб виконувати сирий текст записаний кодуванням UTF-8, необхідно його спочатку перекодувати в КД.

Так як на більшості операційних систем та редакторів UTF-8 є кодуванням за замовчуванням, то ця процедура наразі виконується завжди. В подальшому можна буде вручну вказати кодування сирого тексту та оминути перекодування, якщо він вже закодований як КД.

Розбір

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

До прикладу, візьмемо такий код:

сума = 6 + 8

Для людини цей код читається і сприймається досить просто, але як це зобразити в коді? Розібрати.

Розбір має два кроки:

  1. На слова
  2. На сполуки

Розбір на слова перебирає весь текст на створює "послідовність слів" на основі визначеного набору слів. Це також зветься лексичним аналізом.

До прикладу, послідовність слів коду вище буде такою:

Ідентифікатор ЗнакРівно Число ЗнакПлюс Число

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

Тут ми якраз і створюємо структуровані предмети тексту коду, або як ще кажуть "абстрактне синтаксичне дерево", яке виглядатиме для коду вище грубо кажучи так:

Визначити { ідентифікатор = "сума", значення = ОпераціяДодавання { ліво = 6, право = 8 } }

Це також зветься синтаксичним аналізом.

Вже на цьому кроці, маючи такі структуровані предмети, досить просто виконати програму. Але Мавка йде трошки далі.

Переклад

Після розбору сирого тексту Мавки на сполуки, ці сполуки перетворюються на зрозумілі для Машини Мавки вказівки.

До прикладу, сполуки вище буде перекладено на такі вказівки:

ПокластиКонстанту 1 ;; 6 ПокластиКонстанту 2 ;; 8 Додати Визначити 0 ;; "сума"

Ці вказівки записуються в спеціальний предмет "Код" в Мавці, який надалі передається в Машину і виконується.

Виконання

Тут багато не скажеш, адже процедура досить комплексна. Але, якщо коротко, то Машина перебирає всі вказівки та виконує кожну.

Ось неповний псевдокод виконання:

дія виконати_код(М: адреса<Машина>, код: адреса<ПредметКоду>) -> адреса<Предмет> { змінна пв: натуральне = 0; змінна результат: адреса<Предмет> = пусто; поки пв < код.розмір { змінна вказівка = код.дані[пв]; якщо вказівка == ВПокласатиКонстанту { // ... } інакше якщо вказівка == ВДодати { // ... } інакше якщо вказівка == ВВизначити { // ... } інакше { увімкнути_стан_падіння(М, "Невідома вказівка"); вернути пусто; } пв += 1; } вернути результат; }