Разбор фитч языка AsmX
славянский зажим яйцамиЭта статья посвещенна разбору сообщения пользователя @UsesAsmX в беседе комментариев канала @FullStack_Dev_2.
Все тесты выполнены на новейшей версии от 16 августа 2023 года, 20.00
1) NeuralAI:
Честно, так и не понял, велась ли речь о файле https://github.com/langprogramming-AsmX/AsmX/blob/main/libs/ml.asmX или же о "Нейросети", лежащей в https://github.com/langprogramming-AsmX/AsmX/blob/main/tools/neural.js.
Первый файл содержит одну функцию, смысл которой в вычислении формулы k*x+b.
Вторый файл содержит код, предлагающий замены инструкциям и регистрам, написанным с ошибкой. Однако сама нейросеть не работаспособна:
Внутри исходного кода neural.js никакой нейронной сети, кстати, не наблюдается, только два странных метода, связанных с фильтрацией массива. Ни вызова скрипта на питоне для отработки нейросети, ни, тем более, собственной нейро-библиотеки для javascript.
Оффтоп по нейросети:
Автор языка настаивает, что нейросеть там есть, однако на базовые вопросы в духе:
Какой токенайзер? Какие слои? Какая метрика была использована при обучении? Какие результаты на тренировочной и тестовой выборке?
Он не отвечает и удаляет мои сообщения без причины. Готов переписать данную секцию, если автор чётко укажет архитектуру нейросети и подтвердит её комментариями в коде.
После таких заявлений и речи быть не может об удалении этого пункта.
2)OS
Имеется ввиду MiniOS, она же, AsmXOS, на момент написания статьи. Заглянем в исходный код, папка https://github.com/langprogramming-AsmX/AsmX/tree/main/etc/os/AsmXOS. В папке на данный момент 1 подпапка и два файла исходного кода на языке, внимание, Javascript! Мало того, что это не операционная система, а всего лишь консольное приложение, так ещё и не на великом низкоуровневом языке AsmX, а на обычном высокоуровневом Javascript. Дальнейшее разбирательство в функционале и работоспособности считаю бесполезным, так как сама суть этого кода, как операционной системы на языке AsmX не соблюдена.
3)Builder
Так как автор отказывается пояснять этот пункт:
Будем считать, что имелась ввиду система "сборки" micro. Первая проблема, с которой я столкнулся при тесте - пути, которые нужно указывать в команде сборки micro - абсолютные от корневой директории AsmX. В остальном ситема работает, только есть вопросы к её смыслу. Как таковой сборки AsmX в бинарный код я не увидел. Сборка под ARM - выдаёт ассемблер, который не возможно перевести в бинарный код:
Самому скомпилить ничего под ARM так и не удалось, "Бинарник" взят из примера самого автора. Как он скомпилирует что-то сложнее арифметики не зная, под какое ядро он компилирует - вопрос открытый. Настройки PLL - нет, настройки периферии - нет, регистры не существуют, отсутствуют запятые между аргументами.
Судя по всему AsmX - язык либо jit-компилируемый, либо интерпретируемый. Как это вяжется с низким уровнем и ассемблером - непонятно.
4)ООП
Как ООП связано с низким уровнем - вопрос хороший, но сейчас мы его отбросим и разберёмся с функционалом и работоспособностью ООП в AsmX. Начнём с основных принципов ООП:
4.1)Абстракция: какая абстракция? мы же в низкоуровневом языке. Но если серьёзно, это единственное, что правда работает. С объектами можо работать в отрыве от их реализации.
4.2)Полиморфизм:
4.2.1) Ad-Hoc полиморфизм - реализован только для функций(@tion), для методов классов - отсутствует.
Как видно по выводу, всегда используется первая реализация метода. Количество аргументов не проверяется в большую сторону, поэтому можно пистаь сколько угодно лишних - ошибки не будет.
4.2.2) Параметрический полиморфизм - присутствует, связан с динамической типизацией языка(Javascript, конечно, а не AsmX).
Float проходит через Int аргумент без изменений. Прямой вывод численного аргумента выводит Void:
4.2.3) Полиморфизм подтипов - подтипы не работают, смотреть пнукт Наследование.
4.3)Наследование:
Пока всё работает так, как и должно.
И даже так работает! Неужели тут не кроется какой-то страшной ошибки? Добавим третий класс-наследник Abstract, но забудем добавить ему реализацию метода setName:
Реализация перешла от класса B к классу C? Странно. Давайте добавим реализацию классу C.
Стоп. Так точно не должно быть. Может это проблема общего абстрактного класса? Разделим два класса полностью.
Как видно, вне зависимости от резмещения методов используется первое определение в коде. Абстрактные методы - не работают, тип возвращаемого значения из метода игнорируется, типы аргументов часто игнорируются,количество аргументов - игнорируется, конструктор может быть внешний функцией и использоваться хоть всеми классамиодновременно. Проблемы в духе diamond inheritance игнорируются, проверить наличие механизма их обхода(виртуальное наследование, например) не представляется возможным из-за проблем одиночного наследования.
4.4) Инкапсуляция - отсутствует. Все переменные приватны, все методы публичны.
5)Формат expr - существует в любом языке внутри препроцессора кода, работает лучше авторского(смотерть пункт Другое). За примером далеко ходить не надо, C/C++ может производить любые математические операции с известными во время компиляции значениями(константами, результатами consteval функций, числами, константами препроцессора), авторский - принимает только числа, такой функционал заменяется калькулятором.
6)Server Log - логгер, обычный логгер.
Никакой отправки на какой-то сервер или чего-то несвойственного обычному логгеру я здесь не вижу.
7)Engine - даёт добавлять функции, написанный на Javascript в ассемблер. Думаю тут объяснять, в чём состоит проблема, не нужно
8 и 9)Детальный вывод ошибок
Иногда детальный, иногда трейсбек ядра(чаще).
10)удачного исправления по трейсбеку кернела
11)Низкоуровневость
Управления памятью нет, указателей нет, микрооптимизации нет, многопоточности нет, доступа к физическим регистрам нет, доступа к кэше нет, работы вне среды js нет. Зато есть: ООП, типизация, динамическая типизация, возможность вставлять javascript в код, относительные адреса в условных переходах, свои регистры, свои прерывания.
Исчерпывающий комментарий @MrMiscipitlick, по поводу возможностей, необходимых языку низкого уровня:
"1. Прямая работа с памятью, включая память, отведенную под саму программу.
2. Арифметика указателей
3. Прямая и свободная работа со стеком.
4. Прямой доступ к регистрам процессора.
5. Прямой доступ к инструкциям процессора.
6. Возможность писать так, чтобы отличие исходного кода от исполняемого байт-кода было минимальным, т.е. возможность писать с минимальным уровнем абстракции - собственно словесным описанием мнемоник или и вовсе без них, чистыми опкодами"
Ничего из этого не представлено в AsmX.
Другое:
В expr не работает унарный минус.
При делении на ноль внутри expr выдаётся ошибка о невозможности записать значение Infinity в тип Int/Float, а не ошибка Division by zero. С типом Auto ошибка не возникает, как и при @div 1, 0.
@Issue true - deprecated. До сих пор предлагают включить в сообщениях компилятора.
В Int можно записать дробные числа. В Float нельзя записать целое число.
Вывод - большинство озвученных фитч не работоспособны/не низкоуровневые/не уникальные, а автор языка не понимает,что такое язык низкого уровня.
Post Scriptum:
C++:
1) На нём сделаны мейнстрим нейролибы tensorflow и pytorch
2) Его предшественник, C - основной язык ядра линукса
3) Cmake
4) Одно Template Metaprogramming чего стоить
5) Всё - expr
6) spdlog - отличный логгер
7) Библиотеки на его бэкенд языке(C/Asm) поддерживаются, благодаря ABI можно писать проект на нескольких языках одновременно.
8-10) Идеальный дебаггер gdb
11) Намного ниже AsmX