Привет, Хабр! Меня зовут Владислав, мне 13 лет, и я создал язык программирования VladX. В этой статье расскажу, как устроен его интерпретатор, почему я выбрал русский синтаксис и как можно попробовать язык в действии.

Идея: почему русский синтаксис?

Когда я начал изучать программирование, английские ключевые слова if, else, function казались магическими заклинаниями. Логика алгоритмов была понятна, но синтаксис создавал лишний барьер. Я подумал: а что если сделать язык, где ключевые слова будут на русском? Так появился VladX.

VladX — это интерпретируемый язык с динамической типизацией, который работает поверх Node.js. Его особенность — полностью русский синтаксис, разработанный специально для обучения.

Архитектура: как устроен интерпретатор

VladX построен по классической схеме:


Исходный код → Лексер → Токены → Парсер → AST → Интерпретатор → Результат

Лексер: разбираем русские ключевые слова

Лексер преобразует исходный код в токены. Вот упрощённый пример обработки:


// Пример из src/lexer/tokenizer.js

const keywords = {

    'печать': 'PRINT',

    'если': 'IF',

    'иначе': 'ELSE',

    'цикл': 'FOR',

    'пока': 'WHILE',

    'функция': 'FUNCTION',

    'вернуть': 'RETURN',

    'класс': 'CLASS',

    'новый': 'NEW',

    'пусть': 'LET'

};

function tokenize(code) {

    const tokens = [];

    const lines = code.split('\n');

    

    for (let i = 0; i < lines.length; i++) {

        const line = lines[i];

        const words = line.split(/(\s+|\(|\)|\{|\}|\,|\;|\=|\+|\-|\*|\/)/)

            .filter(w => w.trim().length > 0);

        

        for (const word of words) {

            if (keywords[word]) {

                tokens.push({

                    type: keywords[word],

                    value: word,

                    line: i + 1

                });

            } else if (word.match(/^[0-9]+$/)) {

                tokens.push({ type: 'NUMBER', value: parseInt(word) });

            } else if (word.match(/^"[^"]*"$/)) {

                tokens.push({ type: 'STRING', value: word.slice(1, -1) });

            } else if (word.match(/^[а-яА-Я_][а-яА-Я0-9_]*$/)) {

                tokens.push({ type: 'IDENTIFIER', value: word });

            }

        }

    }

    return tokens;

}

Парсер: строим абстрактное синтаксическое дерево

Парсер преобразует последовательность токенов в AST. Вот как выглядит обработка условия:


// Пример из src/parser/parser.js

class Parser {

    parseIf() {

        this.consume('IF'); // Потребляем токен 'если'

        

        const condition = this.parseExpression();

        

        this.consume('LBRACE'); // {

        

        const thenBranch = this.parseBlock();

        

        let elseBranch = null;

        if (this.match('ELSE')) { // Проверяем 'иначе'

            this.consume('LBRACE');

            elseBranch = this.parseBlock();

        }

        

        return {

            type: 'IfStatement',

            condition: condition,

            thenBranch: thenBranch,

            elseBranch: elseBranch

        };

    }

}

Интерпретатор: выполняем код

Интерпретатор обходит AST и выполняет инструкции:


// Пример из src/interpreter/interpreter.js

class Interpreter {

    visitIf(node) {

        const condition = this.visit(node.condition);

        

        if (this.isTruthy(condition)) {

            return this.visit(node.thenBranch);

        } else if (node.elseBranch) {

            return this.visit(node.elseBranch);

        }

        return null;

    }

    

    visitPrint(node) {

        const value = this.visit(node.expression);

        console.log(value);

        return value;

    }

    

    visitFunction(node) {

        // Создаём объект функции

        const fn = (...args) => {

            const environment = new Environment(this.global);

            

            // Связываем параметры с аргументами

            for (let i = 0; i < node.params.length; i++) {

                environment.define(node.params[i], args[i]);

            }

            

            const previous = this.environment;

            this.environment = environment;

            

            try {

                this.visit(node.body);

            } finally {

                this.environment = previous;

            }

        };

        

        return fn;

    }

}

Примеры кода на VladX

Базовые конструкции


# Переменные и вывод

пусть имя = "Мир"

печать("Привет, " + имя + "!")

# Условия

пусть возраст = 15

если возраст >= 18 {

    печать("Ты взрослый!")

} иначе {

    печать("Тебе " + возраст + " лет")

}

# Циклы

цикл (пусть i = 1; i <= 5; i = i + 1) {

    печать("Шаг " + i)

}

# Функции

функция приветствовать(имя) {

    вернуть "Привет, " + имя + "!"

}

печать(приветствовать("Вася"))

Объектно-ориентированное программирование


класс Животное {

    конструктор(имя) {

        это.имя = имя

    }

    

    говорить() {

        печать(это.имя + " издаёт звук")

    }

}

класс Собака расширяет Животное {

    говорить() {

        печать(это.имя + " говорит: Гав!")

    }

    

    лаять(раз) {

        цикл (пусть i = 0; i < раз; i = i + 1) {

            печать("Гав!")

        }

    }

}

пусть мой_пёс = новый Собака("Шарик")

мой_пёс.говорить()  # Шарик говорит: Гав!

мой_пёс.лаять(3)    # Три раза "Гав!"

Работа с массивами


пусть числа = [1, 2, 3, 4, 5]

пусть сумма = 0

цикл (пусть i = 0; i < числа.длина; i = i + 1) {

    сумма = сумма + числа[i]

}

печать("Сумма: " + сумма)  # Сумма: 15

Установка и использование

VladX можно установить несколькими способами:

Способ 1: через npm (рекомендуется)


npm install -g vladx-main

Способ 2: из исходников


git clone https://github.com/murfivladi/vladx-main.git

cd vladx-main/vladx

npm install

npm link

Способ 3: через установочный скрипт


curl -sL https://raw.githubusercontent.com/murfivladi/vladx/main/install.sh | bash

Проверка установки


vlad --version

Запуск скрипта


vlad программа.vlad

REPL-режим


vlad

> печать("Привет!")

Привет!

> пусть x = 10

> печать(x * 2)

20

Инфраструктура проекта

Структура репозитория


vladx-main/

├── vladx/                    # Основной пакет

│   ├── src/                 # Исходный код

│   │   ├── lexer/          # Лексер

│   │   ├── parser/         # Парсер

│   │   ├── interpreter/    # Интерпретатор

│   │   ├── runtime/        # Среда выполнения

│   │   └── engine/         # Основной движок

│   ├── bin/                # Исполняемые файлы

│   │   ├── vlad.js         # CLI интерпретатор

│   │   └── vladpm.js       # Менеджер пакетов

│   ├── package.json        # Конфигурация npm

│   └── install.sh          # Скрипт установки

├── examples/               # Примеры программ

└── README.md              # Документация

Менеджер пакетов VladPM

VladX включает собственный менеджер пакетов:


# Инициализировать проект

vladpm init

# Установить пакет

vladpm install математика

# Список установленных пакетов

vladpm list

Трудности и решения

1. Обработка русского текста

Первоначально были проблемы с кодировкой, но переход на UTF-8 во всех компонентах решил вопрос.

2. Динамическая типизация

Реализация динамической типизации потребовала создания системы обёрток для значений, которая отслеживает типы во время выполнения.

3. Рекурсивный парсинг

Обработка вложенных конструкций (циклов в условиях, функций в функциях) требовала осторожного управления состоянием парсера.

4. Система модулей

Импорт/экспорт между файлами реализован через общую таблицу символов, что позволяет модулям взаимодействовать.

Почему Node.js?

  1. Кроссплатформенность — работает на Windows, Linux, macOS

  2. Богатая экосистема — можно использовать npm-пакеты

  3. Простота распространения — один файл .js для интерпретатора

  4. Асинхронность — в будущем можно добавить async/await

Планы по развитию

Ближайшие цели:

  1. Онлайн-песочница — веб-редактор для быстрого тестирования

  2. Дополнительные библиотеки — графика, игры, математика

  3. Интеграция с IDE — плагины для VSCode

  4. Образовательные материалы — учебник и видеоуроки

Долгосрочные планы:

  1. JIT-компиляция для повышения производительности

  2. Статическая типизация как опциональная возможность

  3. Собственная виртуальная машина

  4. Поддержка многопоточности

Для кого этот язык?

  1. Школьники — первые шаги в программировании без языкового барьера

  2. Учителя информатики — инструмент для обучения алгоритмам

  3. Русскоязычные новички — возможность сосредоточиться на логике, а не на синтаксисе

  4. Энтузиасты — интересный проект для изучения компиляторостроения

Попробовать VladX

Онлайн-демо: [скоро будет]

GitHub: https://github.com/murfivladi/vladx-main

npm: https://www.npmjs.com/package/vladx-main

Заключение

Создание VladX стало для меня увлекательным путешествием в мир компиляторостроения. Я узнал, как работают лексеры, парсеры, интерпретаторы, системы типов и среды выполнения.

Язык ещё развивается, но уже сейчас на нём можно писать полезные программы. Буду рад, если VladX поможет кому-то сделать первые шаги в программировании или вдохновит на создание собственного языка.

Вопросы и предложения приветствуются в комментариях! Особенно интересно услышать:

  • Какие функции добавить в первую очередь?

  • Где вы видите применение VladX?

  • Хотели бы вы использовать его для обучения?

P.S. Если вы учитель информатики и хотите попробовать VladX на уроках — напишите, подготовлю специальные материалы.

Спасибо за внимание! Код — на русском, логика — универсальна.

Комментарии (44)


  1. NeoCode
    09.01.2026 10:18

    Когда я давным-давно изучал программирование, я представлял как страдают англоязычные: то что для нас - новые, чистые, самостоятельные и независимые концепции ("if", "else", имена функций и переменных), для них - исковерканный родной язык! Именно исковерканный, изуродованный, не подчиняющийся естественным правилам английского языка. Поэтому какое счастье что языки программирования на английском (и какое счастье что я практически не сталкивался с 1С, кроме единственного раза, но для выноса мозга и одного раза хватило).


    1. Einherjar
      09.01.2026 10:18

      я представлял как страдают англоязычные

      Думаю им вообще пофиг.

      но для выноса мозга и одного раза хватило

      Русский вообще плохо пригоден для использования в качестве идентификаторов из за многобуквенности (длины слов), особенно в технической сфере, получается либо brainfuck из сокращений и аббревиатур либо простыня сплошного текста, что так что так - нечитаемо


  1. anonymous
    09.01.2026 10:18


    1. AndrewT2
      09.01.2026 10:18

      Ершов еще в школах внедрял язык ерш на основе русского.

      Такой зашквар.


  1. Diacut
    09.01.2026 10:18

    язык программирования с русским синтаксисом

    Путаете синтаксис с лексикой.


  1. Flux82
    09.01.2026 10:18

    Лет шесть назад подобный пост меня бы восхитил - действительно, юному программисту нужно немало понять абстракций, чтобы что-то подобное сделать. Сейчас впечатление сильно слабее: кажется, ушки нейросети торчат тут из каждого абзаца (может, уже чудится на фоне тонн нейрослопа и LLM тут только редактором работала? если что, читатели и автор поправят меня).

    То, что у вас получилось что-то интересное сделать, уже хорошо: но уделите больше времени тому, чтобы самостоятельно разобраться со всем тем, что вы используете - в будущем экспертиза опытных программистов, способных понять и критически оценить созданный llm-джунами код будет намного ценнее труда промтописателей (imho).


  1. kipar
    09.01.2026 10:18

    Было интересно как ООП реализовано, оказалось

    case 'ClassDeclaration':
    ...
                    return `class ${node.name} { ${methods} }`;
    

    т.е. по сути транспилятор в js и на текущем этапе того же эффекта можно было достигнуть автозаменой ключевых слов без всякого AST.
    Так что задумка хорошая но пока смысла в ней мало.


  1. MAT-POC
    09.01.2026 10:18

    Модно написать сюда https://t.me/perfolenta разработчику Языка Перфолента.NET/Перфо.NET - он добавляет другие языки в свою IDE (Добавил OneScript). Среда разработки у него под Win. Проект активно развивается, сообщество активное и квалифицированное. Мужик весьма продвинутый. преимущество его среды разработки, лично для меня - очень лёгкая, быстрая и не перегруженная.

    Если кому интересно другие языки доведенные до промышленного применения, кроме 1С:

    • OneScript - сценарии на 1С (Win/linux GPL), статья на Хабре

    • язык для микросервисов, аналог Go - Гонец - (Win/linux GPL), статья на хабре

    • Перфолента.NET (аналог C#)/Перфо.NET (аналог Shame/Lisp для изучения функционального программирования, написан на перфоленте, 2000 строк!!) (Windows) - для написание утилит, консольных приложений. Самый продвинутый - ООП, Функциональное программирование, декораторы, замыкания ... всё круто, и имеет товарный вид.

    • Кумир - только процедурное программирование, но зато есть много учебников, используется в школе, но работает под линукс


  1. tarantula58910
    09.01.2026 10:18

    1. Школьники — первые шаги в программировании без языкового барьера

    a) желающие в ИТ школьники еще остались ? по-моему даже школьникам ясно, что денег здесь нет (до многих родителей еще не дошло, но старперы всегда тормозят).

    b) если желающий в ИТ не желает и/или не способен изучить "технический английский"
    в минимальном объеме, то ему здесь не рады.


    1. MainEditor0
      09.01.2026 10:18

      И общая нестабильность, тряска с ИИ, пузырями, сокращениями и рецессией ещё пока не устаканились в дополнение к подъему порога входа и горе таких же желающих... Ну и актуальное вообще для всех "хрен его знает, что там будет хотя бы через год, не то что через больший период"


    1. DimaK21
      09.01.2026 10:18

      Информатика в школе обязательна и там сейчас не паинт с вордом изучают, но и программирование


  1. 411
    09.01.2026 10:18

    Без нескучных обоев не принимается


    1. BosonBeard
      09.01.2026 10:18

      Вы меня опередили :)


  1. Shura_m
    09.01.2026 10:18

    Как всегда, нужно называть вещи своими именами.

    На создал свой язык, а сделал надстройку над Node.js для русификации.

    Чтобы именно создать новый язык с нуля одному.... ну, как раз сразу после рождения и нужно было начать.


  1. serafims
    09.01.2026 10:18

    Печально, что запомнить десяток достаточно понятных слов стало так сложно и таким непреодолимым барьером, что приходится городить такие вот костыли.

    Перевод сомнительный. Но мы рады, что изучение способа решить задачу в итоге вас погрузило в дебри и как все устроено под капотом. Все из нас делали велосипед когда-то.

    Были бы любопытны наработки по синтаксису языка, которые бы упростили работу программиста, сократили бы количество текста. Посмотрите в сторону символов юникода. Может, писать на смеси эмодзи и текста будет скоро визуально понятнее. Но потребуется клавиатура со спец макросами и кнопками.


    1. kost_org
      09.01.2026 10:18

      Пусть сначала хотя бы кнопку смены раскладки аппаратную сделают, а то живём с клавиатурами сто летней давности. И отдельные клавиши для пунктуации на всех раскладках


  1. SkylineXXX
    09.01.2026 10:18

    Теперь на китайском делай


  1. venanen
    09.01.2026 10:18

    Хех, я в 14 лет тоже такое городил. Даже фотку нашел, тогда PHP5 на слуху был, только PHP 5.4 вышла. Но разница в том, что я с сразу понимал, что есть что и делать просто посмеяться. Даже до YoptaScript было, если я верно помню.

    Скрытый текст


    1. ThisMan
      09.01.2026 10:18

      Войди_в_меня - это конечно мощно...


  1. Lucifurry
    09.01.2026 10:18

    Всем известно, что статья повторенная еще раз становится смешной)

    А если серьёзно, то посвятите танкиста в этот затянувшийся рофл по созданию очередного перевода джаваскрипта на русский и написанию об этом статьи плз, а то я совсем уже юмора не понимаю(


    1. Einherjar
      09.01.2026 10:18

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


  1. so_linrun
    09.01.2026 10:18

    В Китае существовала такая «местная программная языковая» система, под названием EPL.

    如果 (a > 0)
       输出("a 是正数")
    否则
       输出("a 不是正数")
    结束如果
    对于 i = 1 到 10 循环
       输出(i)
    结束循环

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