Стив Йегге написал отличный пост в блоге, который несколько косвенно касается этого.
Важный момент # 1: компиляторы охватывают практически все аспекты информатики. Это курс высшего уровня, потому что вам нужно знать все, что вы изучаете в учебной программе по информатике, чтобы начать. Структуры данных, поиск и сортировка, асимптотическая производительность, раскраска графа? Это все там.
Есть причина, по которой Кнут работал над своим монументальным (и бесконечным) «Искусством компьютерного программирования» в течение нескольких десятилетий, хотя он начинал как (просто) учебник по компиляции. Точно так же, как Карл Саган сказал: «Если вы хотите сделать яблочный пирог с нуля, вы должны сначала изобрести вселенную», если вы хотите написать компилятор, вы должны сначала разобраться почти со всеми аспектами информатики.
Это означает, что если компилятор размещается самостоятельно, то он вполне может делать то, что мне нужно, независимо от того, что я делаю. И наоборот, если вы не написали компилятор на своем языке, есть большая вероятность, что он упустит что-то, что действительно важно для кого-то, потому что разработчикам языка никогда не приходилось писать программу, которая заставляла бы их думать обо всех этих проблемах.
Важный момент № 2: с высоты 30 000 футов удивительное количество проблем выглядит как компиляторы.
Компиляторы берут поток символов, выясняют их структуру в соответствии с некоторыми предварительно определенными правилами для конкретного домена и преобразуют их в другой поток символов. Звучит довольно широко, не так ли? Ну, да.
Независимо от того, работаете ли вы в команде Visual C ++ или нет, вам очень часто придется делать что-то, что выглядит как часть компилятора. Я делаю это буквально каждый день.
В отличие от большинства других профессий, программисты не просто используют инструменты, но создают свои собственные инструменты. Программист, который не может (из-за нехватки навыков или из-за отсутствия полезных инструментов для создания других инструментов) писать инструменты, навсегда останется инвалидом, ограниченным инструментами, которые кто-то другой предоставляет.
Если язык «не подходит для создания» программ, которые могут принимать поток символов, применять к ним правила и преобразовывать его в другой поток символов, это звучит как довольно ограниченный язык, а не тот, который был бы полезен мне.
(К счастью, я не думаю, что есть много языков программирования, которые плохо подходят для преобразования символов. C, вероятно, является одним из худших таких языков, используемых в настоящее время, однако компиляторы C, как правило, размещаются самостоятельно, поэтому никогда никого не останавливали.)
Третья причина, на которой я закончу, на личном опыте, не упомянутой Йегге (потому что он не писал о том, «почему сам хозяин»): это избавляет от ошибок. Когда вы пишете компилятор, что означает , что каждый раз , когда вы построить его (не только каждый раз , когда вы запустите его), вы зависите от него , чтобы работать, и работать правильно с приличного размером кодового (сам компилятором).
В этом месяце я использую относительно новый и известный компилятор, не являющийся хостом (вы, вероятно, можете догадаться, какой именно), и я не смогу пройти 2 дня, не запустив эту проблему. Интересно, сколько дизайнеры действительно должны были использовать это.