LINUX.ORG.RU

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

 , qod, ,


4

4

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

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

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

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

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

Чем, парой дополнительных ключевых слов?

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

это и есть разработка синтаксиса. синтаксис это лицо языка. с кондачка такое не делается.

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

Вы еще забыли о целом классе ключевых слов, относящихся к встроенным в язык операциям.

Вы не можете перегрузить или локально переобъявить sizeof.

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

это и есть разработка синтаксиса. синтаксис это лицо языка. с кондачка такое не делается.

Именно. Поэтому разработка и идёт итеративно. Идеи проверяются на материале самого компилятора, и не работающие идеи - отбрасываются.

Спор вокруг when здесь в комментах это спор не пробовавших сыр о вкусе сыра.

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

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

Бездумно не надо, но и максимальная общность — ложная посылка. Так дойдём до того, что кроме «ленты», операций записи/чтения и правил перехода ничего больше не нужно. Все языки отменить, оставить один лишь bf.

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

но и максимальная общность — ложная посылка.

если по операторам, разумеется надо иметь ввиду принципы структурного программирования.

https://ru.wikipedia.org/wiki/%D0%A1%D1%82%D1%80%D1%83%D0%BA%D1%82%D1%83%D1%80%D0%BD%D0%BE%D0%B5_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5

по сути - вот:

    Любая программа, заданная в виде блок-схемы, может быть представлена с помощью трёх управляющих структур:

        последовательность — обозначается: f THEN g,
        ветвление — обозначается: IF p THEN f ELSE g,
        цикл — обозначается: WHILE p DO f,

    где f, g — блок-схемы с одним входом и одним выходом,

        р — условие,
        THEN, IF, ELSE, WHILE, DO — ключевые слова[14].

    Пояснение. Формула f THEN g означает следующее: сначала выполняется программа f, затем выполняется программа g.

и не надо изобретать тыщи вариантов трех базовых конструкций.

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

Спор вокруг when здесь в комментах это спор не пробовавших сыр о вкусе сыра.

Лично у меня вызвало удивление то, что when стал предметом спора. То, что синтаксис немного сыроват и нуждается в правках и уточнениях — да, но это нормальный процесс.
Но чтобы when? Особенно «хорош» аргумент, что это сокращает свободу программиста в выборе имен переменных. Удивительное рядом.

Выполнение операции с предикатом — совершенно логичная, удобная и естественная операция, и вовсе не тождественна if. То, что её обычно реализуют через if — ничего хорошего в этом нет.

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

Лично у меня вызвало удивление то, что when стал предметом спора.

Да. Аналогично.

Особенно на фоне намного более спорного select case case case вместо привычного if elif elif elif

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

структурное программирование

https://ru.wikipedia.org/wiki/Структурное_программирование#Двумерное_структурное_программирование

Даешь 3-мерное или даже 4-мерное (пространство и время)

А то застряли на одномерных строчках.

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

То, что её обычно реализуют через if — ничего хорошего в этом нет.

так классический if и есть операция с предикатом с необязательным else. это потом его расширили на форму if elsif elsif else… что есть просто синт. сахар к классической.

то есть в си, у которого классическая форма (см вики) if - как раз и реализует ваш when, как частный случай.

просто вандриен, будучи увлечен if elsif…end, изобрел when, как вариант классики, дабы иметь возможность краткой записи.

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

А операция умножения — частный случай операции сложения, которая, в свою очередь, частный случай операции succ. Так до мышей машины Тьюринга и дойдём.

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

Особенно на фоне намного более спорного select case case case вместо привычного if elif elif elif

я ж сию конструкцию уже упоминал стопицот раз примерно, и так не понял зачем она вообще, если есть if elif

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

в твоем брейнфаке «try catch» будет?

Знать базу надо. Любая тьюринг-полная система эквивалентна любой другой тьюринг-полной системе.

try catch

Синтаксический сахар же, ненужно.

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

Выполнение операции с предикатом — совершенно логичная, удобная и естественная операция, и вовсе не тождественна if. То, что её обычно реализуют через if — ничего хорошего в этом нет.

удобная и естественная. но еще удобней и естественней форма в которой и на невыполнение предиката есть вариант исполнения. то есть классический if.

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

Это Хохлов придумал. Я попробовал, понравилось.

Некросивое, несимметричное:

if foo() then
  x = 0;
elif bar() then
  x = y + 1;
elif baz() then
  x = y - 1;
end

Кросивое, симметричное:

select
case foo():
  x = 0;
case bar():
  x = y + 1;
case baz():
  x = y - 1;
end
wandrien ★★★
() автор топика
Ответ на: комментарий от wandrien

просто убери then. это давно уж в пытоне сделали. и будет

if foo():  x = 0;
elif bar(): x = y + 1;
elif baz():  x = y - 1;
end

убери все эти do, of, then.. короче если блок можно открыть через : - то это и использовать

struct A :
  int _x;
end
alysnix ★★★
()
Последнее исправление: alysnix (всего исправлений: 3)
Ответ на: комментарий от alysnix

но еще удобней и естественней форма в которой и на невыполнение предиката есть вариант исполнения. то есть классический if.

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

Что же так от when корежит? Не пойму. Ну а хотя бы assert идиосинкразию не вызывает?

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

А при чем тут then, если речь про разницу if/elif. Ты совсем не схватываешь на лету.

Для локальности изменений в гит select лучше:

-if foo() then
+if foo2() then
+  stop();
+elif foo() then
   x = 0;
 elif bar() then

vs

 select
+case foo2():
+  stop();
 case foo():
   x = 0;
wandrien ★★★
() автор топика
Ответ на: комментарий от wandrien

Для локальности изменений в гит select лучше:

причем тут гит? они идут пакетом у тебя???…

зы: слушь, гит без тебя разберется со своими локальностями, мамой клянусь.

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

Ты совсем не схватываешь на лету.

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

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

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

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

и это задача гита - компактифицировать данные или изобретать эффективные внутренние представления.

Ты опять не схватываешь.

Речь шла про:

  • Конфликты при слияниях.
  • Удобство чтения диффов.

Как там гит хранит данные, по барабану чуть больше, чем всем.

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

для себя часто использовал

Да, тоже так иногда пишу.

А если приходится генерировать ветки препроцессором на сях, то это вообще единственный вариант.

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

это ты не схватываешь - а если у тебя гит заберут, половина языка на вынос, в мусорном мешке?

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

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

убери все эти do, of, then.. короче если блок можно открыть через : - то это и использовать

Точняк. Если можно писать в машкодах, то это и использовать.

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

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

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

Я дико веселюсь с этого обсуждения.

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

При чём отдельно еще забавно вот что.

Я мимоходом упомянул, что синтаксис select лучше подходит для локализации изменений в патчах. Собеседник на это пишет: «ты реально считаешь, что язык должен быть заточен под левую тулзу».

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

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

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

«зачем ты перенес строку! появились же две измененные строки! теперь невозможно сделать мердж! это невозможно уже читать! верни все на место!» - это у вас так в конторе работают? мама дорогая…

зы: полжизни мерджили и диффы смотрели вообще не обращая внимания на эту чепуху. а это оказывается настолько принципиально, что даже в язык должно быть введено.

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

Диалог какой-то такой:

- Зачем Б, если есть А.
- Б выглядит симметричнее, а еще имеет вот такое практическое преимущество.
- *возмущательные возгласы*

Реально, я вот чо-то перечитал ветку, и мне стало интересно.

На вопрос о том, чем хорош select, я ответил. Собеседник топит за elif. А аргументы какие-то были за elif? Получается, что ведь не было.

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

Я мимоходом упомянул, что синтаксис select лучше подходит для локализации изменений в патчах.

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

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

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

Я настаиваю, что чего? Ты снова не схватываешь, похоже.

«зачем ты перенес строку! появились же две измененные строки! теперь невозможно сделать мердж! это невозможно уже читать! верни все на место!» - это у вас так в конторе работают? мама дорогая…

Может, глицина?

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

лучше скажи, зачем тебе повышенная «локальность патчей». там кто-то тебя нелокально все время патчит, жить мешает?

может на государственном или мировом уровне встал вопрос о нелокальности патчей? откуда это все взялось хоть?

в чем причина затруднений и каков масштаб ущерба в долларах от «нелокальных патчей»?

я столько грибов не ем, чтобы врубиться.

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

А аргументы какие-то были за elif? Получается, что ведь не было.

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

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

Gentlemen, your conversation makes interesting listening.

Ты так прикольно сливаешься каждый раз))

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

И это человек, у которого «этих языков как мух» (или как там было).

То when не тот, то грамматики нет, то гит, то elif.

Странно это, и очень похоже на ревность и зависть к языку, который работает, в отличие от «мух».

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

То when не тот, то грамматики нет, то гит, то elif.

я ж сказал, что без грамматики и обсуждать нечего. откуда я знаю, есть у него elif или нет? по исходникам это смотреть что-ли? мне казалось, что что-то есть… он говорит - нет. ну нет и нет. зато есть мега select, тогда пусть или трусы оденет или крестик снимет. если есть select - зачем if.

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

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

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

Прикольно (нет), что как только выкладываешь исходный код в открытый доступ, то сразу становишься что-то должен каким-то людям, которых знать не знаешь.

Это не так работает, ребята.

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

Нет, не должен. Но зачем тогда вообще этот тред? Если выкладываешь/показываешь исходный код не проявляя минимального уважения к людям, которые не в теме, то это чистой воды эксгибиционизм.

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

Уважение это характеристика, возникающая по факту отношения с чем-либо/кем-либо.

Публикация на исходников на гитхабе не формирует мои отношения с читателями кода. Поэтому выкладывать исходники «с уважением» или «без уважения» я не могу. Это не релевантно.

А вот если они захотят мне что-то написать. то инициатива исходит от них. Им и решать, с уважением они это делают или нет. В меру своей воспитанности.

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

И еще одно.

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

Если откладывать публикацию кода в связи с тем, что кто-то может чем-то ущемиться, то следует вообще никогда ничего не публиковать.

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

формирует мои отношения с читателями кода

Формирует, формирует.

Точнее, с читателями кода — наверное. Но это такая особая категория — всегда найдутся те, кому нравится копаться в слабоструктурированной лапше без документации, по типу «угадай, что делает эта консрукция». Ну хорошо, пусть будут не мусорщики, а египтологии/любители головоломок, полтора инвалида.

С теми, кто мог бы заинтересоваться самим языком на более высоком уровне — таки формирует.

следует вообще никогда ничего не публиковать

Годный план.

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

на фоне намного более спорного select case case case

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

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

В выжал бейсике такое было. Так что поздравляю, ты переизобретаешь бейсик.

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

Ворох ключевых слов делающих программу похожей на английский текст, это как раз оно.

Нет, это про CoffeeScript.

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

Ворох ключевых слов делающих программу похожей на английский текст, это как раз оно.

Нет, это про CoffeeScript.

Нет, это про Forth и ему подобные.

Разве CoffeeScript конкатенативный? Обычная надстройка над JS, нафиг никому не нужная, с кучей привычных сишных скобочек.

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

Так это главная фича бейсика.

Главная фича бейсика - это что первоначально он влезал в ПЗУ восьмибитной машины.

Все остальные VB и VB.NET это попытка MS оживить помершую, но когда-то любимую лошадь. Однако эта попытка не лишена изящества.

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

Многие влезали, и влезают.

А главная фича (оригинального) Бейсика — в до дурости простой реализации интерпретатора. При этом сохраняя возможность написать не нём что-нибудь осмысленное и читабельное.

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

VB конечно не настолько упорот, но по сути это такой же кобол. Весь этот бахатый синтаксис с закосом под естественный язык (эллочки-людоедки) нафиг никому не сдался.

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

классический if

это арифметический IF statement с ветвлением на три результата

https://docs.oracle.com/cd/E19957-01/805-4939/6j4m0vn9p/index.html

cat t.f; f77 t.f && ./a.out
        A = 1
        B = 2
        C = -3
        D = B**2 - 4*A*C
        IF (D) 10, 20, 30
30      PRINT *, ( SQRT(D) - B )/2/A
20      PRINT *, ( - SQRT(D) - B )/2/A
10      CONTINUE
        END
t.f:5:72:

    5 |  IF (D) 10, 20, 30
      |                                                                        1
Warning: Fortran 2018 deleted feature: Arithmetic IF statement at (1)
   1.00000000
  -3.00000000

Логический IF с предикатом добавили чуть позже

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

реально классический(ариф) это трипути sign

откуда взято что закорюка изображающая if в фортране - это и есть «классический if».

классический if это правило вида

"if" bool_exression "then" operator
"else" operator
alysnix ★★★
()
Ответ на: комментарий от alysnix

был Такой МакКарти(elefant его) - апосля ариф if Бекуса&Ко

ОН предложил многопутевой cond - комитет отказался и только после всё заверте в lisp'е

if then else появился чуть позже и парралельно с генезисом скобок скобкофилов

классика локальна :)

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

"if" bool_exression "then" operator "else" operator

К 1960 напридумывали и не такое:

IF X EQUALS Z THEN MOVE A TO B; 
	OTHERWISE ADD A TO C AND ALSO IF NOT POSITIVE,
	GOTO ERROR-ROUTINE; OTHERWISE ADD A TO B AND ALSO PERFORM PATH-1 THRU PATH-6.

https://bitsavers.computerhistory.org/pdf/codasyl/COBOL_Report_Apr60.pdf?page=35

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

Зачем в C switch если есть if?

if - это выбор по разным булевским выражениям.

switch - это множество вариантов одного! арифметического выражения.

код у этих операторов разный вообще.

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

что для одного константа для другого переменная

ващет набор проверок и есть число

да же если есть побочки проверок это всё отображаемо в число с побочками

чуствую без работы люди с цпш не остануться

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

код притом, что switch делается как выборка адреса ветки исполнения из таблицы переходов, а if - как последовательная проверка условий пока не найдется то, что дает true.

это у тебя с хохловым это одно и то же небось

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

Это деталь реализации. Выбираться он может хоть обращением к Всезнающему Оракулу, для описания языка это иррелевантно.

Познакомься с тем, как работает современный оптимизирующий компилятор:

enum X {
    X1, X2, X3, X4, X5
};

extern int foo1(int);
extern int foo2(int);
extern int foo3(int);
extern int foo4(int);
extern int foo5(int);

int bar(X x, int y)
{
    if (x == X1) return foo1(y);
    if (x == X2) return foo2(y);
    if (x == X3) return foo3(y);
    if (x == X4) return foo4(y);
    if (x == X5) return foo5(y);
    return 0;
}
bar(X, int):
        mov     eax, edi
        mov     edi, esi
        cmp     eax, 4
        ja      .L4
        jmp     [QWORD PTR .L6[0+rax*8]]
.L6:
        .quad   .L10
        .quad   .L9
        .quad   .L8
        .quad   .L7
        .quad   .L5
.L7:
        jmp     foo4(int)
.L5:
        jmp     foo5(int)
.L10:
        jmp     foo1(int)
.L9:
        jmp     foo2(int)
.L8:
        jmp     foo3(int)
.L4:
        xor     eax, eax
        ret

Что ты не понимаешь про семантику, это уже ясно.

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

не кидай мне выхлоп чужих компиляторов. тут твой обсуждают.

а дай-ка код на асме для выражения(это псевдокод)

int lval = 10;
int lcnt = 0;

switch (lval) 
case 1: lcnt = lcnt+10
case 5: lcnt = lcnt+20
case 10:lcnt = lcnt+30
default:  lcnt = 100
}

короче интересно, как у тебя табличка генерится. у тебя похоже и нет ее.

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

Это деталь реализации.

неа. это какой-компилятор подменил if, в силу того, что он просто есть извращенный switch, на нечто вроде него.

что как раз и говорит, что switch - это вполне себе базовый оператор, в который иногда вон и if переделывают.

то есть switch это не «деталь реализации», это и есть реализация. и без этой «детальки» твоя телега далеко не уедет.

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

А если крестовый код в лямбда-исчисление компилировать, то там какие «базовые операторы»?

Эксперт, у которого «этих языков как мух» (или как там было), продолжает генерировать лулзы.

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

А если крестовый код в лямбда-исчисление компилировать, то там какие «базовые операторы»?

покажи выхлоп для твоего оператора switch, и зубы крестами не заговаривай, умнег блин

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

alysnix ★★★
()
Последнее исправление: alysnix (всего исправлений: 2)