Бұл жазба автоматты түрде аударылған. Бастапқы тіл: Орысша
Бұл жаңа қазақстандық бағдарламалау тілін құру туралы цикліміздің үшінші бөлігі. Алдыңғы мақалаларда біз оның философиясы туралы әңгімелестік және оған руникалық алфавит жасадық.
Сонымен, бізде тұжырымдама бар және терең бейнелерге толы алфавит бар. Бірақ компьютердің жансыз кремнийі Λ тек белгіше емес, тұрақты тау екенін қалай түсінуге болады? Оған біздің рундарды оқуды қалай үйретуге болады?
Бұл пост біздің тіліміздің "миын" қалай жасағанымыз туралы. Біздің кодқа өмірді енгізетін Үш "шебер" туралы.
Информатикада оларды Лексер, талдаушы және аудармашы деп атайды, бірақ біздің философиямызда олар өз есімдерін алды: Тануши, Құрастырушы және Іске Асыршы.
Біздің кодты тек үздіксіз таңбалар ағыны деп елестетіп көріңіз. Компьютер ондағы рундарды да, есімдерді де көрмейді. Бірінші шебердің міндеті - "Тануши" (танушы) — осы ағымға қарап, таныс бейнелерді тану.
Ол сөйлемнің мағынасын түсінуге тырыспайды. Ол тек жеке "сөздерді" — лексемаларды немесе токендерді анықтайды.
- Көргеннен кейін ол: "бұл Руна_ айнымалысы" дейді.
- 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)
Енді бізде тек сөздер ғана емес, бағдарламамыздың тамаша логикалық сызбасы бар.
Бізде сурет бар, бірақ үй әлі салынбаған. Мұнда соңғы шебер — "Іске Асыршы" (орындаушы немесе Орындаушы) пайда болады. Оның міндеті - "ой ағашын" алып, оны өмірге әкелу.
Ол ағашты түйіннен түйінге айналдырады және командаларды орындайды:
- Түйінді көргеннен кейін декларация айнымалы, ол компьютер жадында ұяшық бөледі.
- Түйінді көргеннен кейін екілік операция, ол математикалық операцияны орындайды.
- Түйінді көргеннен кейін шығару ( ⁞ ), ол таңбаларды экранға шығару пәрменін береді.
Ол біздің бағдарламамыздың соңғы, көрінетін нәтижесін шығарады.
Бұл үш шебер — тану, сәулетші және инкарнация-және біздің компилятор. Бұл Мәңгілік цикл: рәміздерді тану, олардан құрылым құру, осы құрылымды орындау.
Енді сіз біздің тіліміздің қалай "ойлайтынын" білетін болсаңыз, келесі мақалада біз оны іс жүзінде көрсетеміз. Біз руникалық синтаксисті қолдана отырып, алғашқы толыққанды бағдарламамызды жазамыз және оның соңғы нәтижені шығару үшін барлық үш шебердің қолынан қалай өтетінін көреміз.
Это третья часть нашего цикла о создании нового казахстанского языка программирования. В предыдущих статьях мы рассказали о его философии и создали для него рунический алфавит.
Итак, у нас есть концепция и есть алфавит, полный глубоких образов. Но как заставить бездушный кремний компьютера понять, что Λ — это не просто значок, а незыблемая Гора-Константа? Как научить его читать наши руны?
Этот пост — о том, как мы создавали «мозг» нашего языка. О трех «мастерах», которые вдыхают жизнь в наш код.
В компьютерной науке их называют Лексер, Парсер и Интерпретатор, но в нашей философии они получили свои имена: Танушы, Құрастырушы и Іске Асырушы.
Представьте, что наш код — это просто непрерывный поток символов. Компьютер не видит в нем ни рун, ни имен. Задача первого мастера, «Танушы» (Распознающего), — всмотреться в этот поток и распознать знакомые образы.
Он не пытается понять смысл предложения. Он лишь идентифицирует отдельные «слова» — лексемы или токены.
- Увидев —, он говорит: «Это Руна_Переменной».
- Увидев 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)
Теперь у нас есть не просто слова, а идеальный логический чертеж нашей программы.
У нас есть чертеж, но дом еще не построен. Здесь появляется последний мастер — «Іске Асырушы» (Исполнитель или Воплощающий). Его задача — взять «Древо Мысли» и воплотить его в жизнь.
Он обходит Древо узел за узлом и выполняет команды:
- Увидев узел ОбъявлениеПеременной, он выделяет в памяти компьютера ячейку.
- Увидев узел БинарнаяОперация, он выполняет математическую операцию.
- Увидев узел Вывод (⁞), он отдает команду вывести символы на экран.
Именно он производит финальный, видимый результат работы нашей программы.
Эти три мастера — Распознающий, Архитектор и Воплощающий — и есть наш компилятор. Это вечный цикл: распознать символы, выстроить из них структуру, исполнить эту структуру.
Теперь, когда вы знаете, как «мыслит» наш язык, в следующей статье мы наконец-то покажем его в действии. Мы напишем нашу первую полноценную программу, используя рунический синтаксис, и посмотрим, как она пройдет через руки всех трех мастеров, чтобы выдать финальный результат.