Що за верблюд такий – 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 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 і значення (). Але це все деталі.

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*