LINUX.ORG.RU

Qod. Опубликовал исходники компилятора, над которым работаю

 , qod, ,


3

5

Финально определился с названием языка, подчистил разные хвосты и написал README. Теперь наконец-то можно посмотреть на нечто большее, чем просто фрагменты кода в постах на форуме: https://github.com/wandrien/qod/

Драфты по дизайну языка пока еще не готовы. Если перед НГ завала работы не будет, то может выложу их в течение пары недель. Черновики пишу на русском, осилить всё чётко сформулировать на английском в разумные сроки я точно не смогу. На русском-то не всегда получается.

Надеюсь, что после публикации материалов по языку, мне щедро насыпят в панамку как конструктивной, так и не очень, критики.

А пока можно посмотреть на сам код вживую.

Ответ на: комментарий от wandrien

операторы чудесатые у тебя

1.while .. do end

2.if then else end

3.when .. :

  1. select … end

forever …

чем 2 3 4 отличаются? зачем forever? какие там еще операторы-то?

указатели, ссылки есть вообще?

как писать блоки типа сишных {…}?

alysnix ★★★
()

Если у тебя есть время и способности писать какие-то компиляторы, лучше бы приложил их к тому же SBCL, там очень много работы, причем довольно интересной.

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

lovesan ★★★
()
Ответ на: комментарий от alysnix

чем 2 3 4 отличаются?

when guard : statement

Строго один guard и один statement.

Рассматривай это как аналог when в Аде: exit when A;

Однако читать выражения в обратную сторону, начиная с условия в конце, я рассматриваю как плохую практику. Потому в Qod такая запись будет выглядеть так: when A: exit;

if then else end подразумевает, что может быть else, а также что statements может быть больше одного.

select подразумевает, что guards может быть больше одного.

зачем forever?

Для того, чтобы при закрытии блока ты видел, какой именно цикл закрывается.

указатели, ссылки есть вообще?

Есть. Хохлов синтаксически оформил указатели как ссылки, то есть с автоматическим dereference в выражении. Так что они одновременно и указатели, и ссылки. (Тоже в стиле Ады сделано.)

Это я планирую переделать, разбив на отдельные синтаксические формы: тип указателя будет а ля ^int, а тип ссылки а ля @int.

как писать блоки типа сишных {…}?

Никак. Си уже существует.

wandrien ★★
() автор топика
Последнее исправление: wandrien (всего исправлений: 1)
Ответ на: комментарий от lovesan

Ну смотри… Полезным я занимаюсь на работе. Вне работы я занимаюсь в основном тем, где за мной не будут бегать со списокм багов или требований к деадлайну.

wandrien ★★
() автор топика
Ответ на: комментарий от anonymous

Нет никакой особой литературы, кроме Dragon Book, SICP и прочих LiSP, но это книжки для студентов, где какие-то совсем уж поделки делаются.

Смотришь код реальных промышленных компиляторов и как там все сделано, мотаешь на ус. Можно также читать паперы по некоторым отдельным аспектам.

По конкретике рантаймов типа там GC, книжек уже больше, но все-равно, то же самое.

Это не та область где находится куча ушлых кабанчиков, нонстопом выпускающих макулатуру типа «javascript за 24 часа»

lovesan ★★★
()
Ответ на: комментарий от lovesan

Это не та область где находится куча ушлых кабанчиков, нонстопом выпускающих макулатуру типа «javascript за 24 часа»

А я дочитав до слова макулатура, вспомнил «Совершенный код». Помню, купил её когда-то, и даже почитал (не целиком), и даже цитировал в каких-то случаях. Но по сути - книга вода от «профессионального консультанта за всё хорошее».

wandrien ★★
() автор топика
Ответ на: комментарий от wandrien

в SBCL нет такого идиотизма.

Смотришь че интересно, поковырял, послал им патчи и дальше ковыряешь. Они очень дружелюбно относятся к тем кто помогает, потому что людей мало, т.к. технологии сверхсложные, и мало от кого можно ждать помощи.

lovesan ★★★
()
Ответ на: комментарий от lovesan

SBCL всем нужен

Зачем? Мне вот не нужен. Даже когда я писал на лиспах в универе, я пользовал CCL. Не помню почему уже.

в его поддержку мало кто может, т.к. сложно

Ну, то есть, он нужен явно недостаточно для того, чтобы набралось нужное для его поддержки количество людей. И уж тем более чтобы им за это деньги платили.

hateyoufeel ★★★★★
()
Последнее исправление: hateyoufeel (всего исправлений: 1)
Ответ на: комментарий от wandrien

как писать блоки типа сишных {…}?

Никак. Си уже существует.

Может он про такие (Ada - Block Statements) блоки? Типа local scope.

Dr64h ★★★
()
Последнее исправление: Dr64h (всего исправлений: 1)
Ответ на: комментарий от wandrien

Но пока из этого сделана только возможность обращаться с типом как со значением времени компиляции: https://github.com/wandrien/qod/blob/master/src/tests/typeof_0.qd

Закинул черновик на эту тему:

https://github.com/wandrien/qod/blob/master/drafts/comptime-and-runtime-expr.md

wandrien ★★
() автор топика
Ответ на: комментарий от xmikex

Б*%ский uCoz!

Может на веб-архив поставить ссылку? Не хотелось бы убрать совсем.

Вот по такой ссылке есть какая-нибудь хрень?

https://web.archive.org/web/20161209204032/http://www.avhohlov.narod.ru/

wandrien ★★
() автор топика

Немножко про детали реализации фронта.

Парсинг выражений с учётом приоритета операций выполняется унифицированным образом, вот так вот регистрируются обработчики операций по приоритету:

https://github.com/wandrien/qod/blob/7f49a53c9069b61bc138a6dcc014e256517ad7dd/src/frontend_syn_expr.qdi#L1371

При этом есть еще куча легаси-логики в функции Primary:

https://github.com/wandrien/qod/blob/7f49a53c9069b61bc138a6dcc014e256517ad7dd/src/frontend_syn_expr.qdi#L479

Когда-то эта функция имела совсем другой смысл (парсила ту часть грамматики, для которой Хохлов строил псевдо-деревья в обратной нотации).

Сейчас всё, что там относится к нетерминалам, должно быть постепенно перенесено в обработчик на коллбеках. В том числе парсинг штук вида имя.имя, имя[имя] и т.п. Primary должна отвечать только за терминалы, такие как литералы элементарных типов и идентификаторы.

wandrien ★★
() автор топика
Последнее исправление: wandrien (всего исправлений: 1)
Ответ на: комментарий от wandrien

Рассматривай это как аналог when в Аде: exit when A; Однако читать выражения в обратную сторону, начиная с условия в конце, я рассматриваю как плохую практику. Потому в Qod такая запись будет выглядеть так: when A: exit;

Ну и получается такой же if, только кастрированный. Зачем ещё одно ключевое слово? Идея хвостовых операторов в том, чтобы сместить акцент внимания на саму операцию. А если у тебя будет кудрявый предикат, а где-то далеко справа запрятан exit, то это нифига читаемость не улучшает.

anonymous
()
Ответ на: комментарий от anonymous

У меня идея вокруг материального воплощения синтаксических форм.. то есть собственно форм в прямом смысле… состоит в том, чтобы в как можно меньшем количестве случаев случайно ошибочный код выглядел и компилировался будто неошибочный:

if (a < b)
  x = 0;
  y = 0;
if (foo())
  if (a < b)
    x = 0;
else
  y = 0;
wandrien ★★
() автор топика
Последнее исправление: wandrien (всего исправлений: 1)
Ответ на: комментарий от anonymous

Идея хвостовых операторов в том, чтобы сместить акцент внимания на саму операцию. А если у тебя будет кудрявый предикат, а где-то далеко справа запрятан exit, то это нифига читаемость не улучшает.

Я пользовался хвостовыми условиями в Ruby. И сам писал код, и читал другими написанный код.

По итогу я пришел к выводу, что идея смещения акцента не работает. Она смещает акцент на то, что человек перестаёт внимательно читать условие.

wandrien ★★
() автор топика
Последнее исправление: wandrien (всего исправлений: 1)
Ответ на: комментарий от anonymous

А еще в дополнение к сказанному выше, хвостовые условия поднимают вопрос, а что мы вообще можем положить перед таким условием. Как насчёт такого? И как такое читать?

while i < size do
  // бла бла на 10 строк
  ...
  ...
  ...
end when !foo() & bar();

То есть левую часть придётся ограничить узким набором операторов. Например, только выходом из цикла.

Но как только мы это сделаем, сразу появятся те, кто спросит: а почему нельзя написать вот так?

x = ptr^.x when ptr != NULL;
wandrien ★★
() автор топика
Последнее исправление: wandrien (всего исправлений: 1)
Ответ на: комментарий от wandrien

А еще в дополнение к сказанному выше, хвостовые условия поднимают вопрос, а что мы вообще можем положить перед таким условием.

что вы там все сочиняете?

while (condition) do end; - это предусловие для охраняемого участка. то есть перед первым исполнением будет проверено условие.

do … while (condition); - это постусловие. оно не будет проверено перед первым исполнением. а бьудет проверяться после каждого исполнения

такие формы цикла нужны для записи кода парсинга грамматик удобным образом.

alysnix ★★★
()
Ответ на: комментарий от alysnix

вот эта фраза неверно совершенно. идея там в пред- и постусловиях.

Ты не в теме. Попробую на пальцах:

vadim@aquila:/tmp/1$ cat 1.rb 
a = 0
b = 1

while a < 10 do
	puts(a)
	a += 1
end if b != 1
vadim@aquila:/tmp/1$ ruby 1.rb 
vadim@aquila:/tmp/1$ 
wandrien ★★
() автор топика
Ответ на: комментарий от Dr64h

Может он про такие (Ada - Block Statements) блоки? Типа local scope.

я про блоки плюсовые {…} блоки, что не просто являются «областями видимости», а еще и играют ключевую роль в RAII.

alysnix ★★★
()
Ответ на: комментарий от wandrien

По итогу я пришел к выводу, что идея смещения акцента не работает. Она смещает акцент на то, что человек перестаёт внимательно читать условие.

А я с этим не спорю. Вводить дополнительное ключевое слово, вот что спорно. Допустим when на хвосте может и нормально (показать, что это не ветвление черезжопное). А так просто читатель будет спотыкаться об этот when, а писатель каждый раз чесать репу: тут when нужно или if. Это немножко уже perl way.

anonymous
()
Ответ на: комментарий от anonymous

А так просто читатель будет спотыкаться об этот when, а писатель каждый раз чесать репу: тут when нужно или if. Это немножко уже perl way.

when отлично работает в случаях, когда стоит проверка граничных условий, проверка контракта вызова и т.п.

if лучше работает, когда ветвление делается в рамках алгоритма по его существу.

Да, это чисто сахар на усмотрение программиста. Но так-то вообще и все варианты цикла - это сахар. В том же Си можно просто прыгать по метке, вот вам и любой цикл готов без сахара.

perl way это когда ~!@#кровь$%^кишки&*.{сотона,}[]" интерпретируется без синтаксических ошибок. Немножко про другое)

wandrien ★★
() автор топика
Ответ на: комментарий от wandrien

чтобы в как можно меньшем количестве случаев случайно ошибочный код выглядел и компилировался будто неошибочный

Ну это сишный рак, который решается обязательными скобочками для блока. Но у тебя не скобочки, так что приходится ключевые слова изобретать. Подумай об этом.

anonymous
()