LINUX.ORG.RU

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

 , qod, ,


4

4

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

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

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

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

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

Обращайся по адресу:

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

короче руст это вообще не руководство к действию.

опять же тип noreturn русту нужен, поскольку он занимается анализом потока исполнения, а тебе-то он зачем?

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

«Если перед НГ завала работы не будет»

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

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

Да))

У моего заказчика в последний момент случилась ситуация «сами не знаем, что нам надо». Видимо завтра как на работу выйдут они, я охренею от списка правок.

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

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

ну там нарисован лютейший изврат

Там смысл примера не в том, чтобы показать, как грамотно писать код, а в том, чтобы показать, почему noreturn совместим с любым типом. Или иными словами, t == (t | noreturn), где t — любой тип.

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

опять же тип noreturn русту нужен, поскольку он занимается анализом потока исполнения, а тебе-то он зачем?

Ровно по той же причине.

https://github.com/wandrien/qod/blob/master/src/tests/noreturn_1.qd

https://github.com/wandrien/qod/blob/master/src/tests/noreturn_2.qd

https://github.com/wandrien/qod/blob/master/src/tests/noreturn_3.qd

https://github.com/wandrien/qod/blob/master/src/tests/eRETURNEXP.qd

https://github.com/wandrien/qod/blob/master/src/tests/eRETURNEXP_2.qd

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

Небольшой спойлер того, что ожидается в будущем. Будет круто.

Кто понял, тот понял.

Fixed-size array memory layout

    data[0]  <- reference
    data[1]
    data[2]
    ...

Specified-size array memory layout

    count
    data[0]  <- reference
    data[1]
    data[2]
    ...

Room memory layout

    room
    count
    data[0]  <- reference
    data[1]
    data[2]
    ...

Virtual room memory layout

    virtual_count
    room
    count
    data[0]  <- reference
    data[1]
    data[2]
    ...

Read-only ref-counted string memory layout

    refcount
    count
    data[0]  <- reference
    data[1]
    data[2]
    ...
    string_terminator

Miltidimentional array memory layout

    ...
    count_dim_3
    count_dim_2
    count_dim_1
    data[0]  <- reference
    data[1]
    data[2]
    ...

Slice memory layout

    ptr_to_data
    count

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

Насчёт access types я пока не определился.

Вот такие варианты возможны:

  • Ссылка, aka Reference<T>, aka t& в крестах.
  • Указатель, aka Pointer<T> .
  • Указатель, могущий содержать null, aka NullablePointer<T>, aka t* в крестах. (Как это по-русски называть? «Обнулябельный указатель»?)

Еще на задворках болтается AllowZeroPointer<T> который может потребоваться для программирования ядер ОС и микроконтроллёров. Но я его особо не рассматриваю как вариант на включение. Не вижу строгой необходимости.

Следует ли ссылку и не-null указатель объединить в один тип, или нет. И какие именно свойства им назначить, если не объединять. Не улавливаю пока.

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

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

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

А вот про переполнение - хз. Тот вариант, который я знаю, там требуется разрядность в 4 раза увеличивать для получения результат.

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

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

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

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

Немножко подшаманил парсинг, теперь такой тест проходит компиляцию.

Теперь можно сначала сделать предварительное объявление функции, а уже потом импортировать её дефиницию из пространства имён/модуля.

// TEST: should_print '1234 1235 '

include "../include/test_env.qdi";

int foo(int x, y);

int bar(int x, y)
	return foo(x, y) + 1;
end

namespace AAA of
	int foo(int x, y)
		return x + y;
	end
end:namespace

alias foo = AAA.foo;

begin
	put_int(foo(1000, 234)); puts(" ");
	put_int(bar(1000, 234)); puts(" ");
end
wandrien ★★
() автор топика
Ответ на: комментарий от wandrien

Теперь можно сначала сделать предварительное объявление функции, а уже потом импортировать её дефиницию из пространства имён/модуля.

И теперь можно делать так:

https://github.com/wandrien/qod/commit/f4d3f67c28dfe1e61b0ccf8c75e6e175dff7867b

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

В процессе отладки кодогенератора удалось добиться такого улучшения генерации кода:

Исходник:

	while j < Size do

		if i >= _nChar then
			exit;
		end

		if Str[j] != Char[i] then

Было:

        mov     EAX,  dword [EBP-12]
        cmp     EAX,  dword [EBP+12]
        jae     @10257
                                         ; #line compiler_chardata.qdi:31
        mov     EAX,  dword [EBP-8]
        cmp     EAX,  dword [@@DATA+49284]
        jae     @10257
                                         ; #line compiler_chardata.qdi:35
        mov     EAX,  dword [EBP-12]
        add     EAX,  dword [EBP+8]
        mov      AL,  byte  [EAX]
        mov     EDX,  dword [EBP-8]
        mov      DL,  byte  [@@DATA+EDX+49288]
        cmp      AL,   DL
        je      @10263

Стало:

        mov     EAX,  dword [EBP-12]
        cmp     EAX,  dword [EBP+12]
        jae     @10257
                                         ; #line compiler_chardata.qdi:31
        mov     EDX,  dword [EBP-8]
        cmp     EDX,  dword [@@DATA+49284]
        jae     @10257
                                         ; #line compiler_chardata.qdi:35
        add     EAX,  dword [EBP+8]
        mov      AL,  byte  [EAX]
        mov      DL,  byte  [@@DATA+EDX+49288]
        cmp      AL,   DL
        je      @10263

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

Но в некоторых случаях стало хуже, как тут:

Было:

        mov     EDX,  dword [EBP+20]
        cmp     EDX,  127
        ja      @13199
        cmp     EDX,  4294967168

Стало

        mov     EAX,  dword [EBP+20]
        cmp     EAX,  127
        ja      @13199
        mov     ECX,  dword [EBP+20]
        cmp     ECX,  4294967168

Причину регрессии пока не выяснил.

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

по-русски, многомерных небось?

Это не по-русски, а по неграмотному.

Указатель на указатель «многомерным указателем» не хочешь называть? А массив, состоящий из массивов, почему-то хочешь.

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

В системе типов нет такой сущности как многомерный массив.

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

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

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

Ты б хоть открывал свои ссылки что ли.

тебе сказано, в языках есть термин multidimentional arrays. а то что ты придумал как nested arrays, есть самодеятельность, выдающая в тебе пионера с барабаном, когда ты начинаешь перевыдумывать терминологию, которой лет 50-60, на лету.

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

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

Есть мнение, что имеем дело с началом

Jesus said «I will rebuild this temple in three days.» I could make a compiler in 3 days. (с)

начинаешь перевыдумывать терминологию, которой лет 50-60, на лету.

Опять же, всё протекает похожим образом:
The code is beautiful. I always break compatibility to keep it perfect. (с)

И дело уверенно идёт к
I report to God. You report to me. (с)

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

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

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

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

Причину регрессии пока не выяснил.

Выяснил.

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

На днях работал до 3-х ночи, всё нужно «срочно» перед НГ. Люди так торопятся, будто надеются успеть.

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