Size: a a a

Compiler Development

2020 December 17

а

а это кто in Compiler Development
hazer_hazer
Столкнулся тут с проблемой и задумался.
Как работают byte-code verifier'ы, если получается нужно код наполовину исполнить? Неизвестно же что будет на топе стака лежать и тд...
А компилятору доверять нельзя, вдруг юзер сам руками напишет байт-код. И тут либо проверять только базовые вещи, что константы, на которые ссылаются имена функций и подобные случаи, правильного типа и так далее, либо по-сути почти исполнять код, и останавливаться на местах, где что-либо откуда берется, но не вызывать, и, кстати придется даже считать, а следовательно брать типы возвращаемые и класть их куда-то. Получается придется какой-то стек с типами составлять или вроде того...
Или я слишком усложняю и это просто делается?
"почти исполнять код" в смысле проверить что Типы параметров стековых инструкций совпадают с Типами результатов предыдущих инструкций?
источник

h

hazer_hazer in Compiler Development
а это кто
"почти исполнять код" в смысле проверить что Типы параметров стековых инструкций совпадают с Типами результатов предыдущих инструкций?
да. и не только.
на самом деле это очень много работы. и в рантайм это встраивать нельзя, ведь придется тогда повторяющиеся и рекурсивные моменты запоминать -> + чеки в ран-тайме
Но даже если написать такой сложный verifier, то это как мне кажется очень много работы, которая наполовину ран-тайм, в моем представлении это как ещё одна обрезанная виртуалка
источник

h

hazer_hazer in Compiler Development
hazer_hazer
да. и не только.
на самом деле это очень много работы. и в рантайм это встраивать нельзя, ведь придется тогда повторяющиеся и рекурсивные моменты запоминать -> + чеки в ран-тайме
Но даже если написать такой сложный verifier, то это как мне кажется очень много работы, которая наполовину ран-тайм, в моем представлении это как ещё одна обрезанная виртуалка
к тому же джава хранит к примеру типы как строки-референсы в байт-коде... но что мешает юзверю поместить какую-нибудь фигню, а тип другой поставить. И это чекать как-то нужно перед ран-таймом
источник

а

а это кто in Compiler Development
hazer_hazer
да. и не только.
на самом деле это очень много работы. и в рантайм это встраивать нельзя, ведь придется тогда повторяющиеся и рекурсивные моменты запоминать -> + чеки в ран-тайме
Но даже если написать такой сложный verifier, то это как мне кажется очень много работы, которая наполовину ран-тайм, в моем представлении это как ещё одна обрезанная виртуалка
"чеки в рантайме" делать не обязательно. Ты можешь один раз верифаер прогнать и потом исполнять код с увереностью что от валидный
источник

а

а это кто in Compiler Development
или я чего-то онепонял
источник

Miss Очепятка... in Compiler Development
MrSmith
Вообще это капец как странно, я думал парсер это простая штука, в итоге оказывается что нифига это не простая штука
Она простая просто хороших книг нету. Поэтому каждый новый разработчик транспиляторов проходит путь в 15 первых парсеров прежде чем создаст, тот самый простой.
источник

h

hazer_hazer in Compiler Development
а это кто
"чеки в рантайме" делать не обязательно. Ты можешь один раз верифаер прогнать и потом исполнять код с увереностью что от валидный
да я это понимаю. вот и говорю, что вытекает такая проблема как верифайер — обрезанная вм
источник

Miss Очепятка... in Compiler Development
MrSmith
Хорошая новость любая грамматика разбираемая LR(K) сущесьвуеь эквивалетна LR(1).
Это Вы  ещё конфликт свёртка-сдвиг и свёртка-свёртка не разобрали.
Вот вам чтение на вечер - на следующий вечер.
https://www.opennet.ru/docs/RUS/bison_yacc/bison_8.html
источник

K

Kir in Compiler Development
Miss Очепятка
Это Вы  ещё конфликт свёртка-сдвиг и свёртка-свёртка не разобрали.
Вот вам чтение на вечер - на следующий вечер.
https://www.opennet.ru/docs/RUS/bison_yacc/bison_8.html
Для этого есть rand()!
источник

Miss Очепятка... in Compiler Development
Kir
Для этого есть rand()!
rand() это если вы фазинг делаете. А в парсере лучше делать детерминированный вариант. Либо приоритет поставить у терминала либо выбирать всегда первую ветку по порядку. Либо расщепить состояния и пройти по всем веткам какая первая разрешиться ту и брать. И другие варианты.
источник

K

Kir in Compiler Development
Miss Очепятка
rand() это если вы фазинг делаете. А в парсере лучше делать детерминированный вариант. Либо приоритет поставить у терминала либо выбирать всегда первую ветку по порядку. Либо расщепить состояния и пройти по всем веткам какая первая разрешиться ту и брать. И другие варианты.
Да я пошутил, в стиле https://www.famicol.in/language_checklist.html
источник

M

MrSmith in Compiler Development
Miss Очепятка
Это Вы  ещё конфликт свёртка-сдвиг и свёртка-свёртка не разобрали.
Вот вам чтение на вечер - на следующий вечер.
https://www.opennet.ru/docs/RUS/bison_yacc/bison_8.html
Ага у меня поэтому парсер и не собирается)
источник

M

MrSmith in Compiler Development
Я вообше вот какого мнения - все эти знания это все крайне полезно как знание о self aware структурах данных или retroactive structures но последнее что хочеться делать это разбираться почему вот 8к строк ошибка
источник

h

hazer_hazer in Compiler Development
MrSmith
Ага у меня поэтому парсер и не собирается)
А ты на чем пишешь? Ну в смысле технология какая
источник

M

MrSmith in Compiler Development
lalrpop, игрушечная библиотека на игрушечном языке
источник

h

hazer_hazer in Compiler Development
MrSmith
lalrpop, игрушечная библиотека на игрушечном языке
Ржавчиной запахло
источник

M

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

M

MrSmith in Compiler Development
Ну у меня и компиль си на расте
источник

M

MrSmith in Compiler Development
Вообше я сделал вывод хороший о своих поделиях, в соло писать такие веши как компилятор это безумие
источник

h

hazer_hazer in Compiler Development
MrSmith
Вообше я сделал вывод хороший о своих поделиях, в соло писать такие веши как компилятор это безумие
Да так с любой задачей хоть немного комплексной.

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