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 типы я еще не осознал, если кто объяснит -- буду очень благодарен :)


Saturday, June 09, 2007

Indeed Job Trends - Тенденции на рынке труда

Набрел на отличную игрушку -- поисковик по рынку труда indeed.com (не нашему, конечно, но все равно интересно), но самое замечательное там -- это тулза наподобие google trends, только по предложениям работы. Сижу развлекаюсь вот.

C++ против C# против java

Python против Руби против Лиспа

Окемл и F# (по F# скорее всего неправильные данные -- у него и у хаскеля вообще неудобные названия для поисковиков :)


Tuesday, June 05, 2007

Новая серия Design & Evolution of C++

По сцылке с ltu можно найти статью-продолжение бестселлера известного датского писателя Б. Страуструпа "Дизайн и эволюция C++", охватывающее период с 2001 года по настоящее время.

Не сильно интересующиеся процессом люди (типа меня), могут узнать много нового. Например, я наконец увидел ту фичу, до которой Страуструп мог бы додуматься и 20 лет назад, которой так сильно начинает не хватать в C++ после знакомства с любым нормальным (особенно функциональным) языком программирования -- итак, в C++ будут наконец более-менее нормальные enum типы. *Аллилуйя*. Они не будут неявно конвертится в int, у которых будет определен физический размер, которые можно будет нормально использовать в качестве параметра шаблона и имена которых будут определены внутри пространства имен, задаваемого именем enum'а (т.е. enum E { A } будет доступен как E::A). Это пока только предложение, но отец всех C++ программеров считает, что наверное его примут.

Другой интересный документ, к которому он и сам приложил руку  -- это предложение включить лямбды с замыканиями в C++. Мысль неплохая, но без GC все это, естественно, будет еще одним месторождением тормозов и граблей (в виде, преимущественно, висячих ссылок).

Глючить будет так:

tr1::function<int(int)> foo() {
 A a;
 A *b = &a;
 return (<>(int) { *b = 3; return 0; });
}

tr1::function<int(int)> a = foo();
a(1); // локальная переменная а 
 // внутри foo() уже уничтожена, но
 // лямбда ее использует
Сравним это все с garbage-collected языками где все объекты на хипе, и убиваются когда надо.

А тормозить будет поскольку для локальных объектов которые использует замыкание, по дефолту создается копия. Сравним это с garbage-collected языками, где замыканию достаточно указателя на объект.

Ну и для тех кому не интересны технические подробности, в статье можно почитать про процесс принятия стандарта и включения в него STL, а также причитания по поводу java, особенно понравилось вот это

I see Java as a Sun commercial weapon aimed at Microsoft that missed and hit an innocent bystander: the C++ community.

Вообще яве там целых несколько страниц посвящено, видно, годы аггрессивной рекламы явы как убийцы С++ не прошли даром для бедняги Страуструпа.

Ну в общем и целом статья очень интересная и познавательная, рекомендую.