Войти
ФлеймФорумПроЭкты

MPL (Programmiersprache) #self-hosting, #C++killer

Страницы: 1 2 3 4 5 6 Следующая »
#0
20:25, 15 июля 2020

Последние несколько лет я сижу в уютненьком стартапчике, мы тоже пилим убийцу С++.
Я собственно пилю компилятор.
Упоротый мет, нормальная рефлексия, все дела.
Язык постфиксный, это выглядит упорото, на самом деле потом привыкается.
Можно писать фортообразную фигню типа

plusOne: [dup 1 swap cast +];

но я рекомендую всё же

plusOne: [
  arg:;
  arg 1 arg cast +
];

Ещё постфиксность даёт возможность форварднуть неизвестное число аргументов в другую функцию. Ну и очень много возможностей создавать свои синтаксические конструкты.
В языке один цикл - loop, на его основе можно сделать уже свой times, while, repeat-until, for.

Скачать exe или ll:
https://github.com/Matway/mpl-c/releases/tag/200715

также понадобится скачать это: https://releases.llvm.org/download.html
и это: https://github.com/Matway/mpl-sl

пример проекта на языке: https://github.com/Matway/mpl-c
можно скачать репу, и собрать компилятор при помощи компилятора

Пример хеллоуворлда:

"control" use

{} 0 {} [
  "Hello, world!" print LF print
  0
] "main" exportFunction
mplc hello.mpl -I ../sl
clang mpl.ll
a

Ещё имеется плагин для Студии для синтаксической подсветки и шаблон проекта для Студии, там куча опций доступно из ГУИ, можно пошагово отлаживаться

#1
20:35, 15 июля 2020

ЯП для говнарей.

#2
20:36, 15 июля 2020

1 frag / 2 deaths
> Язык постфиксный
Потому что не смогли написать более продвинутый парсер?

#3
21:15, 15 июля 2020

1 frag / 2 deaths, не так интересен синтаксис, как вопрос управления памятью. Руками? ГЦ? Рефкаунтер? Вообще нет понятия кучи?

#4
21:22, 15 июля 2020

Delfigamer
> Потому что не смогли написать более продвинутый парсер?
Конечно. Парсер это же так сложно.

Dmitry_Milk
> как вопрос управления памятью
RAII. Как в крестах, только ещё и выкинуто много лишнего. Да, нельзя создавать слабые указатели в виде образующих связный список ссылающихся друг на друга сущностей, ну и хрен с ним. Зато вектор расширяется тупым реаллоком.

А так в стандартной либе открывешь Array.mpl и смотришь.

nes
> ЯП для говнарей.
То есть он уже обеспечен огромной целевой аудиторией? Было бы неплохо, но увы. Говнари любят языки с сишным синтаксисом.

#5
21:28, 15 июля 2020

Целых полвека продвигали компиляторное дело, учили их всё больше работы делать самостоятельно, без прямого участия человека - управлять временем жизни ресурсов, сверять контракт с контекстом, выдерживать инварианты - столько работы; а у кого-то до сих пор приходится за стеком вручную следить. Нафиг так жить вообще?

#6
21:30, 15 июля 2020

Delfigamer
Не боись, оно не скомпилится, если что-то не так.

#7
21:44, 15 июля 2020

1 frag / 2 deaths
Круто, что наконец то раскрыли проект.

> Пример хеллоуворлда
Мало что понятно. Есть какая-нибудь документация, вроде такой?

Скопировал репозиторий, посчитал количество линий исходного кода - как то мало вышло - всего 17 тысяч строк. Это что, язык такой простой? Или он очень лаконичный и поэтому исходники компилятора такие компактные?

dataReserve dataReserve 4 / + 4 +

Жуть какая. Чтобы такое понимать, надо наверное долго привыкать.
По какой причине была выбрана постфиксность?

#8
21:55, 15 июля 2020

Panzerschrek[CN]
> Мало что понятно.
Ну, на самом деле надо исходники курить последовательно, чтоб врубиться.

"control" use

"control" строковая константа
use - бильтин, ищет файл с таким именем подключает имена

{} 0 {} 

пустые фигурные скобки - это объект без полей
0 это Int32 0

[]

квадратными скобочками обозначаются блоки кода

"main" exportFunction

Завести функцию с таким именем, чтоб в коде была функция именно с таким именем, при этом бильтин принимает 5 параметров:
- Аргументы (в данном случае {} означает отсутствие аргументов)
- Возвращаемое значение (в данном случае 0 это Int32, важен только тип, тут может стоять вообще любая константа или даже не константа, вообще это ненаконичная запись, лучше сразу написать тут Int32)
- Особые параметры (в данном случае {} означает что их нет, но по хорошему надо вписать туда convention: cdecl; чтоб корректно слинковалось на х32)
- Тело (огорожено [])
- Имя (это main)

Внутри тела происходит следующее

 "Hello, world!" 

Кладём на виртуальный стек стороковую константу

print 

Вызываем библиотечную функцию, со стека снимается 1 аргумент, в данном случае это та самая строковая константа

LF

Это тоже строковая константа, состоит из перевода строки

0

Положить 0 на стек.
К концу блока на стеке одна сущность - она и будет возвращаемым значением.

Panzerschrek[CN]
> Есть какая-нибудь документация, вроде такой?
Нет.

Panzerschrek[CN]
> Скопировал репозиторий, посчитал количество линий исходного кода - как то мало
> вышло - всего 17 тысяч строк. Это что, язык такой простой? Или он очень
> лаконичный и поэтому исходники компилятора такие компактные?
Компилятор нереально сложный, полон нехерового матана, но у него на самом деле очень маленький набор базовых бильтинов, которые на самом деле позволяют на языке написать то, что в других - вшито жёстко. Парсер вообще состоит из 3 сущностей по сути - вложенные блоки вида [] () {} :;, константы и имена.
Очень многое зашито в стандартной библиотеке, ты посчитал строчки в sl?
Я правда в компиляторе использую очень мало модулей оттуда, только ascii, conventions, control, memory, Array, String, HashTable, Variant, Owner, кажись всё перечислил

#9
21:58, 15 июля 2020

Panzerschrek[CN]
> По какой причине была выбрана постфиксность?
Ну на самом деле так мет лучше пишется, не надо матефункциям особый синтаксис прописывать.
Например есть бильтин if
используется как

condition [ branch1] [branch2] if

но если вторая ветка не нужна, то можно написать

condition [ branch1] [] if

но вообще в библиотеке есть метафункция

when: [[] if];

и можно написать

condition [ branch1] when

Без постфиксности пришлось бы отдельно прописывать правила синтаксического разбора для слова when, либо мириться с записью типа when(condition, [branch1]) которая бы сразу выдавала инородность этой метафункции

#10
22:03, 15 июля 2020

Panzerschrek[CN]
Смотрю твою документацию и... чо-то даже проникся, мне почти нравится твой ЯП )

#11
22:10, 15 июля 2020

1 frag / 2 deaths
> очень маленький набор базовых бильтинов, которые на самом деле позволяют на
> языке написать то, что в других - вшито жёстко
Это не самый традиционный подход.

> Парсер вообще состоит из 3 сущностей по сути - вложенные блоки вида [] () {}
> :;, константы и имена
Сурово. А не сказывается ли такая бедность синтаксиса на читаемости?

> Без постфиксности пришлось бы отдельно прописывать правила синтаксического
> разбора для слова when
Вот это меня несколько напрягает. Я сторонник усложнения компилятора для дальнейшего упрощения жизни программиста. В случае с постфиксностью выглядит наоборот - усложняем жизнь программисту, зато упрощаем жизнь разработчику компилятора.

1 frag / 2 deaths
Что в языке MPL с типизацией? Какие есть классы типов? Есть ли наследование?
Что с порядконезависимостью оъявлений верхнего уровня? Есть она или нет?
Что с защитой от ошибок? Есть какой-нибудь контроль ссылок/borrow checker?

1 frag / 2 deaths
А почему есть код только self-hosted компилятора? Куда подевался код компилятора нулевого поколения? Код устарел? Его продолбали? Его стыдно показывать?

#12
22:13, 15 июля 2020

1 frag / 2 deaths
> condition [ branch1] [branch2] if

Типа блок кода - это тоже объект на стеке?

#13
22:21, 15 июля 2020

Panzerschrek[CN]
> Сурово. А не сказывается ли такая бедность синтаксиса на читаемости?
Да, сказывается. В строке кода бывает тяжело разобрать, что из этого - аргумент, а что - функция. Решается выработкой неких базовых принципов написания кода. Типа одна строчка - один вызов функции.

Panzerschrek[CN]
> В случае с постфиксностью выглядит наоборот - усложняем жизнь программисту,
> зато упрощаем жизнь разработчику компилятора.
Нет, юзеру разве что читать непривычнее. А вот разработчик огрёб по полной.
Парсер это 0.001%, я его написал чуть ли не за день ещё на компиляторе 0 поколения и с тех пор в нём ковыряться приходилось крайне редко.
А вот поддерживать правила задания синтаксиса - ну не знаааааю

Panzerschrek[CN]
> Что в языке MPL с типизацией?
Статика, никаких неявных преобразования, вся фигня.

Panzerschrek[CN]
> Какие есть классы типов?
Стандартный набор чисел (отличаются суффиксами), строки, структуры, ссылки, кодоблоки, реальные функции.

Panzerschrek[CN]
> Есть ли наследование?
Не-а. Можно делать аггрегацию. Можно применить упоротый мет и на основе одной структуры зафигачить другую с тем же набором полей и дополнительными.

Panzerschrek[CN]
> Что с порядконезависимостью оъявлений верхнего уровня? Есть она или нет?
Порядок важен. А можно пример?

Panzerschrek[CN]
> Что с защитой от ошибок? Есть какой-нибудь контроль ссылок/borrow checker?
Есть простенькая защита, работает только если точно известно, на что ссылается ссылка. Типа

[a: 0; b: a; b] call - тут компилятор распознает попытку вернуть ссылку на локалку. Для векторов и реаллокаций, увы, защиты нет, и пока неясно, как подступиться, потому что вектор сделан на языке и это просто указатель на фигню в куче.

Panzerschrek[CN]
> Куда подевался код компилятора нулевого поколения? Код устарел? Его продолбали?
> Его стыдно показывать?
Он полностью устарел.
Текущий компилятор далеко не 1го поколения. Я не считал, но он прошёл несколько сотен самосборок. И каждый раз я делал двойную сборку с побайтовым сравнением екзешника.

#14
22:22, 15 июля 2020

Dmitry_Milk
> Типа блок кода - это тоже объект на стеке?
Ну да.
Можно делать так

block: [ branch1 ];
condition @block [] if

В данном случае собачка нужна чтобы блокировать запуск кодоблока block, чтоб на стек положился сам блок а не результат его выполнения.

Страницы: 1 2 3 4 5 6 Следующая »
ФлеймФорумПроЭкты

Тема в архиве.