Pull to refresh

Comments 15

Отличный ход с ScriptGuard до ANTLR – валидировать вход раньше, чем его увидит парсер, дорогого стоит. Забавный поворот в мотивации: язык рождался, чтобы перестать объяснять тестировщикам WireMock и JSON, – и в итоге появляется новая сущность, которую тоже придётся объяснять. Спасает ровно одно: если диалект честно меньше того, что заменил, и падает с понятной ошибкой – обмен выгодный.

Со ScriptGuard я думаю еще добавлю некоторые проверки. Но это буду уже делать в связке UI с расширение, пока в процессе. А вот с мотивацией действительно получилась дополнительная сложность. Но как мне кажется, если сделать в UI удобный и понятный конструктор. То он снимет мнигие вопросы. И так как язык простой. Мне думается можно автоматизировать создание заглушек, то есть тестировщику вообще не придётся писать код руками, только собирать логику визуально

Я когда-то сделал два языка программирования... Один в 1984 году (назывался ПРАЛ), второй - в 1999 (называется "Эллочка"). Один для инженерных(!) калькуляторов, второй для ПК, но так и остался в досовской реализации. Времени нет транслятор переписывать под Виндовс...
Удачи!

Это Вы за время обеда написали такую штуку? Однако... :) Про zig я вообще никогда не слышал, почему именно на нем?
А вообще одна просьба - вставить в описание на гитхабе и в файлы сборки ссылку на описание языка в оригинале - "https://erichware.com/inform/ellochka.htm". ссылки лишними не бывают... :)
У меня на Эллочке написано было много чего, но наиболее интересен компилятор(!) языка brainfuck. Кстати, про его создание там подробная статья есть - "https://erichware.com/litvor/bfcomint.htm".
Я все хочу переписать интерпретатор Эллочки на Виндовс, но это очень большая работа в силу совершенно разной логики организации программ на ДОС и Виндовс. А интерпретатор должен быть таким же полноценным: с редактором, отладкой и т.д. Времени не хватает, слишком много других творческих проектов еще есть... :)

Добрый день! Ссылки добавил — и в README на GitHub, и в файлы сборки (build.zig/build.zig.zon), теперь везде явно указано на ваш оригинал: https://erichware.com/inform/ellochka.htm.
Про написание за обед — тут не весь язык а часть методов как шаблон. Остальное пилил вечером с ИИ.
Что уже сделано. Интерпретатор практически полностью переведён — реализованы и проверены все 62 оператора языка.

Ваш sample.ela в оригинале (без единой правки) я прогнал через получившийся интерпретатор — дошёл до главного меню и раздела «графика» без ошибок. Остальные пункты надо шлифовать.

Что осталось. По мелочи: KEYS/WAIT пока не различают клавиши-стрелки (нужно для игр вроде «Змейки» — планирую доделать); метакоманды !nul/!one/!err; PUTF/GETF только для 4-байтовых значений (1/2 байта не сделаны);
Zig — язык действительно малоизвестный, но набирает популярность. Пока еще первая версия даже не вышла. Выбрал его за: отсутствие скрытых аллокаций и рантайма (важно для маленького интерпретатора, где хочется полностью контролировать память, — в чём-то похоже на дух самой Эллочки, только наоборот, «снизу»), простой и прямой FFI в WinAPI без обёрток (графика и консоль написаны напрямую через extern на user32/gdi32/kernel32), и просто личный интерес — хотелось попробовать язык на нетривиальной задаче, а не на «hello world».

Да, интересно. Надо будет поискать этот zig в готовом для применения виде...
Насчет прочего - восхищен Вашей скоростью. Я свой интерпретатор писал очень долго и через много версий. Правда, я писал полноценный интерпретатор - редактор, отладчик, непосредственное выполнение команд и т.д. И такой же хочу сделать под виндовс, но пока дело стоит, другие дела в приоритете.
А когда-то я даже хотел компилятор Эллочки сделать (тоже под ДОС, конечно), но уже было понятно, что ДОС уходит и возиться нет смысла. Но хоть компилятор брайнфака сделал на Эллочке! :)

Скопировал себе ссылку на Ваш проект. Но меня поразила скорость создания... Сами писали, или через ИИ? :) Уж очень быстро... Кстати, интересно как реализован парсинг формул. Надо посмотреть zig-исходники, если пойму...

Писал в Perplexity паралельно используя обычный ИИ в браузере от Google чтобы уточнять и искать дополнительную информацию. По каждому оператору отдельные уточняющие вопросы. На самом деле я восхищен вами. В DOS много ограничений и вы так мастерски придумали кучу разных обходных путей и ухищрений. Очень достойно! Если писать с нуля и без ИИ тут на месяцы разработки. Редактор я не реализовывал. Меню, графику я добавил. Очень много вопросов было по последнийм операторам LIRA/POLI/REAK... Много вопросов с графикой. Очень не хватало реальных скриптов. Но еще быстро получилось потому что у вас очень хорошо описан язык.
Лексер реализован построчный (язык построчный, GOTO/ESLI работают по номерам строк, так что усложнять токенизацию сквозным контекстом смысла не было) — разбивает одну строку на токены. Результат — не байткод, а просто дерево (ExprNode, тегированный union с указателями через аллокатор) — и отдельная функция evaluate() рекурсивно обходит это дерево, на каждом узле подглядывая текущее состояние интерпретатора (значения переменных/массивов). Если пришлете примеры скриптов или исходники переделаю так как изначально задумывалось. И было очень много ньюансов связаных с Dos и современными Windows. Но было очень интересно!

На самом деле в ДОС все гораздо свободнее, чем в Виндовс, поэтому писать намного легче. Я вот все никак не могу запихнуть написанный Дикарь в подоконный вариант (правда, со всеми наворотами типа редактора, отладчика и т.д.).
Должен сказать, что чисто с точки зрения программирования, Дикарь - одна из самых лучших и красивых моих программ. Как я понимаю, Вы его запускали и работу видели, как и примеры на Эллочке. А я вот пока Ваш "зиг" так и не запустил... И в коде не слишком разобрался, ибо он очень бюрократический, суть теряется за какими-то объявлениями.
Насчет формул мне как раз интересна Ваша реализация, как происходит анализ и вычисление?
Что касается математики (LIRA/POLI/REAK), то в целом реализация стандартная. А вот "tran" - эксклюзивная, по моему методу. :)

Как я понял, Вы организовали анализ кода "ela" и работу интерпретатора совсем не так как я. Я даже не совсем понял Ваше описание выше. Но в любом случае Вы же все равно писали "с нуля", я не понимаю, как Вы сумели с такой скоростью все реализовать... :) Даже ИИ тут непонятно чем может помочь? Кроме описания языка что еще нужно? Мне правда интересен ход Вашей работы...

Попробовал как указано выполнить "zig build run -- examples/hello.ell", но вылезают ошибки. А выполнить "./zig-out/bin/ellochka examples/hello.ell" невозможно вообще, ибо нет такой папки.
Я все же сумел понять, где на гитхабе готовый ехе (у меня с гитхабом взаимная неприязнь), скачал, но ничего не работает. Запуск "ellochka.exe examples\hello.ell" просто ничего не выводит и возвращается в консоль. Я все запускаю из ФАР (работаю только в нем всегда, никаких "проводников"), но это не важно. Может быть нет каких-то библиотек на компьютере? В общем, пока вот так.

Да, я уже написал выше, что нашел. Но не работает!

ellochka.exe examples\hello.ell
ждет любой текст и потом выполняется.
> .\ellochka.exe .\examples\hello.ell
Привет Введите ваше имя: Привет, Привет! Итерация номер 1 Итерация номер 2 Итерация номер 3 Итерация номер 4 Итерация номер 5 Готово!

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

Ни один запускаемый пример ничего не ждет и не выводит. Висит консоль, через несколько секунд процесс завершается. Но вообще, мне кажется, нам лучше другой канал для отладки иметь, не комментарии на Хабре, нет? Я не знаю в плане соблюдения правил... :)

Добавил релизную версию https://github.com/malexple/ellochka-zig/releases/tag/v0.0.1 теперь можно запустить без установки Zig, просто скачать и попробовать примеры.

Там кстати по TRAN есть тест test_tran.ell. На системе X1²+X2²-4=0, X1-X2=0 пример с хорошим и намеренно плохим стартом (X1=-3, X2=10) — в обоих случаях сходится к X1=X2=1.41421, backtracking отрабатывает как надо

Программа сама подбирает, что подставить в неизвестные, чтобы уравнения сошлись. Берёт текущую догадку, смотрит, насколько сильно каждая формула «промахивается» мимо нуля, прикидывает, в какую сторону и насколько двигать каждую переменную, чтобы промах уменьшился, и делает шаг. Если шаг оказался слишком большим и промах вместо уменьшения вырос — шаг уменьшается вдвое и пробуется снова. Повторяет, пока промах не станет достаточно маленьким.

По сути это метод последовательных приближений: не «вычислить ответ по формуле», а «угадать — проверить — поправить», раз за разом всё точнее.


Sign up to leave a comment.

Articles