Статья 3: Три мастера для одного языка. Как компьютер понимает руны.

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

Итак, у нас есть концепция и есть алфавит, полный глубоких образов. Но как заставить бездушный кремний компьютера понять, что Λ — это не просто значок, а незыблемая Гора-Константа? Как научить его читать наши руны?

Этот пост — о том, как мы создавали «мозг» нашего языка. О трех «мастерах», которые вдыхают жизнь в наш код.

В компьютерной науке их называют Лексер, Парсер и Интерпретатор, но в нашей философии они получили свои имена: Танушы, Құрастырушы и Іске Асырушы.

Представьте, что наш код — это просто непрерывный поток символов. Компьютер не видит в нем ни рун, ни имен. Задача первого мастера, «Танушы» (Распознающего), — всмотреться в этот поток и распознать знакомые образы.

Он не пытается понять смысл предложения. Он лишь идентифицирует отдельные «слова» — лексемы или токены.

  • Увидев , он говорит: «Это Руна_Переменной».
  • Увидев san, он говорит: «Это Идентификатор (имя)».
  • Увидев :, он говорит: «Это Оператор_Присвоения».
  • Увидев 10, он говорит: «Это Целочисленный_Литерал».

Например, простую строку кода:

— □ a : 10

«Танушы» превращает в осмысленную последовательность токенов:

[Runa_Var] [Runa_Type_Int] [Identifier: "a"] [Op_Assign: ":"] [IntegerLiteral: 10]

После его работы вместо хаоса символов у нас появляется четкий список распознанных элементов. Но как они связаны друг с другом, система все еще не знает.

Здесь в дело вступает второй мастер, «Құрастырушы» (Собирающий или Архитектор). Он берет поток токенов от «Танушы» и проверяет, соответствуют ли они грамматике нашего языка.

Он — хранитель законов.

Он смотрит на последовательность [Runa_Var] [Runa_Type_Int] [Identifier] [Op_Assign] [IntegerLiteral] и говорит: «Да, это соответствует правилу «Объявление переменной». Все верно». Если бы порядок был нарушен, «Құрастырушы» сообщил бы об ошибке.

Главный результат его работы — это «Ой Бәйтерегі» (Древо Мысли). В науке это называют Абстрактным Синтаксическим Деревом (AST). Он превращает плоский список токенов в иерархическую, древовидную структуру, которая отражает логику программы.

Для кода

— □ c : a * (b + 2)

Древо Мысли будет выглядеть примерно так, точно отражая приоритет операций (сначала сложение в скобках, потом умножение):

(Узел: ОбъявлениеПеременной, Имя: "c")
 |
 |-- (Значение: Узел_БинарнойОперации, Оператор: '*')
      |
      |-- Левая часть: (Узел: ДоступКПеременной, Имя: "a")
      |
      |-- Правая часть: (Узел_БинарнойОперации, Оператор: '+')
           |
           |-- Левая часть: (Узел: ДоступКПеременной, Имя: "b")
           |-- Правая часть: (Узел: Число, Значение: 2)

Теперь у нас есть не просто слова, а идеальный логический чертеж нашей программы.

У нас есть чертеж, но дом еще не построен. Здесь появляется последний мастер — «Іске Асырушы» (Исполнитель или Воплощающий). Его задача — взять «Древо Мысли» и воплотить его в жизнь.

Он обходит Древо узел за узлом и выполняет команды:

  • Увидев узел ОбъявлениеПеременной, он выделяет в памяти компьютера ячейку.
  • Увидев узел БинарнаяОперация, он выполняет математическую операцию.
  • Увидев узел Вывод (), он отдает команду вывести символы на экран.
Именно он производит финальный, видимый результат работы нашей программы.

Эти три мастера — Распознающий, Архитектор и Воплощающий — и есть наш компилятор. Это вечный цикл: распознать символы, выстроить из них структуру, исполнить эту структуру.

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

Комментарии 0

Авторизуйтесь чтобы оставить комментарий