LINUX.ORG.RU

Register Based to Stack based


0

1

Добрый вечер, коллеги!

Есть вопрос по преобразованию кода некой виртуальной машины из регистровой в стековую.

У меня есть формальная запись в виде инструкций псевдоассемблера (похоже на LLVM IR):

<загрузить> <номер регистра> <память>
<выполнить> <выходной регистр> <входной регистр 1> <входной регистр 2>
<сохранить> <память> <номер регистра>

Хочется сделать компиляцию на лету в JVM, для чего использую ASM. Но никак не приходит в голову алгоритм: как правильно распланировать стек. Где бы в умной книге такое прочитать? В гугле по запросу сразу идут ссылки на Dalvik (т.е. все наоборот).

★★

Завтра ищешь в интернете книжку Categories for the Working Mathematician. Похуй если ничего не поймешь. Затем идешь на haskell.org и изучаешь стандартную библиотеку от корки до корки. Потом зубришь, именно, сука, вызубриваешь определения языка и стандартных библиотек - The Haskell 2010 Report, чтобы от зубов отскакивало. Когда напишешь свой первый катаморфизм, по пути изучив теорию типов на уровне TaPL-а, скачиваешь и изучаешь любую хаскеллевскую библиотеку с первоклассными функторами и морфизмами, рекомендую category-extras или recursion-schemes. Как переделаешь стандартную прелюдию, чтобы по крайней мере все рекурсивные схемы были выражены через комонады, можешь идти дальше - тебя ждет увлекательный мир теории категорий. Катаморфизмы, параморфизмы, зигоморфизмы, хистоморфизмы, препроморфизмы, анаморфизмы, апоморфизмы, футуморфизмы, постпроморфизмы, хиломорфизмы, крономорфизмы, синкрономорфизмы, экзоморфизмы, метаморфизмы, динаморфизмы алгебра и коалгебра Калвина Элгота наконец. Успех хиккующих выблядков / просто быдлокодеров типа рейфага или сисярп/джава-девелоперов, которые работают в Люксофте не будет тебя волновать и уже через пол года ты будешь получать такие гранты, что любой профессор будет течь при одном упоминании списка твоих публикаций.

anonymous
()

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

AIv ★★★★★
()

А по сабжу - у меня ощущение, что такая обратная задача некорректна (имеет не единственное решение). Т.е. гемору с ней будет... я б наверное не взялся.

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

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

стандартная копипаста

для Ъ

По непроверенным данным, написана школьником-долбо@бом из Харькова Пашей, который предпринял попытку написать принципиально новый движок™ для Сосача. ЧСХ, потерпел фиаско.

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

О как... а я то и не знал.

У меня до недавнего времени было стойкое ощущение, что анонимус с ЛОРа един как дираковский электрон - мечется от компа к компу судорожно набирая бессвязные посты. Хотя было пару вменяемых, но может у него случилась ремиссия?;-)

AIv ★★★★★
()

В LLVM был проект по генерации jvm-байткода из llvm ir

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

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

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

А аннигиляция электрон-позитронной пары - это просто смена импульса вдоль временной оси, от того, что по электрону вдарили отрицательной энергией?

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

нет, это просто перегиб траектории в пространстве-времени. Летел электрон вперед по времени, развернулся полетел назад. На перегибе наблюдатель видит как электрон и позитрон пришли в одну точку и бабахнули.

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

> На перегибе наблюдатель видит как электрон и позитрон пришли в одну точку и бабахнули.

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

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

Энергия выделилась благодаря закону сохранения. А почему - это к господу Богу;-)

AIv ★★★★★
()

Спасибо всем за дискуссию. Вроде придумал. Я для каждого регистра посчитал в скольких местах он используется + нашел те регистры, которые только сохраняются в память (их назвал корнями дерева). Для тех регистров, которые используются более одного раза выделил локальные переменные. Далее от корней прослеживал операции с помощью рекурсивного спуска (построения дерева). Если какая-то инструкция была выполнена к этому времени в другом дереве (в дереве с другим корнем), то загружал уже значение локальной переменной. В результате получил код. Все это будет работать только, если регистры используются в SSA (single-assigment form), иначе алгоритм не работает.

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

Не читал (не знал о существовании), но обязательно посмотрю. Спасибо.

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

Элементарно. Преобразуй код в SSA, а SSA складывается в expression trees, а их потом очень легко сериализовать в stack VM.

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

Ну собственно я так и сделал, о чем выше написал.

olegk ★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.