InfoCity
InfoCity - виртуальный город компьютерной документации
Реклама на сайте







Размещение сквозной ссылки

 

Что за верблюд такой - ocaml?

Phunx

Нынче модно делать сайты. Это раньше, когда народ был дикий и непросвещённый, все писали вирусы, компиляторы и 3D-шутеры. "Бэйсик? MSX? Фи." - решил я, и стал писать на Turbo Pascal. Как потом оказалось, без ассемблера обойтись было нельзя, и что C - это тот же ассемблер, только похож на паскаль. "Э," говаривали мне, "уважаемый, вы тут на C балуетесь? Ничего у вас не выйдет, ибо сглючит прога, и ничего не поделаете." И сглючивала. "Ну," говорили впоследствии, "надо чтобы с плюсами". Сглючивала. "...и чтобы объектно-ориентированная методология проектирования." Лежала в корах, не подымаясь.

Шли года. Можно было уложить вражескую тачку одним правильно посланным пакетом IP. Можно было получить рутшелл, послав письмо. На слэшдоте великие люди обсуждали фундаментальную проблему мироздания - как нарастить карму до 50 и сменить все ссылки на гоутсе. А в деревне Гадюкины дожди первый сайт на Unix Bash уже сообщал, что страница Васи Пупкина приветствует своего 17-го посетителя.

Шли года снова. Пропаганда реляционных СУБД вызвала к жизни глючный, медленный и сложный MySQL. Воспоминания о будущем хакеров Unix заставили-таки их заставить работать Perl, the real write-only language. Родились порталы, CSS, DHTML и проч. То есть наступило сегодня.

История учит нас не только тому, что ничему она не учит. Уже, например, известно, что для сайта неважно, если язык в 100 раз медленнее C. Непринципиально, что он не объектно-ориентированный. Несущественно, если он порой проглючивает. Главное, чтобы было легко работать с базой данных и с текстом, а также писать скрипты на месте. Именно поэтому, с позволения сказать, изощрённые средства индустриальной разработки ПО так и не сумели сказать своё мудрое слово в этом направлении. Если вам кто-то будет пудрить мозги про компоненты для разработки веб-сайтов, про технологии DCOM для порталов, про Java 2 Enterprise Edition - скажите ему магическое японскоё слово. Настоящие сайты сегодня делают на PHP или mod_perl. С MySQL в качестве бэкэнда. Да. Именно с MySQL, простым, быстрым и надёжным.

Но даже у самой красивой девушки есть недостатки. А кроме того, нельзя же вечно жить в колыбели. Проблемы, которые возникают при попытке написать на Perl-e или PHP достаточно сложные программы, зачастую заставляют даже нормальных людей тоскливо поглядывать в сторону Java.

Говорят, что есть, есть где-то на земле великое и могучее промышленное программирование. Где веб-сервисы пашут землю и пекут бутерброды. Где ошибки сами собой уходят в далёкие горы, эффективные реляционные схемы рождаются сами собой, а посреди великой равнины восседает Java 2 Enterprise Edition. Помните такую сказку?

Ничего такого нет. А есть бедный программист, со своей болью и мукой, за каждой строчкой, за каждой кнопкой, за каждым окошком, который опять вынужден семнадцатый раз исправлять тридцать одну форму и пятнадцать определений таблиц из-за того, что изменился дизайн системы. И ничего, ничегошеньки не меняет Java, PHP, Perl и DB2 Stored Procedure Language в придачу.

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

Сегодня веселье - это Objective Caml (caml.inria.fr). Он "быстрее, проще, более выразителен и надёжен". Хотя, конечно, в отличие от PHP, не может использоваться с тегами наподобие <% %>. Он даже довольно хорошо интегрируется с базами данных, что вообще-то всё ещё большая редкость для скриптовых языков.

Ещё в прошлом веке специалисты по искусственному интеллекту поняли, что на тогдашнем уровне развития последний не может даже заменить им природную глупость. А всё потому, что единственное общее для них всех знание было языком Lisp. В переводе на русский - lots of idiotic silly parenthesis. Пример (цитата из Emacs):

(defun emerge-previous-difference ()
"Go to the previous difference."
(interactive)
(if (> emerge-current-difference -1)
(let ((n (1- emerge-current-difference)))
(while (and emerge-skip-prefers
(> n -1)
(memq (aref (aref emerge-difference-list n) 6)
'(prefer-A prefer-B)))
(setq n (1- n)))
(let ((buffer-read-only nil))
(emerge-unselect-and-select-difference n)))
(error "At beginning")))

Ясное дело, что что нормальные люди на таком языке писать не могут и не будут. Из остальных возникла великая AI-культура MIT, которая породила emacs (который написал Столлман (который создал FSF (который пропагандирует идеалы GNU (and Gnu is Not Unix)))). Но это к слову.

Окамль не таков. Когда стало понятно, что функция, которая принимает функцию в качестве параметра и возвращает функцию, которая возвращает функцию, никак визуально не отличима от функции, которая принимает параметром функцию, которая возвращает функцию, и возвращает функцию, то было решено использовать типизацию. Так вот, окамль - язык с типизацией. В нём такое не пройдёт. Хотя обычно люди используют его систему типов, чтобы понимать, когда нужно передать массив, а когда просто число.

Чтобы отмести обвинения в том, что мы пытаемся продать кота в мешке, мы просто вынуждены привести несколько примеров. Первый пример - печатаем таблицу умножения (из него должно стать понятно, как напечатать "Hello world").

for i = 1 to 9 do
for j = 1 to 9 do
let r = i * j in
print_int r;
if r < 10 then
print_string " "
else
print_string " "
done;
print_string "\n"
done

На первый взгляд, всё просто, и так оно пока и есть. Кстати, очень важный вопрос - а что с этим делать, да? Придётся отвлечься, скачать окамль и собрать его, если под Unix (caml-3.04.tar.gz), или просто поставить под Windows (ocaml-3.04-win.exe). Не будем говорить о нелёгкой судьбе веб-программирования под Windows. Поэтому дальше будет в основном про Unix. Те же, кто всё-таки хочет попробовать под Windows, могут поставить себе cygwin (эмулятор Unix API) с сайта Cygnus http://sources.redhat.com/cygwin/ и использовать его. Окамль под ним вполне работает.

Как собрать окамль?

$ su -
Password: ********

# tar xzf ocaml-3.04.tar.gz
# cd ocaml-3.04
# ./configure --prefix=/usr
...
# make
...
# make opt
...
# make install

# ^D

Затем, счастливые обладатели окамля, мы запускаем его интерпретатор (хотя компилятор тоже есть, даже целых два, но о них потом), и получаем приглашение # имени uid 0. Нет, это не shell, просто он так выглядит. Далее, мы вводим нашу программу прямо в интерпретатор (две точки с запятой подряд обязательны, они говорят интерпретатору, что ввод закончен).

# for i = 1 to 9 do
...
done
;;

И получаем совершенно неожиданный результат:

1 2 3 4 5 6 7 8 9
2 4 6 8 10 12 14 16 18
3 6 9 12 15 18 21 24 27
4 8 12 16 20 24 28 32 36
5 10 15 20 25 30 35 40 45
6 12 18 24 30 36 42 48 54
7 14 21 28 35 42 49 56 63
8 16 24 32 40 48 56 64 72
9 18 27 36 45 54 63 72 81
- : unit = ()

Последняя строчка принадлежит окамлю, и сообщает нам, что вычисленное выражение имеет тип unit и значение (). Но это всё детали.


Реклама на InfoCity

Яндекс цитирования



Финансы: форекс для тебя








1999-2009 © InfoCity.kiev.ua