Mungkin (jika membosankan) untuk menulis kode mesin langsung. Mungkin Anda menuliskan program dalam assembler di selembar kertas, dan kemudian Anda menerjemahkannya dengan tangan ke dalam instruksi kode mesin numerik yang Anda masukkan ke dalam memori mesin. Anda bahkan dapat melewatkan langkah assembler-on-paper jika Anda telah menghafal nilai numerik dari semua instruksi kode mesin - tidak jarang pada masa itu, percaya atau tidak!
Komputer pertama diprogram secara langsung dalam biner dengan mengaktifkan sakelar fisik. Itu adalah peningkatan produktivitas yang hebat ketika perangkat keras berevolusi untuk membiarkan programmer (atau asisten entri data) memasukkan kode dalam angka heksadesimal melalui keypad!
Assembler perangkat lunak hanya menjadi relevan ketika lebih banyak memori tersedia (karena kode assembler membutuhkan lebih banyak ruang daripada kode mesin mentah) dan perangkat keras berevolusi untuk memungkinkan input alfanumerik. Jadi assembler pertama ditulis langsung oleh orang yang fasih dalam kode mesin.
Ketika Anda memiliki assembler, Anda dapat menulis kompiler untuk bahasa tingkat yang lebih tinggi di assembler.
Kisah untuk C memiliki beberapa langkah. Kompiler C pertama ditulis dalam B (pendahulu C) yang pada gilirannya ditulis dalam BCPL. BCPL adalah bahasa yang cukup sederhana (misalnya tidak memiliki tipe sama sekali), tetapi masih merupakan langkah maju dari assembler mentah. Jadi, Anda dapat melihat bagaimana bahasa yang lebih rumit secara bertahap dibangun dalam bahasa yang lebih sederhana sampai ke assembler. Dan itu sendiri C adalah bahasa yang sangat kecil dan sederhana menurut standar todays.
Saat ini, kompiler pertama untuk bahasa baru sering ditulis dalam C, tetapi ketika bahasa mencapai kematangan tertentu sering ditulis ulang "dalam dirinya sendiri". Kompiler Java pertama ditulis dalam C, tetapi kemudian ditulis ulang dalam Java. Compiler C # pertama ditulis dalam C ++, tetapi baru-baru ini telah ditulis ulang dalam C #. Compiler / interpreter Python ditulis dalam C, tetapi proyek PyPy adalah upaya untuk menulis ulang dengan Python.
Namun tidak selalu layak untuk menulis kompiler / juru bahasa untuk bahasa itu sendiri. Penerjemah JavaScript yang ditulis dalam JavaScript ada, tetapi kompiler / juru bahasa di browser saat ini masih ditulis dalam C atau C ++ untuk alasan kinerja. JavaScript yang ditulis dalam JavaScript terlalu lambat.
Tetapi Anda tidak harus menggunakan C sebagai "bahasa awal" untuk kompiler. Kompiler F # pertama ditulis dalam OCaml, yang merupakan bahasa lain yang paling dekat hubungannya dengan F #. Ketika kompiler selesai, itu ditulis ulang dalam F #. Kompiler pertama untuk Perl 6 ditulis dalam Haskell (bahasa fungsional murni yang sangat berbeda dari Perl) tetapi sekarang memiliki kompiler yang ditulis dalam C.
Kasus yang menarik adalah Rust, di mana kompiler pertama ditulis dalam OCaml (sekarang ditulis ulang di Rust). Ini penting karena OCaml umumnya dianggap tingkat yang lebih tinggi daripada Rust, yang merupakan bahasa sistem yang lebih dekat dengan logam. Jadi tidak selalu bahasa tingkat tinggi diimplementasikan dalam bahasa tingkat rendah, mungkin juga sebaliknya.