Некоторые важные замечания по
использованию Библиотеки в среде
пакета Maple 9.5/10/11.
В полной мере представленная Библиотека вполне корректно работает с
пакетом Maple релизов 6 – 9 классического (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. В релизах 6 – 9 пакета вызов “interface(warnlevel = n)”
возвращает NULL-значение, т.е. ничего, тогда
как в релизе 10 возвращается
значение n.
2. Доступ к отсутствующему файлу или
каталогу для релизов 6 – 9 пакета инициирует ошибочную ситуацию
“file or directory does not exist”, тогда как в релизе 10 возвращается несколько иная
диагностика данной ситуации “file or directory, %1, does not exist”.
3. Диагностика ошибочной ситуации
"wrong number (or type) of parameters in function …" релизов 6 – 9 пакета 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. Корректно выполняемая в релизах 6 – 9 пакета важная тестирующая процедура `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 эффективна только на высшем уровне и
предназначена, прежде всего, для интерактивного режима. Она не работает
корректно в телах процедур, определений модуля, или в рамках предложений. Между
тем, в релизах 6 – 9 в теле процедур корректно работают
форматы 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 reached” c последующей диагностикой “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), где Р – имя процедуры из нашей Библиотеки.
Между тем, вполне возможны и
другого типа несовместимости “снизу-вверх” (в книге, прилагаемой к настоящей Библиотеке, представлен целый ряд
моментов несовместимости релизов), что потребует соответствующей корректировки
как нашей Библиотеки, так и других программных средств, разработанных пользователями в среде
релизов 6 – 9 пакета 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
Обновлено – Tallinn – March 18, 2007