Издательский дом ООО "Гейм Лэнд"СПЕЦВЫПУСК ЖУРНАЛА ХАКЕР #55, ИЮНЬ 2005 г.

Языки будущего

Крис Касперски ака мыщъх

Спецвыпуск: Хакер, номер #055, стр. 055-052-2


;; Hello world in MIDAS

title hello

start: .open [.uao,,'tty ? 0 ? 0]

.lose %lsfil

move 1, [440700,,[asciz "Hello, world"]]

loop: ildb 2,1

skipn 2

.logou 1,

.iot 2

jrst loop

end start

Пока программы были маленькими, с этим приходилось мириться, но в какой-то момент программировать на ассемблере стало просто невыносимо, и тогда появился первый язык высокого уровня - Фортран, научивший компьютер "человеческой форме разговора". Большинство рутинных операций и технических деталей язык брал на себя, позволяя программисту сосредоточится непосредственно на самой решаемой задаче. Программа Hello, world, написанная на Фортране, выглядела так:

*

C Hello World in Fortran 77

C (lines must be 6 characters indented)

*

PROGRAM HELLOW

WRITE(UNIT=*, FMT=*) 'Hello World'

END

Вслед за Фортраном появилась целая серия подражателей: Алгол, PL/1, С. Им даже названия придумали императивные. Программа, записанная на императивном языке, в грубом приближении представляет последовательность инструкций, передаваемую компьютеру на выполнение. К императивным относятся практически все современные языки. Остальным завоевать популярность так и не удалось. Но они были!

Вот, например, язык логического программирования Пролог. Это неимперативный язык, в котором программа представляет собой совокупность утверждений, таких как: sin(x) = 0.69; print(x). Факториал на Прологе вычисляется следующим образом:

fak(0,1).

fak(N,R) :- N > 0, M is N - 1, fak(M,R1), R is N * R1.

?- fak(6,N).

Смотри, сначала программист говорит: fak(M, R1), затем определяет R1 как "R1 это N *R1". Все! Логическое соотношение между R и R1 задано. Обо всем остальном позаботиться транслятор. Ну, разве не красота?

Функциональные языки. О! Это совсем другой зверь. Вместо последовательности инструкций типа "отрой кран, наполни чайник водой…" они говорят, что есть такая штука, как "кран", и есть такая штука, как "чайник". Что произойдет при встрече чайника с краном, решает сам транслятор. Программист лишь описывает "характеры" чайника с краном. Функциональные языки либо совсем не содержат переменных (а значит, и оператора присвоения), либо не очень-то поощряют его использование. Тем не менее, программировать на них вполне возможно:

sub fac 1,

if == 1 @[0]

1,

( * @[0] &fac -- @[0] ),

Отсутствие переменных предполагает отсутствие типов данных. LISP - язык, ориентированный на работу со списками, это бестиповый язык, в каноническом варианте которого нет ничего, кроме списков. Даже чисел нет. Число N представляется списком из N элементов. Звучит зловеще, не правда ли? На самом деле от чисел и переменных полностью никто не отказывается (иначе это чрезвычайно снизило бы эффективность), и типичная LIST-программа выглядит так:

(defun fact (n)

(loop for i from 2 to n

for fact = 1 then (* fact i)

finally (return fact)))

(format t "Factorial of 6 is: ~A~%" (fact 6))

Объектно-ориентированные языки (а это практически все современные языки), наоборот, исповедуют диаметрально противоположный подход, навязывая жесткую типизацию даже там, где она нужна так же, как в Китае демографический бум. Каждый Windows-программист знает, что такое кастинг (явное преобразование типов данных) и как он раздражает.

Назад на стр. 055-052-1  Содержание  Вперед на стр. 055-052-3