14 August 2015

Краткая история появления Mathematica

Wolfram Research corporate blogProgrammingDesigning and refactoringFunctional Programming
Original author: Стивен Вольфрам (Stephen Wolfram)

Перевод поста Стивена Вольфрама (Stephen Wolfram) "There Was a Time before Mathematica…".
Выражаю огромную благодарность Кириллу Гузенко KirillGuzenko за помощь в переводе.

Через несколько недель [пост был написан 6 июня 2013 г. — прим. ред.] будет двадцатипятилетний юбилей: 23 июня 1988 года — день, когда была выпущена Mathematica.

Поздней ночью мы все ещё записывали дискеты и упаковывали их. Однако уже в полдень 23 июня я был в конференц-центре в Санта-Кларе, впервые показав публике Mathematica:

Mathematica 1.0 на Macintosh


Да, именно таким был загрузочный экран, и да, Mathematica 1.0 работала на маках и различных рабочих станциях на Unix; PС тогда не хватало мощности.

Многие оказались под впечатлением от того, что может делать Mathematica. И были очень приятные речи о перспективах Mathematica от различных лидеров компьютерной индустрии, в числе которых был и Стив Джобс (тогда он был в NeXT'е), который был весьма любезен, чтобы прийти, хоть он и не появлялся на публике в течение некоторого времени. А кто-то на этом мероприятии был достаточно дальновиден, чтобы попросить всех выступающих расписаться на книге о Mathematica, которая только поступила в продажу в тот день в книжных магазинах по всей стране:



Столько всего произошло с Mathematica за прошедшую с тех пор четверть века. То, что началось с Mathematica 1.0, превратилось в обширную систему, в сегодняшнюю Mathematica. И вот, я смотрю на юбилейный альбом в честь 25-летия, и меня берёт гордость от осознания того, какой вклад внесла Mathematica в исследования, изобретения, образование, науку:



Однако, пожалуй, самым примечательным для меня является то, как фундаментальные принципы, на которых я строил Mathematica, выдержали испытание временем. И то, как основные идеи и сам язык, которые были в Mathematica 1.0, сохраняются и сегодня (и да, большая часть кода Mathematica 1.0 до сих пор работает и осталась нетронутой).

Хорошо, но откуда взялась Mathematica? Как она стала такой, какая она есть? Это очень долгая история, правда. И тесно переплетена с моей жизнью. Однако, когда я пытаюсь заглянуть в будущее, мне интересно понять, как и какими путями всё менялось в прошлом.

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

Первые электронные калькуляторы начали входить в обиход, когда мне было 12, и они меня увлекли с головой. И примерно в то же время я начал пользоваться своим первым компьютером — штуковиной размером с большой стол, в котором памяти было 8 «килослов» по 18 бит каждое, запрограммированных по большей части на ассемблере с использованием бумажной перфоленты. Я пытался приспособить его каким-нибудь образом к решению физических задач, но без особого результата. И вот, мне уже 16, я опубликовал несколько статей по физике, окончил среднюю школу и работал в британской правительственной лаборатории. «Настоящие» физики-теоретики тогда практически не использовали компьютеры. А я использовал. То настольный калькулятор HP (с плоттером!), то мэйнфрейм IBM на Фортране.

В основном я просто делал расчёты. Однако то, чем я хотел заниматься в физике, сопрягалось с самыми разнообразными разделами алгебры. И не с одной лишь алгеброй. Много с чем. Выражения из диаграмм Фейнмана с сотнями или тысячами элементов, все из которых должны быть представлены точно, если мы хотим получить правильный ответ.

И я начал размышлять, что с этим можно сделать. Мне представилось, как я всю жизнь буду гоняться за минусами и множителями в уравнениях. А потом я начал думать о том, как тут можно задействовать компьютер. И кто-то мне сказал, что есть и другие люди с подобными идеями. Были три программы, о которых я смог узнать, и как выяснилось, все они получили своё начало после одной беседы в ЦЕРНе, которая случилась в 1962 году: это Reduce (написана на LISP'е), Ashmedai (написана на фортране) и SCHOONSCHIP (написана на ассемблере 6000 CDC).

Программы были специализированными, и было непонятно, как много людей, помимо самих авторов, всерьёз использовали эти программы. Они были весьма неуклюжими: как правило, вы «скармливали» им целую колоду перфокарт, а через некоторое время получали результат, или, что гораздо более ожидаемо, какое-нибудь загадочное сообщение об ошибке. Однако мне удалось начать их использовать в задачах, с которыми я сталкивался в физике.

А затем, летом 1977 года я открыл для себя ARPANET — то, что в настоящее время переросло в Интернет. Тогда в сети было всего 256 хостов. И вот, @O 236 достался открытому компьютеру в Массачусетском технологическом институте, который работал с программой Macsyma, и в ней можно было проводить алгебраические вычисления в интерактивном режиме. Я был поражен тем, насколько мало людей пользовались этим. Но это было незадолго до тех времён, когда я стал большую часть времени тратить на это. В основном я работал с машиной методом тыка — сделав что-то, смотрел, что произойдёт, возвращался назад, опять что-то пробовал и т. д. И обычно делал такие странные вещи, как перечисление различных алгебраических форм интеграла, чисто экспериментально получая, какая продифференцирована корректно.

Мои статьи по физике начали включать в себя самые разнообразные безумные формулы. И не думая о том, что я мог бы для этого использовать компьютер, людям представлялось, что я какой-то искусный в сфере алгебры человек-калькулятор. Мои амбиции росли вместе с количеством того времени, которое я уделял Macsyma. Через некоторое время, полагаю, я стал использовать её больше всех в мире. Но где-то к 1979 году я достиг её потолка.

Затем был ноябрь 1979-го. Мне было 20, и я только что получил PhD в области физики. Я проводил несколько недель в ЦЕРНе, планируя своё будущее в физике (так мне тогда представлялось). И я тогда кое-что понял: чтобы продуктивно заниматься физикой, мне нужно нечто большее, чем Macsyma. И через некоторое время я решил, что единственный способ получить то, я хочу — сделать это самому.

И я начал реализовывать то, что потом стало называться SMP (Symbolic Manipulation Program, программа для символьных операций). Я обладал обширными познаниями в языках программирования того времени, как в сфере процедурных ALGOL'оподобных, так и в LISP и APL. И когда я набросал примерный вид SMP, то получилось нечто очень похожее на то, что я видел в этих языках. Однако по мере того, как я понимал, какой должна быть SMP, я начал пытаться придумывать всё сам.

Полагаю, у меня были некоторые весьма интересные идеи. И, по сути, в некоторых идеях из проектной документации ещё весьма сырой SMP прослеживаются мотивы грядущей Mathematica:



Просматривая сейчас документацию SMP, я понимаю, что это было весьма впечатляющая система, особенно учитывая, что мне было всего лишь 20 лет, когда я начал её проектировать. Разумеется, далеко не все идеи в SMP оказались хороши. И, как специалист в области дизайна языков с большим стажем, я не могу не упомянуть некоторые из моих «любимых» ошибок, которые представлены в конце этого поста.

Даже в ранних своих версиях SMP была большой системой. Но по каким-то причинам я не находил в ней ничего сложного. Я просто хотел двигаться дальше и реализовать её. Я хотел быть уверенным в том, что сделал всё настолько хорошо, насколько это возможно. Помню, мне пришла в голову мысль: «по-сути, я не знаком с информатикой; лучше бы мне её изучить». После чего пошёл в магазин и скупил у них все книги, которые имели отношение к ней — примерно половина шкафа. И начал их читать одну за одной.

Тогда я работал в Калифорнийском технологическом институте. И я пригласил выступить с речью всех, кого только мог найти в мире, кто бы работал над схожими системами. Я собрал небольшую рабочую группу в Калифорнийском технологическом институте, в которую некоторое время входил и Ричард Фейнман. И я начал вербовать людей со всего кампуса на работу над “SMP Project”.

Вначале предстояло принять важное решение о том, на чём писать SMP. Macsyma была написана на LISP'е, и многие говорили, что только на нём и можно написать. Но молодой аспирант-физик по имени Роб Пайк убедил меня, что C — язык будущего, что это правильный выбор (Роб много чем занимался впоследствии, включая создание языка Go). И вот, в начале 1980 года были написаны первые строки кода C для SMP.

Группа, работающая над SMP, имела весьма интересный состав. Первый из тех, кого я пригласил в группу — Крис Коул — после этого работал IBM и стал ярым последователем APL, после чего основал довольно-таки успешную компанию под названием Peregrine Systems. Были студенты, каждый из которых имел какие-то свои навыки, профессор, весьма увлечённый программированием, в соавторстве с которым я написал несколько статей по физике. Конечно, случались и оказии. Был один парень, который писал очень эффективный код, притом в одну строчку; он использовал красочные имена для функций, притом так, чтобы чтобы их комбинация читалась бы как какая-нибудь шутка. Или, скажем, был блестящий студент-бакалавр, который так усердно работал над проектом, что сильно отстал по учёбе; он пообещал не прикасаться к компьютеру, но вскоре был обнаружен за тем, что надиктовывал своему товарищу код.

Я и сам написал много кода для SMP (около 1000 строк каждый день). Я придумал её дизайн. И я написал большую часть документации. Я никогда до этого не управлял большим проектом. Однако, по какой-то причине, это никогда не было для меня чем-то очень сложным. И вот, в июне 1981 года, появилась первая версия SMP, и была она весьма похожей на Mathematica:



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

Я понял, что всё может иметь символьное представление. Хоть и символьно индексированные списки в SMP не позолили ввести «заголовки выражений», которые весьма ясно реализованы в Mathematica. И, несомненно, были некоторые странности во внутренней реализации символьных выражений, одна из которых — хранение всех чисел в формате с плавающей запятой (Тини Вельтман, автор SCHOONSCHIP, а после и лауреат Нобелевской премии по физике, сказал мне, что хранение числа в формате с плавающей запятой было одним из лучших когда-либо сделанных им решений, потому что FPU намного быстрее в арифметических вычислениях, нежели ALU).

До SMP я написал много кода для таких систем, как Macsyma, и я понял, что всё, что я пытался сделать, заключалось в том, чтобы сказать системе: «у меня есть выражение, которое выглядит вот так, и я хочу его привести его вот к этой форме». Таким образом, в разработке SMP использование правил преобразования для семейств символьных выражений, представленных шаблонами, стало одной из центральных идей. Реализация, конечно, не была столь же чистой, как в Mathematica, и в ней имелись не самые удачные идеи. Однако там были уже многие ключевые элементы.

В конце концов, содержание документации у SMP первой версии 1981 года было в достаточной степени современным:



Да, графическому выводу отводится небольшой раздел — так же, как и управлению памятью. И есть такие очаровательные разделы, как “тупиковые ситуации в программе” (т. е. зависание системы), а так же “создание статистических выражений” (т. е. создание случайных выражений). Однако уже имеется «параллельная обработка», наряду с «построением программ» (т. е. генерация кода). SMP мог даже генерировать C код, компилировать его, и, что весьма пугающе, динамично связывать его с запущенным исполняемым файлом SMP. И было много математических функций и математических операций, хотя и значительно меньше, чем в Mathematica.

Ну, хорошо. Заработал SMP 1.0. И что с ним делать? Было очевидно, что для многих людей система оказалась бы полезной. Она запускалась на довольно больших компьютерах — на так называемых «мини-ЭВМ», наподобие VAX, который был по размерам в несколько больших холодильников, и стоили такие по несколько сотен тысяч долларов. Однако я знал, что было много научно-исследовательских и проектных организаций, которые имели подобные машины.

Тогда я ничего не знал о компаниях и бизнесе. Но я понимал, что работа людей над SMP должна быть оплачиваемой, и весьма очевидный вариант по получению денег заключался в продаже копий SMP. Моя первая мысль была пойти в организацию, которую сейчас назвали бы «центром обмена технологиями» в Калифорнийском технологическом институте и узнать, смогут ли они нам чем-то помочь. В то время офис по существу состоял из одного приятного пожилого джентльмена. Но после нескольких попыток стало ясно, что он на самом деле не знал, что нужно делать. Я спросил его о том, как такое может быть; я полагал, что подобные вещи должны в Калтехе происходить постоянно. «Ну, — сказал он, — в основном люди с факультета просто уходят и сами основывают свои компании, так что мы оказываемся никак не вовлечены в процесс». «О, — сказал я, — так я тоже могу так?». И, пролистав устав университета, он сказал: «программное обеспечение можно запатентовать, университет не претендует на авторские права, так что да, Вы можете».

И я так и сделал, решив основать свою компанию. Но всё оказалось не так просто. Потому что некоторое время спустя администрация университета вдруг решила, что всё было не OK. Были весьма странные и недостойные моменты («возьмите меня в долю, и я отпишусь от этого», и т. д.). Ричард Фейнман и Мюррей Гелл-Манн заступились от моего имени. Президент университета, похоже, не знал, что делать. И на какое-то время всё застопорилось. Но в итоге мы договорились, что университет будет предоставлять лицензии независимо от имеющихся у них прав, даже если им придётся поменять что-то в своих документах касательно программного обеспечения.

В итоге осталась одна загвоздка в виде тогдашнего ректора университета. Он заявил, что подобная лицензия создаёт конфликт интересов между университетом и компанией, если я работаю в университете и владею частью компании. «Хорошо, — сказал я, — это не проблема, я покидаю университет». Казалось, это стало большим сюрпризом. Но я ушёл из университета и перешел в Институт перспективных исследований в Принстоне, куда, как отмечал тогдашний директор, они отдали компьютер, когда умер Джон фон Нейман, так что они могли особо не волноваться касательно интеллектуальной собственности.

В течение многих лет я размышлял о том, что же тогда на самом деле происходило в Калтехе. И, так получилось, что буквально пару недель назад я решил снова посетить Калтех (получить награду “выдающегося выпускника”). Обедая в факультетской столовой, я обнаружил, что за соседним столиком сидел никто иной, как бывший ректор Калтеха, которому уже почти 95. Я был впечатлён его глубоким отзывом на то, что он назвал “the Wolfram Affair” (был ли он предупреждён?). В итоге наш разговор многое прояснил.

Честно говоря, всё оказалось ещё более странным, чем я мог себе вообразить. История в некотором смысле началась в 1930-е годы, когда Арнольд Бекман был в Калтехе, изобрёл измеритель рН, а затем покинул университет, основав Beckman Instruments. К 1981 году Бекман был основным спонсором Калтеха и председателем его попечительского совета. Между тем, председатель его биологического факультета (Ли Гуд) изобрёл геномный секвенсор. Он сказал, что много раз пытался им заинтересовать Beckman Instruments, но безрезультатно, и потому основал свою собственную компанию (Applied Biosystems), которая стала весьма успешной. В какой-то момент, как мне сказали, Арнольд Бекман расстроился и сказал администрации, что они должны “прекратить уходы IP с кампуса” [IP (intellectual property) — интеллектуальная собственность — прим. ред.]. И так получилось, что это совпало со временем появления моего проекта по SMP. И тогдашний ректор сказал, что он обязан этим заняться (он так же был и химиком, которого Фейнман и Гелл-Манн, как физики, называли «околофизиком»).

Но, несмотря на весь этот кавардак, всё таки появилась компания, которую я назвал Computer Mathematics Corporation. В то время я всё ещё представлял себя молодым учёным и не думал, что буду управлять компанией. Так что я привёл CEO, который был старше меня где-то в два раза. И по велению директора и некоторых венчурных капиталистов компанию решили объединить со старпапом, который, как они думали, должен был преуспеть в НИОКР в сфере искусственного интеллекта.

Между тем, SMP продвигался под слоганом «математика на компьютере»:



Были ужасные промахи. Генеральный директор: «Давайте построим рабочую станцию для запуска SMP»; я: «Нет, мы софтверная компания, и я видел систему Stanford University Network (SUN), которая заведомо лучше всего того, что мы смогли бы сделать». А потом были подобные необоснованные заявления от рекламщиков:



И скоро я понял, что всё это неправильно. SMP получается какой-то дойной коровой, и хотя CEO не был особо хорош в зарабатывании денег, он был весьма хорош в их привлечении — пройдя через целый ряд успешных инвестиционных витков, пока в конце концов не пришёл к посредственным IPO много лет спустя.

Тогда лично для меня были потрясающие времена — я непосредственно занимался наукой, открывал вещи, которые впоследствии заложили основы для нового вида науки (A New Kind of Science). И по сути SMP оказался базой для того, что я в итоге сделал. Потому что мой принцип поиска вычислительных примитивов для SMP навёл меня на мысль о поиске вычислительных примитивов в природе и созданию новой науки из изучения результатов действий этих примитивов.

Возможно, вы спросите, что же случилось с SMP. Она по-прежнему продавалась — до тех пор, пока не вышла Mathematica. Ни строчки её кода не использовалось для Mathematica. Но иногда я запускал её лишь чтобы посмотреть, как она смотрится рядом с ней. Со временем становилось всё труднее найти машину, на которой бы запускалась SMP. И лет 15 назад последний наш компьютер, способный её запускать, ушёл на покой.

Что ж, подумал я, у меня всегда имелась собственная копия исходников SMP, в которые я не заглядывал уже много лет. Так почему бы не перекомпилировать их на какую-нибудь современную систему? Но потом я вспомнил о своей «гениальной» идее о том, что мы должны хранить исходники в зашифрованном виде. Но какой ключ мы использовали? Я спрашивал у всех, кто мог знать его. Но никто его не помнил.

Прошло много лет, и мне очень хотелось снова увидеть SMP в действии. Так что вот такая задача. Вот исходник программы на C, зашифрованный так же, как и исходники SMP. На самом деле, это исходники программы, которая и произвела шифрование — версия circa-1981 Unix crypt utility, по-хитрому модифицированная путём изменения ряда параметров и тому подобного. Сможет ли кто-нибудь взломать шифр, освободив, наконец, SMP из столь долгого заточения? Вот что говорит Wolfram | Alpha Pro, если мы просто загрузим этот файл в неизменном виде:



Но вернемся к основной истории. Я перестал работать над SMP в 1983 году, занимаясь параллельно фундаментальной наукой, программными проектами, и своим (весьма поучающим) «хобби» в разработке технологий и стратегическом консалтинге. Понемногу я использовал SMP, но затем я, в конечном итоге, стал писать на C, как правило, склеивая алгоритмы, графики и интерфейсы.

В сфере науки дела у меня шли хорошо, и предстояло ещё много чего сделать. Однако вместо того, чтобы делать всё лишь своими усилиями, я решил привлечь для этого других людей. И в качестве одного из шагов я решил основать исследовательский институт и проанализировал, что готовы предложить различные университеты. В итоге был выбран Университет штата Иллинойс, и в августе 1986 года я отправился туда чтобы основать центр исследования сложных систем.

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

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

И, конечно, результатом стала Mathematica.

SMP и мой опыт с другим софтом научил меня многому из того, что стоит делать, а что не стоит. Было приятно осознавать, что можно начать всё с нуля, пытаясь сделать всё так, как нужно, не имея никаких ограничений. В SMP центром была алгебра. Но с помощью Mathematica я хотел покрывать и множество других областей, будь то численные расчёты, графика, программирование, создание интерфейсов и так далее. Я много думал об основаниях системы, размышляя, к примеру, о том, могут ли такие вещи, как изучаемые мною клеточные автоматы, иметь к этому какое-то отношение. Но я по прежнему ориентировался на основной принцип, разработанный для SMP. Символьные выражения и преобразования для них рассматривать как основное представление для вычислений.

Если это не было бы реализовано в SMP, я допустил бы множество ошибок. Однако SMP многому научил меня, показав, что важно, а что нет, в чём заключаются основные проблемы. Просматривая сейчас свои архивы, я вижу кропотливый процесс решения головоломок из проблем, с которыми я сталкивался при разработке SMP. И шаг за шагом приходило решение.

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

Первые фрагменты кода Mathematica были написаны в октябре 1986 года. И к середине 1987 года Mathematica начинает претворяться в жизнь. Я решил, что документация должна быть опубликована в виде книги, и сотни страниц были уже написаны. И я прикинул, что Mathematica 1.0 будет готова к апрелю 1988 года.

Первоначальный мой план для нашей компании заключался в сосредоточении на исследованиях и разработке, а распространять Mathematica предполагалось прежде всего через производителей компьютеров. Стив Джобс первым принял Mathematica «на борт», которая должна была поставляться на всех, пока ещё не выпущенных компьютерах NeXT. Затем последовали сделки с Sun, Silicon Graphics, IBM и рядом других компаний. Мы начали отправлять бета-версии Mathematica.. И пусть это было задолго до появления всемирной паутины, знание о существовании нашей системы начало распространяться. Также подключились некоторые СМИ (я до сих пор люблю это мороженое):



Где-то весной 1988 года мы официально установили 23 июня датой выхода Mathematica (не имея Wolfram|Alpha, я тогда и не знал, что это был день рождения Алана Тьюринга). Нужно было много чего ещё сделать. В те дни выпуск программного обеспечения представлял собой не просто щелчок переключателя. Вспоминается, как мы запускали The Mathematica Book в печать. Как я прилетел в Канаду с жестким диском, лично нянчившись с фотонаборной машиной все выходные, передав затем произведённую ею коробку плёнок человеку, встречавшему меня в Бостонском аэропорту. Но, несмотря на всё это, незадолго до 23 июня были разосланы эти вот загадочные приглашения:



И вот, полдень 23 июня, в помещении полно народу, и мы выпускаем Mathematica в свет.



Славные 25 лет были после этого. Основа, которую мы заложили в Mathematica 1.0, была хорошо подкреплена моим предыдущим опытом, и оказалась невероятно прочной, и мы на этой основе непрестанно продолжали её строить. Мой «план Б» по использованию Mathematica для своих научных исследований работал просто великолепно, и привёл меня в итоге к новому виду науки. И вместе с Mathematica мы смогли построить прекрасную компанию, а так же создать такие вещи, как Wolfram|Alpha. И в течение последующих 25 лет мы с большим удовольствием и гордостью наблюдали вклад Mathematica в самых различных направлениях.

Дополнительный материал: Уроки SMP


Какой была SMP? Вот несколько примеров программ в SMP, которые я написал для документации SMP:










В некоторых моментах они очень похожи на программы в Mathematica, вместе с обозначениями [...] для функций, {...} для списков и -> для правил замены. Но в них нет той читаемости, которая есть в Mathematica, и программы на SMP выглядят значительно менее понятными.

Одна из наиболее очевидных проблем заключается в том, что код в SMP забит символами $ и %, являющимися соответственно префиксами шаблонов и переменных. В SMP я ещё не реализовал идею, которая появилась в Mathematica, о отделении шаблонов (например, _ ) от их имён (например, x). И я считал, что важно подчеркнуть, какие из переменных являются локальными, однако мне не приходила в голову идея о выделении их цветом.

В SMP я уже реализовал (весьма полезную) идею разграничения непосредственного (=) и отложенного (:=) присваивания. Однако, уподобляясь алголоподобным языкам, я реализовал их тогда не особо ясно — : и ::. (Для правил замены форма -> была именно той формой, которая затем была реализована в Mathematica, а форма --> была аналогична современной :>. Конструкция S[...] была аналогична современной /.)

В SMP, так же, как и в Mathematica, встроенные функции писались с заглавной буквы (в то время это было чем-то новым — разделение на верхний и нижний регистры на компьютере). Но в то время как в Mathematica, как правило, используются обычные английские слова для обозначения функций, в SMP используются короткие и зачастую малопонятные аббревиатуры. Когда я работал над SMP, я находился под влиянием дизайна Unix и использовал принятые в нём короткие имена. И всё было бы в порядке, если в SMP было бы всего несколько функций. Но с сотнями функций, имена которых подобны чему-то вроде Ps, Mei и Uspb, в итоге сильно затрудняется читабельность кода. Конечно, тут играет роль ещё тот факт, что многие пользователи не умеют быстро печатать, так что это был ещё один голос в пользу коротких имён функций.



Весьма интересно почитать документацию SMP в наши дни, В SMP было много хороших идей, которые впоследствии были перенесены в Mathematica. Но были и плохие идеи, которые, к счастью, остались в истории. Одна из подобных идей, которая имеет столь же плохое название, сколь и её суть — «символы-хамелеоны», которые изменяют свое имя при их использовании (это была попытка перенести такую вещь, как фиктивные переменные, нечто вроде более автоматизированной версии Module в Mathematica).

Были и значительно более тонкие ошибки. Как, к примеру, чрезмерное усердствование в обобщении систем. Как и в Mathematica, в SMP списки обозначились так: {a,b,c}. Функции имели такое обозначение: f[x]. И в своём стремлении достичь максимально возможной унификации я решил попробовать объединить понятия списков и функций.

Скажем, есть у нас список v={a,b,c} (в SMP присвоение обозначалось как :, так что записывалось бы вот так v:{a,b,c}). Затем, например, v[2] в SMP извлекало бы второй элемент списка. Но это обозначение выглядит так же, как если бы мы запросили значение функции v с аргументом 2. И это навело меня на мысль о том, что можно обобщить списки таким образом, чтобы у них было не только целочисленное количество элементов, а любое, которое можно выразить в символьной форме.

В SMP шаблонные выражения (x_ в Mathematica) писались так: $x. То есть при определении функции f[$x]:$x^2 можно представить, что это просто определение f как списка с символьной индексацией: {[$x]: $x^2}. Если нужно узнать то, как была определена функция, то достаточно просто ввести её имя — f, к примеру. И получаемое значение было бы символьно индексированным списком, которое бы и представляло собой определение.

Обычный список векторного типа может рассматриваться как нечто-то вроде {[1]:a, [2]:b, [3]:c}. И можно было перемешивать символьные индексы: {[1]: 1, [$x]:$xf[$x-1]}. Была также определенная унификация по части нумерации для обобщённых символьных выражений. И всё, казалось бы, хорошо. И чтобы описать свою единую концепцию функций и списков, я назвал f в f[x] проекцией, а x — фильтром.

Но постепенно эта концепция начала расходиться по швам. Получались разного рода странности при введении определений наподобие v[2]:b, v[3]:c. Тогда для v, согласно принципам SMP, будут значения {[3]:c, [2]:b}. Но что, если сделать определение v[1]:a? В этом случае v вдруг изменяет свой порядок на {a, b, c}.

И всё становилось ещё более странным при использовании функций от нескольких аргументов. Было бы здорово, если бы можно было определить матрицу с m:{{a,b},{c,d}}, тогда m[1] будет {a,b}, а m[1,1] или m[1][1] будет a. Но что делать, если нужна функция с несколькими аргументами? Будет f[x, y] тем же самым, что и f[x][y]? Ну, иногда требовалось нечто подобное, а иногда нет. Так что мне пришлось придумать свойство («атрибуты» в Mathematica), которое я назвал Tier, в котором для каждой функции указывалось, как она должна работать (сегодня многие, наверное, слышали о каррировании, но тогда подобные различия совсем не казались очевидными.)

Символьно индексированные списки в SMP обладали некоторыми изящными и мощными свойствами. Но в результате, когда вся система была построена, обнаружилось множество странностей. И потому, когда я разрабатывал Mathematica, я решил их не использовать. На протяжении многих лет я продолжал о них размышлять. И так получилось, что сейчас, более чем через 30 лет после SMP, я работаю над некоторым весьма интересным новым функционалом в Mathematica, который тесно связан с символьно индексированными списками [в 10-й версии системы появились ассоциации — Association — прим. ред.].

Работа над SMP дала мне бесценный опыт: я увидел, что действительно работает, а что нет. И одним из наиболее запоминающихся моментов для меня был этот. Как и в Mathematica, в SMP были чистые функции. Но, в отличие от Mathematica, они не указывались с помощью символа &. И это означало, что требовался специальный объект, называемый «mark» (пишется как `, машинописный обратный апостроф), для обозначения того, когда чистая функция должна выдавать некоторое символьное, константное значение. Ну, спустя лет пять после выхода SMP, я просматривал одно из обучающих пособий. И мне в глаза бросилась фраза: «обратные апострофы — загадка SMP». И тогда я понял: вот как выглядят ошибки в дизайне языка.

SMP во многих отношениях радикальная система — что-то вроде экстремального эксперимента в разработке языка программирования. Была лишь минимальная поддержка знакомых конструкций. И вместо этого всё вращалось вокруг идеи об использовании правил преобразования символьных выражений. В некотором роде, думаю, SMP слишком далеко ушёл от сложившихся традиций. Ведь язык программирования должен связывать человеческие концепции о вычислениях с реальными вычислениями, которые может осуществлять компьютер. И каким бы мощным язык не являлся, с ним мало чего можно полезного сделать, если у людей нет достаточного контекста для его понимания. Именно поэтому в Mathematica я всегда старался придавать вещам узнаваемый вид там, где это возможно, и вводить что-то незнакомое только в действительно необходимых случаях, для чего-то принципиально нового.

Один из важных моментов в проектировании системы — знать, что в ней будет важно. В SMP мы потратили много усилий на так называемые «семантические шаблоны». Скажем, есть у нас такое определение: f[$x+$y, $x, $y] := {$x, $y}. Вполне понятно, что ему будет соответствовать f[a+b, a, b]. Но что насчёт f[7, 3, 4]? В SMP шаблон будет удовлетворен, хотя 7 не есть форма конструкции $x+$y. Потребовалось большое количество усилий для реализации этого. И в простых примерах всё выглядело здорово. Но, в конце концов, подобное не требуется уж очень часто, а если и требуется, подобное стараются избегать, потому что такие конструкции сильно ухудшают читабельность программы, становится трудно понимать, что она делает.

Было нечто подобное с контролем рекурсии. Я думал, что данные конструкции стоит избегать f[$x] : $xf[$x-1] (без задания f[1]), ведь они имеют бесконечный цикл, пытаясь вычислить f[-1], f[-2] и т. д., пока, в конце концов, в какой-то момент не произойдёт умножение на 0. Так почему бы просто не выдать нуль? Ну, в SMP по умолчанию выводился нуль. Потому что вместо того, чтобы проходить весь путь по вычислению каждой ветви дерева рекурсии, SMP периодически останавливался и пытался упростить все невычесленные ветви. Это было умно и изящно. Однако когда кто-то пытался задать подобное поведение, всё становилось слишком сложным для понимания, и в итоге никто это не использовал.

А потом был определяемый пользователем синтаксис. Он позволял, к примеру, установить "U" (скажем, для " union"), как инфиксный оператор. И всё работало замечательно, пока кто-нибудь не вводил функцию с именем «u». Или пока кто-нибудь не становился пленником своего собственного синтаксиса.

SMP многому меня научил. И Mathematica не была бы так хороша, если бы ей не предшествовала SMP. И вот, размышляя сейчас об ошибках в SMP, меня радует тот факт, что, пожалуй, все эти ошибки остались в прошлом. После SMP и 25 лет работы над дизайном Mathematica большинство из них попадают для в категорию простеньких задачек.

Забавно, как часто не самые лучшие идеи появлялись в SMP. И, на самом деле, мне весьма любопытно, со своими нынешними взглядами на дизайн, что бы я испытал, если бы запустил SMP. И это одна из причин, по которой я хочу выпустить её из заточения и заставить снова работать. Надеюсь, кто-то из вас сможет помочь мне в этом.
Tags:wolfram languagewolfram mathematicasmpsymbolic manipulation program
Hubs: Wolfram Research corporate blog Programming Designing and refactoring Functional Programming
+25
21.8k 101
Comments 8