Программирование вычислений на языке Java для ACL

В. Г. Кон, , 30-05-2021

Я программирую на языке Java с 2003 году. Сначала было трудно. Я просто находил разные примеры кода в интернете и пробовал их изменять Потом я написал свою первую программу. А спустя примерно полгода я проделал огромную работу и перекодировал с языка Фортран на язык Java интерпретатор своего собственного языка программирования ACL. И жить сразу стало легче. Я писал программы на своем языке, который исполняла Java программа -- интерпретатор. Кое-что все-таки пришлось изменить, в том числе интерфейс и средства общения с пользователем. Одновременно я поменял название языка на ACL (advanced command language) и сделал это по аналогии с названием программы IDL, которая работала в системе Юникс на компьютерах фирмы во Франции, где я часто бывал. Я видел как ловко она это делала, но сам в ней не работал.

Интерпретируемых языков много, наиболее известны Pyton и Javascript. Но мой язык выгодно отличается тем, что интерпретатор для моего языка -- это относительно компактная и небольшая программа, которая делает не все на свете, а только то, что нужно лично мне, а также может быть полезно другим, таким как я, то есть ученым. В научной работе главное значение имеют вычисления. При этом простые вычисления можно делать прямо на ACL. Но более сложные вычисления разумно все же делать на языке Java. Такая программа может работать как в прошлом веке, то есть она может принимать входные данные в виде чисел из файла и записывать результаты расчета снова в виде чисел в файл. Не надо окон, кнопок и прочего, что сейчас можно показывать в программах. Все это уже написано на ACL и может быть легко использовано.

А чистый расчет на языке Java делать не так уж и сложно, как многим может показаться. Я приготовил образец такой программы, в котором достаточно поменять код вычислений, а все остальное работает как часы. Но это не самый простой образец. Можно и проще. Однако образец сделан так, что при желании часть кода этой программы можно вставить в программу vkACL.jar (так называется интерпретатор языка ACL) и после этого код будет работать как собственная процедура на языке ACL, что намного проще, так как не потребует запуска внешней программы. Архив файлов образца программы можно скачать по этой ссылке . Но чтобы с таким образцом можно было работать необходимо также скачать компилятор языка Java. Если у вас уже есть компилятор, то ничего не надо.

А если нет, то его можно бесплатно скачать на официальном сайте, как последнюю версию, так и все предыдущие. Но я сам не гонюсь за новыми версиями. Я работаю с версией 6u4 и готовую папку компилятора этой версии предлагаю скачать по этой ссылке . Так будет быстрее и надежнее. В архиве, который вы скачаете, есть всего одна папка, ее надо вынуть, записать на диск С и все дела. Что касается архива программы образца, то там тоже одна папка с названием (vku). Ее можно вынуть в любое место на компьютере, куда вам удобно. Я предлагаю все это проделать, а потом читать дальше. . . .

Итак, осталось объяснить как это все работает. В папке (vku) есть два файла с расширением (.bat). Это командные файлы. Один файл программу компилирует, а второй файл ее выполняет. Можно было бы объединить эти два файла в один, чтобы программа компилировалась и сразу выполнялась. Но фокус в том, что редко кому удается написать код программы сразу без ошибок. Java очень требовательный язык, и все требования соблюсти непросто. Да и не нужно. Компилятор покажет вам ваши ошибки, вы их исправите и все будет хорошо. Не стоит особенно стараться писать без ошибок. Ошибки -- это не страшно, а часто это даже учит языку. Если вы чего-то не знали, то вам подскажут. Но при этом лучше компилировать и запускать программу в два этапа. Второй этап необходим только при условии, что все будет ОК с первым этапом. Так как все мои файлы уже готовы, то можно сразу и попробовать.

Но сначала я предлагаю вам посмотреть что находится в папках. Обратите внимание, что там есть несколько файлов с расширением (.java), но нет ни одного с расширением (.class). А теперь кликайте дважды иконку файла (vku-compile.bat). При этом открывается окно терминала и в нем перечисляются выполненные команды и результат их выполнения. Ошибок не видно. Окно можно закрыть. Снова посмотрим что находится в папках. Теперь для каждого файла с расширением (.java) появились файлы с расширением (.class). Это те же файлы кода программы на языке Java, но записанные в байт-коде. Фактически -- это и есть готовая программа. А теперь можно кликнуть дважды иконку файла (vku-run.bat).

На этот раз окно терминала появилось и сразу закрылось. В папке появился пустой файл с названием (messages.txt) и еще один файл в папке (tmp) с названием (outf.dat). Последний файл и есть результат работы программы. В нем в компьютерном коде записан массив комплексных чисел, который данный пример программы и вычислял. А входные данные для расчета были взяты из файла (inf.txt) в этой же папке. То есть все сработало правильно. Заданы входные параметры числами в текстовом файле. Программа по ним вычислила массив и записала его в коде компьютера, то есть без потери точности. Как видим никаких сложностей нет. Осталось объяснить как все это работает. А в файл (messages.txt) программа (Java интерпретатор) записала бы сообщения об ошибках, какие она заметила бы в процессе расчета, например, деление на ноль и тому подобное. Раз файл пустой, значит ошибок не было.

Я сразу хочу сказать, что структура папок и файлов сделана заведомо более сложной, чем необходимо. Но зато именно такая структура позволяет перенести файл (com/vku/calcul.class) внутрь архива программы vkACL.jar, точнее заменить уже существующий там класс на ваш новый. И ваша программа станет частью языка программирования ACL. Запись с наклонной чертой означает, что файл находится внутри указанных папок. И, вообще говоря, все остальные файлы, кроме указанного, не имеет смысла даже смотреть. Там все сделано как надо и как это записано в программе vkACL.jar. По этой причине мы рассмотрим только указанный файл. Именно его вам предстоит переписать на решение вашей собственной задачи.

Итак, откройте файл (com/vku/calcul.java) в любом текстовом редакторе. Я сам для этой цели использую редактор Notepad2, но можно использовать Notepad++ или любой другой с подсветкой синтаксиса. Здесь сначала указывается папка, в которой находится файл после слова (package), а затем папки, где надо искать файлы, если каких то функций нет в данном файле. Они должны быть там. Для этого используется слово (import). Затем открывается класс (calcul) и объявляются две общие для этого класса переменные -- целая (kid) и массив a[]. После этого пишется первая функция с тем же именем. Это конструктор данного класса. Эта функция запускается, когда объявляется новый объект данного класса словами [new calcul()]. Аргументов нет, но скобки все равно надо писать, такой синтаксис языка Java.

Затем объявляются переменные, которые работают только в пределах данной функции. Переменная (nvar) определяется присваиванием значения массива (da) в классе (mi). Этот массив глобальный и программа его найдет в файле (com/vkm/mi.class). Там данный элемент массива определен как 1. А в программе vkACL.jar он сможет иметь любое значение. Если это значение равно 0, то переменная (kid) принимает значение 1, читается файл (tmp/inf.txt) как текст. Если текст существует, то из него считывается одно число и присваивается переменной. В файле это число равно 1. Смысл этого числа -- номер программы расчетов. Оно может быть разным и как раз следующий код открывает перечисление. Для значения 1 из того же файла считывается 5 чисел и запускается функция (xrofun) с аргументом в виде 1.

В этой функции снова идет перечисление по значению аргумента. Я просто хочу показать, что данный класс может запускать много разных функций, в которых может быть много разных вариантов. То есть в этом классе можно описать расчеты большого числа разных задач. В примере показана только одна функция и один вариант. В этом варианте снова делается проверка параметра kid -- это key of input data. Если он равен 1, то параметры расчета берутся из массива a[], а если нет, то они берутся из массива mi.da[]. Массив a[] считывается из файла, а массив mi.da[] определяется только в программе vkACL.jar при программировании на ACL. Такая конструкция позволяет использовать программу и как независимую, и как часть языка программирования ACL.

Вот, собственно, и все. Стоит добавить пару слов о том, что в данном коде используются функции классов (GenPro), (Complex), (CMath). Такие файлы есть в коде данной программы. Они полностью совпадают с классами интерпретатора ACL. То есть при переносе файла (com/vku/calcul.class) в интерпретатор их переносить не надо, они все там есть. А здесь они нужны для корректной компиляции и самостоятельной работы. Для программирования расчетов достаточно знать только базовые сведения о языке Java. Их можно получить в любом онлайн учебнике по Java. Очень многое в синтаксисе аналогично языку С, то есть для тех, кто знает С вообще нет никаких проблем писать код.

Осталось только сообщить как данную программу вызывать на языке ACL. А вот так
#d 5 r(1) 1 256 0.01 1 100 #e [n=0; b=1;] _\10
Здесь в команде #d указаны те же самые числа, что и в файле (tmp/inf.txt), а числа файла (outf.dat) так и останутся в массиве r(), который эквивалентен массиву mi.da[], начиная с первого индекса, как указано в [b=1;]. Но если поменять значение параметра, то они будет записаны, начиная с указанного значения. Значение [n=0;] менять нельзя. Оно как раз указывает на вашу программу. А есть и другие программы с другими номерами.

Вставлять программу в код интерпретатора разумно, если вы собираетесь ее много раз использовать. А если вам надо сделать расчет всего пару раз, то можно просто в ACL программе прочитать числа из массива (outf.dat). В этом случае программа может работать независимо, а в ACL достаточно прочитать данные и показать их на графике. Или использовать любым другим способом. Но в этом случае есть такое неудобство, что программу на языке ACL надо остановить, например, вывести на экран сообщение, затем запустить внешнюю программу и только потом продолжить работу ACL программы. Это будет медленнее, чем если вставить код в интерпретатор.

И еще пару слов о Java программировании. Как видите, все не так уж и сложно, но неудобно, что много файлов. Но Java-программы можно собирать в zip-архивы. Именно таким архивом является файл vkACL.jar. А перенос файла (com/vku/calcul.class) в интерпретатор представляет собой следующую процедуру -- (1) переименовываем vkACL.jar на vkACL.zip. (2) Открываем архив простым кликом в менеджере файлов. (3) Копируем туда файл, он запишется вместо того файла, который там был. (4) Закрываем архив и возвращаем ему старое название. Для облегчения такой работы можно сделать bat файл, в котором написать три команды (1) переименовать, (2) пауза, (3) переименовать обратно. А в момент паузы можно заменить файл. А вот саму программу расчетов собирать в архив не обязательно, если она находится в процессе разработки.

Еще пару слов о написанном коде. В языке Java нет готовых классов для расчетов с комплексными числами. То есть их нет в интерпретаторе Java. Возможно кто-то уже давно все это написал как внешние классы, но я про это не знаю. Я сам для себя написал такие классы в очень простом виде. То есть есть класс Complex, который определяет такие переменные, и есть класс CMath, в котором записаны функции простых операций с такими переменными типа сложения, вычитания, умножения, деления и элементарных функций. Можно было бы и простой синтаксис со скобками запрограммировать, но я не стал этого делать, так как расчеты с комплексными числами встречаются не часто и вполне можно все расписать и без скобок.

И еще. Можно сразу писать код без использования внешних файлов, то есть считывать и записывать числа в массив mi.da[]. Тогда код будет проще, но он будет работать только из ACL программы. Это разумно делать когда у вас уже есть большой опыт, вы все понимаете и пишете код без ошибок. При этом можно одновременно писать код на двух языках: ACL и Java и сразу его так и проверять в работе. Перенос файла calcul.class в архив vkACL.jar много времени не занимает, но полностью автоматизировать эту операцию мне не удалось. Точнее я вручнуую делаю вставку файла в zip архив, хотя в принципе это можно автоматизировать, но все не хватает времени этим заниматься.
.
.


.
 



  Внимание! Сайт оптимизирован под браузер Google Chrome.