Wolfram Language (Mathematica) — это просто игрушка

от автора

Хочу поговорить о Wolfram Language (далее WL). Прошу прощения за сумбурность изложения, пост вырос из попытки ответить на этот коммент от Nilis.

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

Лет 6-10 назад, когда я учился в школе, я знал лишь BASIC, Pascal/Delphi, C/C++ и WL. Из ОС имел дело лишь с Windows. Не знал, что такое скриптовые языки (perl, python, bash), не знал самого понятия «скрипт». Думал, что командный интерфейс — это устаревший интерфейс и что единственный правильный интерфейс программы — это графический. Программировал я на Delphi и WL. Программы на Delphi всегда были графическими. За исключением олимпиадного программирования, там в требованиях к программам было, что они должны быть текстовыми, я их писал на Delphi и C++. Когда я узнал о WL, я был им очарован, также как и вы. Потому что код на WL был гораздо короче, чем на Delphi/C++. И вообще, потому что WL был совершенно не похож на Delphi и C++. Потому что там была возможность программировать функционально. Я познакомился с функциональным программированием на примере WL, я не знал, что существуют «стандартные» функциональные языки — Haskell, Lisp и ML.

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

Например, меня попросили написать программу для конвертации имён файлов в папке с латиницы на кириллицу. Я написал программу с гуём на Delphi. «Введите папку, где нужно сконвертировать». Код, наверное, был на 100 строк как минимум, если не тысячу. Сейчас я понимаю, что это делается одной командой в GNU/Linux типа такой: prename 's/qwerty.../йцукен.../' *.avi.

У меня появилась идея написать файловый менеджер для Windows (разумеется, для Windows, других ОС я не знал), в котором была бы возможность скриптинга на WL (при этом слова «скриптинг» я не знал). Чтобы там, скажем, была функция Flatten из WL, которая бы делала Flatten для папок, т. е. уничтожала всю иерархию папок внутри данной папки и просто сваливала бы все файлы в кучу.

Потом, 6 лет назад я поступил в университет, познакомился с GNU/Linux, начал программировать на C/C++ и bash под GNU/Linux. Я понял, что всё моё программирование на Delphi и WL (кроме математики) — ерунда. Что все мои программы на Delphi можно было реализовать однострочниками на баше. А WL нужно использовать только для математических задач. Я понял, что командный интерфейс — не устаревший. И понял, что та идея файлового менеджера — ерунда. Потому что весь GNU/Linux в целом представляет собой такой файловый менеджер (а заодно и IDE) с возможностью скриптинга на всех скриптовых языках.

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

  • Mathematica и её язык — это просто сборная солянка. Если нравится WL, используйте языки, от которых он произошёл, например, Lisp. Сам пакет Mathematica содержит кучу математических функций, но никакая из них не развита так, как она развита в узкоспециализированных математических пакетах. Например, если вам нужно быстро и точно обратить большую матрицу (например, 1000 x 1000), то WL использовать нельзя (т. к. могут быть ошибки, неоптимизировано, низкая точность, не предназначено для реальных применений). Пишите свою реализацию или используйте узкоспециализированные пакеты, скажем, для C, C++ или Fortran
  • В WL могут быть ошибки. Вероятность ошибок, скажем, в компиляторе C гораздо ниже, т. к., во-первых, есть полно свободных компиляторов C, во-вторых, эти компиляторы по-настоящему широко используются для реальных задач, и ошибки в них сразу становятся заметны
  • WL имеет куда меньшее быстродействие, чем, скажем, C++
  • WL не является математически правильным. Например:
    In[9]:= Simplify[(x^2 + x) / x /. x -> 0]                                   1 Power::infy: Infinite expression - encountered.                                  0  Infinity::indet: Indeterminate expression 0 ComplexInfinity encountered.  Out[9]= Indeterminate  In[10]:= Simplify[(x^2 + x) / x] /. x -> 0  Out[10]= 1 

    С математической точки зрения невозможно объяснить, почему в одном случае мы имеем Indeterminate, а в другом — 1. Правильным поведением было бы вообще не упрощать (x^2 + x) / x, и упрощать его только если есть условие, что x не равно нулю. Integrate не выдаёт «плюс константа» в конце результата, что опять-таки бессмыслено с точки зрения математики. Solve не учитывает всякие частные случаи. Скажем, Solve[x a == b, x] просто выдаёт b/a, не учитывая, что a может быть равно нулю.

  • WL — это не свободное ПО

Богачёв помимо своей преподавательской деятельности работает в RFD ( rfdyn.ru ) техническим директором, и я там у него работал. Мы там делали симулятор месторождения нефти, я думаю, не нужно пояснять, что деньги в этой области крутятся огромные. Так вот, симулятор написан на C++, в том числе код, выполняющий расчёты (решение диффуров и систем линейных уравнений). И разумеется, не на WL, потому что нет нужного быстродействия, нет должного доверия к этому WL, и вообще WL здесь было бы использовать несерьёзно.

Затем я познакомился с формальной математикой, в том числе с системой Isabelle ( isabelle.in.tum.de ). Так вот, я вам скажу, что формальная математика — это единственный способ проводить математические манипуляции на компьютере так, чтобы быть уверенным в их математической правильности. И всех этих косяков с Simplify, Solve и т. д. в формальной математике нет.

Но такие системы (т. е. системы для работы с формальной математикой) не похожи на WL. Работа с ними происходит так: вы вводите в систему формальное доказательство, а она вам говорит, правильное оно, или нет. Возникает вопрос: можно ли смешать способ работы WL с правильностью формальной математики? Да, можно.

Mathematica, Maple и т. д. относятся к так называемым системам компьютерной алгебры. Так вот, все такие системы грешат отсутствием математической строгости. В связи с этим существует идея написания по-настоящему правильной системы компьютерной алгебры, основанной на формальной математике. Вот здесь специалисты в формальной математике показывают результаты первых экспериментов в этом направлении: www.cs.ru.nl/~freek/pubs/holcas.pdf, прочитайте, пожалуйста, хотя бы первые две страницы.

Таким образом, по поводу математики на WL итог такой: если нужно по-быстрому построить график, вычислить производную и т. д. — юзайте WL. Если серьёзные математические вычисления — пишите код сами на языках общего назначения (типа C++), как это делает Богачёв, либо используйте профессиональные библиотеки, опять-таки для языков общего назначения. Если нужно проводить математические манипуляции, которые не являются вычислением, т. е. не являются численными — то делайте ваши манипуляции вручную, либо с использованием формальной математики (например, Isabelle), либо с использованием формальных систем компьютерной алгебры, например, представленной в статье выше (правда, такие системы на данный момент находятся на начальной стадии развития).

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

Итог. WL — это просто игрушка. Это инструмент студента, но не учёного. Вряд ли, скажем, данные с большого андронного коллайдера обсчитываются на WL. WL как 1С: плохой, узкоспециализированный, коммерческий, несвободный язык.

Если что-то заинтересовало в этом посте (формальная математика, функциональное программирование, и т. д.), спрашивайте, я отвечу.

ссылка на оригинал статьи http://habrahabr.ru/post/263015/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *