All streams
Search
Write a publication
Pull to refresh
94
0
Макс Казанцев @xortator

Разработчик компиляторов

Send message

Спасибо за отзыв, я рад, если моя статья правда помогает людям. :)

Что касается стиля написания программ на тех или иных языках - думаю, на этот счёт написано немало книг, и всё об одном и том же. Можете почитать "Совершенный код" и иже с ним, плюс книгу банды четырёх про паттерны, ну и следуйте тем конвенциям, которые есть в вашем проекте. Если нет никаких - то заведите какие-нибудь (лучше всего, опять же, слизать с какого-нибудь качественного опенсорсного проекта :) ).

Умеют ли бэк-энды оптимизорать код из трех-адресной, скажем в одно или двух адресную или даже стековую арифметику (Java Jit в частности - стековый)?

Ну, строго говоря, LLVM-инструкции не всегда трёхадресные, там иногда вообще нет def'а, или же аргумент всего один. Но если коротко - да, умеют, это задача instruction selector'а и register allocator'а. Я не шибко большой эксперт конкретно в этой теме, но если есть такой запрос, то чего-нибудь написать смогу.

Java JIT в Фалконе переводит джава-байткод в LLVM IR и оптимизирует уже его, таким образом стековость там исчезает уже на этапе парсинга. Потом, на этапе кодогенерации, это превращается в обычный asm (например, x86). С2, насколько я знаю, занимается примерно тем же самым, только там Sea of nodes вместо LLVM IR.

Как могут быть реализованы виртуальные таблицы методов, на отличной от типовых ветвлений архитектурах, например "табличной" (внутренняя регистровая таблица переходов)

Я не уверен, что понял вопрос. Если речь о том, как моделируется виртуальный call, то для этого есть специальная инструкция, которая просто зовёт другую фукнцию. Она стоит где-нибудь в середине блока и не рассматривается как часть CFG данной функции. У неё просто есть сайд-эффект, говорящий о том, что вот из этой инструкции мы, например, можем и не вернуться обратно (а уйти в бесконечный цикл или вообще жёстко прервать программу). Реализована же она с помощью обычной таблицы виртуальных вызовов.

Реализация switch конструкций, где как-бы "данные" (регистры) становятся точками переходов, как?

switch аналогичен инструкции br, просто у br аргумент типа i1 и всего два константных варианта перехода (по true и false). Switch в LLVM разрешает аргумент любого целочисленного типа и большее количество переходов (но все они также идут по константным значениям). Подробно можно почитать здесь:https://llvm.org/docs/LangRef.html#switch-instruction

Спасибо, мне приятно. :)
На самом деле, я совсем не успел осветить расстановку фи-нод (как работают -- понятно, но где вставлять -- вопрос не такой тривиальный). В последующих текстах надеюсь обстоятельно это объяснить.

Information

Rating
Does not participate
Location
Новосибирск, Новосибирская обл., Россия
Registered
Activity

Specialization

System Software Engineer, Software Performance Engineer