Стругацькі, "Пікнік на узбіччі"
Редрік Шухарт важко було описати "пустушку" швидше за все тому, що надто вже багато цих дивовижних об'єктів він переносив на своїй спині з Зони під прилавок Ернесту. Так само важко описувати улюблену комп'ютерну програму після приблизно тисячного дабл-кліка по її іконці: час перетворює все дивовижне в звичне і просте на вигляд. Але під цю оманливу простоту дуже навіть варто заглянути, якщо мова йде про програму 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 - це абсолютно точні числа, які обчислюють за вимогу з довільною точністю, машинного чи вищою. Цікаво, як символьні вирази представляються на рівні ядра: xy перетворюється в 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 файлів.
Сергій СІРИЙ
Нерозумно?Чи легко прискоритися в 400 разів "залізним" способом?
Її чекали не тільки з нетерпінням (чекали щось не менше мільйона людино-років), а й зі страхом: а раптом вона зажадає 128 Мб оперативної пам'яті?
Років - і що ж?
Він підтримує багато парадигм програмування: процедурну, функціональну, об'єктно-орієнтовану, а ще - як же це буде по-російськи?
Нарешті, останнє запитання: а чому дана стаття називається саме так?