A компилятор , вероятно, мог быть написан на любом языке. В своей основной форме компилятор просто преобразует код с одного языка на другой. В том смысле, что большинство людей сегодня используют термин «компилятор», они относятся к чему-то, что принимает исходный код какого-либо языка более высокого уровня и преобразует его либо в ассемблер, либо в какой-либо промежуточный язык низкого уровня ( CIL ) .
Иногда да, иногда нет. Принято пытаться реализовать компилятор для нового языка на самом языке как можно скорее, частично для того, чтобы доказать, что он может выполнять «тяжелую работу».
Но, конечно, вам сначала понадобится компилятор или, по крайней мере, интерпретатор, чтобы запустить этот компилятор и заставить его скомпилировать себя - так что сначала вам нужно реализовать его на другом языке.
А для многих специализированных языков написание компилятора на самом языке нецелесообразно, потому что язык не предназначен для таких вещей, как компиляторы.
Компиляторы часто пишутся на языке, на котором написан компилятор. Например, компилятор языка C обычно написан на языке C.
... что вызывает вопрос "как скомпилировать его в первый раз?". На него я слышал два ответа: либо компилировать вручную (как бы страшно это ни звучало), либо схитрить и использовать существующий компилятор для этого языка.
Как заметил @jball, прочитайте статью в Википедии о Bootstrapping для получения полной информации.
На каком языке есть что-нибудь? gcc , например, написан на C .
Однажды была история об интерпретаторе Лиспа , написанном на Лиспе.
Это поднимает следующий вопрос - если компилятор C написан на C, то что скомпилировало первый компилятор C? Для этого прочтите здесь .
Вот пара примеров:
В общем, компиляторы могут быть написаны на любом языке, который на самом деле достаточно мощный для написания компилятора. Это, очевидно, включает любой Tu кольцевой язык. Но возможно даже написать компилятор на языке, не являющемся полным по Тьюрингу. (Например, я не вижу очевидной причины, по которой компилятор не может быть полной функцией, но общие функции, очевидно, не являются полными по Тьюрингу.)
На практике, однако, компиляторы в основном написаны на трех конкретных классах языков с разными плюсами и минусами:
Все это по сути компромиссы: написание компилятора на одном языке облегчает понимание, потому что вам не нужно изучать другой язык. Это также может затруднить понимание, потому что язык на самом деле не очень хорош для написания компиляторов. (Представьте, например, написание компилятора SQL на SQL.) Возможно, даже невозможно написать компилятор, например (для довольно общего определения «языка» и «компилятора») это невозможно. написать компилятор CSS в CSS или компилятор HTML в HTML.
С другой стороны: написание компилятора на специализированном языке написания компилятора, вероятно, упрощает его понимание, но в то же время требует от вас изучения нового языка.
Обратите внимание, что эти три класса не являются непересекающимися: компилятор может относиться к более чем одному классу. Например, компилятор для специализированного языка написания компиляторов, написанный сам по себе, попадает как в категорию 1 (написан сам по себе), так и в категорию 3 (написан на языке, который хорошо умеет писать компиляторы).
В некоторых случаях вы действительно можете попасть в золотую середину. Например, F # - это собственный язык с собственной скоростью интерфейса командной строки, и он очень хорош для написания компиляторов. Итак, написание компилятора F # на F # дает вам №1 (запись сама по себе), №2 (запись на родном, быстром языке) и №3 (запись на языке, который хорошо подходит для написания компиляторов). То же относится и к Scala.