Steve Yegge napisał świetny post na blogu, który w pewien pośredni sposób rozwiązuje ten problem.
Wielki punkt nr 1: kompilatory obejmują prawie każdy aspekt informatyki. Są to kursy wyższego poziomu, ponieważ na początek musisz znać wszystkie inne rzeczy, których uczysz się w programie nauczania informatyki. Struktury danych, wyszukiwanie i sortowanie, wydajność asymptotyczna, kolorowanie wykresów? Wszystko tam jest.
Jest powód, dla którego Knuth pracował nad swoją monumentalną (i niekończącą się) „sztuką programowania komputerowego” od kilku dziesięcioleci, chociaż początkowo był (tylko) podręcznikiem kompilatora. W ten sam sposób, w jaki powiedział Carl Sagan „Jeśli chcesz zrobić szarlotkę od zera, musisz najpierw wynaleźć wszechświat”, jeśli chcesz napisać kompilator, musisz najpierw poradzić sobie z prawie każdym aspektem informatyki.
Oznacza to, że jeśli kompilator jest hostowany samodzielnie, to z pewnością będzie w stanie zrobić to, czego potrzebuję, bez względu na to, co robię. I odwrotnie, jeśli nie napisałeś kompilatora w swoim języku, istnieje duża szansa, że ominie coś, co jest naprawdę ważne dla kogoś, ponieważ implementatorzy języka nigdy nie musieli pisać programu, który wymagałby od nich myślenia o tych wszystkich problemach.
Wielki punkt # 2: z 30 000 stóp zaskakująca liczba problemów wygląda jak kompilatory.
Kompilatory pobierają strumień symboli, ustalają ich strukturę zgodnie z pewnymi predefiniowanymi regułami specyficznymi dla domeny i przekształcają je w inny strumień symboli. Brzmi dość ogólnie, prawda? No tak.
Niezależnie od tego, czy jesteś w zespole Visual C ++, czy nie, bardzo często będziesz musiał zrobić coś, co wygląda jak część kompilatora. Robię to dosłownie każdego dnia.
W przeciwieństwie do większości innych zawodów, programiści nie tylko używają narzędzi, ale również budują własne narzędzia. Programista, który nie może (z powodu braku umiejętności lub braku przydatnych narzędzi do budowania innych narzędzi) pisać na zawsze będzie upośledzony, ograniczony do narzędzi, które zapewnia ktoś inny.
Jeśli język „nie nadaje się do tworzenia” programów, które mogą pobierać strumień symboli, stosować do nich reguły i przekształcać je w inny strumień symboli, co brzmi jak dość ograniczony język, a nie taki, który byłby przydatny Dla mnie.
(Na szczęście nie sądzę, aby istniało wiele języków programowania, które nie nadają się do przekształcania symboli. C jest prawdopodobnie jednym z najgorszych obecnie używanych takich języków, jednak kompilatory C są zazwyczaj hostowane przez siebie, więc nigdy nikogo nie zatrzymał.)
Trzeci powód, dla którego skończę, z własnego doświadczenia, o którym nie wspomina Yegge (ponieważ nie pisał o tym „dlaczego sam się hostuje”): to usuwa błędy. Kiedy piszesz kompilator, co oznacza, że za każdym razem, gdy go budujesz (nie tylko za każdym razem, gdy go uruchamiasz ), zależy od niego, aby działał i działał poprawnie w oparciu o bazę kodową przyzwoitych rozmiarów (sam kompilator).
W tym miesiącu korzystałem ze stosunkowo nowego i znanego kompilatora nieobsługiwanego przez hosta (prawdopodobnie można się domyślić, który z nich) i nie mogę przejść 2 dni bez segregacji. Zastanawiam się, ile projektanci musieli z niego skorzystać.