2016-10-01 9 views
1

Я пишу язык, который сейчас компилируется в C, и когда я говорю IL, я имею в виду, поскольку на языке C я пишу код, чтобы затем сгенерировать сборку другим компилятором c, например gcc или clang.Вопросы о языке C как промежуточном языке

: C код, который я генерировать, это будет более выгодно:

  • Если я некоторые простые перевалы неавтоматического (постоянная распространения, мертвое удаление кода, ...) это уменьшит объем работ по C компилятор должен сделать, или сделать его сложнее, потому что это не действительно человеческий код C?
  • Если бы я должен был скомпилировать, чтобы сказать код с тремя адресами или SSA или какую-либо другую форму, а затем передать это в программу на языке C с функциями, метками и переменными - это упростило бы или упростило бы компилятор C для оптимизации?

Какой вид связи вместе, чтобы сформировать следующий вопрос ...

  • Что является наиболее оптимальным способом для получения хорошего кода C от языка, который компилирует в C?
  • Стоит ли вообще делать какие-либо оптимизации и оставлять это для компилятора?

ответ

0

Как правило, нет особого смысла делать оптимизацию типа peephole, потому что компилятор C просто сделает это за вас. Что дороговато: a) потраченные впустую или ненужные операции «подарочной упаковки», b) обращения к памяти, c) неверные предсказания отрасли.

Для а) убедитесь, что вы не слишком много передаете данные, поскольку C будет осуществлять постоянное распространение, существует ограничение на то, насколько далеко он может обнаружить, что два буфера фактически являются псевдонимами одних и тех же базовых данных. Для b) попробуйте сохранить функции короткими и работать с одними и теми же данными вместе, а также ограничить использование памяти кучи для повышения производительности кеша. Для c) компилятор понимает для циклов, он не понимает циклы goto. Так это будет цифра, что

for(i=0;i<N;i++) 

обычно занимает тело цикла, оно не понять, что

if(++i < N) goto do_loop_again 

обычно совершить прыжок.

Так что на самом деле правило состоит в том, чтобы сделать ваш автоматический код максимально человечным. Хотя, если он слишком похож на человека, возникает вопрос о том, что ваш язык может предложить, что C не делает - вся точка не-C-языка - это создание спагетти gotos в источнике C, хорошая структура в входной скрипт.

+0

«Вся точка не-C-языка - это создание спагетти gotos_» - это бессмыслица! Я писал языки с yacc, которые генерируют совершенно хороший C без goto. –

+0

Можете ли вы рассказать о том, почему эти операции дороги? Считаете ли вы, что их можно оптимизировать, если кто-то должен писать плохой код, прежде чем он будет скомпилирован на C? Я не думаю, что могу ограничить использование памяти кучи, поскольку этот язык относительно низкий, нет GC или что-то еще, поэтому программист обрабатывает их управление памятью. –

+0

Чтение и запись в основную память включает передачу данных из процессора и обратно, что намного дороже, чем операции, которые происходят внутри процессора. Упорядочивая данные так, чтобы элементы, используемые вместе, были близки друг к другу и выполнялись так, чтобы операции, действующие на одни и те же данные, были близки друг к другу, вы минимизируете это. –