Объектно-ориентированный продвинутый векторный транслятор — язык программирования с поддержкой AVX-512
Тип | Языки программирования, генераторы кода |
Написан на | ПВТ-ОО, Lazarus IDE, flat assembler |
Операционные системы | Windows 8/10, WINE64 |
Системные требования | AVX, AVX2, AVX-512 |
Языки оболочки | Русский |
Первый выпуск | 8 сентября 2021 |
Последняя версия | 0.4.1 |
Дата последней версии | 19 августа 2024 |
Читаемые форматы данных | исходный код ПВТ-ОО .avt, папка проекта ПВТ-ОО |
Создаваемые форматы данных | исходный код fasm .asm, .inc |
Лицензия | GNU GPL 3, GNU LGPL 3 |
Объектно-ориентированный продвинутый векторный транслятор (сокращённо: ПВТ-ОО) — язык программирования высокого уровня с поддержкой объектно-ориентированного стиля, векторных типов данных и операций с использованием набора инструкций AVX-512. Поддерживает работу как с комплексными числами, кватернионами и октонионами, так и с произвольными векторными величинами длиной 2, 4 и 8 элементов. Работа с векторными типами данных реализована на уровне языковых конструкций и встроенных функций. Скалярные типы данных так же поддерживаются.
ПВТ-ОО является результатом дальнейшего развития своего предшественника. Компилятор ПВТ-ОО, как и свой предшественник, создаёт исходный код на языке flat assembler. Часть кода может быть написана непосредственно на ассемблере, в том числе и с использованием макросного движка flat assembler. ПВТ-ОО использует более простой синтаксис записи выражений, чем свой предшественник: из него удалены лишние операции, а названия векторных типов были унифицированы.
Вам так же понадобится flat assembler для компиляции сгенерированного исходного кода.
Важное замечание по версии 0.6: компилятор данной версии написан на самом себе и может долго компилировать проекты. Кроме того, обозреватель кода был удалён из данной версии. Это временное состояние проекта, однако оно было небходимо для разработки языка программирования. Следующая версия, если она выйдет, снова будет написана на Lazarus IDE.
Важно: компилятор находится на стадии альфа, что означает отсутствие некоторых возможностей, заложенных в концепцию языка программирования. Тем не менее, возможность создания исполняемых файлов имеется. Мы сейчас работаем над тем, чтобы данный компилятор стал пригоден для разработки приложений.
Загрузки
Загрузить Объектно-ориентированный продвинутый векторный транслятор версии 0.6 (загрузок: 0)
Загрузить Объектно-ориентированный продвинутый векторный транслятор версии 0.4.1 (загрузок: 6)
Что нового в последнем выпуске
Все изменения помещены в текстовый файл CHANGELOG
. Здесь перечислены только значимые изменения.
Компилятор:
- Добавлена поддержка библиотек классов и собственного формата
classpath
, используемого компилятором для чтения параметров компиляции проекта и поиска используемых проектом библиотек. Текстовый файл форматаclasspath
создаётся программистом в папке проекта и таких файлов в одном проекте может быть несколько, каждый из них может быть со своими настройками и используемыми библиотеками. - Добавлена поддержка генерации двоичного исходного кода библиотек и собственного формата
avtoo-recompilable
, используемого компилятором для хранения кода библиотек в двоичном виде с целью перекомпиляции его в исходный код на языке ассемблера. - В генератор кода добавлена оптимизация методов с телом определённого вида.
- Добавлен подсчёт количества элементов стака, которое может занять код метода в ходе выполнения.
- Реализована оптимизация инструкций перехода.
- Исправлены ошибки в лексическом анализаторе.
- Исправлена ошибка пустой папки, которая не позволяла проекту скомпилироваться, если в папке
src
илиsrc.avt
были пустые папки. - Исправлена ошибка наследования типов, из-за которой иногда не все типы, реализованные супертипами, становились супертипами текущего типа, если они не были явно указаны в исходном коде.
Язык программирования:
- Добавлена поддержка финализированных локальных переменных. Чтобы сделать локальную переменную финализированной, нужно написать ключевое слово
final
перед её типом. Если такая переменная имеет постоянное значение, то она станет локальной константой. - Добавлена поддержка расширения синтаксиса свойств. Теперь можно указывать любое допустимое выражение во всех спецификаторах:
index
,read
,write
иstored
. В последних трёх спецификаторах будет доступна неявная финализированная переменнаяindex
, если в свойстве был объявлен одноимённый спецификатор. В спецификатореwrite
теперь доступна неявная финализированная переменнаяvalue
, содержащая новое значение свойства. - Добавлена поддержка видимости пакетов. Теперь пакеты библиотек могут иметь три видимости:
private
(приватные пакеты, которые видны только текущей библиотеке),protected
(защищённые пакеты, которые видны текущей и другим библиотекам) иpublic
(открытые пакеты, которые видны всем типам проектов). Прямой доступ из исходного кода к невидимым пакетам (черезimport
и прямое использование пакетов и типов в исходном коде) невозможен, однако косвенный доступ (через рефлексию,Class.get("полное название типа")
иPackage.get("полное название пакета")
) возможен. - Видимость
private
пакета теперь используется, если не указано иное. - Добавлена возможность написания документации к пакетам.
- Добавлены обратные операторы – операторы, которые объявлены с суффиксом
`
и которые можно вызвать, поменяв аргументы местами. - Добавлены помощники – классы специального вида, которые позволяют программисту расширить функционал любого класса новыми методами, операторами, свойствами и статичными полями.
- Ключевые слова
class
иpackage
теперь можно использовать как выражения для быстрого получения объектных ссылок на текущий класс и текущий пакет соответственно. - Теперь можно быстро получить объектную ссылку на любой видимый пакет, написав полное название пакета и
.package
. - Добавлена поддержка ключевого слова
union
. Теперь в структурах можно объявлять поля в перекрывающихся областях памяти.
Среда исполнения:
- В связи с тем, что компилятор теперь поддерживает библиотеки классов, код среды исполнения теперь разделён на несколько библиотек, которые можно подключать к своему проекту.
- Изменения кода среды исполнения, связанные с поддержкой библиотек классов.
- Реализовано удаление из исполняемого модуля неиспользованных методов. Реализовано на уровне fasm через
if(used <название символа>) … end if
.
Что можно написать на ПВТ-ОО?
ПВТ-ОО является специализированным языком программирования: с его помощью можно создавать приложения произвольного формата, а в будущем планируется возможность написания ядер операционных систем.
На данный момент поддерживается возможность создания консольных приложений под ОС Windows. В будущем планируется поддержка большего количества операционных систем и возможности создания графических приложений.
Важно: ПВТ-ОО НЕ предназначен для создания динамически подключаемых библиотек и программ для устройств.
Примеры кода
Пример вывода текста на консоль:
Исходный код
/* Пример вывода текста на консоль */ package ru.malik.elaborarer.avtoo.examples.hello; import avtx.application.*; public class HelloApp(ConsoleApp) { public () { } public int main(String[] arguments) { System.out.println("Приветствую! Ваш процессор поддерживает AVX-512!"); return 0; } }
Вывод программы
Приветствую! Ваш процессор поддерживает AVX-512!
Пример поворота вектора вокруг оси:
Исходный код
/* Пример поворота вектора вокруг оси */ package ru.malik.elaborarer.avtoo.examples.rotation; import avt.io.*; import avtx.application.*; public class RotationApp(ConsoleApp, Math) { public () { } public int main(String[] arguments) { PrintStream output = System.out; double4 axis = new byte4 { 0, 1, 1, 1 }; output.print("Пусть у нас есть ось вращения a = "); output.print(axis); output.print(", которая имеет нормализованный вид: norm(a) = "); output.println(axis /= (double) abs(axis)); double4 vrot = rotq(PI * 2 / 3, axis); double4 vec1 = new byte4 { 0, 1, 0, 0 }; output.print("Повернём вектор v1 = "); output.print(vec1); output.print(" на 120 градусов вокруг a, получим вектор v2 = "); output.println(vrot * vec1 / vrot); double4 vec2 = new byte4 { 0, 0, 1, 0 }; output.print("Повернём вектор v2 = "); output.print(vec2); output.print(" на 120 градусов вокруг a, получим вектор v3 = "); output.println(vrot * vec2 / vrot); vrot = rotq(PI / 3, axis); output.print("Повернём вектор v1 = "); output.print(vec1); output.print(" на 60 градусов вокруг a, получим вектор v4 = "); output.println(vrot * vec1 / vrot); return 0; } } helper RotationAppVectorPrintStream: PrintStream { public void print(double4 vector) { printf("{ %0#1.3%, %1#1.3%, %2#1.3% }", new Object[] { new Double(vector[1]), new Double(vector[2]), new Double(vector[3]) }); } public void println(double4 vector) { printlnf("{ %0#1.3%, %1#1.3%, %2#1.3% }", new Object[] { new Double(vector[1]), new Double(vector[2]), new Double(vector[3]) }); } }
Вывод программы
Пусть у нас есть ось вращения a = { 1.0, 1.0, 1.0 }, которая имеет нормализованный вид: norm(a) = { 0.577, 0.577, 0.577 } Повернём вектор v1 = { 1.0, 0.0, 0.0 } на 120 градусов вокруг a, получим вектор v2 = { 0.0, 1.0, 0.0 } Повернём вектор v2 = { 0.0, 1.0, 0.0 } на 120 градусов вокруг a, получим вектор v3 = { 0.0, 0.0, 1.0 } Повернём вектор v1 = { 1.0, 0.0, 0.0 } на 60 градусов вокруг a, получим вектор v4 = { 0.667, 0.667, -0.333 }
Кроме того, последний пример показывает использование помощника, расширяющего функционал класса avt.io.PrintStream
, чтобы он мог выводить векторную часть кватерниона типа double4
. Оригинальный класс не имеет методов вывода векторных типов данных (см. исходный код).
Технические детали
Внутренне ПВТ-ОО состоит из консольного компилятора avtc.exe
и графического обозревателя кода avtb.exe
. (Обозреватель кода доступен в версии 0.4.1 и не совместим с версией 0.6.) Компилятор создаёт в заданной папке проекта папку dst
и помещает в неё исходный код на языке flat assembler. Обозреватель кода, как правило, используется во время написания исходного кода для поиска и просмотра классов, методов и других элементов объектно-ориентированной программы.