Size: a a a

Compiler Development

2020 December 01

M

MrSmith in Compiler Development
MaxGraey
Это можно даже без построения CFG. Сдесь описано как
https://pp.ipd.kit.edu/uploads/publikationen/braun13cc.pdf
Да, это сейчас и читаю
источник

M

MrSmith in Compiler Development
Классика же как и cython at el, у меня ещё две монографии и книга есть
источник

E

EgorBo in Compiler Development
Value* visitNode(Node node)
{
   swith (node->Operator)
   case Mul: return builder.CreateMul(visitNode(node->op1), visitNode(node->op2)));
   case Add: return builder.CreateAdd(visitNode(node->op1), visitNode(node->op2)));
   ...
источник

M

MrSmith in Compiler Development
Оно только не гарантирует pruned и ещё пару вещей, но как понял это почти бесплатно в взрослых компилях
источник

M

MrSmith in Compiler Development
И ещё не понял что они имели ввиду под mimic и not ssa based
источник

PS

Pavel Samolysov in Compiler Development
hazer_hazer
Переслано от hazer_hazer
На самом деле это от реализации зависит. Можно разделить операторы и киворды. Но числа в юнионах на уровне токенов хранить не стоит.


Если у тебя на уровне парсинга важно знать, что токен это оператор, например, если у тебя есть оверрайд типа def +(), как в руби, то это может быть удобно. Но хз.

У меня определение оператор/киворд реализовано возможно не супер безопасно: у меня enum class TokenType: uint8_t, в котором токены сгруппированы и определяется по range от первого оператора до "не оператора"
Большое спасибо за мнение. В принципе ни в каких промышленных компиляторах и не видел, чтобы парсили числа на этапе лексера, видел только в игрушечных/тестовых, например в trill в OMR.
источник

M

MrSmith in Compiler Development
EgorBo
Value* visitNode(Node node)
{
   swith (node->Operator)
   case Mul: return builder.CreateMul(visitNode(node->op1), visitNode(node->op2)));
   case Add: return builder.CreateAdd(visitNode(node->op1), visitNode(node->op2)));
   ...
Да ладно щас кофейку выпью и пойму как обходить
источник

M

MrSmith in Compiler Development
Визитор у меня есть уже
источник

M

MaxGraey in Compiler Development
not ssa based - это не SSA, а другие формы -  CPS, RVSDG, ANF и т д
источник

E

EgorBo in Compiler Development
MrSmith
Да ладно щас кофейку выпью и пойму как обходить
у меня есть скрин самого простого LLVM IR эмиттера для RyuJIT IR дотнетовского, как раз для твоего кейса
источник

E

EgorBo in Compiler Development
источник

E

EgorBo in Compiler Development
я его уже дописал до более серьезного состояния, циклы ветвления уже поддерживает :)
источник

E

EgorBo in Compiler Development
думаю сделать как плагин к джиту дотнета - для оптимизации no-gc ф-ций
источник

M

MrSmith in Compiler Development
EgorBo
я его уже дописал до более серьезного состояния, циклы ветвления уже поддерживает :)
Я наоборот начал с конца писать сначала циклы и ветвления потом стейтменты
источник

E

EgorBo in Compiler Development
это логично, но дольше до шага "что-то увидеть работающее"
источник

M

MrSmith in Compiler Development
3 недели суммарно, но я дурак местный мне можно, слышал вообще на курсе митма они за 3 его запускают, но там комманда 2 человека
источник

E

EgorBo in Compiler Development
мне интереснее самому на грабли понаступать, а потом узнать как надо
источник

M

MrSmith in Compiler Development
Будушее за графами
источник

M

MrSmith in Compiler Development
Проблема в том, что не раскрывая внутреннего устройства абстракции нельзя написать эффективно только если под каждый кейс писать функцию
источник

M

MrSmith in Compiler Development
А над последовательностью можно больше оптимизаций делать
источник