Макс Казанцев @xortator
Разработчик компиляторов
Information
- Rating
- Does not participate
- Location
- Новосибирск, Новосибирская обл., Россия
- Registered
- Activity
Specialization
System Software Engineer, Software Performance Engineer
Разработчик компиляторов
Спасибо за отзыв, я рад, если моя статья правда помогает людям. :)
Что касается стиля написания программ на тех или иных языках - думаю, на этот счёт написано немало книг, и всё об одном и том же. Можете почитать "Совершенный код" и иже с ним, плюс книгу банды четырёх про паттерны, ну и следуйте тем конвенциям, которые есть в вашем проекте. Если нет никаких - то заведите какие-нибудь (лучше всего, опять же, слизать с какого-нибудь качественного опенсорсного проекта :) ).
Ну, строго говоря, LLVM-инструкции не всегда трёхадресные, там иногда вообще нет def'а, или же аргумент всего один. Но если коротко - да, умеют, это задача instruction selector'а и register allocator'а. Я не шибко большой эксперт конкретно в этой теме, но если есть такой запрос, то чего-нибудь написать смогу.
Java JIT в Фалконе переводит джава-байткод в LLVM IR и оптимизирует уже его, таким образом стековость там исчезает уже на этапе парсинга. Потом, на этапе кодогенерации, это превращается в обычный asm (например, x86). С2, насколько я знаю, занимается примерно тем же самым, только там Sea of nodes вместо LLVM IR.
Я не уверен, что понял вопрос. Если речь о том, как моделируется виртуальный call, то для этого есть специальная инструкция, которая просто зовёт другую фукнцию. Она стоит где-нибудь в середине блока и не рассматривается как часть CFG данной функции. У неё просто есть сайд-эффект, говорящий о том, что вот из этой инструкции мы, например, можем и не вернуться обратно (а уйти в бесконечный цикл или вообще жёстко прервать программу). Реализована же она с помощью обычной таблицы виртуальных вызовов.
switch аналогичен инструкции br, просто у br аргумент типа i1 и всего два константных варианта перехода (по true и false). Switch в LLVM разрешает аргумент любого целочисленного типа и большее количество переходов (но все они также идут по константным значениям). Подробно можно почитать здесь:https://llvm.org/docs/LangRef.html#switch-instruction
Спасибо, мне приятно. :)
На самом деле, я совсем не успел осветить расстановку фи-нод (как работают -- понятно, но где вставлять -- вопрос не такой тривиальный). В последующих текстах надеюсь обстоятельно это объяснить.