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

http://blog.wolfram.com/2013/06/06/there-was-a-time-before-mathematica/
  • Перевод
  • Tutorial

Перевод поста Стивена Вольфрама (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. И это одна из причин, по которой я хочу выпустить её из заточения и заставить снова работать. Надеюсь, кто-то из вас сможет помочь мне в этом.
  • +25
  • 21k
  • 8
Wolfram Research 45,49
Wolfram Language, Mathematica, Wolfram Alpha и др.
Поделиться публикацией
Комментарии 8
  • +2
    Спасибо! Так приятно было прочитать. Ещё раз убедился, что он гений!

    (У меня есть не менее пяти причин считать его гением: универ+статьи в 16, докторская в 20, создал Математику, его работы по клеточным автоматам и новому виду науки, ну и плюс его способность фигачить сутками три десятилетия).

    Приятно было почитать доки SMP, как исходники дума посмотреть.

    Ну и вот моменты, кто не знает:

    * Пользователей Математики в мире в два раза больше чем у Маткада.

    * Матсофт купил обанкротившегося конкуретна Математики — Maple — чтобы целиком всунуть её ядро символьных вычислений в 2700 функций в Маткад.

    * Сергей Брин работал разработчиком у Вольфрама, перед тем как основать Гугл.

    * Вольфрам (как компания) даёт 90% скидку студентам и преподавателям.

    * Недавно смотрел фильм Ex Machina (Из машины), 2015, www.imdb.com/title/tt0470752
    И думал, что там на прототип главного героя больше не Сергей Брин подходит, а Стефан Вольфрам — также нафигачить много сложного в одиночку и вообще по образу гения.
    • +8
      Если и гений — то в области самопиара. Правда в отличие от почившего в бозе Джобса он действительно кой-чего изобрёл, а не только отлакировал и продал, но гонору-то, гонору.

      * Вольфрам (как компания) даёт 90% скидку студентам и преподавателям.
      Обычное дело. Apple тоже этим занималась и занимается. Первая доза — бесплатно, да. Винить его в этом сложно (практически все компьютерные компании этим занимаются), но причём тут генильность?

      * Пользователей Математики в мире в два раза больше чем у Маткада.
      То есть продукт «мегасупергениальнейшего гения всех времён и народов» всего-то навсего вдвое более популярен, чем то, что сделали «посредственности»? А пользователей Octave вы не забыли посчитать — или вы только по продажам?

      * Матсофт купил обанкротившегося конкуретна Математики — Maple — чтобы целиком всунуть её ядро символьных вычислений в 2700 функций в Маткад.
      Опять передёргивание фактов. MathCad начала использовать ядро Maple задолго до того, как Maplesoft обанкротился — но при этом далеко не «целиком». Кстати для тех, кто любит «додумывать»: Maplesoft проходил через процедуру банкротства, но это не значит, что речь идёт об «обанкротившемся и сгинувшем» конкуренте — последняя версия Maple вышла в 2015м года

      * Сергей Брин работал разработчиком у Вольфрама, перед тем как основать Гугл.
      Вот только не разработчиком, а интерном. Что несколько меняет дело, не так ли? Интернов редко допускают к «секретным секретам», так что считать, что Брин вынес оттуда какое-то тайное знание попросту глупо.

      А сама статья меня скорее заставляет задуматься над словами Толстого: «Человек подобен дроби, числитель её то, что он есть, а знаменатель то, что он о себе думает. Чем больше знаменатель, тем меньше дробь.» Вот Стивен — это пример человека, который, при довольно-таки большом числителе, всё-таки близок к нулю за счёт знаменателя, уж извините.
      • –4
        По поводу Толстого. Это его высказывание можно применить к любому и получится ноль. Другое дело, если ноль получается в случае неопределенности вида (+∞)/(+∞). Мне лично все равно на знаменатель в формуле Толстого (на него обращают внимание разве что завистники), главное — числитель. Знаменатель — эмоции, числитель — конкретика.

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

        По поводу фразы о том, что пользователей Mathcad в два раза больше, чем Mathematica — не могу сказать. Официальной статистики нет и это не более чем ничем не подкрепленное заявление.

        При этом не ясно, причем тут Octave, имеющий отношение к Matlab, а не к Mathcad.
        • +5
          Это многократно обсуждалось на Хабре и, почти всегда, кроме как «Стивен очень себя любит» нет никакого конструктивного обсуждения его идей и проектов.
          Естественно.
          Почему — потому что это сложно.
          Нет — это просто не нужно.
          Мне лично все равно на знаменатель в формуле Толстого (на него обращают внимание разве что завистники), главное — числитель. Знаменатель — эмоции, числитель — конкретика.
          А дробь в целом — показывает как сильно человек сможет повлиять на окружающий его мир. Обсуждать «гениальные» идеи Стивена не имеет смысла просто потому, что даже те из них, которые потом сильно изменят мир от него никто не воспримет. Его нарциссизм — это не просто какая-то особенность характера, это вещь, которая закрывает дорогу его же идеям.

          Представьте мир, где нет Стивена. Что в нём изменится? Пара теорем будут названы другими именами, кой-какие вещи будут по другому посчитаны, в нескольких узких областях будет много изменений, но мир в целом это всё едва-едва заметит. А убери, скажем, Google — что случится? Мир будет совсем иным. И вовсе не потому, что для поиска в Интеренете люди будут использовать не Google, а Yahoo — нет, это как раз частность довольно мелкая. А вот тот факт, что Android в этом мире не сможет захватить мир — изменит жизнь миллиардов. Причём, заметьте, «гениальных» идей в Android'е — куда меньше, чем в творениях Стивена. Но за счёт того, что его создатели не отталкивают последователей его влияние — куда больше, чем от всех гениальных идей Стивена вместе взятых.
          При этом не ясно, причем тут Octave, имеющий отношение к Matlab, а не к Mathcad.
          Oops. Это да — это я действительно с прямым углом перепутал.
          • –3
            Ваше рассуждение на тему того, как изменился бы мир без Стивена абсолютно беспочвенны и субъективны.

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

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

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

            Конечно, это мое субъективное мнение, но лично для меня наличие Стивена в этом мире очень полезно, если говорить прагматично, моей работе во многих сферах и со многими компаниями. История покажет, что важно в этом мире, а что нет.
            • +3
              В целом, я вижу, что для вас подача имеет больше значения, чем содержимое.
              Не совсем так. Всегда есть баланс. Отсюда и Толстовская «дробь». Если тебе нечего «подать», то ты ничего не изменишь в этом мире. Если тебе есть чего подать, но ты этого делать не умешь — тоже.

              Это верно для большинства людей, иначе Apple не добилась бы такого успеха.
              Ну дык. Похоже вы всё-таки понимаете, в чём дело, но признаться в этом себе не хотите.

              Любой человек имеет ничтожное влияние на мир.
              Сие есть неправда. Вернее не совсем правда. Правда в другом: люди, которые влияют на мир сильнее других зачастую не являются такими уж гениями. Они просто оказываются «в нужное время в нужном месте». Линус — хороший тому пример. «Гении» же типа Стивена, даже оказавшись в нужное время в нужном месте, отталкивают возможных последователей.

              Сравнивать отсутствие одного человека с целой компанией — сомнительная идея.
              Ну так это ж его выбор. Говорим Mathematica — подразумеваем Стивен, говорим Стивен — подразумеваем Wolfram Research. А Google — он изначально был двумя людьми основан, да и потом к ним много ярких личностей присоединились. Пресловутый Алфавит — очень показателен в этом смысле. А Стивен — так и останется «непризнанным гением».
          • +2
            В нашей стране, к сожалению, особенно в научной среде существует, при этом особенно остро, концепция какой-то «научной скромности». Каждый употребляет обезличенное «мы», выдавая это за научную скромность и все цепляются к человеку, говорящему «я».


            Это не относится к нашей стране, «научное „мы“» и «научная скромность» — неотъемлемые атрибуты научного сообщества где бы то ни было. Подробнее читайте у Мёртона, например, здесь: press.princeton.edu/titles/7576.html
      • +1
        Спасибо за этот перевод! Одна из самых увлекательных историй IT. Стивен Вольфрам действительно поражает.

        Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

        Самое читаемое