33. ИСПОЛЬЗОВАНИЕ Java КОДА В ACL ПРОГРАММАХ

Этот раздел можно пропустить при первом изучении основ программирования на ACL. Но это может быть важно тем, кто уже все знает, и хочет знать больше. Я это записал лично для себя. Хотя кое-что уже было написано в главе 18. Дело в том, что есть еще одно применение команды #e (execute). Язык ACL все же достаточно медленный, так как на интерпретацию команд тратится время, иногда соизмеримое с самим выполнением команды. Это совсем не важно, если речь идет о любых однократных операциях с графикой, файлами, текстом. Но в математических задачах часто используются циклы с многократным повторением одного и того же кода. Чтобы ускорить работу программы в этом случае в ACL введена команда #ma (mathematics), которая выполняет много стандартных операций над массивами чисел. В нашем случае массивами являются части одного массива r(). Но иногда разумно всю расчетную работу выполнить в программе на языке программирования Java, на котором написан интерпретатор ACL. Затем код этой программы можно подключить в интерпретатор и всю программу как целое вызвать на выполнение в ACL программе. Такой вызов тоже выполняется командой #e, а сами программы просто имеют номера из двух разрядов, например, 05 (ноль писать обязательно). Выглядит это так #e [параметры] _\nn.

Каждая из таких программ имеет собственное описание, в котором написано что она делает и как она обменивается информацией с ACL программой через массивы r() и t(). Первоначально я такие программы писал только для себя и своих соавторов, точнее для своей работы по рентгеновской оптике. Они представляют интерес только для моих коллег, но я все же перечислю что было сделано.

\00 -- расчет коэффициента прохождения для многокристального монохроматора на плоскости энергия-угол
\01 -- программа рентгеновской ин-лайн оптики, т.е. перенос волновой функции через объекты и воздух
\02 -- программа метода стоячих волн, угловая зависимость рентгеновского отражения и выхода вторичных процессов
\03 -- программа расчета лауэ-дифракции в кристалле методами геометрической оптики
\04 -- расчет набора стандартных функций для использования в ACL программах одномерной ин-лайн оптики
\05 -- программа трех-волновой дифракции в кристаллах
\06 -- программа четырех-волновой дифракции в кристаллах
\07 -- программа расчета реальных функций двух аргументов (матриц)
\08 -- программа расчета произвольных функций без файлов
\09 -- программа spexpro для вызова внешних программ общего назначения
\10 -- программа extpro для вызова внешних программ по физике

Программа 00 уже имеет аналог на языке javascript и работает онлайн на моем сайте. Программу 01 я уже практически не использую, так как то же самое можно делать на ACL другим способом. Она была моей самой первой java программой. Программы 02,03,05,06 написаны для решения конкретных задач. Программа 08 является заменой программам 04 и 07, но их пришлось оставить для совместимости со старыми версиями ACL программ.

Метод подключения сложных специальных программ на языке Java к языку ACL удобен тем, что хотя основной расчет эти программы выполняют сами, но подготовку входных данных для расчета и обработку результатов расчета, а также их графическое представление удобнее и проще программировать на ACL. Конечно, всегда есть возможность делать связь между ACL и такими программами через файлы и операционную систему. Но это уже менее удобно и очень ограничивает автоматическое выполнение программ. Программа на ACL умеет запускать внешние программы, но она не знает когда они закончат, чтобы использовать результаты и программу надо останавливать сообщением с кнопками.

Однако, раньше подключение Java программ к ACL требовало каждый раз заново компилировать программу интерпретатора, что не очень удобно, учитывая большой размер программы. А реализация связи внешних программ с ACL требует знания всего кода на языке Java. В конце концов я пришел к выводу, что иногда удобно подключать полностью внешние программы. Достаточно включить в интерпретатор только вызов некоторого стандартного java класса, который никак не связан с остальным кодом и прокомпилировать программу. А затем внешнюю программу можно разрабатывать отдельно и отдельно компилировать, но с такой же структурой папок. Такая программа должна получать входные данные из файла и в файлы же записывать результаты.

А когда программа готова, то файлы новых классов можно просто скопировать в jar архив vkACL и программа будет работать как внутренняя, оставаясь внешней. Удобство такого подхода еще и в том, что если внешняя программа не нужна, то файлы ее классов можно снова вынуть, или заменить на новые. То есть программа не растет в размере как снежный ком при добавлении новых внешних программ. Именно этим грешат все специализированные программы типа Матлаба. Такая технология реализована в двух последних программах 09 и 10. Программа 09 используется для вызова внешних программ общего назначения. Они реально всегда необходимы, но существуют и разрабатывались независимо от ACL.

Эта программа имеет один параметр [n] указывающий на вызов n-й внешней программы. Реально их может быть много. Все они должны запускаться в конструкторе класса spexpro(n) в папке com.vks. Сейчас работает вызов #e [n=1;] _\09, который запускает очень мощный редактор текстов с большим числом функций и настроек, а именно, копию программы vkNotepad.jar. Он берет имя файла для редактирования из файла vknpfile.txt в папке [tmp]. Записать нужное имя в этот файл как раз можно с помощью ACL команд. В будущем возможно подключение других внешних программ (с другим номером). Предполагается, что все такие программы будут записываться в папку com.vks.

Программа 10 сделана аналогичным образом. Она запускает конструктор класса extpro(n) в папке com.vku. Что конкретно делает этот конструктор зависит от реализации. Все остальное можно разрабатывать и компилировать независимо от vkACL. Такая программа тоже может не иметь никакой связи с переменными и массивами ACL, а может и иметь, если при компиляции, например, объявить общие массивы должным образом. Она может получать входные данные из файла с названием, например, in.txt в папке tmp, а результат записывает в файл out.dat в той же папке. Но это не обязательно делать именно так, названия и папку можно менять как и способ обмена информацией. Фактически такой способ является универсальным и позволяет заменить все другие. Все математические расчеты можно оформить таким образом. Но неразумно переписывать старый код, поэтому этот способ ориентирован на будущее, а старые номера программ пока работают по старому.

В настоящее время я организовал три программы вычислений указанным выше способом, которые были использованы после того, как этот метод был реализован. При n=1 запускается программа xmdl из соответствующего класса. Она делает расчет многоволновой дифракции в случае Лауэ. При n=2 запускается программа calc, которая также написана в своем классе. Эта программа использует некоторые классы основной программы, например, комплексную арифметику. Она задумана как набор вычислений с большими циклами, которые имеют настолько специальный характер, что нет смысла добавлять новые операции в команду #ma или в программы с номерами 04, 07, 08. В основном она вычисляет трансмиссионные функции разных объектов. При n=3 запускается программа xmdswt. Она делает расчет многоволновой дифракции сферической волны. Она дополнительно использует реальный массив основной программы для экономии памяти при работе с большими массивами.

Важно знать, что при компиляции программы с реальным массивом mi.da[] последний надо указывать с таким же размером, как и в версии vkACL, иначе программа работать не будет. Так как сейчас существуют три версии с разными размерами массива r(), нужно иметь и три версии классов дополнительной программы. Проблему можно решить таким образом. При отладке новой программы и отдельной ее компиляции использовать, например, минимальный размер массива. Полностью готовый класс новой программы можно сразу поставить в версию с минимальным размером массива. А в код остальных версий добавить файл с расширением java, то есть java код, и прокомпилировать сразу программу интерпретатора. Если ошибок нет, то все будет быстро. При этом надо сделать bat файл таким образом, чтобы в нем уничтожалась цепочка классов, вызывающая новую программу. Остальные классы компилироваться не будут и все будет быстро.

Для компиляции программ, подключаемых по 9-му и 10-му номерам я открыл папку [Java] в папке программы. Но эти же программы можно скомпилировать и как совершенно отдельные, не связанные с интерпретатором. Для таких программ я открыл папку [Java-s] в папке программы. Если кого-то интересует какую структуру имеют эти папки, то пишите мне письмо, я могу выслать. Публиковать это в интернете нет смысла, желающих все равно будет мало. Вообще-говоря java-код таких программ имеет небольшой размер, и можно включать все программы в интерпретатор без проблем, даже если они и не будут никем использоваться. Сам я ими пользуюсь и выделять их каждый раз просто не хочется, жалко времени.