Разбор фитч языка AsmX
славянский зажим яйцамиЭта статья посвещенна разбору сообщения пользователя @UsesAsmX в беседе комментариев канала @FullStack_Dev_2.
![](/file/da6b777343c89db376644.png)
Все тесты выполнены на новейшей версии от 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.
Вторый файл содержит код, предлагающий замены инструкциям и регистрам, написанным с ошибкой. Однако сама нейросеть не работаспособна:
![](/file/97b1915d3d1c552e55a04.png)
![](/file/28bb34d00a6b27be91e1b.png)
![](/file/185a873c0d9fc6a422da8.png)
![](/file/2d22265e079f53d7302a8.png)
Внутри исходного кода neural.js никакой нейронной сети, кстати, не наблюдается, только два странных метода, связанных с фильтрацией массива. Ни вызова скрипта на питоне для отработки нейросети, ни, тем более, собственной нейро-библиотеки для javascript.
Оффтоп по нейросети:
Автор языка настаивает, что нейросеть там есть, однако на базовые вопросы в духе:
Какой токенайзер? Какие слои? Какая метрика была использована при обучении? Какие результаты на тренировочной и тестовой выборке?
Он не отвечает и удаляет мои сообщения без причины. Готов переписать данную секцию, если автор чётко укажет архитектуру нейросети и подтвердит её комментариями в коде.
![](/file/f6d970b3a1fa01ca49ce4.png)
![](/file/2cb15ec06bceebe64232a.png)
После таких заявлений и речи быть не может об удалении этого пункта.
2)OS
Имеется ввиду MiniOS, она же, AsmXOS, на момент написания статьи. Заглянем в исходный код, папка https://github.com/langprogramming-AsmX/AsmX/tree/main/etc/os/AsmXOS. В папке на данный момент 1 подпапка и два файла исходного кода на языке, внимание, Javascript! Мало того, что это не операционная система, а всего лишь консольное приложение, так ещё и не на великом низкоуровневом языке AsmX, а на обычном высокоуровневом Javascript. Дальнейшее разбирательство в функционале и работоспособности считаю бесполезным, так как сама суть этого кода, как операционной системы на языке AsmX не соблюдена.
3)Builder
Так как автор отказывается пояснять этот пункт:
![](/file/987da6682a3db1b459291.png)
Будем считать, что имелась ввиду система "сборки" micro. Первая проблема, с которой я столкнулся при тесте - пути, которые нужно указывать в команде сборки micro - абсолютные от корневой директории AsmX. В остальном ситема работает, только есть вопросы к её смыслу. Как таковой сборки AsmX в бинарный код я не увидел. Сборка под ARM - выдаёт ассемблер, который не возможно перевести в бинарный код:
![](/file/7041f88e0fa18075bb2e6.png)
Самому скомпилить ничего под ARM так и не удалось, "Бинарник" взят из примера самого автора. Как он скомпилирует что-то сложнее арифметики не зная, под какое ядро он компилирует - вопрос открытый. Настройки PLL - нет, настройки периферии - нет, регистры не существуют, отсутствуют запятые между аргументами.
![](/file/f61733039f663256b86b1.png)
Судя по всему AsmX - язык либо jit-компилируемый, либо интерпретируемый. Как это вяжется с низким уровнем и ассемблером - непонятно.
4)ООП
Как ООП связано с низким уровнем - вопрос хороший, но сейчас мы его отбросим и разберёмся с функционалом и работоспособностью ООП в AsmX. Начнём с основных принципов ООП:
4.1)Абстракция: какая абстракция? мы же в низкоуровневом языке. Но если серьёзно, это единственное, что правда работает. С объектами можо работать в отрыве от их реализации.
4.2)Полиморфизм:
4.2.1) Ad-Hoc полиморфизм - реализован только для функций(@tion), для методов классов - отсутствует.
![](/file/216d1f4c6ac6fc1cef5d3.png)
![](/file/6130b649f9ac39238de39.png)
Как видно по выводу, всегда используется первая реализация метода. Количество аргументов не проверяется в большую сторону, поэтому можно пистаь сколько угодно лишних - ошибки не будет.
4.2.2) Параметрический полиморфизм - присутствует, связан с динамической типизацией языка(Javascript, конечно, а не AsmX).
![](/file/44ff93d1c3fd0def70ba8.png)
![](/file/a435267f3605be18ce573.png)
Float проходит через Int аргумент без изменений. Прямой вывод численного аргумента выводит Void:
![](/file/df07c072b5f0d97a52cd5.png)
![](/file/f2f1a71b43edfd4e96134.png)
4.2.3) Полиморфизм подтипов - подтипы не работают, смотреть пнукт Наследование.
4.3)Наследование:
![](/file/53e1b376b64e5f0bd7524.png)
![](/file/80388d20359d953b33b00.png)
Пока всё работает так, как и должно.
![](/file/b5f186574ee41e69f0658.png)
![](/file/008c9a343ec894559a172.png)
И даже так работает! Неужели тут не кроется какой-то страшной ошибки? Добавим третий класс-наследник Abstract, но забудем добавить ему реализацию метода setName:
![](/file/0e91a30e4051b806c2030.png)
![](/file/75dee26447161dfbc8a56.png)
Реализация перешла от класса B к классу C? Странно. Давайте добавим реализацию классу C.
![](/file/2ecb5d1a123385a512e6f.png)
![](/file/491beb3ae7bcfa48b91d0.png)
Стоп. Так точно не должно быть. Может это проблема общего абстрактного класса? Разделим два класса полностью.
![](/file/002325a7b5bb31831b0c5.png)
![](/file/e0cd347e944a6a8f198bb.png)
Как видно, вне зависимости от резмещения методов используется первое определение в коде. Абстрактные методы - не работают, тип возвращаемого значения из метода игнорируется, типы аргументов часто игнорируются,количество аргументов - игнорируется, конструктор может быть внешний функцией и использоваться хоть всеми классамиодновременно. Проблемы в духе diamond inheritance игнорируются, проверить наличие механизма их обхода(виртуальное наследование, например) не представляется возможным из-за проблем одиночного наследования.
4.4) Инкапсуляция - отсутствует. Все переменные приватны, все методы публичны.
5)Формат expr - существует в любом языке внутри препроцессора кода, работает лучше авторского(смотерть пункт Другое). За примером далеко ходить не надо, C/C++ может производить любые математические операции с известными во время компиляции значениями(константами, результатами consteval функций, числами, константами препроцессора), авторский - принимает только числа, такой функционал заменяется калькулятором.
6)Server Log - логгер, обычный логгер.
![](/file/6c267ca298f4a9c797bd7.png)
Никакой отправки на какой-то сервер или чего-то несвойственного обычному логгеру я здесь не вижу.
7)Engine - даёт добавлять функции, написанный на Javascript в ассемблер. Думаю тут объяснять, в чём состоит проблема, не нужно
8 и 9)Детальный вывод ошибок
![](/file/f4a5857ad0fe0a403c541.png)
Иногда детальный, иногда трейсбек ядра(чаще).
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