> restart; map(with, [plots, linalg, LinearAlgebra, plottools]): packages();
Warning, the name changecoords has been redefined
Warning, the protected names norm and trace have been redefined and unprotected Warning, the assigned name GramSchmidt now has a global binding
Warning, the name arrow has been redefined
[plots, linalg, LinearAlgebra, plottools]
> restart; p:= x^3+10*x^2+17: m:=matrix(3, 3, [x, y, z, a, b, c, d, g, h]): norm(p, 1), linalg[norm](m);
28, max(| x | + | y | + | z |, | d | + | g | + | h |,| a | + | b | + | c |)
> ListPack(); # Maple 8
{simplex, polytools, padic, geom3d, student, tensor, geometry, PDEtools, powseries, plots, plottools, diffalg,
========================================================================
LREtools, Domains, liesymm, Sockets, SNAP, VectorCalculus,Units, Maplets,Worksheet, stats, SolveTools}
> ListPack("C:/Program Files/Maple 8/LIB/UserLib");
{ACC, boolop, DIRAX, SimpleStat, SoLists, AlgLists}
В заключение данного раздела сделаем еще одно существенное замечание. Процедура with пакета используется для обеспечения удобного доступа к модульным средствам Maple, в удобной форме на интерактивном уровне. Это - команда, которая обеспечивает функциональные возможности, аналогичные предложению use, но работает на интерактивном уровне и применима ко всем пакетным и программным модулям. При этом, предложение use обеспечивает средства только для работы с программными модулями.
Процедура with эффективна только на верхнем уровне и предназначена, прежде всего, для интерактивного использования. Поскольку with работает, используя специальный лексический предпросмотр, она не работает в телах процедур или модулей. Между тем, в релизах 6 - 9 формат with работает корректно в телах процедур и модулей, тогда как в Maple 10 она не работает корректно в телах процедур или модулей, выводя соответствующие предупреждения.
Наша процедура With [103] устраняет данный недостаток, позволяя корректно использовать вышеупомянутый формат в телах процедур и модулей. В целом ряде случаев это обеспечивает более удобное представление алгоритмов в среде Maple-языка. Наряду с этим, вызов процедуры With(P, Fo {, F1 {…..}}) присваивает именам {Fo, F1,…} protected-атрибут, отсутствующий для стандартных средств пакета.
Использование вызова процедуры with(P) для проверки экспортов пакетного модуля P не является целесообразным, ибо в этом случае производится загрузка в РОП всех его экспортов. Поэтому для этих целей рекомендуется использовать процедуру tpacmod, имеющую формат вызова следующего вида: tpacmod(P {, Name}), где Р – имя пакетного модуля и Name – имя его экспорта [103]. Вызов процедуры с одним аргументом Р, в качестве которого допустимо только имя пакетного модуля, находящегося в Maple-библиотеке, логически сцепленной с глав- ной библиотекой пакета, возвращает список экспортов модуля Р. Тогда как вызов процедуры tpacmod(P, Name) с двумя аргументами возвращает true, если Name является экспортом модуля Р, и false в противном случае. При этом, в любом случае экспорты модуля Р не загружаются в РОП и не становятся активными в текущем сеансе. Данная возможность весьма актуальна при работе с пакетными модулями. Следующий фрагмент представляет исходный текст процедуры tpacmod и примеры ее использования для проверки экспортов пакетных модулей.
> tpacmod:= proc(P::package) parse(cat("`if`(belong(Release(), 6 .. 8), `pacman`, `PackageManagement`):- ", convert(`if`(nargs = 1, `pexports`, `pmember`) (`if`(nargs = 1, args, op([args[2], args[1]]))), 'string')), 'statement') end proc;
tpacmod := proc (P::package )
parse(cat("`if`(belong(Release(), 6 .. 8),`pacman`, `PackageManagement`):- " , convert(`if`(nargs = 1, pexports , pmember )(
`if`(nargs = 1, args, op([args[2], args[1]]))), 'string ')), 'statement ') end proc
281
> tpacmod(linalg);
[BlockDiagonal, GramSchmidt, JordanBlock, LUdecomp, QRdecomp, Wronskian, addcol, addrow, adj,
=====================================================================
swaprow, sylvester, toeplitz, trace, transpose, vandermonde, vecpotent, vectdim, vector, wronskian]
> packages(); []
> tpacmod(linalg, AVZ), tpacmod(linalg, det), tpacmod(linalg, diag); false, true, true > tpacmod(SimpleStat, AGN), tpacmod(SimpleStat, Ds), tpacmod(SimpleStat, MCC);
false, true, true
> packages(); []
Из примеров фрагмента следует, что вызовы процедуры tpacmod как для выяснения списка экспортов пакетного модуля, так и для тестирования имени быть экспортом пакетного модуля не загружает ни экспортов пакетного модуля в РОП, ни модуля в целом.
6.4. Статистический анализ Maple-библиотек
Создав собственную Maple-библиотеку процедур с использованием вышеупомянутых подходов или каким-либо иным способом, естественно возникает задача ее оптимизации, в частности, с целью раскрытия частоты использования средств, содержащихся в ней, и основных ресурсов компьютера, используемых ими. В этом контексте, проблема оптимизации библиотек пользователя весьма актуальна. Для этих целей достаточно полезной представляется процедура StatLib(L) [103], обеспечивающая сбор основной статистики по заданной L библиотеке и возврату статистики для последующего анализа. Прежде всего, данная процедура предполагает, что анализируемая L библиотека расположена в каталоге LIB с главной библиотекой Maple. В процессе своего выполнения процедура StatLib требует некоторых дополнительных ресурсов памяти и времени.
Процедура StatLib(L) в качестве первого обязательного аргумента L использует имя Maple- библиотеки, расположенной в подкаталоге LIB главного каталога пакета, которая логически связана с главной библиотекой пакета. Другие ее формальные аргументы (в количестве до 3) являются дополнительными и назначение кортежей их значений определяется как:
StatLib(L) |
– инициация сбора статистики по средствам библиотеки L в целом; |
StatLib(L, 0) |
– удаление всех файлов со статистической информацией по библиотеке; |
StatLib(L, 1) |
– отмена сбора статистики по библиотеке L с сохранением результатов; |
StatLib(L, P) |
– инициация сбора статистики по процедуре P из библиотеки L; |
StatLib(L, T, 2) |
– возврат собранной статистики по библиотеке L или по ее P процедуре |
|
в заданном разрезе T; |
StatLib(L, T, 2, m) |
– возврат собранной статистики по библиотеке L или по ее P процедуре |
|
в заданном T разрезе, характеризуемом числом m; |
StatLib(L, T, N) |
– возврат собранной статистики по заданной процедуре N в требуемом |
|
разрезе {calls, bytes, depth, maxdepth, time}; |
StatLib(L, abend) |
– завершение процедуры StatLib при возникновении критических ошибок. |
Вызов процедуры StatLib(L) с одним фактическим L аргументом инициирует процесс сбора статистики по вызовам составляющих L библиотеку процедур. Данный процесс сбора может быть прекращен вызовом процедуры StatLib(L, 1), который обязателен при необходимости продолжения сбора статистики в последующих сеансах работы с пакетом, ибо он производит сохранение собранной статистики в пяти файлах, размещаемых в каталоге с L библиотекой. Имена этих файлов данных имеют одинаковый “$@_”-префикс. Вызов процедуры с нулевым значением второго фактического аргумента возвращает NULL-значение с удалением файлов сбора статистики для данной L библиотеки. Данный вызов рекомендуется выполнять перед инициацией нового процесса профилирования процедур с целью сохранения его результатов в каталоге с L библиотекой. При этом, существующие статистические файлы данных с ранее
282
собранной информацией могут быть предварительно сохранены в другом каталоге либо остаться в старом под иными именами.
Вызов процедуры StatLib(L, P) инициирует процесс сбора статистики по вызовам процедур, составляющих L библиотеку и определяемых их P-списком имен. При этом, запрашиваемые к профилированию процедуры не обязательно должны принадлежать L библиотеке – они могут находиться в любой библиотеке, логически связанной с основной библиотекой пакета, или быть активными в текущем Maple сеансе. В противном случае инициируется ошибочная ситуация с возвратом соответствующей диагностики. Это позволяет производить анализ как всей библиотеки L в целом, так и в разрезе составляющих библиотекуе процедур (не совмещая оба эти процесса), а также любых активных либо доступных процедур текущего сеанса.
Процедура обеспечивает возврат статистической информации в следующих пяти разрезах, определяемых ключевыми словами T = {calls, bytes, depth, maxdepth, time}, определяющими соответственно показатели: (1) количество вызовов, (2) объем используемой памяти, (3) глубина и (4) максимальная глубина вложенности, а также (5) использованное время в сек. Вызов процедуры
StatLib(L, T, 2) возвращает массив числовых характеристик для всех профилируемых процедур
L библиотеки {либо процедур, определенных P-аргументом при вызове StatLib(L, P)} на текущий момент в заданном T-разрезе (например, calls – количество вызовов процедуры), тогда как вызов процедуры StatLib(L, T, 2, m) возвращает массив для T-разреза тех профилируемых процедур, значения соответствующих T-разрезу характеристик которых не менее m-величины. При отсутствии таких строк у массива процедура возвращает lack-значение, информируя о том, что на данный момент ни одна из профилируемых процедур не обладает соответствующей T-ра- зрезу характеристикой со значением, не меньшим, чем m. Данный массив построчно отсортирован в порядке убывания значений характеристик; при этом, для равных значений строки массива сортируются лексикографически.
Наконец, вызов StatLib(L, T, N) процедуры (если в качестве третьего аргумента N процедуры указано значение {symbol, string}-типа) возвращает значение характеристики процедуры с именем N (если таковая существует и ранее профилировалась) в заданном T-разрезе. Например, вызов StatLib(UserLib, calls, RmDir) возвращает количество вызовов процедуры RmDir библиотеки UserLib, если данная библиотека или процедура предварительно профилировались. На остальных кортежах значений фактических аргументов возвращается NULL-значение. Для обеспечения больших надежности и сохранности собираемой статистической информации рекомендуется периодически ее сохранять посредством вызовов StatLib(L, 1) с последующим возобновлением профилирования требуемых средств вызовом StatLib(L) процедуры.
Процедура допускает два режима мониторинга результатов профилирования процедур – ди- намический и разовый. Динамический режим обеспечивает достаточно удобную возможность мониторинга посредством описанных выше вызовов процедуры в процессе профилирования, т.е. между двумя вызовами процедуры StatLib(L) и StatLib(L, 1). При этом, не нарушается сам процесс профилирования. Тогда как разовый режим дает возможность проводить выборочную проверку результатов предыдущего профилирования без возобновления самого процесса профилирования. Данный подход позволяет более гибко производить мониторинг процесса профилирования процедур как внутри него, так и вне.
В некоторых версиях релизов 6-10 пакета использование процедуры StatLib может в ряде случаев вызывать критические ошибки, связанные, прежде всего, с переполнением пакетного стэка. В этом случае рекомендуется выполнить вызов StatLib(L,abend) с последующим выполнением предложения restart пакета. Данный прием позволяет сохранять в указанных статистических файлах по меньшей мере информацию по количеству вызовов профилированных процедур на момент аварийной ситуации. Последующий вызов StatLib(L) обеспечивает возобновление процесса профилирования с прерванного момента. Вышеупомянутые ошибочные ситуации могут быть в значительной степени объяснены следующим образом.
Наш достаточно длительный опыт использования Maple релизов 4-10 в различных приложениях, включая развитие средств, расширяющих основные средства пакета, со всей определен-
283
ностью выявил одно довольно существенное обстоятельство. Многие из часто используемых стандартных Maple-средств были обеспечены недостаточно развитой системой обработки специальных и ошибочных ситуаций, которые в большинстве случаев завершаются ошибками с очевидно некорректной диагностикой, например, "Execution stopped: Stack limit reached" с последующим аварийным завершением текущего сеанса. Таким образом, либо Maple имеет стэк недостаточной глубины, либо вышеупомянутая ситуация была вызвана (в отсутствие каких-либо циклических вычислений) ошибкой, имеющей причину некоторого другого характера. К сожалению, увеличение номеров релизов Maple пока сопровождается уменьшением их ошибкоустойчивости, да и не только этого.
Реализация алгоритма процедуры StatLib существенно базируется на представленных в книге [103] процедурах DoF, Fremove, Plib, belong, _SL, tabar, а также на специальных процедурах profile и unprofile пакета для профилирования вызовов процедур. При использовании StatLib процедуры имеет место замедление вычислений и увеличение используемой памяти, величина которых зависит, прежде всего, как от количества профилируемых процедур, так и частоты их использования. Однако, ввиду относительно небольших библиотек пользователя (до 600 – 700 процедур и частоте их использования не более 600 за сеанс, исключая циклические конструкции) данное обстоятельство не приводит к критическим ситуациям, связанным с использованием основных ресурсов компьютера и времени обработки. В частности, использование данного механизма для нашей библиотеки с процедурами (свыше 700), представленными в книге [103] и прилагаемой к ней библиотеке, не дает каких-либо оснований рассматривать описанный механизм профилирования в качестве причины достаточно серьезных дополнительных издержек основных ресурсов ПК, правда, эксперименты производились на Pentium 4 c частотой 3 GHz, RAM 1 GB и HDD 120 GB.
Механизм использования StatLib процедуры сводится к следующему. В самом начале сеанса работы с пакетом выполняется вызов процедуры StatLib(L {, P}), где L – имя анализируемой библиотеки пользователя, удовлетворяющей указанным выше условиям (P-аргумент может определять список имен процедур из L библиотеки или вне ее). Перед завершением текущего сеанса работы выполняется вызов процедуры StatLib(L, 1), который обеспечивает сохранение статистической информации в пяти специальных файлах с именами "$@#_h" (где h {depth, calls, bytes, maxdepth, time}), помещаемых в подкаталог с L библиотекой. В любой момент (динамичес- ки либо разово) посредством вызовов процедуры StatLib(L, T, {2|name} {, m}) можно получать справку по характеристикам вызовов процедур библиотеки в указанных выше разрезах.
Наиболее эффективным режимом является следующий. Каждый очередной сеанс работы с пакетом начинается вызовом StatLib(L), после которого производится текущая работа в среде пакета. Периодически рекомендуется производить пары вызовов {StatLib(L, 1), StatLib(L)} для обеспечения надежности по сохранности результатов профилирования процедур библиотеки. Перед завершением текущего сеанса выполняется вызов процедуры StatLib(L, 1), обеспечивая прекращение процесса профилирования и сохранение его результатов в упомянутых файлах. Просмотр результатов профилирования в упомянутых разрезах рассматривался нами выше. Анализ собранной статистической информации дает возможность улучшать как организацию библиотеки в целом, так и эффективность составляющих ее отдельных процедур, имеющих достаточно высокую частоту использования или существенно использующих базовые ресурсы компьютера.
Опыт использования процедуры StatLib со всей определенностью говорит о ее довольно высокой эффективности в случае решения проблем оптимизации библиотек пользователя. Механизм и методы использования процедуры StatLib достаточно подробно рассмотрены в наших предыдущих книгах [29-33,39,42-46,103]. Представленные ниже примеры достаточно хорошо иллюстрируют принципы и результаты применения процедуры StatLib.
284
StatLib := proc (L::{string , symbol})
local a, k, h, S, P, K, G, H, t, pf, unp, u, V, T, R, W, Z, calls1, bytes1, depth1 , maxdepth1 , time1 ;
global profile_maxdepth , profile_calls, profile_bytes , profile_depth , profile_time , `$Art16_Kr9` , calls2, bytes2, depth2 , maxdepth2 , time2;
unp := ( ) → unassign('`$Art16_Kr9` ', 'profile_proc ', op(T), seq(cat(profile_ , k), k = R));
`if`(nargs = 2 and args[2] = 'abend',
RETURN(unprofile( ), unp( ), "Abend! Execute `restart` command!" ),
NULL );
W := table([1 = true, 2 = `if`(
nargs = 2 and type(args[2], {'binary', 'list'({'symbol'})}), true, false ), 3 = `if`(nargs = 3 and
member(args[2], {'bytes', 'maxdepth ', 'calls', 'time', 'depth'}) and
(args[3] = 2 or type(args[3], 'symbol')), true, false ), 4 = `if`(nargs = 4 and member (args[2], {'bytes', 'maxdepth ', 'calls', 'time', 'depth '}) and args[3] = 2 and type(args[4], 'numeric '), true, false )]);
`if`(W[nargs ] = true, unassign('W'),
ERROR("invalid arguments %1 have been passed to the StatLib" , [args]))
;
assign(K = Plib(L)), assign(R = ['bytes', 'calls', 'depth ', 'maxdepth ', 'time']), assign('calls1' = cat(K, "/$@_", R[2]), 'bytes1' = cat(K, "/$@_", R[1]), 'depth1 ' = cat(K, "/$@_", R[3]), 'maxdepth1 ' = cat(K, "/$@_", R[4]), 'time1' = cat(K, "/$@_", R[5])), assign(
T = [seq(cat(R[h ], `2`), h = 1 .. 5)],
V = ['bytes1', 'calls1', 'depth1 ', 'maxdepth1 ', 'time1 '],
Z = [seq(cat(profile_, R[h ]), h = 1 .. 5)], G = [ ]);
`if`(nargs = 2 and args[2] = 0, RETURN(WARNING("datafiles with statist\ ics have been removed out of directory with library <%1>" , L), unprofile( ),
op(map(Fremove, [bytes1, calls1, depth1 , maxdepth1 , time1 ])), unp( )) , NULL );
if nargs = 2 and args[2] = 1 then
`if`(type(eval(profile_calls ), 'table'), assign( 'calls2' = eval(cat(profile_, R[2])), 'bytes2' = eval(cat(profile_ , R[1])), 'depth2 ' = eval(cat(profile_, R[3])), 'maxdepth2 ' = eval(cat(profile_, R[4])), 'time2 ' = eval(cat(profile_, R[5]))), ERROR("profiling does not exist" ));
(proc ()
save maxdepth2 , maxdepth1 ; save calls2, calls1;
save bytes2, bytes1 ; save depth2 , depth1 ; save time2 , time1
end proc )( ), RETURN(unprofile( ), unp( ),
WARNING("profiling of library <%1> has been completed" , L)) else NULL
end if ;
285
if nargs = 3 and belong(cat(``, args[2]), R) and member(whattype(args[3]), {'symbol', 'string '}) then
assign('`$Art16_Kr9` ' = eval(cat(profile_, args[2])), pf = cat(K, "/$@_", args[2])), `if`(
type(eval(`$Art16_Kr9` ), 'table'), NULL, `if`(DoF(pf ) = 'file', [ (proc () read pf end proc )( ),
assign('`$Art16_Kr9` ' = eval(cat(``, args[2], `2`)))], RETURN("a profiling information does not exist" )));
assign(a = [cat(``, args[2]), `$Art16_Kr9` [cat("", args[3])]]), RETURN( `if`(type(a[2], 'numeric '), a, "procedure has been not profiled" ), `if`(type(eval(profile_proc ), 'symbol'), unp( ), NULL ))
else NULL end if ;
if 3 ≤ nargs and belong(cat(``, args[2]), R) and args[3] = 2 then `if`(nargs = 4 and type(args[4], 'numeric '), assign(a = args[4]),
assign(a = 0));
assign(pf = cat(K, "/$@_", args[2]),
'`$Art16_Kr9` ' = eval(cat(profile_, args[2]))), `if`(
type(eval(`$Art16_Kr9` ), 'table'), NULL, `if`(DoF(pf ) = 'file', [
(proc () read pf end proc )( ),
assign('`$Art16_Kr9` ' = eval(cat(``, args[2], `2`)))], RETURN("a profiling information does not exist" )));
RETURN(
tabar(`$Art16_Kr9` , 'Procedures', cat(`Procedure's `, args[2]), a ), `if`(type(eval(profile_proc ), 'symbol'), unp( ), NULL ))
else NULL end if ;
`if`(K ≠ false, [assign(P = march('list', K )), assign('h' = nops(P))], ERROR( "library <%1> does not exist or is not linked with the main Maple library" , L));
`if`(nargs = 2 and type(args[2], 'list'({'symbol'})), assign(S = args[2]), assign( S = [
seq(`if`(P[k][1][1 .. 2] ≠ ":-", cat(``, P[k][1][1 .. -3]), NULL ), k = 1 .. h ) ]));
for k in S do
try `if`(type(eval(k), 'procedure '), assign('G' = [op(G), k]), NULL ) catch "": NULL("Exception handling with program modules" )
end try end do ;
`if`(G = [ ], ERROR("procedures ordered for profiling do not exist both in \ library <%1> and in libraries logically linked with the main Maple libr \ ry", L, unprofile( ), unp( )), NULL );
try
if DoF(calls1) = 'file' then null((proc () profile(op(G));
286
seq((proc (x) read x end proc )(eval(V[h ])), h = 1 .. 5); seq(_SL(Z, eval(T[h ]), h ), h = 1 .. 5)
end proc )( ))
else profile(op(G)) end if
catch "%1 is already being profiled":
WARNING("profiling is already being executed!" ) end try
end proc
>restart; StatLib(UserLib);
>MkDir("C:\\Temp/Art/Kr"), type("C:\\Temp/Art/Kr", dir), type("C:\\Temp/Art/Kr", file);
"c:\temp\art\kr", true, false
> StatLib(UserLib, calls, 2, 7);
Procedures |
Procedure's calls |
||
|
|
|
|
|
Red_n |
33 |
|
|
|
||
|
|
|
|
|
Case |
31 |
|
|
|
||
|
|
|
|
|
|
16 |
|
Subs_all1 |
|
||
|
|
|
|
|
|
16 |
|
Subs_All |
|
||
|
|
|
|
|
Search |
10 |
|
|
|
||
|
|
|
|
|
holdof |
9 |
|
|
|
||
|
|
|
|
|
CF |
7 |
|
|
|
||
> StatLib(UserLib, time, Case); |
[time, 0.0] |
|
|
> StatLib(UserLib, bytes, StatLib); |
[bytes, 17980] |
|
|
> seq(StatLib(UserLib, calls, h), h = [belong, tabar, Case, CF]); |
|||
[calls, 4], [calls, 1], [calls, 61], [calls, 7] |
|||
> StatLib(UserLib, time, 2, 0.05); |
|
|
|
Procedures |
Procedure's time |
||
|
|
|
|
|
Adrive |
0.157 |
|
|
|
||
|
|
|
|
|
tabar |
0.062 |
|
|
|
||
> StatLib(UserLib, calls, 2, 20); |
|
|
|
Procedures |
Procedure's calls |
||
|
|
|
|
|
Case |
76 |
|
|
|
||
|
|
|
|
|
Red_n |
33 |
|
|
|
||
|
|
|
|
|
sub_1 |
20 |
|
|
|
||
> StatLib(UserLib, bytes, 2, 20000);
287
Procedures |
Procedure's bytes |
||
|
|
|
|
|
SLj |
3591160 |
|
|
|
||
|
|
|
|
|
tabar |
2097700 |
|
|
|
||
|
|
|
|
|
Red_n |
355168 |
|
|
|
||
|
|
|
|
|
Case |
176172 |
|
|
|
||
|
|
|
|
|
|
115256 |
|
type/nestlist |
|
||
|
|
|
|
|
Search |
74416 |
|
|
|
||
|
|
|
|
|
Adrive |
64752 |
|
|
|
||
|
|
|
|
|
StatLib |
60944 |
|
|
|
||
|
|
|
|
|
Plib |
42456 |
|
|
|
||
|
|
|
|
|
|
38856 |
|
Subs_all1 |
|
||
|
|
|
|
|
type/dir |
35676 |
|
|
|
||
|
|
|
|
|
CF |
35372 |
|
|
|
||
|
|
|
|
|
belong |
33132 |
|
|
|
||
|
|
|
|
|
sub_1 |
28392 |
|
|
|
||
|
|
|
|
|
type/file |
20244 |
|
|
|
||
> StatLib(UserLib, 1);
Warning, profiling of library <UserLib> has been completed
[Новый Maple-сеанс:
> StatLib(UserLib); CureLib("C:\\rans\\academy\\libraries\\ArtKr", x, y):
Warning, library file <C:/rans\academy/libraries\ArtKr\Maple.ind> does not exist Warning, Analysis of contents of library lib-file is being done. Please, wait! Warning, library contains multiple entries of the following means
[Atr, CCM, CureLib, Currentdir, DAclose, DAopen, DAread, DUlib, FSSF, F_atr1, F_atr2, FmF, Imaple, Is_Color, LibElem, LnFile, ModFile, NLP, ParProc1, RTfile, Reduce_T, SDF, SSF, Suffix, Uninstall, Vol, Vol_Free_Space, WD, WS, cdt, conSA, dslib, ewsc, gelist, sfd, mapTab, readdata1, redlt, sorttf, type/dir, type/...];
the sorted nested list of their names with multiplicities appropriate to them is in predefined variable `_mulvertools`
Warning, Analysis of contents of library lib-file has been completed!
> _mulvertools;
[[F_atr2, 6], [Atr, 4], [CureLib, 3], [FSSF, 3], [SDF, 3], [SSF, 3], [Suffix, 3], [conSA, 3], [ewsc, 3], [gelist, 3], [sorttf, 3], [type/file, 3], [CCM, 2], [Currentdir, 2], [DAclose, 2], [DAopen, 2], [DAread, 2], [DUlib, 2], [F_atr1, 2], [FmF, 2], [Imaple, 2], [Is_Color, 2], [LibElem, 2], [LnFile, 2], [ModFile, 2], [NLP, 2], [ParProc1, 2], [RTfile, 2], [dslib, 2], [Reduce_T, 2], [Uninstall, 2], [Vol, 2], [Vol_Free_Space, 2], [WD, 2], [WS, 2], [cdt, 2], [mapTab, 2], [readdata1, 2], [redlt, 2], [sfd, 2], [type/dir, 2]]
> SLj([[Vic, 63], [Gal, 58], [Sv, 38], [Arn, 42], [Art, 16], [Kr, 9]], 2);
[[Kr, 9], [Art, 16], [Sv, 38], [Arn, 42], [Gal, 58], [Vic, 63]]
> StatLib(UserLib, calls, 2, 15);
288
Procedures |
Procedure's calls |
||
|
|
|
|
|
Case |
96 |
|
|
|
||
|
|
|
|
|
Red_n |
39 |
|
|
|
||
|
|
|
|
|
sub_1 |
26 |
|
|
|
||
|
|
|
|
|
Search |
23 |
|
|
|
||
|
|
|
|
|
|
19 |
|
Subs_all1 |
|
||
|
|
|
|
|
Subs_All |
19 |
|
|
|
||
|
|
|
|
|
belong |
15 |
|
|
|
||
> StatLib(UserLib, bytes, 2, 63000);
Procedures |
Procedure's bytes |
||
|
|
|
|
|
SLj |
7143544 |
|
|
|
||
|
|
|
|
|
tabar |
4929356 |
|
|
|
||
|
|
|
|
|
Red_n |
407032 |
|
|
|
||
|
|
|
|
|
|
340600 |
|
type/nestlist |
|
||
|
|
|
|
|
Case |
252076 |
|
|
|
||
|
|
|
|
|
Search |
99476 |
|
|
|
||
|
|
|
|
|
Adrive |
84024 |
|
|
|
||
|
|
|
|
|
StatLib |
82572 |
|
|
|
||
|
|
|
|
|
Plib |
67216 |
|
|
|
||
> StatLib(UserLib, 0);
Warning, datafiles with statistics have been removed out of directory with library <UserLib>
Ввиду пояснений, сделанных выше, примеры данного фрагмента достаточно прозрачны и не требуют каких-либо дополнительных пояснений. В частности, данная процедура весьма эффективно использовалась для улучшения функциональных характеристик пользовательской библиотеки UserLib, содержащей процедуры, представленные в нашей книге [103].
Процедуры, представленные в [103] и прилагаемой к ней библиотеке, обеспечивают пользователя набором средств для обработки библиотек пользователя, имеющих структурную организацию, аналогичную главной Maple-библиотеке. Данные средства обеспечивают целый ряд функций, упрощающих проблему восстановления поврежденных библиотек. Наряду с этим, они также поддерживают и другие структурные организации, полезные в целом ряде важных приложений. Эти и другие предпосылки, обусловленные вышеупомянутыми процедурами, позволяют существенно автоматизировать обработку пользовательских библиотек, наряду с расширением возможностей, имеющих дело с сохранением процедур и программных модулей во внешней памяти компьютера. В целом, средства, методы и приемы, представленные в книге [103], предназначены как для повышения эффективности применения Maple в различных приложениях, требующих программирования, так и для самого освоения программирования в среде пакета Maple.
289
Заключение
Настоящая книга вводит специалистов, ученых, преподавателей и студентов в различные аспекты программирования в среде известного математического пакета Maple релизов 6 – 10. В ряде источников Maple определяется как система компьютерной алгебры (CAS), использовался
данный термин и нами. Однако мы остановились именно на термине «пакет» и вот почему. В нашем понимании программное средство, именуемое «пакетом», предоставляет собственную среду программирования, ориентированную, прежде всего, на наиболее эффективную реализацию в ней задач, относящихся к области приложений пакета. При этом, перед пакетом, как правило, не ставится цели универсализации в том смысле, чтобы программируемые в его среде средства были выполняемыми непосредственно в операционной среде ПК, например, на уровне {exe, com}-файлов. А именно такой возможностью и не обладает Maple.
Книга является непосредственным продолжением наших предыдущих книг по проблематике пакета, изданных в России, Белоруссии, Эстонии, Литве и США. Основное наше внимание уделено основам программирования в среде Maple-языка пакета, позволяющим эффективно использовать нашу библиотеку, прилагаемую к книге [103], прежде всего. Наряду с этим, книга может послужить неплохим введением в программную среду пакета Maple релизов 6 – 10.
Данное программное обеспечение, выполненное на инновативном уровне, организовано как пользовательская библиотека, логическое соединение которой с главной Maple-библиотекой позволяет использовать содержащиеся в ней средства на уровне стандартных средств пакета. Библиотека содержит хорошо-разработанное программное обеспечение (набор более 700 процедур и программных модулей), которое хорошо дополняет уже существующее программное обеспечение пакета с ориентацией на самый широкий круг пользователей, существенно увеличивая его применимость и эффективность. Опыт использования данной библиотеки как отдельными пользователями, так и в целом ряде университетов и исследовательских институтов в России, Белоруссии, Латвии, Литве, Украине, Германии и т.д. подтвердил ее хорошие функциональные характеристики при решении разнообразных физико-математических задач. Во многих случаях представленные дополнительные процедуры и модули иллюстрируют как полезные приемы программирования, так и элементы методологии и методов программирования в среде пакета.
Библиотека предназначена для Maple релизов 6-10, функционирующего на платформах типа Windows 95/98/98SE/ME/NT/XP/2000/2003, однако ASCII- файл с исходными текстами всех библиотечных средств, поставляемый с библиотекой, позволяет легко адаптировать ее к операционным платформам, отличным от Windows. При этом, наборы исходных текстов всех библиотечных средств и справочных страниц, составляющих ее справочную базу данных позволяют легко обновлять библиотеку или создавать на ее основе собственные библиотеки. Прилагаемые файлы `ProcLib_6_7_8_9.mws` и `ProcLib_10.mws` содержат Maple-документы, обеспечивающие автоматическую инсталляцию библиотеки в среде Maple релизов 6-10. Наконец, в поставляемый комплект библиотеки входит набор ее стандартных вариантов для релизов 6-10, легко устанавливаемых на ПК простым копированием без традиционной инсталляции.
Средства, представленные в библиотеке, расширяют диапазон и эффективность применения пакета на платформе Windows благодаря новациям в трех основных направлениях, а именно: (1) устранение ряда основных дефектов и недостатков, (2) расширение возможностей целого ряда стандартных средств, и (3) пополнение пакета новыми средствами, которые расширяют возможности его программной среды, включая средства, существенно повышающие уровень совместимости релизов 6 – 10. Основное внимание было уделено дополнительным средствам, созданным в процессе практического использования и апробации Maple релизов 4 – 9, которые по ряду характеристик существенно расширяют возможности пакета, делая работу с ним намного более легкой. Значительное внимание уделено средствам, обеспечивающим более высокий уровень совместимости пакета релизов 6 – 10. Опыт наш и наших коллег по исполь-
290
