Математика в кармане

6 октябрь, 2003 - 23:00Андрей Зубинский
Трансформации

Первая трансформация уже, можно сказать, произошла -- пригодность КПК к чтению с экрана для огромного количества пользователей стала столь важной критериальной оценкой, что на ее основе принимается решение о предпочтительности приобретения той или иной модели (об этом свидетельствуют многочисленные тематические форумы). Соответственно, изменяются и требования к программам класса "e-book readers" (кроме как "читалки электронных книг" перевести этот термин сложно) -- сегодняшний привередливый читатель больше заинтересован в развитых механизмах аннотирования и комментирования текста, в удобной процедуре копирования понравившихся фрагментов и в простоте самостоятельной подготовки книги, чем, например, в вычурном форматировании электронного издания, оценить которое на маленьком экране PDA трудно. Резко возрос интерес и к сателлитным программам -- аналогам привычных "бумажных" спутников грамотного читателя: словарям, простым и эффективным, ориентированным на хранение текста, базам данных. Здесь есть свои трансформации -- с ростом вычислительных ресурсов КПК и одновременным снижением цен потребители готовы простить производителям и ресурсоемкость программ, и их "неповоротливость": сегодня в цене качество словарных баз (если речь идет о словарях) и удобство.

Математика в кармане
Клавиатура для "инопланетян", работающих по системе Айверсона
Вторая трансформация еще только зреет -- естественно, в умах тех, кто в ней заинтересован. Сотни мегагерц производительных процессоров, десятки и сотни мегабайт памяти -- такие показатели сравнительно недавно были характерны для рабочих станций. Сегодня это действительность бюджетных карманных вычислителей. И неудивительно, что все чаще можно встретить на форумах и конференциях вопрос о мощных математических программах для КПК. Мы попробуем кратко ознакомить вас с наиболее интересными разработками в этой области, концентрируя внимание на продуктах одновременно мощных и доступных -- попадающих в классы freeware и Open Source.

Здесь следует предупредить читателей: сразу забудьте об "игрушечном виде" вашего КПК и не обольщайтесь "карманным" характером программ. Это очень серьезные разработки, требующие не только тщательного изучения, но и готовности к... неожиданностям.


J

Начнем мы с системы, по мнению не только автора, безукоризненно неожиданной во всех отношениях. Во-первых, она "раритетна" -- ее история начинается... в 1960 г., когда студент Гарвардского университета Кеннет Айверсон (Kenneth E. Iverson) разработал новый универсальный язык программирования.

Математика в кармане Математика в кармане
Еще одну "карманную" реализацию J можно отыскать на персональной страничке Олега Кобченко -- www22.brinkster.com/ olegyk/j/. Эта версия отличается скромным размером, "консольным" характером, аналогичным упомянутой системе Jacal, и всеми "врожденными способностями" J
Во-вторых, сказать, что в 1960 г. этот язык был "новым", в данном случае означает не сказать ничего вообще. Похоже, и сегодня детище Айверсона (за которое он был награжден "компьютерной Нобелевской премией" ACM Alan M. Turing Award) специалисту, воспитанному на любых, будь то императивных, функциональных или логических системах программирования, покажется революционно новым.

В-третьих, по сей день эта система действительно "живее всех живых" -- она реально используется примерно в 50% компаний из списка Fortune 500, ее изучение входит в обязательную программу подготовки специалистов в области... менеджмента (!) во многих университетах, ей посвящены десятки журналов, целый раздел сайта ACM, этой же организацией утверждены престижные премии имени Айверсона за достижения в развитии системы и ее использовании.

И наконец, в-четвертых, даже такая экзотика может быть стандартной, каковой она и является, -- для нее принят целый букет стандартов: ISO 8485, ISO 13751 и т. д., за создание и сопровождение которых отвечают несколько групп ISO-IEC.

Из всего перечня уникальностей разработки Айверсона стоит выделить одну, с которой в рассматриваемом случае читателю столкнуться не придется (на самом деле настоящие фанаты могут получить на свой КПК коммерческую реализацию системы, соответствующую стандартам), а именно расширенный алфавит, т. е. множество символов, которыми она оперирует. Достаточно взглянуть на "раскладку" клавиатуры для системы Айверсона, чтобы понять: мы встречаемся с чем-то действительно необычным, хотя и реально существующим -- продаются и такие готовые клавиатуры, и более демократичные наклейки для переделки стандартных ПК-клавиатур.

В общем, достаточно подогревающих интерес "завлекательных" фактов -- речь идет о совершенно уникальном языке APL, предназначенном в первую очередь для решения задач вычислительной математики.

В нашем же случае -- об очередном воплощении APL, ориентированном на поддержку стандартных общепринятых устройств ввода и алфавитов. Система программирования с лаконичным названием "J", созданная Айверсоном, сегодня доступна для самых разных платформ, в перечне которых присутствует и "карманная" Pocket PC. Реализации системы распространяются на условиях freeware, но использующие их в коммерческих и прочих целях должны оплатить "J User Licence" компании-разработчику Jsoftware.

"Карманная" версия J не отличается компактностью (порядка 3,2 MB -- весьма внушительный размер для ПО Pocket PC), зато совершенно неприхотлива в отношении места установки -- программа безболезненно работает, будучи размещенной на SD- или CF-карте памяти. Кроме того, процедура инсталляции элементарна (копирование каталога), а установленная система характеризуется минимальным "вмешательством" в конфигурации ОС.

Итак, первый шаг сделан -- вы стали счастливым обладателем одной из самых мощных математических систем, соответствующей наивысшим требованиям, -- здесь есть и неожиданно резвый вычислитель, и мощные средства визуализации результатов (двух- и трехмерная графика), и, наконец, не требующий иероглифического ввода современный APL с множеством встроенных функций. Настало время сделать второй шаг. И он будет весьма неординарным -- если вы уже пользовались "настольными" пакетами класса MATLAB, изучили один-два языка программирования, вам крайне необходимо... все это на время забыть. И, начинать с нуля -- например, с чтения очень интересной статьи МакИнтайра (McItyre), опубликованной в 1991 г. в журнале "IBM Systems Journal", -- "Язык как интеллектуальный инструмент: от иероглифов к APL" (сканированный препринт можно загрузить отсюда: www.dbmcintyre.pwp.blueyonder.co.uk/index_f/menu_f/j_f/sysj_r_29.zip). Статья самого Айверсона "Компьютеры и математическая нотация" является претендентом # 1 к прочтению на начальном этапе изучения.

Изучать J методом "аналогии" (или распространенным эмпирическим) лучше и не пробовать. Зато параллельно с изучением J очень неплохо повторять... грамматику английского языка -- в J есть свои глаголы, существительные, прилагательные, из которых можно образовывать фразы именно согласно английским грамматическим правилам.

Базовые глаголы J хорошо знакомы всем по школьному курсу арифметики: + (сложить), -- (вычесть), * (умножить), % (делить), ^ (возвести [в степень]). В "калькуляторном" режиме использования J начинать изучение можно и нужно именно с них -- здесь кроется масса неожиданностей. Например, полноценная "ортогональность" (если такое понятие вообще применимо к столь странным и красивым конструкциям, как J и APL) -- глаголы могут обозначать действия над любыми существительными:

2 + 5 7 9 1

в J выдает результат 7 9 11 3, потому как мы записали в математической нотации предложение "сложить скалярное число 2 с вектором из четырех элементов 5 7 9 1" (кроме векторов, J позволяет оперировать и матрицами любой размерности). Но это далеко не все -- у большинства глаголов J есть две основные формы -- двухэлементная (dyadic) и одноместная (monadic). Двухэлементную форму глагола "сложить" мы только что привели, а вот одноместная далека от того, до чего можно было бы додуматься "эмпирическим путем" -- monadic "+" здесь фактически ничего не делает, при условии, что действие осуществляется над "существительным", являющимся некомплексным числом (работа с такими числами -- еще одна "фишка" J).

В общем, нет смысла даже пытаться в объеме статьи дать читателю почувствовать J "на вкус". Да это и не требуется -- система сопровождается массой учебных материалов, рассчитанных на самые разные уровни подготовки пользователей, включая и начинающих, и хорошо знающих распространенные императивные языки программирования. Основные учебные ресурсы сосредоточены на сайте Jsoftware и доступны в формате pdf.

Естественно, автор статьи не может взять на себя ответственность безоговорочно утверждать, что во всех случаях изучение J просто необходимо тем, кто нуждается в мощном "карманном" математическом пакете, но на сегодняшний день это действительно одна из лучших разработок в своем классе, с которой очень интересно иметь дело. Пусть на начальных этапах осваивать систему трудно (больше из-за непривычности), зато потом эти затраты компенсируются совершенно невероятными возможностями.


Jacal

Если J можно отнести к классу "вычислительных" математических программ, то система Jacal является представителем класса "символьной математики". В отличие от J, которая была портирована в операционную среду Windows CE (Pocket PC) с одновременно далекой и близкой "настольной" Windows, Jacal пришла в "карманный мир" из Unix, унаследовав все, в том числе и совершенно неадекватные особенностям применения на КПК черты. Зато, если вам нужен легально бесплатный пакет символьных вычислений, альтернативы Jacal пока нет. Впрочем, по порядку...

Математика в кармане
Jacal -- никаких излишеств, красот и удобств. Только вы, КПК и математика
Для инсталляции Jacal большинству пользователей КПК придется выполнить ряд подготовительных действий.

Во-первых, необходимо установить бесплатную программу консольного устройства для Windows CE, во-вторых, нелишней будет инсталляция интерпретатора командной строки CMD, также легально бесплатного. Устанавливать эти две программы надо именно в указанном порядке (сначала -- PocketConsole, затем -- CMD) и только в основную память КПК (в противном случае, например, PocketConsole порождает массу неприятностей).

И наконец, в-третьих -- загрузить и инсталлировать интерпретатор SCM функционального языка программирования Scheme, включающий написанную на Scheme систему Jacal. Она немаленькая (порядка 1,7 MB), но к установке так же, как и J, не критична.

Последняя "составляющая" процесса инсталляции -- загрузка документации на систему. Здесь же, при желании, как и в случае с J, можно дополнить "карманный" Jacal настольной версией практически для любой платформы.

Если попытаться кратко охарактеризовать Jacal, то две вещи не вызывали сомнения. Как и все системы символьных вычислений, Jacal -- не программа "для всех и каждого", для ее освоения требуется отличное знание весьма сложных разделов математики -- это очевидное "первое". "Второе" касается "карманного" исполнения программы -- к сожалению, она совершенно не адаптирована к специфике платформы Pocket PC. Терминальный режим при работе на крохотном устройстве со всплывающей виртуальной клавиатурой -- разновидность мазохизма, для которой еще не придумано название. Кроме того, PocketConsole, без чего Jacal не способна функционировать, в комбинациях с совершенно "невинными" и устойчиво работающими приложениями может порождать забавно-неприятные "интерференционные" эффекты. И все-таки, если вам действительно нужен весьма неплохой пакет, позволяющий оперировать алгебраическими выражениями со многими переменными, представленными числами, символьными именами, алгебраическими и дифференциальными функциями, векторами, матрицами и тензорами, -- Jacal в силу доступности будет претендентом # 1, даже несмотря на неудобство работы. В конце концов, удобство -- это привычка, и сколь бы "удобен" ни был программный продукт, если он не обладает требуемой функциональностью, особого смысла в нем нет.


Dialect

Эта система весьма условно попадает в рассматриваемый нами класс -- ее "место" среди развитых интерпретаторов несложных языков программирования. И все-таки, сколь бы крамольным ни показалось такое утверждение (ну как же -- сравнивать обычный интерпретатор со специальными математически ориентированными средами, как минимум, некорректно), на большом классе сугубо математических расчетных задач ее использование кажется автору наиболее целесообразным именно из-за ее "традиционности" и удобства. По сути, Dialect -- весьма развитая интегрированная среда разработки (IDE), включающая в себя интерпретатор простого объектно-ориентированного "диалекта" языка Basic. Правда, Dialect настолько "диалект", что угадать здесь Basic можно разве что в упоминании глубинных исторических корней в документации. Эта некогда бывшая коммерческой разработка сейчас "отпущена" на волю в мир Open Source, что позволяет при очень большом желании даже что-то в ней модифицировать (кстати, улучшать есть что -- в первую очередь поддержку Unicode-символов и строк).

Математика в кармане
Математика в кармане Математика в кармане
Система Dialect -- одна и та же программа без модификации на настольном компьютере и КПК
С точки зрения нуждающегося в хорошем расчетном инструменте специалиста, Dialect представляет собой весьма привлекательную разработку. Во-первых, среда поддерживает вычисления с плавающей точкой (не всегда это встречается в интерпретаторах для Pocket PC), во-вторых, располагает мощными встроенными типами данных и, что главное, эффективными и простыми механизмами создания пользовательских типов, в-третьих, развитой графической подсистемой, позволяющей визуализировать результаты вычислений.

Итак, продолжая в принятом ранее "практичном стиле", начнем, естественно, с инсталляции системы. Разработчики Dialect (компания Aristar) потрудились на славу, превратив этот процесс в совершенно тривиальное копирование одного-единственного исполняемого файла. Как и в предыдущих случаях, Dialect нейтрален к варианту установки на Pocket PC (в основную память или на флэш-карту) и выгодно отличается компактностью от J и Jacal, занимая всего около 800 KB драгоценного пространства. Документация на систему поставляется в виде небольшого chm-файла, который можно непосредственно читать на Pocket PC каким-либо chm-ридером (например, программой CHM Reader компании Aroy Ltd -- www.pocketgear.com/software_detail.asp?id=5985&associateid=262) или же "разобрать" на отдельные html-страницы на настольном компьютере (эти страницы можно просматривать встроенным в ПО КПК броузером Pocket Explorer или конвертировать в формат какой-либо программы классы e-book reader).

Интегрированная среда Dialect включает в себя редактор, отладчик и собственно интерпретатор языка. В отличие от перечисленных программ, Dialect позволяет генерировать исполняемые файлы программ непосредственно на КПК, без необходимости обращения к десктопной версии программы. Иногда такая возможность оказывается весьма нелишней -- особенно в тех случаях, когда ваша программа на Dialect допускает повторное использование.

Как язык программирования Dialect, безусловно, -- самый простой в нашем перечне. Но простота не означает ущербность -- это весьма развитый императивный язык со встроенными механизмами поддержки объектно-ориентированного программирования (с полноценными, автоматически инициируемыми конструкторами и деструкторами), сборщиком мусора и массой программистских "вкусностей". К последним, наиболее интересным при учете нашей "математической" тематики, относятся: динамические многомерные массивы с удобным и мощным механизмом выбора поддиапазона значений (например, если необходимо выбрать из массива X и записать в переменную Y подмассив, начинающийся с четвертого элемента и заканчивающийся седьмым, достаточно одной строчки кода: Y = X[4->7]), удачный компактный синтаксис множественной операции присваивания (строка “[a,b,c,d] = [3,4,5,6]” на Dialect эквивалентна “а = 3; b=4; c=5; d=6;” многих С-подобных языков), мощные встроенные типы данных "ассоциативный массив" и "множество объектов произвольного типа" (chunk в терминах Dialect, по сути, -- это область памяти, к которой можно обращаться как угодно -- записать в нее множество значений с плавающей точкой, прочитать ее побайтно и т. д.). Наконец, незначительные языковые нюансы Dialect вполне соответствуют жестким требованиям "карманной" платформы -- нечувствительность к регистру, например, существенно облегчает жизнь при написании небольших, одноразовых расчетных программок.

В качестве маленького отступления о Dialect можно сказать пару слов и как о системе универсального назначения (хотя как программируемый "калькулятор-переросток" эта система, безусловно, хороша). В ней есть практически все необходимое для экспресс-разработки маленьких, но полезных исключительно для их создателя утилит -- система сопровождается развитыми библиотеками, существенно облегчающими жизнь во многих случаях (неплохо поддержаны работа с базами данных Pocket PC, сетевые функции, фрагментарно, но удовлетворительно -- элементы пользовательского интерфейса).


Вечная проблема выбора

Трудно или даже невозможно безоговорочно рекомендовать хоть один из этих доступных и хороших пакетов в каком-либо конкретном случае. Но сказать пару слов о подходе к такому выбору все-таки необходимо. Мощная и исключительно выразительная система J требует серьезных усилий для изучения -- сказывается слишком уж ярко выраженная "криптографичность" ее языка и необычность правил. Но усилия здесь -- дело второе, главное же все-таки -- время, затраченное на изучение. "Карманный" характер математического пакета, безусловно, свидетельствует о том, что роль "КПК-математика" -- не основная и, что главное, не единственная. Конечно, "настольная" версия J позволит получить 100% отдачи от затраченных усилий и времени... Dialect, в свою очередь, быстро осваивается человеком, знакомым хотя бы с одним языком программирования. "Набросать" на нем сугубо вычислительную программу элементарно.

В общем, "кесарю -- кесарево": J и Jacal больше подходят профессиональным математикам, Dialect -- инженерам, нуждающимся в гибком расчетном (и, в конце концов, универсальном) средстве.