Авторство: Phunx
phunx@webhowto.ru
Нынче модно делать сайты. Это раньше, когда народ был дикий и
непросвещённый, все писали вирусы, компиляторы и 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 и значение (). Но это всё детали.
Про то, как писать под Web на этом языке, читайте в следующем
выпуске и оставайтесь с нами.
|