Компиляторы - это служебные программы - они превращают текст языка программирования в машинный код. Если язык программирования описывает программное обеспечение, это просто компилятор .....
Компиляторы также могут создавать машинный код для других архитектур. Например, Apple компилирует iOS с использованием стоек серверов на базе Intel. Компилятору не нужно запускать генерируемый им код ARM, просто запишите его на диск.
Компилятор 2.0 должен быть написан на языке, который может обработать компилятор 1.0, но он, безусловно, может создать компилятор 2.0 с более новыми функциями, такими как оптимизация. Затем вы можете заново скомпилировать исходный код с помощью компилятора 2.0 и сделать лучшую версию самого себя. Опять же, компилятор не знает, что делает другую версию самого себя.
Если мы пойдем достаточно далеко назад в глубь веков времени, тогда мы действительно достигнем точки, где у нас нет компилятора, - самой первой итерации языка высокого уровня. Затем мы должны достать карандаши и книги с кодами операций и написать первый в сборке. Как мы написали первый ассемблер? Прямой ввод машинного кода, возможно, на перфорированной бумажной ленте или переключателях на передней панели.