Size: a a a

Compiler Development

2020 July 09

c

cevek in Compiler Development
Виталий Медоваров
Ты сначала находишь адрес виртуальной таблицы для соответствующего интерфейса, далее просто по смещению там смотришь. Получается несколько шагов
ну вот вопрос, а как найти адрес таблицы интерфейса для приходящего инстанса класса?
источник

f

fldlg2 in Compiler Development
Ivan Kochurkin
Зачем делать это не знаю, но не строить дефолтное дерево в LL парсере нужно, чтобы потреблять меньше памяти и использовать привычные и удобные LL грамматики, которых много.
Если в ANTLR при этом выключен backtracking, то почему бы и нет. Если включен, то без parse tree, как я понимаю, придётся проходить один и тот же путь несколько раз.
источник

c

cevek in Compiler Development
типа у нас есть огромная таблица многие ко многим классов и интерфейсов чтобы одним лукапом найти?
источник

AT

Alexander Tchitchigi... in Compiler Development
cevek
ну вот вопрос, а как найти адрес таблицы интерфейса для приходящего инстанса класса?
Не для инстанса, а для самого класса. Он будет одинаковый у всех инстансов. И компилятор знает, какой именно он сгенерировал.
источник

c

cevek in Compiler Development
Alexander Tchitchigin
Не для инстанса, а для самого класса. Он будет одинаковый у всех инстансов. И компилятор знает, какой именно он сгенерировал.
ну еще раз, приходящий класс мы не знаем, это рантайм информация же
источник

ВМ

Виталий Медоваров... in Compiler Development
cevek
ну еще раз, приходящий класс мы не знаем, это рантайм информация же
знаем, для этого есть RTTI
источник

AT

Alexander Tchitchigi... in Compiler Development
cevek
ну еще раз, приходящий класс мы не знаем, это рантайм информация же
Он нужен в месте вызова, а там знаем. В функцию параметром приходит уже указатель сразу куда надо.
источник

c

cevek in Compiler Development
cevek
все равно не понимаю, как в x в месте g.print() определить смещение? классы же приходят разные
interface A {void print()}
interface B {...}
interface C {...}
interface D {...}
class Foo implements B, A {...}
class Bar implements C, A {...}
function x(A g) {g.print()}
x(new Foo())
x(new Bar())
ну вот же я пример привел, мы даем функции разные классы
источник

AT

Alexander Tchitchigi... in Compiler Development
Виталий Медоваров
знаем, для этого есть RTTI
Не усложняйте и не запутывайте человека — он ещё самых тривиальных случаев не осознал.
источник

AT

Alexander Tchitchigi... in Compiler Development
cevek
ну вот же я пример привел, мы даем функции разные классы
И в каждом месте вызова компилятор знает какой конкретно класс. А внутри функции пофиг — она видит сразу правильный указатель.
источник

IK

Ivan Kochurkin in Compiler Development
fldlg2
Есть известная картинка: https://i.stack.imgur.com/rivKh.jpg
На ней видно, что существуют грамматики, которые покрыты LL(1) и, тем более, LL(k), но не LALR(1). (Впрочем, обратное тоже верно).
С другой стороны, LALR(k) покрывает и LR(k), и LL(k) — этого на картинке нет (генераторы LALR(k) лично мне неизвестны, но если я правильно помню теорию, то это так.)
А вот наглядный практический пример: https://stackoverflow.com/a/8811523/1046374
источник

MS

Mikola Summer Duck in Compiler Development
cevek
типа у нас есть огромная таблица многие ко многим классов и интерфейсов чтобы одним лукапом найти?
Один ко многим.
источник

MS

Mikola Summer Duck in Compiler Development
Один класс ко многим интерфейсам.
источник

AT

Alexander Tchitchigi... in Compiler Development
Mikola Summer Duck
Один класс ко многим интерфейсам.
Та не, один интерфейс могут реализовывать много разных классов. Но это ничему не мешает.
источник

f

fldlg2 in Compiler Development
Так ведь изначальный вопрос был — что может top-down, чего не может bottom-up, а не наоборот? 😉
источник

MS

Mikola Summer Duck in Compiler Development
Alexander Tchitchigin
Та не, один интерфейс могут реализовывать много разных классов. Но это ничему не мешает.
Ой, да, не то сказал.
источник

c

cevek in Compiler Development
Alexander Tchitchigin
И в каждом месте вызова компилятор знает какой конкретно класс. А внутри функции пофиг — она видит сразу правильный указатель.
ну хорошо, что компилятор должен сгенерить для такого кейса
x(rand()  >  0.5 ? new Foo() : new Bar() )
источник

MS

Mikola Summer Duck in Compiler Development
cevek
ну хорошо, что компилятор должен сгенерить для такого кейса
x(rand()  >  0.5 ? new Foo() : new Bar() )
При условии что Foo и Bar удовлетворяют одному интерфейсу?
источник

c

cevek in Compiler Development
да
источник

MS

Mikola Summer Duck in Compiler Development
Указатель на структуру и указатель на лукап-таблицу с реализациями функций интерфейса.
источник