Стів Єгге написав чудову публікацію в блозі, яка, дещо опосередковано, вирішує це питання.
Велике значення №1: компілятори охоплюють майже всі аспекти інформатики. Вони курси вищого рівня, тому що вам потрібно знати всі інші речі, які ви дізнаєтесь у навчальній програмі з інформатики, щоб почати роботу. Структура даних, пошук та сортування, асимптотична продуктивність, забарвлення графіків? Це все там.
Існує причина, що Кнут працював над своїм монументальним (і нескінченним) «Мистецтвом комп’ютерного програмування» протягом декількох десятиліть, навіть незважаючи на те, що він починався як (просто) підручник із компілятора. Так само, як сказав Карл Саган: "Якщо ви хочете зробити яблучний пиріг з нуля, ви повинні спочатку винайти Всесвіт", якщо ви хочете написати компілятор, ви повинні спочатку розібратися майже з кожним аспектом інформатики.
Це означає, що якщо компілятор влаштовує власний хостинг, то він напевно зможе робити те, що мені потрібно, незалежно від того, що я роблю. І навпаки, якщо ви не написали компілятор своєю мовою, є велика ймовірність, що він пропустить щось, що для когось дійсно важливо, тому що мовні виконавці ніколи не повинні писати програму, яка вимагає від них думати про всі ці проблеми.
Велика справа №2: від 30 000 футів дивовижна кількість проблем виглядає так само, як і компілятори.
Компілятори беруть потік символів, з'ясовують їх структуру за деякими заздалегідь визначеними доменними правилами та перетворюють їх в інший потік символів. Звучить досить загально, чи не так? Ну так.
Незалежно від того, працюєте ви в команді Visual C ++ чи ні, вам дуже часто доведеться робити щось, що схоже на частину компілятора. Я роблю це буквально кожен день.
На відміну від більшості інших професій, програмісти не просто використовують інструменти, а будують власні інструменти. Програміст, який не може (через недостатню майстерність або відсутність корисних інструментів, за допомогою яких можна побудувати інші інструменти), інструменти для запису назавжди буде обмежений, обмежуючись лише інструментами, які надає хтось інший.
Якщо мова не "підходить для створення" програм, які можуть приймати потік символів, застосовуючи до них правила та перетворюючи її в інший потік символів, це звучить як досить обмежена мова, а не така, яка була б корисною для мене.
(На щастя, я не думаю, що існує багато мов програмування, які не підходять для трансформації символів. C, мабуть, є однією з найгірших таких мов, які використовуються сьогодні, але компілятори C, як правило, розміщуються самостійно, так що ніколи нікого не зупиняли.)
Третя причина, яку я закінчу, з особистого досвіду, не згадуваної Йегге (тому що він не писав про "чому самостійно влаштовувати хазяїна"): це витрушує помилки. Коли ви пишете компілятор, це означає , що кожен раз , коли ви побудувати його (не тільки кожен раз , коли ви запустите його), ви залежите від нього , щоб працювати, і працювати правильно з пристойного розміром кодового (сам компілятором).
Цього місяця я використовую порівняно новий і відомий некомплектний компілятор (ви, напевно, можете здогадатися, який із них), і я не можу пройти 2 дні, без того, що б це було зроблено. Цікаво, скільки дизайнерам насправді довелося цим користуватися.