Tuesday, June 26, 2007

Стековые языки

Почему-то наиболее активно пишущими блоггерами в области языков программирования и computer science в моей rss читалке последнее время оказываются авторы двух стековых языков -- Cat и Factor. Если пробежаться по ссылкам — оказалось в этой области происходит много интересного.

 * * *

Наиболее известным и распространенным стековым языком до сих пор является Forth, а в 80-е он вообще очень широко использовался в embedded системах. Чуть ли не каждый третий девайс программировался на Форте.

Основной плюс — синтаксис практически отсутствует, все просто как три рубля — есть данные на стеке, есть "слова" которые совершают операции над ними и результат опять же кладут на стек. Есть еще второй стек для хранения адресов возврата из функций.

Вот функция которая возводит аргумент в квадрат

SQUARE ( a -- b ) DUP * ;

В скобочках это комментарий (обозначает что на входе одно число, на выходе одно), DUP клонирует значение на вершине стека, * берет со стека два значения, умножает, и кладет результат на стек.

Затем году в 2001-м появился чисто функциональный стековый язык Joy. Состояния, как и полагается в функциональном языке — нету, абстракций (формальных параметров у функций) нету тоже, в целом все весьма похоже на point-free стиль в Хаскеле. Функции рассматриваются как пробразования Stack -> Stack. Есть higher-order функции и прочие замечательные вещи.

Joy в свою очередь вдохновил еще нескольких товарищей на создание еще нескольких интересных вариантов стековых языков.

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

Во-вторых, Cat — чисто функциональный стековый язык со статической типизацией и мощным выводом типов. Причем с последней версии типы автоматически выводятся вроде как для любой валидной программы на Cat.1

И, в-третьих — Enchilada, тоже чисто функциональный язык, предназначенный для параллельных вычислений. Замечателен тем, что строго статически типизирован, но тип в нем всего один — это список. То есть, скажем, число 3 считается эквивалентным списку, содержащему три пустых значения. В общем почитать очень интересно, например, умножение чисел там реализовано через декартово произведение таких списков, а по дизайну Enchilada очень напоминает APL-подобные языки, только с более человеческим лицом.

Ссылки:


Ну и про форт немного интересного до кучи:

1Получается это вроде как засчет использования equirecursive типов. Почему в Хаскеле/ML используются isorecursive типы я еще не осознал, если кто объяснит -- буду очень благодарен :)

2 comments:

Djuffin said...

MS IL, Java bytecode

lrrr said...

Ну CLI/JVM эт понятно, но все-таки IL ассемблер ведь не предназначен для того чтоб на нем люди программы писали. Так что не считается ;)