Как стать автором
Обновить

Комментарии 9

Вот тоже близкий идеям, описанным в статье, язык (2002г) D2 Language,
но уже высокоуровневая часть Паскаль-подобная и по причине заброшенности проекта не особо представляющий интерес для практического применения, но интересен с эзотерической стороны его оценки реализованных идей. :)

P.S. Библиотека времени выполнения 2-ух стековая машина.

Что здесь "красиво ужасного"? Обычный лисп.

Вероятно реализация CVM с точки зрения автора статьи?
«красиво ужасного» — механизма расширения Лисп языка из статьи?

но по мне, к примеру, функциональность языка Factor, возможно более ужасна с точки зрения Лисп программистов вне рассмотрения его VM.

P.S. Для реализации Лисп есть и готовые инструменты и методолгии для минимизации придумывания своих «велосипедов».

Лисп, но несовсем обычный. Он эзотерический (в то время как LISP вполне себе нормальный язык программирования, в практическом смысле этого слова) и примитивный (даже с точки зрения LISP языков).

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

Примитивность его в нескольких деталях. Первая - это количество инструкций языка, их всего три штуки include, define и if. Не существует ни операций сложения, вычитания, умножения, деления и т.д. Тем не менее, он способен в себя их вбирать, но "соединяясь" с низкоуровневой частью. Вторая - это примитивность исполнения, где по умолчанию я в него вгрузил лишь операции инкремента, декремента и выражения больше, равно. Все остальные действия язык проводит сквозь уже свои инструкции, создавая сложение, вычитание и т.п. операции. Это всё есть его красивая сторона.

это большое количество операций инкремента и декремента

То есть почти брейнфак, но в обертке лиспа. Ну, или лисповый сахар поверх брейнфака.

Это не Lisp. Пусть вас не смущают скобочки.

В универе давно делал VM Пролога, тоже стековую, +шитый код.

Добавьте в компиляторе "ассемблера" модификатор inline. Тогда не нужно будет постоянно перекладывать из пустого в порожнее в базовых операциях _inc _dec и т.д.
Вот как можно будет делать.

labl _inc
    inline inc

labl _dec
    inline dec

Я бы изменил операции load и store до версий с аргументами как у операции push, только у них аргумент это смешение относительно верхушки стека и сделал бы его или всегда положительным, или отрицательным как у вас, но с положительными числами работать легче. При этом операция store сразу выталкивает верхушку стека.

   load 2 ; вместо push -2; load
   load 0 ; продублировать стек
   store 0 ; аналог pop получается, но лучше pop оставить тоже

Добавил бы в ассемблер инструкцию nop, тогда

(define (ret x)
    (_ret x))

labl _ret
    inline nop

; Как вариант без nop
labl _dec
    inline load 0
    inline store 0 ; или просто pop

ALLang. Расшифровка его звучит так: Another LISP Language

Ваш ALLang совсем не Lisp! Ведь Lisp это не только круглые скобки, это ещё и cons, car и списки как основа языка. А ещё eval интерпретирующий список как код.

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории