Архив рубрики ~Лента новостей~

Как создать свой язык программирования?

Как создать свой язык программирования?
Как создать свой язык программирования?

Как создать свой язык программирования?

Создаём собственный язык Proger: придумываем синтаксис, пишем Lexer и Parser на Python, генерируем C-код и собираем настоящую исполняемую программу.

Создание языка программирования часто представляют как задачу для огромной команды инженеров, которая несколько лет пишет компилятор и спорит о стандартах. Для языка уровня C++ это недалеко от истины. Но небольшой рабочий язык можно собрать самостоятельно и заодно разобраться, что происходит между исходным кодом и запуском программы.

В этом уроке мы создадим язык Proger. У него будет собственное расширение файлов .proger, несколько ключевых команд, переменные, условия и циклы. Написанный код будет преобразовываться в C, а затем собираться системным C-компилятором в обычный исполняемый файл.

Видео по созданию языка Proger

В видео показан весь путь: от проектирования синтаксиса до запуска скомпилированной программы. Статья нужна как короткая карта проекта, поэтому некоторые технические детали удобнее посмотреть непосредственно в уроке.

С чего начинается язык программирования

Первым делом нужно определить правила языка. Не выбирать библиотеку и не писать классы компилятора, а решить, как будет выглядеть сам код. Какие команды увидит разработчик? Как объявить переменную? Чем обозначить условие?

В Proger переменные создаются с помощью слова remember, вывод выполняется командой say, а за условия и циклы отвечают when, otherwise и repeat.

remember name = «George» remember age = 25 say «Привет, {name}!» when age >= 18 { say «Доступ разрешён» } otherwise { say «Доступ запрещён» } repeat 3 { say «Proger работает» }

Синтаксис специально сделан простым и немного разговорным. Но внешний вид — лишь начало. Компьютер пока видит в файле обычный текст и не знает, что означает слово remember.

Lexer: превращаем текст в токены

Первым код программы получает Lexer, или лексический анализатор. Он движется по тексту символ за символом и разбивает его на понятные компилятору элементы — токены.

Строка remember age = 25 после лексического анализа превращается примерно в такую последовательность:

REMEMBER IDENTIFIER: age EQUALS NUMBER: 25

Lexer уже отличает ключевую команду от имени переменной и числа. Он умеет пропускать пробелы и комментарии, а текст внутри кавычек превращает в единый токен STRING. При этом Lexer не проверяет, правильно ли составлена команда. Даже бессмысленная последовательность может состоять из вполне корректных токенов.

Parser и структура программы

Порядок токенов проверяет Parser. После команды remember он ожидает идентификатор, затем знак равенства и только после него значение или выражение. Если одного элемента не хватает, Parser сообщает о синтаксической ошибке.

Корректные команды превращаются в узлы абстрактного синтаксического дерева — AST. Например, объявление переменной можно представить так:

RememberStatement ├── name: age └── value: NumberLiteral(25)

Название звучит серьёзнее, чем сама идея. AST — это структура, в которой хранится смысл программы. Вместо набора букв компилятор получает конкретный узел объявления переменной с именем age и значением 25.

Для say создаётся узел вывода, для when — условие и вложенный блок команд, а для repeat — количество повторений и тело цикла.

Генерация C-кода

После Parser у нас уже есть понятная структура программы, но процессор всё ещё не может её выполнить. Следующая часть компилятора проходит по AST и генерирует соответствующие команды на языке C.

Основные преобразования выглядят вполне предсказуемо: remember становится объявлением переменной, say превращается в printf, when — в if, otherwise — в else, а repeat создаёт цикл for.

#include int main(void) { const char *name = «George»; int age = 25; printf(«Привет, %s!\n», name); if (age >= 18) { printf(«Доступ разрешёнn»); } else { printf(«Доступ запрещёнn»); } return 0; }

На этом же этапе обрабатывается подстановка переменных в текст. Конструкция {name} заменяется форматом %s, а сама переменная передаётся функции printf отдельным аргументом.

Строго говоря, первая часть нашего инструмента работает как транспилятор: она переводит Proger в C. Настоящий машинный код создаёт уже системный C-компилятор. Для учебного проекта это разумный путь. Пытаться сразу генерировать машинные инструкции или подключать LLVM можно, но логика Lexer и Parser от этого понятнее не станет.

Сборка исполняемого файла

Команда build запускает весь процесс. Python читает файл, Lexer создаёт токены, Parser строит AST, генератор записывает C-код, после чего команда cc собирает готовую программу.

python3 compiler.py build hello.proger

После успешной компиляции в каталоге build появится исполняемый файл. На macOS и Linux его можно запустить напрямую:

./build/hello

В результате запускается уже не Python-скрипт и не файл .proger. Операционная система запускает собранную C-компилятором программу.

Насколько это настоящий язык

Proger пока нельзя сравнивать с Python, Go или Rust. В нём нет функций, модулей, сложной системы типов, управления памятью и десятков других механизмов. Зато у него уже есть главное: собственный синтаксис, лексический анализ, Parser, AST, генерация кода и этап сборки.

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

Материалы проекта

Ниже можно скачать исходный код компилятора, пример программы hello.proger, тестовые файлы и инструкцию по запуску. Архив пригодится, если вы хотите повторить проект вместе с видео или продолжить разработку языка самостоятельно.

Скачать все материалы урока

Источник

Оцените материал:

Поделиться
Понравилась статья? Расскажите другим
ВКонтакте
Читайте также
Архив рубрики ~Полезное~ ЛЕГАЛЬНЫЙ ФОТОШОП ДЛЯ ВИДЕО Higgsfield выкатили Genjutsu — инструмент, который… Архив рубрики ~Коротко из Telegram~ На рабочем столе теперь можно завести собственную ИИ-вайфу. Animates… Архив рубрики ~Полезное~ Ловите огромный каталог дополнений для Claude. В Build with… Архив рубрики ~Полезное~ В Claude добавили собственный браузер. В Cowork теперь можно… Архив рубрики ~Коротко из Telegram~ 1200 ИИ-агентов сговорились и устроили коллективный взлом Hugging Face…. Архив рубрики ~Полезное~ Вышел open-source сервис для нарезки видео на шорты. Архив рубрики ~Коротко из Telegram~ Почти половина российских компаний планирует увеличить использование облачных и ИИ-сервисов…. Архив рубрики ~Полезное~ Новый апскенйлер изображений работает с любой графикой Photo Enhancer Новости робототехники Так теперь выглядит поездка на такси по Остину. Tesla… Архив рубрики ~Коротко из Telegram~ Google добавила в Agent Development Kit нативную live-оценку голосовых… Архив рубрики ~Коротко из Telegram~ Эммануэль Акита (спонсировано Andela) разбирает частую ловушку: считается, что… Архив рубрики ~Обо всем~ Тенденции из окопов: почему семантика имеет значение в биологических науках Новости робототехники Когда компьютерное зрение на складе окупается, а когда становится дорогим экспериментом Архив рубрики ~Обо всем~ Вторая полная карта мозга плодовой мухи завершена. Архив рубрики ~Полезное~ ЛЕГАЛЬНЫЙ ФОТОШОП ДЛЯ ВИДЕО Higgsfield выкатили Genjutsu — инструмент, который… Архив рубрики ~Коротко из Telegram~ На рабочем столе теперь можно завести собственную ИИ-вайфу. Animates… Архив рубрики ~Полезное~ Ловите огромный каталог дополнений для Claude. В Build with… Архив рубрики ~Полезное~ В Claude добавили собственный браузер. В Cowork теперь можно… Архив рубрики ~Коротко из Telegram~ 1200 ИИ-агентов сговорились и устроили коллективный взлом Hugging Face…. Архив рубрики ~Полезное~ Вышел open-source сервис для нарезки видео на шорты. Архив рубрики ~Коротко из Telegram~ Почти половина российских компаний планирует увеличить использование облачных и ИИ-сервисов…. Архив рубрики ~Полезное~ Новый апскенйлер изображений работает с любой графикой Photo Enhancer Новости робототехники Так теперь выглядит поездка на такси по Остину. Tesla… Архив рубрики ~Коротко из Telegram~ Google добавила в Agent Development Kit нативную live-оценку голосовых… Архив рубрики ~Коротко из Telegram~ Эммануэль Акита (спонсировано Andela) разбирает частую ловушку: считается, что… Архив рубрики ~Обо всем~ Тенденции из окопов: почему семантика имеет значение в биологических науках Новости робототехники Когда компьютерное зрение на складе окупается, а когда становится дорогим экспериментом Архив рубрики ~Обо всем~ Вторая полная карта мозга плодовой мухи завершена.

Оставить комментарий