[devel] I: alterator internals

Stanislav Ievlev =?iso-8859-1?q?inger_=CE=C1_altlinux=2Eorg?=
Чт Май 26 12:13:53 MSD 2005


Привет всем!

С этого письма начинается серия маленьких писем, призванных популярно и
доступно объяснить, что же такое alterator. Надеюсь, что помимо того что
эти письма осядут в архивах рассылки, кто-нибудь оформит всё это в wiki
или в какую ещё документацию.

Alterator находится в постоянном развитии, поэтому то что было сказано
сегодня, через месяц может стать уже неактуальным, поэтому следите
внимательно, дабы не было потом недоразумений ;)

1. Немного истории.
Надеюсь никто из упомянутых ниже не будет возмущаться от скромности ;)
Ведь именно они стояли у истоков сегодняшнего alterator, а без знания
прошлого делать будущего никак нельзя.
ALTerator - это гениальное изобретение Лёши Воинова (voins) и Гоши Курячего (george), 
в первоначальных обсуждениях ,если не ошибаюсь, ещё всегда принимал 
участие Лёша Гладков (legion), хотя в Кольчуге он формально задействован не был.
Возник alterator в недрах проекта ИВК-Кольчуга, и первое его воплощение
можно там наблюдать. Над движком ALTerator в рамках Кольчуги работали
помимо выше означенных ещё Антон Качалов (mouse), Саша Николаев (avn), 
Лёша Турбин (at). Ну и конечно была масса профессиональных сисадминов, 
которые закладывали все собственно алгоритмы настройки. Подробности этой 
части работы пусть уже рассказывает voins. Для меня же главное - сам alterator.

Вообще перечислять людей, сделавших тот или иной вклад в alterator очень
сложно, ибо это значит перечислить практически всех. Не одно дельное
замечание подчас переворачивало только что придуманную замечательную
концепцию того или иного компонента.

Ну хватит, заниматься ностальгией.

2. Альфа и Омега

Чтобы хорошо понять alterator, надо сначала научиться говорить на его
языке, ибо самая наглядная часть ,диалог с пользователем, да и большая
часть самого alterator, описывается на нём.

Сразу спешу успокоить. Вообще говоря одна из неповторимых особенностей
alterator состоит в том что любой его компонент можно написать на любом
языке программирования. Так части, собственно занимающиеся
конфигурированием системы в основном написаны на языке понятном любому
администратору - на shell и awk.

Но всё-равно какой-то язык должен быть основным, а у alterator таким
языком является Scheme (я позволю себе называть его просто схема, чтобы
реже переключаться с одного языка на другой).

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

Сначала всем кажется что это ужасный язык с гирляндами круглых скобок,
однако при более подробном знакомстве выясняется, что это совсем не
проблема и плюсы перевешивают этот единственный минус.

Сразу порекомендую пользоваться нормальным текстовым редактором. Очень
хорошо подойдёт vim и emacs. А вот mcedit навсегда вас отвадит от этого
языка.

Это примерно как с поп-музыкой и чем-то другим. Первая всегда быстро
приходит и также быстро уходит, а вторая не сразу прийдёт, зато никогда
потом не покинет ;)

Всё это разглагольствование отнюдь не означает, что все остальные языки
по боку. Portable Assembler C - ещё никто не смог заменить ;)

Небольшое замечание в сторону Сизифа: В Сизифе пожалуй самая большая
коллекция компиляторов и интерпретаторов схемы. Их пусть лучше
предствавит их мантейнер. Я же хочу обратить внимание только на три:
* guile - не самый оптимальный по скорости, но зато непревзойдённый по
удобству интеграции с C.
* gambit-c - очень хороший компилятор, но с бедноватым набором готовых
бибилиотек
* scheme48 - один из лучших интерпретаторов с богатой библиотекой.


2.1 О порядке слов.

Одно и тоже можно рассказать разными способами. Попытаемся рассказать разными
способами про операцию сложения двух чисел.

Способ 1: "2 + 3" или "К двум прибавить три".
Не самый удачный способ с точки зрения математики и языков
программирования. Однако нас приучают к нему с детства также как и к
десятичной системе счисления. Гораздо чаще произносится "два плюс три", но
это скорее пословное оглашение записи, строго говоря лишённое какого либо
смысла ибо плюсы бывают разными. Да и с точки зрения языков
программирования, например того же C, получается несколько неудачно ибо
операция прибавления всё-таки обозначается как +=. А в C++  это вообще
может быть оформленно как маловразумительная конструкция operator+().

Таким языком общается с миром большинство популярных языков
программирования.

Способ 2: "23+" "два и три сложить"
Очень непривычный, но удобный способ с точки зрения математики. Известен
также под названием польская нотация (или польская запись).
Математическое удобство превращается в то что компиляторы и интерпретаторы
языков программирования, использующую такую нотацию получаются чрезвычайно
компактными, что позволяет их "засунуть" в кремний.
Таким языком общается с миром Форт и Постскрипт.

Способ 3: "+23" "сложить два и три".
Может быть не самый лучший с точки зрения науки, зато самый естественный.
"сложить два и три" гораздо понятнее чем "два плюс три".
Это не случайно, ибо это функциональный подход. Функция сложения
применяется к двум и трём. В общем, то функция, пожалуй одно из самых
основных понятий современного мира.

Таким языком общается с миром всё многочисленное семейство LISP (и ещё много других
функциональных языков программирования)

Итак, когда вы захотите что-то сказать на Схеме, сначала надо назвать
функцию, а потом перечислить к кому её применить.

Например "вычесть из трёх четыре", "перемножить пять шесть и семь".

Теперь немного о формате вызова.

Стандартный, и известный по школе способ записи результата применения функции к своим аргументам - f(x). Ещё часто используется в математике бескобочный вариант - Ax,Fx,...
Но LISP идёт своим путём и описывает вызов как (f x).
Казалось бы это ужасно, однако если функция много-аргументная, то мы
экономим на спец. символах.
f(x,y,z) запишется как (f x y z).
Собственно такая экономность и регуларяность в синтаксисе LISP и отпугивает от него, но
как мы увидим дальше, бедность и регулярность синтаксиса - это ещё и богатство, если бы
не она, то не было бы удобного испособа описания интерфейса.

Благодаря такому способу записи интерпретатор выражений получается очень простым и компактным не в пример C++, где развесистые выражения подчас пособны свести с ума как разработчика, так и компилятор, да и двусмысленность, что C что C++ тоже не подарок. К ней же привыкли - привыкните и к Scheme.

Сразу несколько простейших выражений на Scheme. Комментировать их не буду
и так всё понятно:

(+ 1 2)
(- 2 3)
(+ 1 2 3 4 5 6 7)
(* 1 2 3 4 5 6 7 0)
(+ 1 (+ 3 5))
(* 3 (* 5 6))
(+ 1 (- 7 4))
(+ 1 (- 4 (+ 5 6)))

Считайте что одну четверть Scheme уже выучили - это очень маленький язык.

Продолжение следует ....


--
Стас.




Подробная информация о списке рассылки Devel