Комментарии 67
Не хватает описания того, зачем собственно он вообще нужен ещё один такой.
Язык создан в основном в академических целях.
Но вообще, т.к. он встраиваемый, то применение ему найти думаю можно :)
Пока что можно сказать, что это отечественный аналог Python'а, который можно встроить в какой-нибудь софт.
Надо сначала на ассемблере написать компилятор С, потом на этом С написать ВМ для Mash-а, вот тогда это будет полное ипортозамещение. Кстати, я не шучу, такое в области каких-нибудь госзаказов вполне прокатить сможет.
Не помню где, для бутстрапа написали крохотный компилятор C на scheme, и крохотный интерпретатор scheme на C.
Вы, наверное, про Mes, про который недавно писали ребята из Guix: https://guix.gnu.org/blog/2019/guix-reduces-bootstrap-seed-by-50/
Думаю, главное — это навыки, получаемые автором в процессе работы. Да, может язык и не нужен никому. А вот люди, понимающие, как эта кухня работает изнутри — нужны, причем запредельно нужны.
Это сложные вещи, важные навыки и опыт, которыми может похвастать далеко не каждый "я уже 15 лет в разработках".
Так что пускай автор дерзает, вреда от этого никому точно не будет.
Где они нужны прямо вот запредельно? Где-то нехватка разработчиков компиляторов?
Ну так-то почти во всех языковых платформах нехватка разработчиков. А во всех остальных областях нехватка разработчиков, способных понять, о чём думали разработчики платформы.
Нехватка разработчиков в платформах (языках, стандартных библиотеках, среде исполнения), на мой взгляд, в основном из-за того, что среды разработки быстро обрастают грузом наследия и каждая следующая фича пилится сложнее предыдущих. С этой точки зрения, "академические" или "бесполезные" языки как раз и являются единственным местом, где можно проверить подходы, которые лет через Nдцать дойдут до мейнстрима.
Для работы с битовыми операциями или же с байтами по-отдельности предусмотрены языковые операторы и ряд классов по типу stream, в будущем этот функционал языка будет расширен.
Т.к. Mash с динамической типизацией и относительно других современных языков производительностью не выделяется, то писать какие-либо низкоуровневые вещи, кодеки и т.п. требующие производительности разумно на нативных языках и в дальнейшем возможно использовать это все из Mash, если это необходимо.
Ну а так, в Mash будет все это поддерживаться на уровне "работает медленно, но корректно".
:)
Так а размер-то какой в итоге? Да и вообще семантика всего этого дела
null
unsigned int — 4 байта (для счетчиков)
int — 8 байт
double — 8 байт (5.0E-324… 1.7E308, значащих цифр: 15-16)
string — динамическая длина, 1 символ = 1 байт
array — массив указателей, длина фиксированная, размер зависит от разрядности ос, но её можно изменять через SetLen()
Хабы: Высокая производительность
Так производительность какая? Высокая? А где замеры?
Что за бинари в репозитории и почему они не в releases собственных репозиториев?
Где тесты или хотя бы примеры? Хотя бы код той же змейки. Есть подозрение, что те же явные указатели скрывают некоторые проблемы с памятью.
Что с перегрузкой операторов?
Что с деструкторами?
Что с обработкой ошибок?
Есть API для запуска нативного кода, но снова где примеры (нашел только в pdf пример на паскале, что называется "без пруфов" что работает)?
Есть код, но где инструкция по сборке?
Зовется высокопроизводительным, но где бенчмарки?
Проекты обычно принято разбивать на несколько файлов — как организовано взаимодействие таких code units? Или пока только все в один файл?
за whilst палец вверх
за whilst палец вверх
Безусловно цикл с whilst пишется короче на целую строчку чем repeat...until, но зато repeat...until гораздо нагляднее показывает что делается на самом деле и
Но всё равно end без begin выглядит странно. Конец блока end, начало :?
?= — это присваивание (чем плохо паскалевское :=? ), или что-то непривычное? Оба варианта плохие, набираются в 3 нажатия. Почему не питоновское =?
Язык как язык, выучить можно.
может я плохо доку читал, но я думал while и whilst синонимы
2. В репозитории полно примеров кода, bin/win64/test, примеры также включены в архив с пре-релизной сборкой.
3. Перегрузка операторов ещё не отлажена, будет добавлена в язык позже. Это второстепенная задача пока что.
4. Деструкторы в языке отсутствуют, т.к. есть сборщик мусора. Освободить память от того же экземпляра класса можно присвоив переменной с указателем на него — null.
5. Язык поддерживает конструкции try/catch/finally/raise, выравнивание стека при исключении, обратную трассировку исключений и в целом исключения довольно хорошо проработаны в Mash.
6. Ну опять же по API. Откройте любой пример, вы можете увидеть там println(). ВМ по умолчанию не поддерживает ни одной лишней функции, даже такой простой как вывод чего-либо в консоль. Весь функционал, расширяющий ВМ лежит в виде модулей в папке lib рядом с ней, либо должен лежать рядом с проектом (если требуется распространять потом mash приложение + свою библиотеку).
Исходники библиотек можно глянуть в ветке /runtime/libs/
7. Инструкция по сборке? Проект написан без зависимостей, .lpi файлы идут вместе с исходниками. Можно скачать Lazarus и собрать все за 5 минут. Ну а вообще для FPC процесс сборки выглядит очень даже просто, достаточно пары команд в консоль послать :)
8. Я не упоминал вроде, что язык высокопроизводительный. Без JIT'a он все ещё остается интерпретируемым, хоть и через стековую ВМ. Производительность языка пока что на уровне старых версий Python'а.
9. В языке можно разбивать проекты на кучу файлов, есть оператор uses. В этом плане все супер :)
Спасибо за вопросы :)
7. Инструкция по сборке? Проект написан без зависимостей, .lpi файлы идут вместе с исходниками. Можно скачать Lazarus и собрать все за 5 минут. Ну а вообще для FPC процесс сборки выглядит очень даже просто, достаточно пары команд в консоль послать :)
Это IMHO из той же серии, что «Проект написан без зависимостей, сначала покупаете себе компьютер, после устанавливаете на него Windows, Linux или любую свою любимую OS, под которую есть Free Pascal. А дальше .lpi файлы идут вместе с исходниками, собираешь и всё работает! Что? Как конкретно собирать, какие директивы давать fpc, что куда класть и прочее? Позвольте, это язык Mash, а как собирать при помощи fpc и его оболочки Lazarus читайте на соответствующих сайтах! Или смотри рисунок номер 1
Если вам сложно собрать проект без зависимостей, путем нажатия 2-3 кнопок в ide, то в таком случае придется подождать до релиза :)
Там же есть исполняемые файлы :-) Правда только под Windows. Поэтому я тоже не смог посмотреть Mash в действии.
Под wine Mash IDE не пошло, позволило создать простейший hello.mash:
uses <crt>
proc main():
println(“Hello world!”)
end
но при попытке его откомпилировать выдало штук 10 абсолютно пустых окон «Error» без какого-либо содержимого в них и зависло. Выручил pkill на процесс wine.
Вызов:
./mashc.exe hello.mash hello.out
создал мне hello.out с набором команд какого-то судя по всему внутреннего ассемблера:
[...]
word vtable__methodname 41
word vtable__methodaddr 42
@global.arg_counter
@global.this
@global.temp
word global.zero 0
word global.one 1
str global.raised "ERaisedException"
pushc global.zero
peek global.arg_counter
pop
[...]
Попробовал напустить на него:
./asm.exe console hello.out hello
в результате создался бинарник hello, но что с ним делать дальше ума не приложу, svmc без параметров просто выводит:
./svmc.exe
MASH!
Stack-based virtual machine.
Version: 0.2
Using: svmc.exe <svmexe file> [args]
а будучи запущен с параметром, с этим самым hello:
./svmc.exe hello
вообще ничего не делает, просто запускается, ничего не пишет и вываливается обратно в терминал.
- Деструкторы в языке отсутствуют, т.к. есть сборщик мусора. Освободить память от того же экземпляра класса можно присвоив переменной с указателем на него — null.
так есть же всякие рутины типа закрытия файла/коннекта/стрима перед тем как он больше ненужен, как это разруливается?
- Я не упоминал вроде, что язык высокопроизводительный.
Hubs: High perfomance
- В языке можно разбивать проекты на кучу файлов, есть оператор uses. В этом плане все супер :)
как-то у вас этот момент и в статье и в доке упущен.
ну и финалочка — когда планируете язык self-hosting сделать?
Для закрытия стримов/сокетов и т.п. объявлены методы close(), т.е. после вызова поток закрыт, но все ещё находится в памяти ВМ, ждет своего часа, когда GC освободит память :)
Ну, хаб о высокой производительности, просто потому что можно выбрать 5 хабов :)
self-hosting уже делал, есть версия транслятора для Mash, написанная на Mash'e.
Но у неё есть один недостаток — время компиляции через неё кода на Mash. Одинаковый код компилятор на FPC и на Mash'е могут собирать 0,0001 сек. и 6-7 сек. соответственно.
Пока занимался разработкой, понял почему эта сфера деятельности у разработчиков не очень популярна :)
Проект начал своё развитие в 2018-м и сейчас до сих пор он все ещё не завершенный :)
Возможно как доучусь до 4-го курса, то получится оформить все как конечную готовую работу.
PS Когда вижу uses crt; жду, что вот-вот появится clrscr; )
Каждый уважающий себя программист обязан написать свой язык программирования :).
Можно посмотреть мой проект 32-битного компилятора Delavar: http://dc32.ml. Этот проект не так амбициозен и так и не был доведен до конца. Есть англо- и русскоязычный синтаксис. Есть поддержка ООП. Есть версия для Windows и Linux. Есть простенькая IDE, написанная на Делаваре (с подсветкой синтаксиса).
А можно как-нибудь посмотреть на AST? Вот буквально, как оно выглядит. Дамп какой-нибудь, или типа того?
Код я видел, мне бы на дамп поглядеть, хотя бы для самых простых случаев. Ну вот хотя бы как proc main
из самого первого примера выглядит в AST?
Это не совсем праздный интерес, если есть такая возможность — хоть сюда комментарием можете выплеснуть?
В компиляторе каждая нода AST представляет собой класс (под каждый языковой блок — отдельный) + интерфейс базовой ноды.
Ноды, содержащие блоки кода, т.е. ноды class, enum, method, for, while и т.д. содержат массив, в который в процессе разбора кода закидываются по порядку ноды, входящие в блок кода.
Полное AST даже простого кода, который приведен в начале статьи выглядело бы очень громоздким, чтобы его тут постить, т.к. для того чтобы собрать этот код нужно также включить в сборку ряд файлов с базовыми классами & методами, благодаря которым все работает (например поддержка некоторых операторов языковых, инициализация выполнения кода, частичное управление памятью, обработка и traceback исключений, реализованы полностью на Mash'е, см. /bin/win64/inc/sys/*)
содержат массив
Ох. А править-то его как? Тут поля слишком узкие, чтобы полностью аргументировать мою точку зрения (вот тут можно про нее почитать по-английски), но AST обязан иметь языконезависимое представление, если вы рассчитываете на взлет языка. Я мог бы попробрвать запустить его, скажем, в виртуальной машине эрланга, если бы AST выражался по-человечески, а не паскалевскими классами.
Кроме того, когда вы доберетесь до макросов, а вы рано или поздно до них доберетесь, без easy traversable AST ничего внятного сделать не удастся.
Смутил скриншот со стектрейсом – почему исключение «floating point division by zero»? С одной стороны, деление float на 0 определено и даёт infinity, а с другой, все числа в коде целые.
Язык программирования Mash