Как создать свой язык программирования?
Как создать свой язык программирования?
Создаём собственный язык 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, тестовые файлы и инструкцию по запуску. Архив пригодится, если вы хотите повторить проект вместе с видео или продолжить разработку языка самостоятельно.
Скачать все материалы урока
Похожие записи
Оцените материал:
Похожие записи
«Гипотеза репродуктивной устойчивости» указывает на яичник как на источник открытий в исследованиях долголетия.
07.09.2026
Компания MG Ship внедряет оптимизацию маршрутов с помощью ИИ, поскольку отдача от логистики растет.
07.09.2026
ChatGPT называет клиентам вашу старую цену: как проверить, что нейросети говорят о вашем бренде
07.09.2026Присоединяйтесь и подпишитесь на рассылку самых свежих новостей по Email
Получайте свежие новости и идеи на почту. Без спама — только самое интересное.
Нажимая «Подписаться», вы соглашаетесь с политикой конфиденциальности.
