Сьогодні вам потрібен справжній компілятор C, який буде оптимізуючим компілятором , особливо тому, що C більше не є мовою, близькою до апаратних, тому що поточні процесори неймовірно складні ( не в порядку , конвеєрні , суперскалярні , зі складними кешами та TLB , отже, потребує планування інструкцій тощо ...). Сьогоднішні процесори x86 не схожі на процесори i386 попереднього століття, навіть якщо обидва здатні запускати один і той же машинний код. Дивіться, що C не є мовою низького рівня (Ваш комп’ютер не є швидкою PDP-11) папером Девіда Чісналла.
Мало хто використовує наївні неоптимізуючі компілятори C, такі як tinycc або nwcc , оскільки вони виробляють код, який у кілька разів повільніше, ніж оптимізація компіляторів.
Кодування оптимізуючого компілятора важко. Зауважте, що і GCC, і Clang оптимізують деяке "нейтральне мовне джерело" представлення коду (Gimple для GCC, LLVM для Clang). Складність хорошого компілятора C не знаходиться у фазі розбору!
Зокрема, зробити компілятор C ++ не набагато складніше, ніж зробити компілятор C: аналіз C ++ та перетворення його на деяке внутрішнє представлення коду є складним (оскільки специфікація C ++ є складним), але добре зрозумілий, але частини оптимізації ще більше складний (всередині GCC: оптимізація середнього класу, мова джерела та нейтраль процесора нейтральна, складають більшість компіляторів, решта врівноважується між передніми кінцевими мовами для декількох мов та зворотними для декількох процесорів). Отже, більшість оптимізуючих компіляторів C також можуть компілювати деякі інші мови, наприклад, C ++, Fortran, D, ... Специфічні частини C ++ GCC складають близько 20% компілятора ...
Також C (або C ++) настільки широко використовується, що люди очікують, що їх код може бути компільований навіть тоді, коли він точно не відповідає офіційним стандартам, які не визначають достатньо точно семантики мови (тому кожен компілятор може мати свою інтерпретацію з неї). Подивіться також на перевірений CompCert компілятор C та статичний аналізатор Frama -C , які піклуються про більш формальну семантику C.
І оптимізації - це явище з довгим хвостом : реалізувати кілька простих оптимізацій легко, але компілятор не зробить конкурентоспроможним! Вам потрібно здійснити багато різних оптимізацій та вміло їх організувати та комбінувати, щоб отримати реальний конкурент, який є конкурентоспроможним. Іншими словами, компілятор оптимізації в реальному світі повинен бути складною програмою. BTW, і GCC, і Clang / LLVM мають декілька внутрішніх спеціалізованих генераторів коду C / C ++. І обидва - це величезні звірі (кілька мільйонів вихідних рядків коду зі швидкістю приросту в кілька відсотків щороку) з великою спільнотою розробників (кілька сотень осіб, які працюють переважно на повний робочий день, або принаймні на половину робочого часу).
Зауважте, що немає (наскільки мені відомо) багатопотокового компілятора C, навіть якщо деякі частини компілятора могли працювати паралельно (наприклад, внутрішньопроцедульна оптимізація, розподіл реєстру, планування інструкцій ...). І паралельної побудови з make -j
не завжди достатньо (особливо з LTO ).
Крім того, важко отримати фінансування на кодування компілятора C з нуля, і такі зусилля потребують кількох років. Нарешті, більшість компіляторів C або C ++ є сьогодні безкоштовним програмним забезпеченням (більше немає ринку нових фірмових компіляторів, які продаються стартапами) або, принаймні, монополістичні товари (наприклад, Microsoft Visual C ++ ), а для компіляторів майже необхідне безкоштовне програмне забезпечення ( тому що їм потрібен внесок багатьох різних організацій).
Я був би радий отримати фінансування для роботи на компіляторі C з нуля, як вільного програмного забезпечення, але я не є достатньо наївним, щоб вважати, що це можливо сьогодні!