Некоторые важные замечания по использованию Библиотеки в среде пакета Maple 9.5/10/11.

В полной мере представленная Библиотека вполне корректно работает с пакетом Maple релизов 69 классического (classic) клона и в подавляющем спектре своих средств также со стандартным (standard) клоном указанных релизов. Между тем, при распространении вышесказанного и на последний релиз 10 здесь имеется ряд особенностей, отмечаемых нами ниже. Здесь мы представим некоторые замечания и пояснения, связанные с применением Библиотеки в среде пакета Maple 9.5/10/11, которые позволят прояснить некоторые особенности, выявленные нами при работе с Библиотекой, и потребовавшие соответствующей модификации ряда ее средств.

А. Ряд средств библиотеки используют метод “дисковых транзитов”, который в качестве временной памяти для файлов использует устройство, определяемое выражением “[libname][1][1 .. 2]”. Как правило, в качестве такого устройства выступает “C:\”, точнее bootdrive. Между тем, в некоторых ПК, прежде всего, находящихся в компьютерных классах, может быть запрещена запись на это устройство. В этом случае рекомендуется либо отменить такой запрет, либо в исходных текстах соответствующих средств библиотеки произвести замены конструкций вида “cat([libname][1][1..2], "\\file")” на конструкции, например, вида:

cat([libname][1], "\\file")   либо   cat(CDM(), "\\file")

Принятое нами решение мотивировалось как повышением эффективности метода “дисковых транзитов”, так и некоторыми соображениями лицензионного характера. Необходимость же в указанной модификации средств послужит также целям повышения квалификации пользователя библиотеки в качестве Maple-программиста, ибо потребует применения и развития полезных навыков.

В. Во-вторых, особо следует отметить, что Maple 10 успешно продолжает традицию несовместимости релизов, неоднократно отмечаемую в наших публикациях по данной тематике, наряду с замечаниями других пользователей пакета. В частности, имеет место очередная несовместимость “снизу-вверх” по следующим двум позициям, а именно:

1. В релизах 69 пакета вызов “interface(warnlevel = n)” возвращает NULL-значение, т.е. ничего, тогда как в релизе 10 возвращается значение n.

2. Доступ к отсутствующему файлу или каталогу для релизов 69 пакета инициирует ошибочную ситуацию “file or directory does not exist”, тогда как в релизе 10 возвращается несколько иная диагностика данной ситуации “file or directory, %1, does not exist”.

3. Диагностика ошибочной ситуации "wrong number (or type) of parameters in function" релизов 69 пакета Maple изменена в релизе 10 на диагностику "invalid input: …".

Указанные моменты потребовали очередной корректировки нашей Библиотеки. В первом случае там, где это требовалось, конструкции interface(warnlevel = n) были заменены на конструкции null(interface(warnlevel = n))(обеспечивая совместимость с предыдущими релизами), тогда как во втором случае подверглись корректировке try-предложения, а именно:

try …..

………

catch "file or directory does not exist": …

catch "file or directory, %1, does not exist":  …… (введено дополнительно)

……....

end try

Третий же случай потребовал простой корректировки try-предложений в двух процедурах Библиотеки подобно предыдущему случаю, а именно:

try  ….

………

catch "wrong number (or type) of parameters in function": …

catch "invalid input: ":                                      …… (введено дополнительно)

…..…..

end try

4. Корректно выполняемая в релизах 69 пакета важная тестирующая процедура `type/boolproc` в релизе 10 выполнялась некорректно, что потребовало ее модификации для пакета Maple 10.

5. При выполнении в среде пакета Maple 10 нашей процедуры Fend, обеспечивающей для операций доступа к файлам данных обработку особой ситуации “конец файла”, была обнаружена ситуация, весьма наглядно иллюстрируемая следующим простым фрагментом:

> S:=NULL:  p:=fopen("C:/temp/1.txt", 'READ', 'TEXT'):  while  `not`(Fend(p))  do  S:=S,  readline(p)  end do:  Close();  S;           # Maple 6 - 9

"111", "222", "333", "444", "555", "666", "777", "888", "999"

> S:=NULL:  p:=fopen("C:/temp/1.txt", 'READ', 'TEXT'):  while  not Fend(p)  do  S:=S,  readline(p)  end do:  Close();  S;

"111", "222", "333", "444", "555", "666", "777", "888", "999"

> S:=NULL:  p:=fopen("C:/temp/1.txt", 'READ', 'TEXT'):  while  not Find(p)  do  S:=S,  readline(p)  end do:  Close();  S;

"111", "222", "333", "444", "555", "666", "777", "888", "999"

> S:=NULL:  p:=fopen("C:/temp/1.txt", 'READ', 'TEXT'):  while  `not`(Fend(p))  do  S:=S, readline(p)  end do:  Close();  S;           # Maple 10

"111", "222", "333", "444", "555", "666", "777", "888", "999"

> S:=NULL:  p:=fopen("C:/temp/1.txt", 'READ', 'TEXT'):  while  not Fend(p)  do  S:=S, readline(p)  end do:  Close();  S;

         Error, invalid boolean expression

> S:=NULL:  p:=fopen("C:/temp/1.txt", 'READ', 'TEXT'):  while  not Find(p)  do  S:=S, readline(p)  end do:  Close();  S;

"111", "222", "333", "444", "555", "666", "777", "888", "999"

Это предполагает использование вместо конструкций типа “not Fend(F)” конструкций типа “`not`(Fend(F))” или “not Find(F)”, где Find – одна из модификаций Fend-процедуры, допускающая использование в качестве фактического аргумента только номера логических каналов ввода/вывода. В настоящее время выясняется причина такой несовместимости.

6. Согласно декларируемому пакетом процедура with эффективна только на высшем уровне и предназначена, прежде всего, для интерактивного режима. Она не работает корректно в телах процедур, определений модуля, или в рамках предложений. Между тем, в релизах 69 в теле процедур корректно работают форматы with(P) и with(P, Fo {, F1 {, …. }}), тогда как в среде Maple 10 использование их в теле процедур в общем случае приводит к ошибкам. Процедура With устраняет данный недостаток, позволяя корректно использовать оба указанных формата в теле процедур и модулей. В целом ряде случаев это позволяет обеспечивать более удобное представление алгоритмов в среде Maple-языка. Наряду с этим, вызов процедуры With(P, Fo {, F1 {, …. }}) присваивает именам {Fo, F1, …}, а вызов With(P) именам всех экспортов пакетного P-модуля protected-атрибут, отсутствующий у стандартных средств пакета. Более того, вызов стандартной процедуры with(M) на модуле М без экспортов вызывает ошибочную ситуацию, тогда как вызов With(M) возвращает пустой список, т.е. [], что в целом ряде случаев более предпочтительно. Весьма простой пример иллюстрирует вышесказанное:

> M:= module ()  end module: with(M);

Error, (in pacman:-with) module `M` has no exports

> With(M);

                                  []

Подробнее об этом и других существенных аспектах говорится в Help базе по Библиотеке.

7. В отличие от предыдущих релизов в Maple 10 главная и другие библиотеки пакета организационно устроены несколько иначе, а именно: вместо трех файлов “name.hdb”, “name.ind” и “name.lib” (библиотека mlib-типа) они состоят из двух файлов “name.hdb” и “name.mla” (библиотека mla-типа), где первый (в общем случае необязательный) файл “name.hdb” структурно остался неизменным, тогда как файл “name.mla” представляет собой, по сути дела, слияние двух файлов “name.ind” и “name.lib” прежней организации с соответствующей коррекцией входов в начальной индексной части файла “name.mla”. Такая новация требует соответствующей модификации наших средств поддержки работы с библиотеками пользователя mlib-типа, рассмотренных в нашей книге и представленных в Библиотеке. Мы не проводили такой работы по двум основным причинам, а именно: (1) новая версия утилиты march имеет опцию 'convert' {march('convert', <Путь к библиотеке>)}, обеспечивающую конвертацию mlib-библиотеки в mla-библиотеку, и наоборот; (2) на основе алгоритмов, реализуемых нашими процедурами работы с mlib-библиотеками, относительно несложно выполнить вышеупомянутую модификацию, прежде всего, в плане прекрасного практического упражнения по программированию в Maple-среде. Между тем, дополнительно к mlib-типу нами введен и mla-тип библиотек, полезный при программировании целого ряда приложений в среде пакета.

8. Начиная с Maple 9, пакет испытывает серьезные затруднения при использовании стэка, вызывая на корректных в предыдущих релизах вычислениях аварийные ситуации с диагностикой “Execution stopped: Stack limit reachedc последующей диагностикой “The kernel has been shut down. Firther computations cannot be performed”. Единственным выходом из такой ситуации является перезагрузка пакета. В целом же, устойчивость функционирования Maple 10 подобно Maple 9/9.5 оставляет желать много лучшего.

9. Начиная с Maple 10, пакет для представления своей основной библиотеки (наряду с Maple-библиотеками пользователя) использует дополнительно к типу `mlib` тип `mla`, что потребовало создания простой процедуры conmlib, обеспечивающей конвертацию библиотек mla-типа в библиотеки mlib-типа. Данное средство существенно упрощает перенос средств, созданных в предыдущих релизах пакета с использованием mlib-типа, в среду Maple 10 и выше. Следует иметь в виду, что в среде Maple 10 по следующей стандартной цепочке предложений:

> march('create', "C:\\Program Files\\Maple 10\\LIB\\Galina", 10);

> savelibname:= "C:\\Program Files\\Maple 10\\LIB\\Galina":

> savelib(Test0, Test1, Test2, Test3, Test4, Test5, Test6, Test7);

> mapN(type, 2, "C:\\Program Files\\Maple 10\\LIB\\Galina", x, ['mlib', 'mla', 'mlab']);

                         [true, false, false]

создается пользовательская библиотека Galina именно первого mlib-типа. Таким образом, основным нам представляется именно mlib-тип библиотеки, тогда как переход к дополнительному mla-типу особого смысла не имеет, разве что уменьшает количество базовых библиотечных файлов на единицу. Начиная с Maple релиза 9 и ниже, библиотеки mla-типа пакетом не распознаются, а находящиеся в них средства недоступны. Следовательно, основные средства работы с пользовательскими библиотеками ориентированы именно на mlib-тип библиотек, хотя многие допускают корректную работу и с библиотеками mla-типа. При необходимости требуемые средства работы с mlib-библиотеками можно относительно несложно модифицировать под mla-библиотеки, основной же набор таких средств уже адаптирован под оба типа Maple-библиотек (`mlib` и `mla`).

При этом, следует иметь в виду, что для Maple 10 в каталоге любой Maple-библиотеки могут одновременно находиться как пара файлов “name.ind, name.lib” (тип `mlib`), так и файл “name.mla” (тип `mla`), т.е. библиотека может принадлежать к обоих типам (`mlib`, `mla`). Однако, в таком случае Maple 10 работает только с первыми двумя библиотечными файлами, т.е. с библиотекой mlib-типа. Вследствие чего для поддержания актуальности обоих типов библиотеки требуется периодическое применение march-утилиты с опцией 'convert'. Данное новшество Maple еще раз подтверждает тот факт, что в основе разработки пакета не лежали хорошо продуманные концепция и архитектура создаваемого продукта.

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

Наряду с перечисленными, по целому ряду причин нам пришлось адаптировать к пакету Maple 10 и ряд других средств нашей Библиотеки, что еще раз подтвердило недостаточный уровень ответственности разработчиков пакета перед его пользователями. С такими модификациями читатель сможет ознакомиться в исходных текстах соответствующих библиотечных средств, находящихся в каталоге “…\\COMMON\\MWS6789” архива либо получаемых по вызову eval(P), где Р – имя процедуры из нашей Библиотеки.

Между тем, вполне возможны и другого типа несовместимости “снизу-вверх” (в книге, прилагаемой к настоящей Библиотеке, представлен целый ряд моментов несовместимости релизов), что потребует соответствующей корректировки как нашей Библиотеки, так и других программных средств, разработанных пользователями в среде релизов 69 пакета Maple. Естественно, подобные недоработки Maple team (далеко не самые существенные), не мотивируемые серьезным обоснованием и объясняемые либо недостаточной изначальной концептуальной проработкой проекта, либо сознательно создающих подобные ситуации из коммерческих соображений, подрывают доверие как к самим разработчикам, так и к пакету Maple с его перспективой в целом. Ситуация с MapleSoft несколько напоминает ситуацию с Microsoft с тем отличием, что если вторая усиленно скрывает свои коды, тогда как первая, будучи в отношении своего пакета достаточно открытой, постоянно меняет, в частности, важные как организационные, так и функциональные компоненты пакета. Если подход второй фирмы мотивируется, в основном, стремлением поставлять на рынок именно свои Windows-приложения, отсекая других конкурентов, то действия первой, на наш взгляд, мотивируются либо изначально непродуманной архитектурой пакета, либо навязыванием пользователю новых релизов пакета. Иначе весьма сложно мотивировать многие “новшества” пакета; при этом, нельзя отрицать и появление новых перспективных средств и новаций. К сожалению, с последними в новые релизы привносится и немало ошибок, недоработок и несуразиц. Имеются и просто вопиющие несуразицы, когда решаемые в младших релизах пакета задачи, не решаются в более старших. Примеров тому немало и они довольно активно дебатируются пользователями на различных форумах и в группах по пакету. Прискорбно, что подобное игнорирование общепринятых требований к качественному программному обеспечению весьма негативно сказывается на достаточно хорошем в целом пакете современной компьютерной алгебры.

Поэтому, при обнаружении подобных ситуаций убедительно просим в любой из наших представленных ниже email-адресов выслать четкое описание ситуации (желательно с примерами в виде mws-файлов; в Subject-строке следует указать “Problems with Maple). Это позволит нам не только оказать вам помощь в устранении возникшей ситуации, но и в случае необходимости разработать средства, обеспечивающие устранение недоработок и ошибок пакета, обнаруженных при выполнении Библиотеки в среде пакета Maple 10 на платформе Windows. К сожалению, данная непростая ситуация является проблемой не нашей Библиотеки, а вопросов обеспечения устойчивого и качественного программирования в среде пакета Maple в целом.

При этом следует сделать одно весьма существенное замечание. В настоящее время мы активно не занимаемся Maple-тематикой, поэтому в наш адрес не рекомендуется отсылать сообщения следующих двух типов:

(1)   по частным ошибкам пакета (например, невычисление или некорректное вычисление конкретного интеграла и т.п.), коими пакет изобилует и количество которых с появлением новых релизов по меньшей мере не уменьшается. В противном случае, только этим нам и пришлось бы заниматься. Бесполезной же констатацией ошибок и несуразиц пакета мы не считаем нужным заниматься. Такого типа вопросы следует адресовать MapleSoft team, хотя, на наш взгляд, это и не очень продуктивно.

(2)   по вопросам применения пакета для решения конкретных задач (тематика может просто выходить за рамки наших интересов и компетентности). Подобные вопросы можно обсуждать на соответствующих форумах или в группах в Internet, например, здесь или здесь.

Нами будут гарантированно рассматриваться лишь вопросы, непосредственно относящиеся к функционированию в том или ином релизе пакета Maple нашей Библиотеки, а также вопросы, носящие общий и концептуальный характер по программной среде пакета и его организации. Именно на такие вопросы следует ожидать нашей реакции в той или иной форме.

 

valadjev@yahoo.com,  aladjev@gmail.com,  victor-aladjev@rambler.ru,  aladjev@yandex.ru

http://www.aladjev.newmail.ru/,  http://www.geocities.com/noosphere_academy/index.htm

Возврат

Эстония, Tallinn April December, 2005

Обновлено TallinnMarch 18, 2007