Можна (якщо нудно) писати прямий машинний код. Можливо, ви записуєте програму в асемблері на аркуші паперу, а потім переводите її вручну в числові інструкції машинного коду, які ви вводите в пам'ять машини. Ви навіть можете пропустити крок асемблера на папері, якщо ви запам'ятали числові значення всіх інструкцій машинного коду - не рідкість у ті дні, вірите чи ні!
Найперші комп’ютери безпосередньо програмувались у двійковій формі шляхом перемикання фізичних комутаторів. Це було великим покращенням продуктивності, коли еволюціонувало обладнання, яке дозволяло програмісту (або помічнику введення даних) вводити код у шістнадцяткових цифрах за допомогою клавіатури!
Асемблер програмного забезпечення став актуальним лише тоді, коли стало доступно більше пам’яті (оскільки код асемблера займає більше місця, ніж сировинний код машини) та обладнання, що розвивалося, щоб дозволити буквено-цифровий ввід. Тож перші асемблери були написані безпосередньо людьми, які добре володіють машинним кодом.
Коли у вас є асемблер, ви можете написати компілятор для мови вищого рівня в асемблері.
Історія для C має кілька кроків. Перший компілятор C був написаний на B (попередник C), який, у свою чергу, був написаний у BCPL. BCPL є досить простою мовою (наприклад, вона взагалі не має типів), але все-таки є кроком від сировинного асемблера. Отже, ви бачите, як поступово складніші мови будуються на більш простих мовах аж до асемблера. А сам C - це досить мала і проста мова за сучасними мірками.
Сьогодні перший компілятор для нової мови часто пишеться на С, але коли мова досягає певної зрілості, вона часто переписується "сама по собі". Перший компілятор Java був написаний на C, але пізніше переписаний на Java. Перший компілятор C # був написаний на C ++, але останнім часом він був переписаний на C #. Компілятор / інтерпретатор Python написаний на C, але проект PyPy - це спроба переписати його в Python.
Не завжди можливо скласти компілятор / перекладач для мови на самій мові. Інтерпретатор JavaScript, написаний на JavaScript, існує, але компілятори / інтерпретатори в поточних браузерах все ще записуються на C або C ++ з міркувань продуктивності. JavaScript, написаний на JavaScript, занадто повільний.
Але вам не потрібно використовувати C як "початкову мову" для компілятора. Перший компілятор F # був написаний в OCaml, що є іншою мовою, найбільш тісно пов'язаною з F #. Коли компілятор завершився, він був переписаний у F #. Перший компілятор для Perl 6 був написаний на Haskell (чиста функціональна мова, сильно відрізняється від Perl), але зараз компілятор написаний на C.
Цікавий випадок «Руст», де перший компілятор був написаний в OCaml (зараз він переписаний у «Rust»). Це помітно, оскільки OCaml, як правило, вважається вищим рівнем, ніж Rust, що є мовою систем, наближених до металу. Тож це не завжди мови вищого рівня, реалізовані в мовах нижчого рівня, це може бути і навпаки.