"Нет, ребята, тяжело эту
штуку описать, если кто не
видел, очень уж она проста на
вид, особенно когда
приглядишься и поверишь
наконец своим глазам." Стругацкие, "Пикник на обочине" |
Рэдрику Шухарту тяжело было описать "пустышку" скорее всего потому, что слишком уж много этих удивительных объектов он перетаскал на своей спине из Зоны под прилавок Эрнесту. Столь же трудно описывать любимую компьютерную программу после примерно тысячного дабл-клика по ее иконке: время превращает всё удивительное в привычное и простое на вид. Но под эту обманчивую простоту очень даже стоит заглянуть, если речь идет о программе Mathematica, одной из самых сложных систем ПО в мире, которой 23 июня 1998 года исполнилось 10 лет.
Давайте мы с Вами, уважаемый читатель, найдем на десктопе иконку в виде разноцветного звездчатого икосаэдра и сделаем по ней дабл-клик. Это даст нам паузу для нелирического отступления под аккомпанемент винчестера. Ох, уж эти дабл-клики! Некоторые люди очень не любят такие сложные приемы и соответствующие им операционные системы от MS. Однако тема данной статьи - Mathematica - дает редчайшую в наши дни возможность не раздражать их, и без того обиженных на глупое большинство, предпочитающее худшее лучшему. Действительно, хотя широкой распространенности и высокой производительности платформы Wintel в обозримом будущем ничто не угрожает, компания Wolfram Research (см. www.wolfram.com), создавшая и развивающая Mathematica, обеспечивает истинную многоплатформенность этой программы на более чем 20 типах компьютерных систем: Windows 95/NT, Macintosh, Sun SPARC, DEC Alpha, HP PA-RISC, Silicon Graphics, IBM RISC, Linux, NextStep (на 4 типах процессоров), OS/2, OpenVMS и т.д. Легко догадаться, какая из версий программы самая доходная для компании. Зато пользователю глубоко безразлично, на какой платформе он работает с Mathematica: он видит тот же интерфейс, использует тот же язык программирования и без проблем переносит свои документы и программы на другую платформу. Вот только при таком переносе он не выиграет и порядка в производительности: прошли те времена, когда ученые и инженеры кисло морщились при упоминании о PC.
А вот и она, Mathematica! На экране - графический интерфейс "Notebook" во всей своей строгой простоте. Никаких украшений, никаких мультяшек с глазастыми скрепочками, ведь с этой программой работают люди серьезные, а не смешливые длинноногие секретарши. Сверху - узкое горизонтальное окно меню, слева на пол-экрана - пустое пока окно нового документа-ноутбука "Untitled-1", справа - узкое вертикальное окно палитры "BasicInput". Нет, эта палитра не имеет отношения к Бейсику: у Mathematica свой собственный язык программирования - мощный, гибкий, выразительный и ни на что не похожий. А палитра эта, как и многие другие, вызываемые из меню или создаваемые пользователем, просто снижает нагрузку на клавиатуру. Щелкая мышкой по кнопкам палитр, можно вводить в документ-ноутбук греческие, готические и прочие исторические буквы, утомительно длинные команды типа JordanDecomposition[], матрицы, суммы, интегралы, стрелки, тильды, наблы, индексы, степени, радикалы и тому подобное, без чего математик, втиснутый в командную строку, чувствует себя больным и несчастным. Впрочем, все это типографское изобилие - более 700 спецсимволов - вводится и посредством чечетки на клавиатуре, причем несколькими альтернативными способами. Ноутбук многолик. Ноутбук - это электронный документ, поддерживающий на экране и на печати текст, формулы и графику (2D и 3D) с цветом, массой шрифтов и символов, привычной двухмерностью математических обозначений и средствами форматирования всего этого хозяйства, а не для печати - еще и анимацию со звуком. Ноутбук - это файл *.nb в стандартной 7-битной кодировке и потому пригодный для передачи по любым каналам связи. Ноутбук - это мощное средство подготовки научных статей, лекций, книг и презентаций, а по качеству печати текста с обильными формулами его превосходит разве что только TEX. Но все эти прелести вторичны, а первично то, что ноутбук - интерфейс Mathematica, обеспечивающий удобное общение человека с ядром программы, с "Kernel", где, собственно, и заключены те миллионы лошадиных сил вычислительной мощности, за которые миллионы пользователей любят Mathematica.
Кстати, ядро пока дремлет на винчестере, не загружаясь за ненадобностью, ведь мы его еще ни о чем не спросили. Спросим. Печатаем в ноутбуке 2+2 и жмем Shift+Enter. Так и есть: сам по себе интерфейс туп как пуп в математике, хоть и способен напечатать целую монографию по этой науке. Ноутбук вызывает ядро, долго ворчит винчестер, и вот появляется оно, как тень отца Гамлета: на Taskbar рядом с кнопкой "Mathematica" возникает кнопка "Mathematica Kernel", отвечающая исключительно за индикацию загрузки ядра. Хотя само ядро мы никогда не увидим, весь смысл его незримого присутствия заключается в его действиях. Ядро впечатывает перед 2+2 синее In[1]=, вычисляет значение выражения 2+2 и с новой строки печатает в ноутбуке ответ: Out[1]:=4. Феноменально! Да, решение таких проблем на Mathematica подобно вскапыванию огорода посредством трактора "Кировец". Но математических проблем в науке и технике много и очень разных. Над одними из них Mathematica задумывается на микросекунды, над другими - на месяцы. Сказать, что ядро программы может вычислить всё, будет неправдой, но и нелегко придумать то, что ему не по силам: обычно человек, нашедший слабое место в Mathematica, постепенно краснеет по мере осознания того, что он сам не сумел правильно задать ей вопрос. Mathematica - универсальная программа для выполнения вычислений всех трех основных типов: численных, графических и символьных (т.е. алгебраических). Хотя устройство ядра модульное, нельзя сказать, что указанные типы вычислений в нем строго разграничены: численные алгоритмы, например, интенсивно используют алгебру, а графика - быстрые численные оценки с машинной точностью. Mathematica - интерпретатор, и это разумно, потому что подаваемые пользователем короткие команды типа Solve и Plot3D запускают на исполнение целые сотни страниц уже готового кода. Но Mathematica имеет и встроенный компилятор, который заметно ускоряет вычисления, интенсивно использующие FPU, он, например, автоматически применяется при графических вычислениях. В Mathematica тип переменных не оговаривается, то есть она - нетипированная система. Очень удобно, что для нее 1.5 - заведомо число с машинной точностью, однако 3/2, 1000!, Sqrt[2] и Pi - это абсолютно точные числа, вычисляемые по требованию с произвольной точностью, машинной или более высокой. Любопытно, как символьные выражения представляются на уровне ядра: x-y превращается в Plus[x,Times[-1,y]]. Алгоритмы ядра Mathematica во многом не похожи на то, как вычисляет человек. Например, вычисляя неопределенный интеграл, она сначала строит возможный ответ в максимально общей форме (а набор известных ей спецфункций колоссален), затем его дифференцирует, после чего пытается подогнать результат к подынтегральному выражению. Глупо? Для человека - да, а Mathematica может себе такое позволить от избытка сил. (Советую сходить на www.integrals.com и там посмотреть ее интегратор в действии.) Многие алгоритмы ядра написаны вручную, но также многие сгенерированы компьютерно - самой Mathematica. Пример: алгоритмы вычисления встроенных функций с машинной точностью (следует помнить, что в этой программе буквально всё может вычисляться и с произвольной точностью - тогда FPU не используется). В основе этих алгоритмов лежат формулы, которые, обеспечивая достаточную точность, должны быть предельно короткими; вот такие оптимальные формулы и вывела сама для себя Mathematica, затратив на некоторые из них месяцы вычислений. Игра стоила свеч: в отношении эффективности вычислительных алгоритмов Mathematica не имеет себе равных. Например, на численное определение собственных значений случайной матрицы размером 50 на 50 она тратит 1 секунду на типичном PC, а ее конкурентка - программа Maple - более 6 минут. Легко ли ускориться в 400 раз "железным" способом?
Mathematica - одна из самых сложных программ в мире. Ее исходный код написан на комбинации Си и собственного языка Mathematica. Исходник ядра содержит 500000 строк Си и 80000 строк языка Mathematica, что составляет 15 Мб кода в совокупности. Код Си написан на специальном фирменном расширении языка Си, которое поддерживает необходимые функции управления памятью и имеет некоторые объектно-ориентированные возможности. В исходнике ядра на язык и систему приходится 30% кода, на численные вычисления - 25%, на алгебру - 25%, на графику и обработку выхода ядра - 20%. Нужно особо подчеркнуть, что исходный код ядра Mathematica с точностью до доли процента един для всех типов компьютерных систем, на которых работает эта программа. Однако это не так в отношении интерфейса: его исходник содержит около 175000 строк системно-независимого кода Си (из них 60000 отвечают за форматирование выражений), но кроме них - от 20000 до 50000 строк системно-зависимого кода Си. Mathematica использует модель вычислений клиент-сервер, при этом интерфейс и ядро связаны системой MathLink - той же самой, что служит для связи Mathematica с внешними программами. На большинстве платформ ядро может работать на удаленном сервере, но при современной производительности PC это как-то неактуально. Последнюю мысль стоит развить в историческом аспекте. Концепцию программы Mathematica, ее дизайн и язык придумал в 1986 году 27-летний Стивен Уолфрэм (Stephen Wolfram); в следующем году он основал компанию Wolfram Research. С тех пор более тысячи человеко-лет ушло на разработку кода Mathematica, столько же - на ее тестирование. В 1988 году вышла Mathematica 1.0. Объем исходного кода ее ядра составлял 150000 строк, и потому эта программа требовала очень продвинутого "железа" - по тем временам. Версия 2.0 (1991 год) имела исходник ядра объемом 350000 строк - и снова столь могучий "дух" помещался далеко не в любом "теле". Поначалу ее требования - 8 Мб оперативки для спокойной работы и 15 Мб на винчестере для инсталляции - казались просто кошмарными, но за 5 лет жизни 2-й версии это ощущение испарилось. Текущая версия 3.0, о которой и написана эта статья, вышла в 1996 году. Ее ждали не только с нетерпением (ждали-то не менее миллиона человеко-лет), но и со страхом: а вдруг она затребует 128 Мб оперативки? Но нет: разработчики стали скромнее, а "железо" выросло неимоверно. Сегодня требования Mathematica никого не испугают: на всех платформах достаточно 130 Мб на винчестере для полной инсталляции (из них 80% уходит на исчерпывающую документацию и пакеты), а рекомендуемый объем оперативки составляет всего лишь 32 Мб, причем для скромной Windows 95 рекомендуется 16 Мб, и этого действительно хватает. Особо повторю: для Linux рекомендуется 32 Мб, как для NT и всех Unix'ов. И еще о 95-ке. Распространено мнение, что под этой ОС серьезно работать вообще невозможно. Не знаю, на чем оно основано, и "не скажу про всю Одессу", но у меня Mathematica под 95-кой непрерывно считает в фоновом режиме по несколько суток с полной загрузкой процессора и "свопом" в пару сотен Мб, при этом никому и ничему не мешает, и всё OK. Агитацию я прекращаю напоминанием о том, что Mathematica позволяет пользователю выбрать себе по вкусу практически любую платформу. Более того, она позволяет "переноситься" не только в пространстве, но и во времени: программы, написанные на языке Mathematica 1.0, работают и с версией 3.0, хотя у ядер 1-й и 3-й версии совпадают всего лишь несколько процентов кода.
Всё достаточно сложное содержит ошибки. Природа пишет и тестирует генетический код человека уже 3,5 млрд. лет - и что же? Потому и в Mathematica есть ошибки и всегда будут. Но компания Wolfram Research к надежности своего детища относится очень серьезно. Особо тщательно тестируется ядро программы. В основном это делается автоматизированной системой, написанной на языке Mathematica! Система генерирует и вводит в ядро свои вопросы и анализирует его ответы, используя для контроля пары взаимно-обратных операций типа степень - корень или интегрирование - дифференцирование. Вопросы генерируются не только случайным образом: все стандартные математические таблицы и тонны упражнений из учебников сканировались, вводились и проверялись. В каждом спорном случае арбитром служит эксперт-человек. При тестировании автоматизированная система проверяет не только результат, но и использование памяти, скорость и сообщения об ошибках. Есть также и специальная инструментальная версия Mathematica: она работает гораздо медленнее обычной, зато позволяет контролировать на каждом шаге вычислений использование памяти, возможность прерывания счета и то, какие части кода задействованы в данный момент. Разумеется, тестирование программы производится отдельно на каждом из многих родных для нее типов компьютерных систем. Потому-то в Wolfram Research на 200 человек приходится 550 самых разнообразных компьютеров.
Язык Mathematica заслуживает высших похвал! Говорят, что сегодня молодежь уже нигде не изучает Фортран, и этот седой научно-ориентированный патриарх умирает. Увы, он очень устарел, и даже "реанимация-90" его не спасла. Однако в последние годы в научно-технических кругах круто набирает популярность язык Mathematica. Этот научно-ориентированный язык очень не похож на Фортран, но способен стать стандартом де-факто, как бы Фортраном XXI века. Он прост и логичен. В нем чрезвычайно продуманно используются большие буквы, три типа скобок, знаки пунктуации, несколько типов присваивания. Его концепции "expression", "list", "rule", "pattern", "string", "pure function" очень общи и так же функциональны. Он поддерживает много парадигм программирования: процедурную, функциональную, объектно-ориентированную, а еще - как же это будет по-русски? - "list-based", "rule-based", "string-based" и, разумеется, "mixed". На языке Mathematica можно выразить любую проблему из любой математизированной области науки и техники и при этом получить не только работающую программу, но и удовольствие.
Ну а такого роскошного Help'а, как в Mathematica, Вы нигде не найдете. Недаром он назван "Help Browser": не только своим устройством, но и информационным богатством он наводит на мысли о Сети. Исчерпывающий предметный указатель, полный список встроенных функций с примерами и ссылками, описания стандартных пакетов, красивое введение для начинающих, дополнительная системно-зависимая информация. Но главная жемчужина Help'а - книга самого Стивена Уолфрэма "The Mathematica Book", то есть лучшая книга об этой программе. Полностью и on-line! А в ее бумажном варианте, между прочим, 1400 страниц. Всё содержимое Help'а выполнено в виде электронных документов-ноутбуков средствами интерфейса программы, и это вообще типично для Mathematica: если в ней есть правило, то из него нет исключений.
Наконец, последний вопрос: а почему данная статья называется именно так? Help и здесь поможет. Если Вы просмотрите имена более 1000 встроенных функций Mathematica и названия ее алгоритмов, то встретите сотню знакомых фамилий. Эратосфен и Чебышёв, Ньютон и Эйлер, Риман и Гаусс, Вейерштрасс и Жордан, Коши и Бессель... Они, как и многие тысячи других именитых и безымянных математиков, никогда не работали в Wolfram Research, и пользователи Mathematica не могут ни заплатить им, ни послать им благодарный e-mail. Однако при каждой загрузке Mathematica Kernel их бессмертные души перетекают из винчестера в оперативку и превращают железного дурака в математического гения. Поэтому будьте бдительны, уважаемый читатель, и не пугайтесь, если во время сессии Mathematica из Вашего системного блока станут появляться задумчивые призраки в одеждах разных эпох и народов и изумленно глядеть на то, как быстро и легко Вы делаете умопомрачительные вычисления посредством какой-то диковинной машины. Не забудьте сказать им искреннее "спасибо", и они уйдут, не испортив Ваших *.nb файлов.
Сергей СЕРЫЙ
Горячие темы