Вопросы о C как промежуточном языке
Я пишу язык, который компилируется в C прямо сейчас, и когда я говорю "IL", я имею в виду, что "C" - это язык, на котором я пишу код, чтобы затем генерировать сборку другим компилятором c, например, gcc или clang.
Код C, который я генерирую, будет более полезным для:
- Если я сделаю несколько простых проходов (постоянное распространение, удаление мертвого кода,...), это уменьшит объем работы, которую должен выполнять компилятор C, или усложнит, потому что это не совсем человеческий код C?
- Если бы я должен был скомпилировать, скажем, трехадресный код, или SSA, или какую-то другую форму, а затем передать это в программу на C с функциями, метками и переменными - это облегчит или затруднит оптимизацию компилятора C?
Какой вид ссылки вместе, чтобы сформировать следующий вопрос...
- Каков наиболее оптимальный способ создания хорошего кода C из языка, который компилируется в C?
- Стоит ли вообще делать какие-либо оптимизации и оставить это компилятору?
1 ответ
В общем, нет особого смысла проводить оптимизацию типа глазка, потому что компилятор C просто сделает это за вас. То, что дорого, это: а) потраченные впустую или ненужные операции "упаковки подарков", б) доступ к памяти, в) неправильные прогнозы веток.
Для а) убедитесь, что вы не передаете данные о слишком большом количестве данных, поскольку пока C будет выполнять постоянное распространение, существует предел того, насколько далеко он может обнаружить, что два буфера фактически являются псевдонимами одних и тех же базовых данных. Для b) старайтесь держать функции короткими и операции над одними и теми же данными вместе, а также ограничьте использование памяти кучи для повышения производительности кэша. Для c) компилятор понимает циклы, он не понимает циклы goto. Так что это будет понимать, что
for(i=0;i<N;i++)
будет обычно принимать тело цикла, это не будет
if(++i < N) goto do_loop_again
будет обычно делать прыжок.
Поэтому на самом деле правило состоит в том, чтобы сделать ваш автоматический код максимально похожим на человека. Хотя если это слишком по-человечески, то возникает вопрос о том, что может предложить ваш язык, чего нет в C - весь смысл языка, не относящегося к C, заключается в создании спагетти gotos в источнике C, хорошей структуре в входной скрипт.