Статья 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
Авторизуйтесь чтобы оставить комментарий