$$IF?LIGHTEN,LIGHTRU $$IF?DARKEN,DARKRU AL-IV - Подробное описание $$FI $$IF?DARKRU,DARKEN $$IF?LIGHTRU,LIGHTEN $$FI

$$-FlagEN ENGLISH | $$-FlagRU RUSSIAN(Русский) |  | $$IF?LIGHTEN $$IF?DARKEN $$IF?LIGHTRU $$IF?DARKRU $$FI

## Введение | ## Introduction

Язык программирования AL/IV - это минимальный императивный объектно-ориентированный платформенно-независимый язык высокого уровня со статической типизацией, претендующий на чрезвычайно высокую степень надежности кода управляемого уровня. | A programming language AL/IV is a minimal imperative object oriented platform independent high-level programming language with static types, claiming to a very high level of safety and stability of a controllable level of code protection.
#### Важные семантические особенности: | #### Important semantic things of the language are:
NONE-объекты вместо NULL-ов Поля NONE-объектов всегда равны NONE. Запись в поля `NONE`-объектов игнорируется. Чтение полей всегда дает нули и `NONE`-объекты соответствующих типов. `NONE`-объекты возвращаются в случае обращения за пределами массивов, и при потере объекта, на который имелась ссылка. Все объектные переменные всегда инициализированы значениями `NONE` и никогда не имеют значение `NULL`. | NONE-objects instead of NULLs fields of NONE objects are always equal to NONE. Writing to fields of `NONE`-objects is ignored. Reading of fields gives always zeroes and `NONE`-objects of correspondent types. `NONE`-objects are returned in a case when arrays are accessed out of the array bounds, and when the object referenced was lost . All object variables are always initialized with `NONE` and never have value `NULL`.
Разделение указателей на владеющие (сильные) и использующие_ (слабые) Сильные указатели не могут быть использованы для организации замкнутых цепочек взаимного владения. Не нужен механизм сборки мусора. Объект автоматически уничтожается, когда обнуляется его счетчик использования сильными указателями. При уничтожения объекта все слабые ссылки на него автоматически перенаправляются на `NONE`-объекты соответствующего класса. Новые объекты либо должны адресоваться сильным указателем, либо передаваться во владение ранее созданному объекту. | Separating references to objects onto strong (owning) and weak_ (using) references Strong references can not be used to create closed link chains between objects. Garbage collection is not necessary at all. All objects are automatically destroyed when its usage (by strong references) counters becomes zero. When the object is destroyed, all weak references onto it immediately become referencing to `NONE` objects of corresponding class. New objects must be addressed either a strong pointer reference or an existing object should be specified becoming an owner of the creating object.
Полная изоляция данных потока от других параллельно работающих вычислительных потоков (примечание: распараллеливание не реализовано) Не требуются механизмы для исключительного доступа к разделяемым объектам. Поток видит только свои объекты и не имеет доступа к объектам других потоков. Невозможны взаимные блокировки потоков из-за доступа к данным. Глобальные переменные в языке AL/IV отсутствуют, поэтому проблемы с одновременным доступом к ним не возникают. | Total thread data isolation from other simultaneously executing threads (Note: parallel working is not implemented yet) Special mechanisms to provide exclusive access to shared data are not necessary. A thread can access only its own objects and even does not see objects of other threads. There are not possible deadlocks due to data access conflicts. There are no global variables so there are no problems with simultaneous access them from different threads.
Управление распараллеливанием вычислений на уровне синтаксиса языка Блочный оператор `FORK`. Иерархическая модель распараллеливания: порождающий поток знает только о своих дочерних потоках и может их контролировать. Произвольные управляющие действия из других потоков запрещены. | Controlling threads on a language syntax level Block statement `FORK` to organize parallel executing, Hierarchical model of threads: a thread which creates child threads, only can control those. It is not possible to affect it from other threads.
Невозможность зацикливания и бесконечной рекурсии Циклы возможны только в форме `FOR var IN arr[] : ...` (нет циклов типа `WHILE`/`REPEAT-UNTIL`). Есть бесконечные циклы, но их использование жёстко ограничено. Любой цикл `FOR` с переменной обязательно завершается, поэтому вечное зацикливание становится невозможным. Рекурсивные функции обязательно помечаются маркером `RECURSIVE`, и глубина рекурсии контролируется: в случае опасности бесконечной рекурсии выполняется немедленный возврат к рекурсивному вызову первого уровня в цепочке вызовов, и она возвращает `NONE`-значение. | Detection of infinitive loops and endless recursions Loops are possible only in form `FOR var IN arr[] : ...` (there are no loops like `WHILE`/`REPEAT-UNTIL`). There are also infinite loops `FOR`, but its usage is restricted hardly. Any loop `FOR` with a variable is finished obligatory, so infinitive looping become impossible. Recursive functions always are marked with a modifier `RECURSIVE`, and a recursion deep is controlled: in case of danger of too deep recursion an immediate return to the first level of the recursion in the calls chain is performed and it returns `NONE` value.
Оператор PUSH для переменных В операторе `PUSH` для переменной сохраняется прежнее значение и может присваиваться новое. По окончании блока, для переменной гарантированно восстанавливается ее значение. | PUSH statement for variables and objects In a `PUSH` statement for a variable its value is stored and new value can be assigned. On a block end, stored value of a variable is restored always.
Параметры простых типов всегда передаются "по значению" и не могут изменяться в теле функции Повторное использование простых входных параметров для хранения промежуточных значений запрещено. Отсутствует возможность изменять значение скалярного параметра (кроме изменения полей объектного параметра). Для массива допускается изменение элементов, а для динамического массива-параметра - добавление и удаление элементов. | Parameters passed by value, can not be changed in a function Reusing input parameters to store intermediate values is not allowed. Value of a scalar parameter can not be changed until the function ends. For an array parameter it is allowed to change items, and for dynamic arrays - adding and deleting items.
Поля и переменные класса "только для чтения" Упрощают создание "свойств", которые может изменять только владелец (класс и его наследники). | "Read only" fields and module variables Simplifies creating of "properties" which can be modified only by the owner (class and its descendants).
Перечисления Являются прямыми аналогами перечислений других языков высокого уровня. Позволяют работать с именованными константами и флажками. В качестве коллекции предлагается использовать булевские массивы с индексами типа этих перечислений. Элементы перечислений заключаются в одинарные кавычки. | Enumerations and collections These are very similar to enumerations and sets in Pascal-like languages. These allow to work with named constants and flags. It is possible to use Boolean arrays with such enumerations as indexes to implement collections of flags. Enumeration items are included into apostrophes.
Обработка исключений не требуется, ввиду отсутствия исключений Никакие ошибки не могут изменить ход выполнения программы непосредственно (путём немедленной передачи управления в другую точку). Передача управления в рекурсивную функцию верхнего уровня при превышении допустимого уровня рекурсии выполняется только для ускорения обнаружения сбоя и предотвращения "зависания" в случае большого числа вложенных циклов. Большинство ошибок подавляется путём замены предполагаемого результата значением `NONE`. Дополнительные средства обнаружения проблем в процессе выполнения конечной программы в языке отсутствуют, но могут использоваться встроенные в язык средства тестирования. | There are no handling exception instruments, since there are no exceptions There are no errors which could change execution flow immediately (branching to another execution point). Passing control to a top level recursive function when a maximal allowed level of a recursion is achieved is performed only to speed up malfunction detection and to prevent stuck of execution in case of a big amount of nested loops. Most of errors are ignored by replacing a supposed result with the `NONE` value. The are no additional tools to find problems at the execution time but special test tools can be used embedded into the language.
Встроенные в язык средства тестирования Функции `TEST` позволяют протестировать исходный код. Степень покрытия кода тестами оценивается компилятором. Модуль, недостаточно покрытый тестами, должен быть помечен модификатором UNTESTED. | Embedded to the language testing engine TEST functions allows to test code. Covering of the code by tests is measured by the compiler. A unit insufficiently covered by tests must be marked by the modifier UNTESTED.

#### Важные синтаксические особенности: | #### Important syntax things of the language are:
Один класс - один модуль Один исходный текстовой файл содержит ровно один класс. Все публичные имена и параметры функций начинаются с заглавной буквы, все скрытые поля и локальные переменные - со строчной буквы. Подчёркивание на конце имени используется только для имён объектных полей класса, для индикации того, что поле является слабой ссылкой на объект. | One class - one module Each source text file contains a single class definition. All public names and function parameters have names starting from uppercase letter, all the hidden names and local variables are starting from a lowercase letter. Underlining at the end of a name is used only for object fields of class which are weak references to the ovject.
Двойное именование типов, переменных, функций, констант Большинство объектов (переменных, функций, типов данных) имеют два имени. При декларации, полное имя делится на 2 части символом '|', при этом часть до разделителя является кратким именем объекта. Все сущности (за исключением переменных цикла FOR) обязаны иметь длинное имя не менее 8 символов. Ключевые слова языка записываются в верхнем регистре и не могут употребляться для именования функций и переменных. | Double naming of types, variables, functions, constants Most of objects (variables, functions, data types) have two names. In declarations, full name is separated onto 2 pars via a '|'. The part before '|' is representing a short name of an item. All named things (excluding FOR loop variables) should have long names (at least 8 characters). Language keywords are written in the uppercase and can not be used to name functions or variables.
Классы и перечисления всегда упоминаются в фигурных скобках. Имеется 4 простых типа данных: `BOOL`, `INT|EGER`, `REAL`, `STR|ING`. Классы и перечисления именуются в фигурных скобках, например, `{My|_class}`. Имена классов в фигурных скобках начинаются с Прописной буквы. Имена перечислений - со строчной. Нет типа char (используется `STR`). Неявное преобразование типа возможно только из `INT` в `REAL`. | Names of classes and enumerations are always written in figure brackets. The are 4 simple data types: `BOOL`, `INT|EGER`, `REAL`, `STR|ING`. Classes and enumerations are named using figure brackets, e.g. `{My|_class}`. Classes have names in figure brackets starting from uppercase. Enumeration names are always starting from a lowercase letter. Type like "char" is not present (`STR` is used). Implicit conversion is allowed only for converting `INT` to `REAL`.
Ограничение длины строк кода Исходный код не должен содержать строки длиннее 80 символов (не считая комментариев и завершающих пробелов). Предыдущее правило не распространяется на строки, расположенные за финальной директивой `END`. Код продолжается в следующей строке, если строка завершается одним из символов ',', '(' или '[', либо следующая строка начинается с символа двойной кавычки. | Source code string length restriction Source code should not contain lines with length greater then 80 characters (not taking into account comments and ending spaces). The rule above is not affecting lines after the final directive `END`. A line of code is continuing in the next line if it is ending with one of character ',' '(' ')' or if the next line is starting from a quotation character (").
Возможность вызова функции в постфиксной форме для статических однопараметрических функций Вызов `Sin(x)` эквивалентен `x.Sin`. | Static function with a single parameter can be called always in a postfix form Calling in form `sin(x)` can be always replaced with `x.sin()`
Массивы всегда упоминаются с квадратными скобками: A[ ] Имеются только одномерные массивы. Массив может быть динамическим или фиксированным. Для фиксированного массива в качестве индексов может использоваться перечисление (как тип). | Arrays are always used together with its square brackets: A[ ] Only single dimension arrays are present. An array can be either dynamic or a fixed. For fixed arrays enumerations can be used as indexes (as data types).
Строка содержит только один оператор Символ ';' используется для завершения блочного оператора (`CASE`, `FOR`, `PUSH, DEBUG`). Символ '.' завершает функцию, перечисление, блок констант, список импорта. Символ завершения ';' или '.' должен быть последним таким же в строке (то есть два символа подряд '; ;' или '. .' не допускаются), но указание '; .' в одной строке возможно. Простой оператор не требует специального символа для завершения (и продолжается на другую строку символами '(', '[', ',' или в случае, когда следующая строка начинается двойной кавычкой). Любой простой оператор (кроме `BREAK`, `CONTINUE` или `STOP`) может быть завершён оператором выхода из функции '`==>`'. | A line of code contains only a single statement Symbol ';' is used to end a block statement (`CASE`, `FOR`, `PUSH`, `DEBUG`). Symbol '.' is ending a function, a enumeration, a constant block or an import list. Ending symbol ';' or '.' must be the last such symbol in a line (so, two semicolons are not possible but '; .' is allowed). Continuing a statement on the next line is allowed only if: the line is finished with '(', '[', ',' or the next line is started with '"' (double quotation). Any simple statement (except `BREAK`, `CONTINUE` or ) can have a statement '==>' attached (return from a function statement).
Ограничения на качество кода: Допускается не более трёх уровней вложения операторов `CASE` / `FOR`. Допускается не более 7 простых и 7 блочных операторов подряд в одном блоке, после чего требуется наличие комментария вида ------------------- 'комментарий' Допускается не более трёх явных параметров у функции (не считая неявного параметра-объекта класса `THIS`) В случае нарушения любого из приведённых правил, класс должен быть помечен маркером плохого кода (`BAD`). | Restrictions on a code quality: It is allowed not more then 3 nested levels of block statements `CASE` / `FOR`. It is allowed not more then 7 simple and 7 block statements in a single block, after that a block comment is required (--------- 'comment'). It is allowed not more then 3 explicit parameters of a function (without implicit `THIS` parameter). In case of abandoning any of rules listed above, a class must be marked with a bad code modifier (`BAD`).

#### В языке отсутствуют: | #### The language has lack of:
Препроцессор Нет макросов (взамен - константные функции). Есть повторное использование кода - оператор LIKE. Но он макросом с параметрами не является, не допускает вложенных вызовов и обращений за пределами класса. Нет условной компиляции (взамен - константные функции в условиях). Нет включения файлов. | Preprocessor There are no non-typed macros (though there is a LIKE statement, but it is restricted and can not be used nested or out of class bounds). There are no conditional compilations (constant functions in conditions instead). There are no file includes.
Указатели функций Взамен указателей функций, имеется механизм виртуальных методов. Функция в качестве параметра может быть передана только в шаблонную функцию. | Function pointers There are no function pointers. Use instead virtual methods. A function can be "passed" as a parameter only to a generic function.
Перегрузка функций В классе нет одноименных функций. При импорте одноименных статических функций из разных классов, следует использовать явное указание класса при вызове функции, в форме `{класс}.функция(параметры)`. | Overloading There are no same named functions in a module. While importing same named static functions and procedures it is required to specify explicitly a class where these are from: `{class}.function(parameters)`.
Перегрузка операторов Отсутствуют переопределяемые операторы. | Overloading operators There are no operators.
Массив как результат функции Функция может возвращать только скалярное значение. При необходимости возвратить массив, результат оформляется как параметр. | Array as a result of a function Function can return only a scalar value. If it is necessary to return an array, the result is passed is a parameter.
Шаблоны классов Нет шаблонов для классов наподобие `List<T>`. Списки и коллекции заменены динамическими массивами. Есть шаблонные статические функции, с ограничением на единственный тип параметра, и с возможностью задать статические параметры-функции (включая шаблонные). | Generic classes There are no generics for classes like `List<T>`. Lists and collections are stored in dynamic arrays. There are generic static functions, with a restriction to a single parametric data type, and with a capability to accept static function parameters (including generic functions).
Множественное наследование Класс может быть унаследован только от одного класса-предка. | Multiple inheritance Class can be inherited only from one ancestor class.
Оператор go to Нет оператора `GOTO`. Есть возможность продолжения или выхода из глубоко вложенного цикла (`CONTINUE` `x`, `BREAK x`). | go to statement There is no `GOTO` statements. It is possible to continue or break a loop from a deeply nested block (`NEXT x`, `BREAK x`).
Итераторы, задаваемые методом Нет возможности задавать произвольные итераторы. Есть итераторы элементов массивов FOR m IN M[]. | Iterators defined by methods It is not possible to define custom enumerators. There are array item enumerators FOR EACH m IN M[] DO
"Геттеры" и "сеттеры" с синтаксисом поля Поле или переменная не может иметь сеттер, обрабатывающий присваивание нового значения, или геттер, реализующий чтение из поля. Геттеры и сеттеры существуют, но их назначение - обеспечивать возможность переворачивания присваиваний (оператор REVERT). Чтение из поля - всегда является просто чтением значения из памяти. Запись в поле всегда лишь выполняет запись значения в память. | "Getters" and "setters" with variable-like access A field or a variable can not have a setter which handles assignment of new value, or setter which implements reading from value. There are getters and setters but its purpose is in providing with capability to use the statement REVERT. Reading a field always is simple reading a value from memory. Writing to a field always just is simple writing a value to memory.
Символьный тип данных Для представления символа используется строчная переменная или константа длиной 1 символ. | Character data type To represent characters, string variables and constants of length 1 are used.
Указание разрядности типов данных Разрядность простых типов данных не указывается. Она всегда одинакова для всех типов INT, REAL, STR, BOOL, и зависит от целевой платформы, компилятора и настроек проекта. | Precision specification for simple data type variables Precision is not specified. It is always same for embedded data types <int>, <real>, <str>, <bool>.
Неявные преобразования разнородных типов данных Нет неявных преобразований переменных, кроме преобразования целого в вещественное. Нет приведения типов данных. Все преобразования выполняются явным вызовом функций. | Implicit type conversions for distinct data types There are no implicit data type conversions except converting `INT` to `REAL`. There are no type casts.
Низкоуровневое программирование Роль ассемблера выполняют "кодовые" (native) функции языка, который является целевым для компилятора. Целевым может быть любой язык (например, С++, Objective C, Java, C#, Delphi, Python, Rubi, LUA, Shell, Algol, Fortran, Oberon, ...). Вся низкоуровневая поддержка делается на целевом языке, компилятору лишь указываются функции-переходники с атрибутом NATIVE. | Low-level programming Special NATIVE functions are used to implement wrappers between high level language (AL-IV) and a target language, to which source code is translated. Any programming language can be a target (e.g., C++, Objective C, Java, C#, Delphi, Python, Rubi, LUA, Shell, Algol, Fortran, Oberon, etc.). Entire low level support is written on a target language, and just a set of wrapper functions is specified with attribute NATIVE.
Исключения В программе практически невозможны исключения, связанные с неверной адресацией (благодаря использованию `NONE`-объектов, гарантированной инициализации переменных, проверкой выхода за границы массива). Во всех случаях, когда в обычных системах генерируется исключение, в AL/IV не выполняются никакие действия, и возвращается пустой результат (`NONE`). Соответственно, в AL/IV не требуется обработка исключений, и отсутствуют для этого средства. | Exceptions Exceptions due to an incorrect addressing are almost not possible (because of `NONE` objects, instant initializations of variables, checking arrays bounds). In most cases when in other environments an exception is generated, in AL/IV no actions are fired, and an empty result is returned (`NONE`). So, exception handling is not required, so exception handling is not provided.

$$INCLUDE:_I_Syntax.htm

$$INCLUDE:_II_Simple_data_types.htm

$$INCLUDE:_III_Classes.htm

$$INCLUDE:_IV_Records.htm

$$INCLUDE:_V_Tests.htm

$$INCLUDE:_VI_Additionally.htm

$$IF?LIGHTRU`` В начало $$IF?DARKRU`` В начало $$FI | $$IF?LIGHTEN`` Home $$IF?DARKEN`` Home $$FI

$$STOP!

$$DEF+FlagRU

$$END

$$DEF+FlagEN

$$END

$$IF?LIGHTRU

$$OUT=AL-IV_large_RU.htm

$$CONTENT:..\cont_AL-IV_large_RU.html

$$IF?DARKRU

$$OUT=AL-IV_large_RU_black.htm

$$CONTENT:..\cont_AL-IV_large_RU_black.html

$$IF?LIGHTEN

$$OUT=AL-IV_large_EN.htm

$$CONTENT:..\cont_AL-IV_large_EN.html

$$IF?DARKEN

$$OUT=AL-IV_large_EN_black.htm

$$CONTENT:..\cont_AL-IV_large_EN_black.html

$$FI