Dzisiaj trzeba prawdziwego kompilatora C być kompilator optymalizujący , zwłaszcza dlatego, że C nie jest językiem blisko sprzętu, ponieważ obecne procesory są niezwykle złożone ( out-of-order , potokowych , Superskalarna , ze złożonymi skrytek i TLB , dlatego wymaga planowania instrukcji itp.). Dzisiejsze procesory x86 nie przypominają procesorów i386 z poprzedniego wieku, nawet jeśli oba są w stanie uruchomić ten sam kod maszynowy. Zobacz, że C nie jest językiem niskiego poziomu (Twój komputer nie jest szybkim PDP-11), autorstwa Davida Chisnalla.
Niewiele osób używa naiwnych, nieoptymalizujących kompilatorów C, takich jak tinycc lub nwcc , ponieważ produkują kod, który jest kilka razy wolniejszy niż to, co mogą dać kompilatory optymalizujące.
Kodowanie optymalizującego kompilatora jest trudne. Zauważ, że zarówno GCC, jak i Clang optymalizują pewną reprezentację kodu „neutralną dla języka źródłowego” (Gimple dla GCC, LLVM dla Clang). Złożoność dobrego kompilatora C nie znajduje się w fazie analizy!
W szczególności tworzenie kompilatora C ++ nie jest dużo trudniejsze niż tworzenie kompilatora C: parsowanie C ++ i przekształcanie go w wewnętrzną reprezentację kodu jest złożone (ponieważ specyfikacja C ++ jest złożona), ale jest dobrze zrozumiana, ale części optymalizacyjne są jeszcze bardziej złożone (wewnątrz GCC: optymalizacje klasy środkowej, język neutralny i procesor docelowy są neutralne, stanowią większość kompilatora, a reszta jest zrównoważona między frontonami dla kilku języków i backendami dla kilku procesorów). Dlatego większość optymalizujących kompilatorów C jest w stanie kompilować niektóre inne języki, takie jak C ++, Fortran, D, ... Specyficzne części GCC dla C ++ stanowią około 20% kompilatora ...
Ponadto C (lub C ++) jest tak szeroko stosowane, że ludzie oczekują, że ich kod będzie podlegał kompilacji, nawet jeśli nie jest on zgodny z oficjalnymi standardami, które nie określają wystarczająco dokładnie semantyki języka (więc każdy kompilator może mieć własną interpretację tego). Spójrz także na sprawdzony kompilator CompCert C i analizator statyczny Frama-C , które dbają o bardziej formalną semantykę C.
Optymalizacje to zjawisko długofalowe : wdrożenie kilku prostych optymalizacji jest łatwe, ale nie uczynią kompilatora konkurencyjnym! Musisz wdrożyć wiele różnych optymalizacji oraz sprytnie je zorganizować i połączyć, aby uzyskać konkurencyjny kompilator w świecie rzeczywistym. Innymi słowy, kompilator optymalizujący w świecie rzeczywistym musi być złożonym oprogramowaniem. BTW, zarówno GCC, jak i Clang / LLVM, mają kilka wewnętrznych specjalistycznych generatorów kodu C / C ++. Oba są ogromnymi bestiami (kilka milionów linii kodu źródłowego, z roczną stopą wzrostu o kilka procent rocznie) z dużą społecznością programistów (kilkaset osób, pracujących głównie w pełnym wymiarze godzin lub przynajmniej w niepełnym wymiarze godzin).
Zauważ, że nie ma (według mojej najlepszej wiedzy) wielowątkowego kompilatora C, nawet jeśli niektóre części kompilatora mogłyby być uruchomione równolegle (np. Optymalizacja między procedurami, alokacja rejestru, planowanie instrukcji ...). A kompilacja równoległa z make -j
nie zawsze wystarcza (zwłaszcza z LTO ).
Ponadto trudno jest uzyskać fundusze na kodowanie kompilatora C od zera, a taki wysiłek musi trwać kilka lat. Wreszcie, większość kompilatorów C lub C ++ jest obecnie wolnym oprogramowaniem (nie ma już rynku na nowe kompilatory zastrzeżone sprzedawane przez start-upy) lub przynajmniej są to monopolistyczne towary (takie jak Microsoft Visual C ++ ), a bycie wolnym oprogramowaniem jest prawie wymagane dla kompilatorów ( ponieważ potrzebują wkładu wielu różnych organizacji).
Byłbym zachwycony, gdybym otrzymał fundusze na pracę nad kompilatorem C od zera jako wolne oprogramowanie, ale nie jestem wystarczająco naiwny, aby wierzyć, że jest to możliwe dzisiaj!