Язык программирования ACL -- это набор указаний компьютеру о выполнении той или другой работы. Каждое указание должно быть по возможности простым, но четким и ясным. Задача программиста -- составить такую цепочку указаний, которая бы привела к полному решению проблемы компьютером. При этом компьютер работает как автомат, он сам не думает. Он должен однозначно выполнять то, что написано в программе. Элементарные указания оформлены как приказы или, по другому, команды. Команда сопровождается дополнительной информацией в виде чисел и текстов, которая распределена между параметрами и аргументами.
Итак основными структурными единицами языка ACL являются команды, параметры и аргументы. Типичная ACL программа -- это поток команд для исполнения как в любых командных файлах ДОС или UNIX, хотя в моем случае аргументы некоторых команд имеют очень сложную структуру и сами могут иметь вид подпрограммы. В тексте программы привязка команд к строкам отсутствует, а комментарии никак не выделяются и являются нормальным текстом. Сами же команды могут находиться между таким нормальным текстом в любом месте, но для их идентификации используется специальный символ. Другими словами, комментарии пишутся естественным образом, а код программы метится символом. Интерпретатор пропускает текст в файле до тех пор, пока не находит символ [#]. Я буду выделенные символы помещать в квадратные скобки, чтобы показать, что они не текст. Этот символ и указывает на начало команды. За ним без пробелов должно быть написано имя команды. Можно писать как угодно длинное имя, но интерпретатор будет принимать во внимание только первые буквы. Для некоторых команд достаточно одной буквы, для каких-то команд -- двух букв, но для всех команд не более трех букв. Число команд, в принципе, может быть любым, но пока их 39.
После имени команды через пробел проверяется наличие специального поля определения параметров, я его называю FPD (field of parameter definition). Редкие исключения из этого правила оговариваются отдельно. FPD -- это некоторый набор операций присваивания для определения значений параметров, ограниченный квадратными скобками. Существует 4 текстовых параметра, значениями которых являются строки символов, остальные параметры -- это целые переменные, значениями которых являются целые числа. Параметры внутри FPD имеют специальные имена. С именами параметров такая же история -- важны только первые буквы, хотя имя может быть и длинным, если кому то так удобнее. Один раз определенный параметр сохраняет свое значение пока не будет переопределен.
Определять и переопределять любые параметры можно в FPD любой команды. При запуске программы все параметры определены. Поэтому, если вы не определили какой-либо параметр, то команда сначала будет работать правильно, но потом, после того, как этот параметр переопределен, могут быть ошибки. Точнее, ошибки могут быть и вначале, если параметр должен иметь значение, отличное от предопределенного. Поэтому лучше все же определять все параметры, используемые данной командой, в ее FPD, или, по крайней мере, следить за их текущим значением. И особенно при вставке дополнительного кода.
Наконец, после FPD через пробел нужно писать аргументы команды, если согласно ее определению это необходимо. В отличие от параметров, которые имеют имена, и которые можно определять сколько угодно раз, аргументы считываются только один раз и являются значениями. Поэтому аргументы надо определять всегда. Аргументы пишутся без скобок. Итак, еще раз. Параметры определяются по принципу [имя] = [значение]; а аргументы -- это только значения, которые различаются номером в очереди следования после команды. То есть первый аргумент, второй и так далее. Разделителем аргументов является один или несколько символов пробела. Аргументы имеют точно такой же смысл как в командных файлах системы Виндовс.
Примеры записи ACL-программ можно найти в папке [proc] программы интерпретатора, где записаны готовые программы универсального использования (суперкоманды). Смысл введения параметров с именами в том, чтобы программа проще читалась. Имена параметров как-бы подсказывают смысл их значений. А аргументы -- это просто значения, которые программа должна получить для своей работы. Аргументы -- это самый общий принцип запуска программ в операционной системе. Все операционные системы имеют командный режим работы, и команды как раз имеют только аргументы, разделяемые специальным символом-разделителем. Обычно это пробел. Аналогично и в ACL. Что касается параметров, то их можно рассматривать как дополнение к определению команды.
Многие команды используют специальный параметр, называемый [operation] или короче [op]. Этот параметр указывает какую операцию данная команда будет выполнять из числа возможных. Число операций для каждой команды тоже, в принципе, не ограничено и зависит лишь от версии языка и работоспособности ее автора. В зависимости от типа операции команда может использовать различные параметры и аргументы. То есть одна и та же команда имеет много разных способов ее использования. Важным свойством любого языка программирования является модель использования памяти для выполнения вычислений и хранения входных, промежуточных и выходных результатов. Известно, что в объектно-ориентированных языках все же есть статические классы, работающие со статической памятью. Язык ACL частично похож на такой язык со статическими классами. Команды аналогичны статическим классам, а их операции похожи на статические методы классов. По законам жанра должна быть и статическая память.
Так и есть, в языке ACL память общая для всех команд во всех частях ACL-программы, то есть статическая. Или ее еще можно назвать глобальной. Современные языки умеют оперировать с временными переменными и массивами, которые динамически создаются и динамически убираются. С другой стороны, в языке PostScript вообще нет памяти в обычном понимании -- только стэк. В языке ACL реализован промежуточный вариант, который наиболее подходит для основной цели языка -- организации вычислений с использованием готовых блоков. Использовать интерпретатор на микро-уровне для супер-сложных расчетов с большим числом повторений кода неразумно из-за резкого снижения скорости выполнения операций по причине необходимости интерпретировать каждую команду снова и снова.
Но у интерпретатора есть свои преимущества и вот их как раз полезно использовать. И статическая (глобальная) память в этом случае тоже полезна, так как не надо думать о передаче данных из одной ACL-процедуры в другую. Но зато необходимо следить, чтобы не возникало конфликтов и какие-либо из внутренних программ не портили переменные, заданные внешней программой. Ну и память все же надо распределять. Это дополнительные расчеты, зато пользователь может это делать динамически и в зависимости от конкретных параметров расчета. Недостатки статической памяти есть следствие ее достоинств, как общий холодильник в общежитии студентов.
Память в ACL очень простая. Сначала я сделал только однобуквенные имена переменных от [a] до [z], затем от [A] до [Z] и дополнительно специальные переменные [$] [%] [&]. Всего 55 имен переменных. При этом большие и маленькие буквы означают разные переменные. Но потом я расширил число переменных, что все же необходимо для организации достаточно сложных расчетов. Как показала практика, язык ACL оказался вполне способен достаточно быстро выполнять сложные аналитические анализы без длинных циклов. Поэтому я ввел дополнительно переменные, имена которых имеют два символа - букву и цифру, то есть дополнительно весь указанный выше набор с цифрой 0, затем с цифрой 1 и так далее до 9. Всего 550 дополнительных имен переменных. Так когда-то было в бейсике для первых примитивных персональных компьютеров, на которых мне удалось поработать.
И так я работал очень много лет, примерно лет 15. И в таком режиме было написано очень большое количество программ. Однако практика показывала, что малое число переменных приводило к ошибкам переопределения переменных, которые еще были нужны, что приводило к очень непонятным ошибкам, то есть неправильной работе программы без диагностики на ошибку. То есть код правильно написан, просто результаты не те, что нужны. И 21 июля 2020 года я добавил еще 3025 = 55*55 переменных с двумя буквами из указанного выше набора. Программ, использующих такие переменные, пока мало, но постепенно они будут возникать.
С определением массивов тоже все просто. Ничего определять не надо. Есть один целый массив
Размер массива r() указан в базовой версии, которую я выставляю в интернет. Эта базовая версия имеет достаточно большой массив, и уже не так легко умещается в памяти компьютера. В частности, необходимо использовать 64-битную версию JRE для 64-битной операционной системы. Иногда, для особенно сложных расчетов необходимо иметь массив еще большего размера. Для этой цели можно сделать другие версии программы, в которых этот массив будет иметь необходимый размер. Это легко делается, но требует компиляции программы. Кроме того, для работы с большими массивами нужны специальные параметры компьютера, то есть достаточно большую оперативную память. Если кому это надо, то пишите мне письмо и я вам вышлю такой вариант.
Несмотря на жесткие ограничения, такая структура языка позволяет создавать программы любой степени сложности, которые могут работать как интерактивные и многооконные приложения, причем в любой операционной системе, так как исполняются Java программой. Они могут использовать все ресурсы самых современных компьютеров, так как интерпретатор написан на Java, и использует почти все, что Java предлагает. Новичкам для лучшего понимания что такое команды языка программирования и память компьютера еще раз советую прочитать мою статью про (Компьютер и программирование)
Полезно с самого начала сказать больше о текстовых параметрах. Их всего 4 и они имеют имена first [fir], operation [op], file, form. Они определяются как [имя] = [текст];. Но текст для каждого параметра имеет максимальный размер. Так для fir - это 8 знаков, для op - 4 знака, для file и form - 42 знака. Нельзя записывать больше знаков, так как лишние не запишутся и не будут использованы, что может привести к очень сложным ошибкам. Конечно, было бы разумно просто увеличить число символов, но пока так. Вот пример возможной ошибки. Нельзя писать [fir=r(9999999);] По смыслу это вполне разумное определение, так как такой элемент у реального массива есть. Но в записи 9 знаков. Поэтому результат не гарантирован. Иногда это проходит, иногда нет. Надо писать
# k=9999999; [fir=r(k);]
Это то же самое, но здесь уже все правила соблюдены. Такая же проблема с длинными именами файлов. Но в этом случае сделано дополнение. Так, если записать в некоторых командах
Так как, в принципе, могут существовать разные варианты программы с разными размерами массива r(), то какие-то куски стандартного ACL кода должны знать с какой версией программы они работают. Эту информацию дает служебный параметр s(109), который сообщает максимальный индекс массива r() в той версии программы, которая используется. Эту информацию полезно использовать при распределении памяти в ACL программах. Также полезно знать с самого начала, что в параметрах s(106) и s(107) находятся размеры экрана дисплея в пикселах используемого компьютера, что позволяет правильно размещать окна на экране. Графическая команда #w выдает координаты выбранной пользователем области на картинке в параметры s(102) -- s(105), соответственно x,y - координаты левого нижнего и правого верхнего углов области. Остальные служебные параметры с индексами выше 100 используются самим интерпретатором для организации правильного исполнения команд.