Форма + содержание = программа

Валерий Очков

Для названия статьи автор взял шаблон Н.Вирта — создателя языка Pascal. Немолодые читатели журнала, несомненно, помнят нашумевшую в свое время книгу Вирта, в название которой была вынесена формула “Алгоритм + структура данных = программа” [1]. Книга эта была во многом этапная (переход к структурному программированию) и поэтому запоминающаяся.

Структурное программирование кардинально изменило не только технологию кодирования алгоритмов (отказ от оператора GOTO и др.), но и сами листинги программ. Отступы от правого края, зрительно выделяя вложенные конструкции, но, никак не влияя на содержание программы, существенно преобразовали ее форму. Программы стали походить на стихи Маяковского. С тех пор форма программ изменилась мало. Добавился только цвет (дань современным дисплеям и принтерам) для выделения ключевых слов и комментариев, а также для целей отладки программ (трассировка, контрольные точки и т.д.).

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

Но автору хотелось бы обратить внимание читателей на другое — на проблему эстетического вида не просто компьютерных рисунков, а листингов программ и, в частности, на проблему соответствия (или противопоставления) формы листинга содержанию программы.

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

Автор далеко не искусствовед и не смеет особо распространяться на эту тему. Он просто выставляет на суд читателей некоторые свои практические работы в этой области, что дает ему если не право, то хотя бы повод порассуждать на тему компьютерной графики.

Автор высказывает не только свою точку зрения, но как бы заодно озвучивает одну из крайних. Более того, какие-то положения статьи специально утрируются, чтобы раззадорить и даже рассердить читателя компьютерного издания.

В комментариях к компьютерным рисункам, как правило, подчеркивается, что их авторы — компьютерные художники. В прилагательных к существительным часто таится некая ущербность или по, крайней мере, двусмысленность. — “Папа, кто построил эту башню?” — “Инженер Шухов.” — “Это как наша мама инженер?” — “Нет, сынок, наша мама — старший инженер.”

С другой стороны, настоящие существительные — названия научных дисциплин или направлений искусства — не боятся даже фривольных прилагательных: занимательная математика, например. Но занимательная история КПСС или занимательный научный коммунизм — как вам это понравится. Ладно, не будем пинать ногами издыхающего льва. Но занимательная политология или занимательная экономика. Термин компьютерный художник содержит в себе некую двойственность. С одной стороны, прилагательным “компьютерный“ как бы извиняются перед потенциальным зрителем за несовершенную эстетику рисунков. А с другой стороны — предупреждают о том, что при создании рисунков использовались специфические инструменты и методы (авангардистские изыски).

Настоящий художник готов работать на чём угодно и чем угодно. Рисунки Анатолия Зверева (художника с трагической судьбой, какая, увы, часто постигает гениев), выполненные чуть ли не окурком на обрывке листа бумаги, сейчас продаются на аукционах за большие деньги. Давайте дождемся времен, когда распечатки принтеров будут выставляться в Лувре, в Эрмитаже или на худой конец продаваться на художественных аукционах.

Последнее вряд ли случится. На аукционах могут продать дискету, принадлежавшую компьютерному художнику (фетиш — сейчас так продаются гитары великих музыкантов). Дело в том, что у computer art нет понятия оригинала и копии. А это может убить даже настоящие шедевры, которые иногда публикуются на обложках и внутри глянцевых изданий. Пушкин говорил, что пу шло то, что пошлу в народ. Только самые гениальные произведения искусства способны выдержать такое испытание. Они-то и формируют пласт культуры, на котором базируется современная цивилизация.

Ну а теперь примеры.

 

Пример 1

     
  DEF FnY (X) = SIN(X) - 1

INPUT "a, b, N"; a, b, N

D = (b - a) / N: REM Шаг

FnY(X)

  FOR I1 = 1 TO N

S = S+D* FnY(X)

X = X+(b-a) / N

 
  NEXT I1

PRINT S

777 END

 
  X  

Рис. 1

На рис. 1 помещена BASIC-программа расчета определенного интеграла методом, о котором листинг программы говорит сам за себя, — методом прямоугольников. Сам метод прост. Примитивен и способ связывания формы программы с ее содержанием. Но метод расчета и программу можно усложнить, заменив прямоугольники строк на трапеции (метод трапеций) или на отрезки параболы (метод Симпсона), подогнав под них, соответственно, и форму листинга. Читатель может увидеть в рисунках статьи изъяны, вернее, попытки автора подогнать форму под содержание. В программе на рис.1, например, переменная цикла названа I1, хотя общепринятое ее имя — I.

Считается, что по-настоящему красивая женщина (“чертовски красивая”) непременно должна иметь внешний дефект, небольшой, но сразу бросающийся в глаза: вздернутый нос, родинка, веснушки... Такие "украшения" лишний раз подчеркнут, что это не богиня, от которой лучше держаться подальше, не "кукла восковая", а земная женщина. Хрестоматийный пример — Наталья Николаевна Пушкина (урожденная Гончарова) — петербургская красавица, которая, тем не менее, чуть-чуть косила. А вот другой пример — Шекспир воспел "смуглую леди сонетов" в те времена, когда белизна лица считалась непременным условием женской красоты.

Слово “чуть-чуть”, только что промелькнувшее в тексте, напоминает о кратком, но, тем не менее точном определении художественного вкуса: “Искусство — это чувство меры”. Рафинированное произведение искусства, созданное на основе чистых канонов, находится как бы в неравновесном состоянии. Маленький щелчок (родинка, легкое косоглазие, кривая колокольня, корявый автограф в углу картины или, на худой конец, темный штрих в биографии художника) сталкивает эту шаткую балансирующую конструкцию либо в чулан поделок (кич), либо в сокровищницу шедевров.

А вот еще пример, поворачивающий проблему на новую грань, где пересекаются плоскости формы и содержания. Сергей Довлатов в своих записках упоминает об известном профессоре-филологе с такими косыми глазами, что с ним трудно было общаться — непонятно, в какой глаз нужно смотреть. Этот профессор, прикрывая рукой левый глаз, говорил собеседнику: “Смотрите в правый. На левый не обращайте внимания. Левый — это дань формализму”. Хорошо дурачиться, создав предварительно целую филологическую школу.

Ошибки - это отзвуки конфликта между формой и содержанием. В этом вечном споре художник принимает сторону формы, а ученый — содержания.

 

Пример 2

1 Fibo1 = 1 ' Первое базовое число Фибоначчи

2 Fibo2 = 2 ' Второе базовое число Фибоначчи

3 ' Поиск минимума функции методом Фибоначчи

5 DEF FnY (X) = X ^ 2 + X - 3' Анализируемая функция

8 INPUT "A, B, Число приближений к минимуму"; A, B, N

13 FOR I = 2 TO N ' Расчет чисел Фибоначчи

21 Fibo3 = Fibo1 + Fibo2 ' Новое число Фибоначчи

34 Fibo1 = Fibo2

55 Fibo2 = Fibo3 ' Подготовка к новому расчету

89 NEXT

144 X2 = A + (B - A) * Fibo2 / Fibo3

233 Y2 = FnY(X2)

377 FOR I = 1 TO N ' Циклы приближения к минимуму

610 X1 = A + B - X2

987 Y4 = FnY(X1)

1597 IF X2 > X1 AND Y2 > Y4 THEN B = X2: X2 = X1: Y2 = Y4: GOTO 10946

2584 IF X2 <= X1 AND Y2 > Y4 THEN A = X2: X2 = X1: Y2 = Y4: GOTO 10946

4181 IF X2 > X1 AND Y2 < Y4 THEN A = X1: GOTO 10946

6765 IF X2 <= X1 AND Y2 <= Y4 THEN B = X1

10946 NEXT

17711 X = (A + B) / 2

28657 PRINT "Y мин. = "; FnY(X); " при X = "; X

Рис. 2

Программа на рис. 2, написанная также на языке BASIC, предназначена для поиска методом Фибоначчи минимума функции (она на строке 5) одной переменной. Числа Фибоначчи позволяют особым образом делить отрезок неопределенности А-В так, что при очередном приближении к минимуму (цикл на строках 377-10946) было достаточно всего лишь один раз вычислить значение анализируемой функции (см. строку 987). Номера строк программы на рис.2 — это числа Фибоначчи: в этом столбце каждое новое число равно сумме двух предыдущих.

 

Пример 3

В конце программы на рис.2 должна стоять строка 46368 END, с оператором, который на языке BASIC необязателен: числа Фибоначчи — это бесконечный ряд. Кроме того, эти числа имеют прямое отношение к одной из базовых пропорций изобразительного искусства — к золотой пропорции. Если двигаться по числам Фибоначчи в бесконечность, то отношение двух смежных чисел будет стремиться к величине 0.618... — к золотой пропорции. Читатель может провести над собой такой эксперимент — начертить на бумаге отрезок прямой и разделить (рассечь) его на две неравные части. Считается, что чем тоньше у человека чувство меры, тем точнее будет поделен отрезок в золотой пропорции (золотое сечение), когда отношение бу льшей части отрезка ко всему отрезку равно отношению меньшей части отрезка к бу льшей (0.618...). Считается, что пояс человека (представим себе Давида резца Микеланджело) делит его фигуру в золотой пропорции. Стороны живописных полотен находятся в этом же соотношении...

Рис. 3

На рис.3 представлена BASIC-программа поиска минимума функции одной переменной методом золотого сечения (содержание программы), вписанная в рамки структурной диаграммы, стороны которой находятся в золотом соотношении (форма программы). Сама золотая пропорция (функция пользователя GP) в программе записана математической формулой на последней строке. Метод золотого сечения как и метод Фибоначчи хорош тем, что в цикле поиска минимума значение анализируемой функции рассчитывается всего лишь раз. Если функция простенькая (как у нас на предпоследней строке программы), то это не играет роли, но если значение функции рассчитывается минуты, часы, сутки... Нет ничего практичней не только хорошей, но и красивой теории.

Читатель, не пытайся с линейкой и калькулятором проверить соответствие сторон листинга программы на рис. 3 золотому соотношению. Во-первых, при макетировании статьи могли вкрасться искажения, а во-вторых, и в главных...

Настоящий художник никогда не будет оценивать пропорцию линейкой и калькулятором. Он просто почувствует, что эта пропорция еще не золотая (или какая-то другая, эстетически приемлемая), а эта уже не золотая. Грань между красивым и некрасивым нечеткая (размытая) или, как говорят англичане, пушистая. Об этом догадываются не только люди искусства, но и ученые. В математике, например, последние 30 лет бурно развивается теория нечетких множеств (fuzzy sets — пушистые множества), оперирующая такими “перлами“ как “это число скорее отрицательное, чем положительное“ и т.д. Теория нечетких множеств, как это не покажется странным, позволяет более качественно управлять технологическими процессами. В этой научной дисциплине вместо понятия красоты фигурирует, например, понятие нормальности: температура пара в котле еще понижена, а теперь уже повышена и т.д. В точных науках наблюдается постепенный отказ от фиксированных величин (число убивает не только искусство, но и науку) и переход к экспертным оценкам. Художник может сказать, красива ли эта картина, ученый скажет, нормален ли или нет данный технологический процесс.

На рис. 3 золотое соотношение размыто внутри рамки программы: внутренние габариты рамки это еще не золотое сечение, а наружные — уже не золотое. В этом, по-видимому, заключается одна из эстетических нагрузок толстых рам живописных полотен: золотое сечение размыто внутри рамы и каждый зритель волен мысленно проводить его там, где он считает нужным (проблема вкусотерпимости; о веротерпимости мы скажем пару слов позже). Золотая пропорция человеческого тела (вспомним Давида с пращей) — это тоже некая фикция — попытка измерить неизмеримое (объять необъятное): местоположение пояса (в частности, пупка Давида) размыто прической, позой (Давид стоит по команде “Вольно!“ — он убил Голиафа и может расслабиться). Женщины могут прекрасно управлять этой пропорцией, надевая обувь на каблуках.

Лучший способ охарактеризовать какое-либо явление — тем более в статье с претензией на искусствоведение — это привести классическую цитату. Вот она:

Они сначала нравилися мне

Глазами синими, да белизною,

Да скромностью — а пуще новизною;

Да, слава богу, скоро догадался —

Увидел я, что с ними грех и знаться —

В них жизни нет, все куклы восковые;

А наши!...

Угадайте, о чем говорил пушкинский Дон Жуан! Да-да — и о компьютерной анимации, и о рисунках, созданных с помощью компьютерной графики... Скажем мягче (и с надеждой) — о современных образцах этого симбиоза науки, технологии и искусства. Теорию fuzzy sets многие считают панацеей, способной вылечить не только автоматизированные системы управления, но и компьютеры как инструмент художественного творчества. Ведь, в компьютерных рисунках больше чувствуется несовершенный инструмент (парадокс high technology), чем неумелый художник.

Элементы fuzzy sets присутствуют на рис.3 не только в рамке программы, но и в ее алгоритме. Золотое сечение в программе записано аналитической формулой (квадратный корень из пяти и прочее), т.е. абсолютно точно. Компьютер же, выполняя программу, рассчитает золотую пропорцию с погрешностью (0.618 Ч A + 0.382 Ч B), которая, тем не менее, никак не влияет на результат расчета — на успех поиска минимума. Более того, эту погрешность иногда целесообразно сделать случайной (функция RND) и более существенной. Получится некий гибрид метода золотого сечения и метода случайного поиска. Соотношение классики и новаторства (случайного или неслучайного творческого поиска) — еще одно слабое место компьютерной графики. Настоящие шедевры авангарда создавались и создаются художниками, уже достигшими неких высот в классическом видении мира. Примеры — Пабло Пикассо (живопись), Даниил Хармс (литература), Мейерхольд (театр) и т.д. К сожалению, компьютерной графикой в настоящее время увлекаются (а, главное, выставляются) в основном любители от живописи.

Художники-профессионалы, увы, пока дилетанты в сфере computer sience. Кто разорвет этот заколдованный круг?!

 

Пример 4

Мало кто знает, что у цепочки чисел Фибоначчи нет края не только справа, но и слева. Pascal-программа на рис. 4 способна найти числа Фибоначчи на всей числовой оси. На рис. 4а она записана в традиционной форме с выделением отступами структурных управляющих конструкций.

13, -8, 5, -3, 2, -1, 1, 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55 и 89.

{ Фибоначчи }

function Fibo(N: integer): longint;

begin

    if N < 1

        then

            case N of

                    0 : Fibo:=0;

                    -1 : Fibo:=1;

                    else Fibo:=Fibo(N+2)-Fibo(N+1);

            end {case}

        else

            if (N = 1) or (N = 2)

                then

                    Fibo:=1

                else

                    Fibo:=Fibo(N-2)+Fibo(N-1)

                end;

    var N: integer;

begin

        read(N);

        write(Fibo(N))

end.

Другая форма на рис. 4б, где число символов (буквы, цифры, пробелы и другие знаки) на каждой строке — это числа Фибоначчи, расположенные около нуля:

Рис. 4а

Рис. 4б

 

Пример 5

Помимо проблем золотого сечения людей искусства волнует и проблема изящных (сакральных) чисел: “тройка, семерка, туз”, 777 (антипод 666) и т.д. Автор предлагает программу расчета этих чисел — см. рис. 5. Назовем их изящными числами Фибоначчи, учитывая, что алгоритм их поиска почти полностью совпадает с тем, какой заложен в программу на рис. 4а и 4б. Только суммируются не два, а три предыдущих числа. Кроме того, изменена база: 1+3+7=11 (туз), 3+7+11=21 (три семерки, очко) и т.д. В этой цепочке нет 777 (тем более нет 666 и вообще нет четных чисел), т.к. 777 — это тоже “три семерки”, а не “семьсот семьдесят семь”.

Declare Function FINEFIBO (N)

Input "N"; N

Print FINEFIBO(N)

End

Function FINEFIBO (N)

Select Case N

Case Is < 1

FINEFIBO = FINEFIBO(N + 3) - FINEFIBO(N + 2) - FINEFIBO(N + 1)

Case 1

FINEFIBO = 1 ‘ Первое изящное число Фибоначчи

Case 2

FINEFIBO = 3 ‘ Второе изящное число Фибоначчи

Case 3

FINEFIBO = 7 ‘ Третье изящное число Фибоначчи

Case IS > 3

FINEFIBO = FINEFIBO(N - 3) + FINEFIBO(N - 2) + FINEFIBO(N - 1)

End Select

End Function

Рис. 5

Читатель, задайте товарищу альтернативный вопрос. Вы можете получить не два, а как минимум три варианта ответа ("Да", "Нет" и "Не знаю"). Уход от вопроса - это тоже ответ. Таким искусством славятся дипломаты. Что-то подобное можно наблюдать и при анализе логических выражений, используемых в программировании для управления работой вычислительной машины. Кроме двух известных значений (Да-Нет, Нуль-Не нуль, True-False) есть и третье, когда значения у этих выражений нет. Такая ситуация может рассматриваться не только как грубая ошибка, но и как тонкий программистский прием, опирающийся на метод проб и ошибок: если логическое выражение не определено, то выполнение программы идет по новому, третьему пути. Аналогичную картину можно наблюдать и в поведении двоичных элементов памяти компьютера - конденсаторов, триггеров, участков магнитного или оптического диска, дырок на перфокарте или на перфоленте. Кроме двух базовых состояний (заряжено-разряжено, открыто-закрыто, намагничено-размагничено, проколото-не проколото), генерирующих бит информации, есть и третье - недостаточно заряжен, вышел из строя, плохо намагничен, порван. Компьютер был бы просто неработоспособен, если б его элементная база опиралась только на двоичный код. Машина должна правильно анализировать ход обработки информации (а для этого и существуют контрольные байты и другие хитрости) и ожидать не два, а три варианта ответа на альтернативный вопрос: "Да", "Нет" и "Спроси у кого-нибудь другого" или что-то в этом роде.

Считается, что ЭВМ покоится на "двух китах" — на нуле и единице, союз которых называется битом. Но "два кита" — это несерьезная вещь не только в эстетическом, но и чисто в физическом плане. Человек это понял давно и стал закладывать тройку в религию (Троица), в искусство и в науку еще с незапамятных времен.

Не все так просто и с числом восемь, формирующим байт информации — те буквы и другие символы, какие читатель видит в тексте.

Два в степени восемь - это 256. С последним числом ассоциируются ASCII-коды. Но ASCII-таблица ни машиной, ни человеком не воспринимается в качестве единого целого, а разбивается на две половинки: верхнюю и нижнюю по 128 символов (два в степени семь) в каждой.

Проблема замены одной восьмерки-байта на две семерки (как и замена двойки-бита на тройку) лежит в плоскости теории надежности.

Любой мало-мальски грамотный инженер никогда не поставит в технологической цепочке один насос (клапан, фильтр, теплообменник). Требования живучести заставляют монтировать либо два насоса, либо три 50-процентной производительности каждый. У человека две руки, два глаза, две почки, пара легких, но одно сердце, что и определяет высокую смертность от инфаркта. Но два сердца, улучшив наше содержание, обеднили бы нашу форму — нельзя было бы сказать: "Я отдаю тебе свое сердце."

Тройка и семерка лежат в основе нашего мироощущения и, следовательно, можно, не прибегая к научным доказательствам, сказать, что и вычислительная техника базируется не на числах 2 (бит) и 8 (байт), а на числах 3 и 7.

Взглянем на далеко не полный список названий произведений искусства, иллюстрирующих затронутый эстетический принцип: “Трехгрошевая опера”, “Любовь к трем апельсинам”, “Трое в лодке не считая собаки”, “33 фуэте”, а также три карты, мушкетера, возраста Казановы, сестры, брата, царевича, девицы, товарища, толстяка, поросенка, танкиста, мудреца, желания, тополя на Плющихе — далее без остановок до тридцати трех богатырей за тридевять земель в тридесятом царстве.

Хорошо, — скажет читатель, — автор убедил меня, что число три заложено в художественной стороне информатики. Но научно-технологическая сторона проблемы подчиняется другим законам!? Не будем торопиться, а просмотрим опять же далеко не полный список компьютерных троек, объединенных принципом "Куда ни кинь — всюду треугольник, то есть клин".

Семерка — это второе изящное число. Вспомним, за сколько дней был создан наш мир, покоящийся, как мы уже отметили, на трех китах. Посмотрим на календарь, прослушаем музыкальную гамму, вспомним радугу... Можно привести еще один список, связанный с наукой, искусством и религией: “Семь незаходящих в Северном полушарии звезд Большой Медведицы”, “Семь смертных грехов”, “Семь гномов”, “Семь слоников”, “Семеро смелых”, “Семь невест для семи братьев”, “Семь нянек”, “Спящая царевна и семь богатырей”, “Семь чудес света”, “Семь Семионов”, “Агент 007”, “Великолепная семерка”, “Семь самураев”... Можно вспомнить пушкинского Германна из “Пиковой дамы”, сошедшего с ума и бормотавшего: “Тройка, семерка, туз! Тройка, семерка, дама!...”. В пушкинской фразе “Тройка, семерка, дама!...” тройка (а дама - это три очка) замыкает заколдованный круг:

Новой России очень трудно будет войти в семерку наиболее промышленно развитых стран мира не только по экономическим и политическим причинам. Из семерки никогда не сделают восьмерку - нарушится эстетика ежегодных summit'ов. А выпихивать кого-то из этой компании - тоже не очень красиво. Лучше уж семерку расширить до десятки. Кстати, десятка лучших (спортсменов, программ и пр.) - это три победителя и семь лауреатов.

Примеров компьютерных семерок тоже немало. Приведем курьезный.

В настоящее время пользователи персональных компьютеров переходят от работы в среде DOS к работе в среде Windows, от работы на 286-х, 386-х и 486-х машинах к работе на машинах PowerPC или с процессором Pentium. Люди, формально говоря, меняют число три (DOS, x86) на число семь (Windows, UNIX+OS2=7, Pentium, PowerPC).

У осетрины свежесть, как мы знаем, должна быть первой и последней. Последняя свежесть программных продуктов обычно нумеруется семеркой: MS-DOS 7.0, Microsoft C 7.0, Turbo Pascal 7.0... - седьмые версии, как правило, завершают линию этапных разработок.

База языка Visual Basic - семь структурных управляющих конструкций и семь типов переменных. В классическом Pascal'е тоже семь структурных управляющих конструкций.

А вот еще пример. В пакете Mathcad семь ключевых слов для управления процессом символьных преобразований, семь панелей математических инструментов, семь видов графиков, семь кнопок для формирования текста программы, семь текстовых функций...

 

Пример 6

Форма листинга программы пока, увы, почти не используется для раскрытия ее особенностей. Чего не скажешь о цвете. Впервые цвет появился в листингах программ, написанных на языке Quick Pascal фирмы Microsoft: ключевые слова — синий цвет, комментарии — зеленый и т.д. Но цвет здесь играет не эстетическую, а чисто утилитарную роль.

Автор увлекся цветом в программах еще задолго до появления цветных дисплеев и принтеров. На своих лекциях по программированию автор использовал цветные мелки для выделения структурных управляющих конструкций в программах. Студентам же было рекомендовано пользоваться цветными карандашами для освоения азов структурного программирования, где основным и нередко единственным средством ветвления был оператор GOTO, который в те времена предавали анафеме. Первая попытка опубликования идеи цвета в программах окончилась курьезом. Редактор журнала “Микропроцессорные средства и системы” честно признался, что он дальтоник, поэтому и по другим причинам он статью “режет”.

На рис. 6 воспроизведена программа ввода массива с одновременной сортировкой его, которую автор уже публиковал на цветной вкладке журнала “Наука и жизнь” (N 4’88).

INPUT "Число элементов в массиве"; N

DIM A(N)

FOR i = 1 TO N

INPUT A(i)

J = i

WHILE J > 1 AND A(J) < A(J - 1)

SWAP A(J), A(J - 1)

J = J - 1

WEND

NEXT

FOR i = 1 TO N

PRINT A(i)

NEXT

Рис. 6

Поэты подарили программистам идею программы-лесенки (см. рис. 4а). Долг платежом красен. Цвета в листингов можно перенести на стихи, раскрасив, например, рифмы. Автору не хватило смелости опубликовать здесь свои юношеские расцвеченные стихи. Но хватило нахальства разукрасить строфу из пушкинского Евгения Онегина:

  • Блажен, кто смолоду был молод,

    Блажен, кто вовремя созрел,

    Кто постепенно жизни холод

    С летами вытерпеть успел;

    Кто странным снам не предавался,

    Кто черни светской не чуждался,

    Кто в двадцать лет был франт иль хват,

    А в тридцать выгодно женат;

    Кто в пятьдесят освободился

    От частных и других долгов,

    Кто славы, денег и чинов

    Спокойно в очередь добился,

    О ком твердили целый век:

    N.N. прекрасный человек.

  • Пример 7

    В термине Computer Art почему-то видят только изобразительное искусство, забывая при этом о музыке.

    Итак, музыка и программы.

    Наверно мало кому из читающих эти строки довелось работать на компьютерах типа БЭСМ, Урал или Мир. А уж о ламповых, релейных или пневматических вычислительных машинах и говорить не приходится. Современные персональные компьютеры помимо всего прочего отличаются от вышеназванных и тем, что работают почти бесшумно. Только легкое жужжание вентилятора да пощелкивание винчестера, радует слух программиста или огорчает его, сообщая, что все хорошо или что-то не так. Шум старых машин был более информационно насыщен. Говорят, водились программисты, которые по характеру гудения машины определяли, в какой стадии находится вычислительный процесс. "Вот, вошли во вложенный цикл!", "Тише! Берется квадратный корень!" — поговаривали они то ли в шутку, то ли всерьез, разыгрывая наивных посетителей вычислительного центра. Но одно можно было утверждать с уверенностью, — на слух состояние машины (исправна-неисправна) можно было определить довольно точно.

    Ностальгия по старым временам, наличие у персонального компьютера звукогенератора, а в современных языках — звуковых операторов (типа PLAY) толкнули автора к идеи озвучивания "немых" программ по принципу:

    "А вы ноктюрн сыграть смогли бы на флейте водосточных труб!".

    На водосточных трубах, как призывает уже упоминавшийся нами Маяковский, автор играть не пытался, а вот на операторах программы... Если в начале и конце самостоятельных программных фрагментов поместить звуковые операторы, да так, чтобы высота звука была связана с типом озвучиваемого фрагмента, а его длительность — с глубиной вложения, то прогонка программы породит мелодию... Можно закрыть глаза, вытянуть ноги, закинуть руки за голову и вспомнить о добрых старых временах... Звукогенератор обладает буфером — программа уже выполнена, а мелодия звучит подобно свету угасшей звезды...

    ' Ностальгическая BASIC-программа "Сортировать так с музыкой!"

    PLAY "o3ms" ' Начало программы

    DATA 5: REM Число элементов в исходном списке

    DATA 3, -6, -69, -89, -5: REM Исходный список

    READ N: DIM A(N) ' Сортируемый массив

    FOR I = 1 TO N: READ A(I): NEXT I: Flag = -1

    PLAY "c1" ' Начало функционального блока

    PLAY "d1": DO WHILE Flag ' Начало цикла с предпроверкой

    PLAY "c2": Flag = 0: PLAY "c2" ' Функциональный блок

    PLAY "g3": FOR I = 2 TO N ' Начало цикла с параметром

    'Начало альтернативы

    PLAY "e4"

    IF A(I) < A(I - 1) THEN

    PLAY "c5": SWAP A(I), A(I - 1): Flag = 1: PLAY "c5"

    END IF

    PLAY "e4" ' Конец альтернативы

    NEXT I: PLAY "g3" ' Конец цикла с параметром

    LOOP: PLAY "d1"

    PLAY "c1" ' Конец цикла с параметром

    FOR I = 1 TO N: PRINT A(I): NEXT I

    PLAY "c1c0": END ' Конец функционального блока и программы

    Рис. 7

    Программа сортирует "с музыкой" массив из 5 элементов (было 3, -6, -69, -89 и -5, стало -89, -69, -6, -5 и 3), играя при этом нехитрую мелодию.

    Европейская гамма "до-мажор" (C#, C-дур: тон, тон, полутон, полутон, тон, тон, тон, полутон) с семью основными звуками (до, ре, ми, фа, соль, ля и си) и с пятью вспомогательными (до-диез, ми-бемоль, фа-диез, ля-бемоль и си-бемоль) "созвучна" другому творению Европы — языку Pascal, у которого семь основных (структурирующих) и пять вспомогательных (деструктурирующих) средства изменения течения алгоритма. Поэтому Pascal-программу можно озвучить так:

    Эта семерка "структурирующих" звуков будет озвучивать программу дифтонгами, отмечая начала и концы соответствующих блоков. А вот эти звуки

    будут одиночными, так как отмечают в программе деструктурирующее ключевое слово goto и встроенные функции break и continue:

    Последние две встроенные функции — break и continue — введены только в седьмую (и последнюю) версию Turbo Pascal. Новых конструкций, связанных с ветвлениями в алгоритмах, по-видимому не предвидится. Они будут лишними и в языковом и в музыкальном смыслах.

    Эту закономерность можно объяснить с "музыкальной" точки зрения. Дело в том, что пять нот, а не семь — это основа восточного звукоряда, а не европейского: на Востоке на уроках сольфеджио распевают "аa-ее-ии-оо-уу", а не "до-ре-ми-фа-соль-ля-си" как на Западе. Языки Pascal и C создавались программистами для собственного употребления. Язык же Бейсик задумывался как инструментальное средство для "восточных туземцев" — непрофессиональных программистов, использующих компьютер для решения своих прикладных задач. BASIC — это не только аббревиатура английской фразы "Beginner's All-purpose Symbolic Instructions Code". Слово basic имеет и прямой перевод — основной язык программирования. В колониальные века миссионеры использовали basic english (основной английский), состоящий из примерно 300 слов, для общения с туземцами.

    Запустив программу на рис. 7 в режиме трассировки, можно сыграть целую цвето-музыкальную симфонию.

    Статья начиналась шаблоном Вирта, Кончим мы ее перефразированием уже Чехова: В программе все должно быть прекрасно — и форма, и интерфейс, и алгоритм, и структура данных.

    Литература:

    1. Wirth N. Algorithms + Data Structures = Programms, Pentice-Hall, Inc., Englewood Cliffs, N.1., 1976 (русский перевод — М.: Мир, 1985)
    2. Заде Л.А. Понятие лингвистической переменной и его применение к принятию приближенных решений (перевод с англ.). М.: Мир,1976
    3. Очков В.Ф. Принцип неопределенности программирования. КомпьютерПресс, 6’96

    Отклик

    Здравствуйте, Валерий.

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

    К сожалению, для "журнала образцового содержания" статья ваша слишком специальная и напечатана в нем быть не может. Но это не значит, что в "Столице" не может появится некий дайджест или изложение ее. Не могли бы вы порекомендовать мне кого-то еще, кто занимается тем, что вы называете экспериментальным программированием. Может быть, что-то существует в Сети. Если я почувствую, что материала достаточно и он поддается внятному для некомпьютерщика изложению (а ваша работа, в значительной степени поддается), то можно было бы написать хорошенький обзор опытов в этой малоизвестной "тем, кто умеет читать" области.

    Александр Левин