Всегда ли первый язык, используемый для начальной загрузки, имеет штамповку / влияние в конечном сгенерированном коде? - PullRequest
0 голосов
/ 28 апреля 2011

Скажем, у меня плохой язык - он создает много избыточного ассемблерного кода (например, для чего-то столь же простого, как + b, он создает сборку из 10 строк, но выполняет свою работу) и другой C-подобный язык, который создает хороший оптимизированный ассемблерный код (2 строки для простого кода, такого как + b). Я создаю компилятор на обоих этих языках с тем же подмножеством Теперь я получил компилятор для моего языка и готов к загрузке Не думаете ли вы, что компилятор из первого случая был бы плохим выбором, хотя он может выполнять начальную загрузку, хотя и генерацию кода для порта? Альтернативно, разве первый язык, используемый для определения подмножества, не окажет своего влияния на все слои? Т.е. компилятор, сгенерированный из этого компилятора?

Ответы [ 3 ]

1 голос
/ 28 апреля 2011

Единственное, что я могу думать о том, что передается от одного поколения загрузочного компилятора к следующему, это значение констант, например, «1» будет равно «1» независимо от того, какой код генерирует компилятор.

Интересное примечание о константах: escape-символы Си.Я написал компиляторы C с использованием начальной загрузки и был удивлен (я легко удивлен), когда я вижу код вроде:

// Decode escape characters.
if (ch == '\\') {
    ch = nextchar();
    switch (ch) {
        case 'n':
            ch = '\n';
            break;
...

Откуда взято начальное значение '\ n'?Кто-то где-то должен был сказать компилятору, что '\ n' имеет значение 10.; -)

1 голос
/ 28 апреля 2011

Только что загруженный ограниченный компилятор не победит компилятор C, это точно.Но никто не говорит, что так должно быть (ну, вам будет очень трудно победить даже современные компиляторы Си, но давайте предположим, что мы конкурируем с чем-то другим, кроме компиляторов для переносимого языка ассемблера, усовершенствованного за тридцать лет).В зависимости от вашего языка, очень возможно, что расширение загрузочного компилятора будет намного проще, чем расширение написанного на C. Это может позволить много этапов оптимизации, которые было бы сложнее реализовать в C, постепенно увеличивая производительность вашего компилятора (так какself-hosts, т.е. сам компилируется) и производительность всех других программ, которые вы компилируете.

Это различие подводит нас к еще одному важному моменту: производительность компилятора редко имеет значение, если только онане совсем необоснованно.Производительность сгенерированного кода обычно гораздо важнее, и это зависит от генератора кода вашего компилятора, а не от генератора кода компилятора, используемого для компиляции вашего генератора.

В-третьих, в таких проектах, как LLVM, генерациядостойный ассемблерный код уже не так сложен, как раньше.Если вы сгенерируете нормальный код LLVM, даже если он содержит избыточность, LLVM имеет много проходов оптимизации, которые могут позаботиться о том, чтобы и производили лучший фактический код сборки и выделяли регистры лучше, чем вы могли быделай сам в разумные сроки.

1 голос
/ 28 апреля 2011

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

...