Bagaimana kompiler pertama ditulis?

166

Saya mendengar tentang ayam dan telur serta tali sepatu. Saya punya beberapa pertanyaan.

Apa yang menulis kompiler pertama yang mengubah sesuatu menjadi instruksi biner?

Apakah assembly dikompilasi atau diterjemahkan ke dalam instruksi biner?

... Saya merasa sulit untuk percaya bahwa mereka menulis kompiler dalam biner.

Shawn Mclean
sumber
@nawfal, ini adalah perbedaan antara bahasa pemrograman baru dan kompiler pertama, jadi tidak - ini bukan duplikat
@ PauliSudarshanTerho apa bedanya? Semangat pertanyaannya sama. Anda tidak dapat menulis bahasa pemrograman, pertanyaan itu pada gilirannya berbicara tentang kompiler pertama.
nawfal
Dalam imajinasi spiritual Anda, mungkin? Pada kenyataannya Anda tidak menemukan apa pun yang disebutkan tentang kompiler pertama di tautan itu. Dan Anda seharusnya tidak menyarankan siapa pun menulis bahasa baru untuk memulai dari awal. Dan jika demikian, mengapa Anda ingin menyembunyikan jawaban tentang bagaimana kompiler pertama ditulis jika penting untuk menulis bahasa baru?
Belajar dari saya - Ini adalah duplikat: stackoverflow.com/questions/4772768/…

Jawaban:

133

Instruksi perakitan adalah (umumnya) pemetaan langsung ke opcodes, yang merupakan (multi) nilai byte kode mesin yang dapat langsung ditafsirkan oleh prosesor. Sangat mungkin untuk menulis sebuah program dalam opcodes secara langsung dengan mencari mereka dari sebuah tabel (seperti ini untuk mikroprosesor 6039 , misalnya) yang mencantumkannya dengan instruksi perakitan yang cocok, dan menentukan alamat / offset memori untuk hal-hal lain. seperti melompat.

Program pertama dilakukan persis seperti ini - opcodes tulisan tangan.

Namun, sebagian besar waktu lebih mudah menggunakan assembler untuk "mengkompilasi" kode perakitan, yang secara otomatis melakukan pencarian opcode ini, serta membantu dalam menghitung alamat / offset untuk label lompat bernama, dan lain-lain.

Perakit pertama ditulis dengan tangan. Perakit tersebut kemudian dapat digunakan untuk merakit perakit yang lebih rumit, yang kemudian dapat digunakan untuk merakit kompiler yang ditulis untuk bahasa tingkat yang lebih tinggi, dan seterusnya. Proses penulisan iteratif alat-alat untuk menyederhanakan penciptaan set alat berikutnya disebut (seperti yang disebutkan oleh David Rabinowitz dalam jawabannya) bootstrap .

Amber
sumber
18
Komputer pertama saya adalah mesin berbasis Z80 di mana monitor ROM saya harus merakit tangan bootstrap loader untuk memunculkan dasar-dasar sistem operasi (CP / M) sehingga saya dapat merakit sisa dari sistem operasi tersebut ke dalam sistem kerja. , lengkap dengan bootstrap loader berbasis disk. Waktu yang menyenangkan. Jadi ya, Anda bisa merakit tangan dengan baik. Ini lambat dan menyakitkan dan rawan kesalahan (itulah sebabnya kami mengotomatiskan hal-hal) tetapi itu mungkin.
HANYA SAYA PENDAPAT benar
The link pertama rusak.
Luke
Ditulis dengan tangan. Bagaimana? Kabel atau kartu meninju? Saya kira mereka memiliki keypad heksadesimal.
44

Silakan baca tentang bootstrap kompiler dan sejarah penulisan kompiler

Idenya adalah untuk menulis kompiler yang sangat sederhana secara langsung dalam kode mesin, menggunakannya untuk menulis kompiler yang lebih canggih, gunakan yang kedua untuk membangun yang ketiga dan seterusnya sampai Anda dapat memiliki kompiler berfitur lengkap.

David Rabinowitz
sumber
36

Telur ayam sebelum lama. Jawaban untuk sebagian besar masalah "ayam dan telur" adalah sama: evolusi. Beberapa orang juga kesulitan mempercayai evolusi biologis, tetapi ketidakpercayaan bukanlah sebuah argumen (google argumentum ad ignorantiam).

Untuk langsung menjawab pertanyaan Anda: kompiler pertama ditulis (oleh manusia) dalam bahasa rakitan - program yang disebut assembler akan menerjemahkan bahasa rakitan menjadi biner; ini adalah proses yang jauh lebih sederhana daripada kompilasi karena bahasa rakitan hanyalah bentuk simbolis dari bahasa mesin yang menggunakan nama opcode alih-alih angka, mewakili alamat dengan simbol, dan sebagainya. Banyak kompiler selanjutnya ditulis dalam bahasa assembly juga. Namun C compiler pertama adalah B compiler dimodifikasi, yang ditulis dalam B . Kompiler B pertama ditulis dalam TMG . Kompiler TMG yang digunakan untuk mengkompilasi bahwa kompiler B ditulis dalam bahasa assembly PDP-7.

Jim Balter
sumber
24

Woz mengatakan dalam salah satu pembicaraan publiknya bahwa ketika dia mulai, dia tidak mampu membeli kompiler sehingga dia dikompilasi ke biner dengan tangan di atas kertas. Jika Anda ingin melihat sesuatu yang lebih liar, baca tentang kondisi di mana Bill Gates dan Paul Allen menulis BASIC untuk Altair 8800.

Mengenai "menulis komputer dalam biner" - mundur selangkah dari menjadi seorang programmer dan berpikir tentang apa itu komputer awal. Barang tingkat tinggi belum ada - Anda memikirkan segala sesuatu di tingkat rendah karena hanya itu yang ada. Anda memiliki perangkat keras yang dapat melakukan logika dasar dan aritmatika yang Anda manipulasi melalui kode mesin (yang hanya dikompilasi perakitan - Amber menjelaskan mengapa bagian ini tidak sulit dilakukan dengan tangan) dan Anda ingin perangkat keras ini melakukan prestasi matematika tertentu. Anda tidak khawatir tentang sistem operasi yang tidak ada, Anda hanya memberi tahu perangkat keras (dalam perakitan) bagaimana cara memanipulasi angka yang Anda berikan. Itu hanya kalkulator besar. Komputer saat ini dibangun satu abstraksi pada suatu waktu.

Jika Anda ingin menjebol penghalang yang membuat komputer terasa seperti sulap, saya SANGAT merekomendasikan membaca KODE oleh Charles Petzold dan / atau Elemen Sistem Komputasi . Hanya dengan pengetahuan dasar pemrograman, buku-buku yang sangat mudah diakses ini akan membuat Anda memahami komputer dari atas ke bawah. Jelas, seseorang tidak bisa mendapatkan komputer. sci. atau gelar EE setelah hanya 2 buku, tapi bisa saya katakan sebagai programmer otodidak yang ketinggalan pelatihan formal: buku-buku ini mengguncang dunia saya!

Dina
sumber
2
Menulis penerjemah Altair BASIC setelah melakukan promosi dagang? Menyandikan bootstrapper saat naik pesawat ke Albuquerque? Kedengarannya agak konyol. Dan menyenangkan.
Ehtesh Choudhury
2
@Shurane: ha! Poin itu juga relevan tetapi bagi saya seluk beluk bagaimana mereka membuat penerjemah BASIC dan bagaimana kelompok menjejalkannya ke dalam ruang kecil adalah sesuatu yang indah dan kemampuan pemrograman / peretasan yang mencengangkan.
Dinah
10

Apa yang menulis kompiler pertama yang mengubah sesuatu menjadi instruksi biner?

Manusia melakukannya. Baca tentang sistem A-0 :

Pada tahun 1952, Grace Hopper menyelesaikan kompiler pertamanya untuk Sperry, yang dikenal sebagai A-0. Sistem A-0 adalah seperangkat instruksi yang dapat menerjemahkan kode matematika simbolis ke dalam bahasa mesin. Dalam memproduksi A-0, dia mengambil semua subrutin yang telah dia kumpulkan selama bertahun-tahun dan merekamnya. Setiap rutin diberi nomor panggilan, sehingga mesin itu dapat menemukannya di kaset. "Yang harus saya lakukan adalah menulis satu set nomor panggilan, biarkan komputer menemukannya di kaset, bawa dan lakukan penambahan. Ini adalah kompiler pertama," seperti dijelaskan oleh Grace.

Sinan Ünür
sumber
1
Tautannya tampaknya 404 sekarang, bagaimanapun, "Grace" di atas adalah Grace Hopper.
Volker Stolz
2
Saya pernah mendengar bahwa Hopper menulis kompiler pertama, tetapi deskripsi di atas membuatnya terdengar lebih seperti penghubung daripada kompiler. Tetap saja, cerita yang bagus. Sungguh menakjubkan untuk berpikir ada saat ketika para ilmuwan komputer skeptis tentang gagasan penyusun ...
Mark E. Haase
1
@memenuhi ini sebabnya disebut "kompiler". itu membuat kompilasi rutin, yang masing-masing (berpotensi) ditulis dalam bahasa mesin secara langsung.
Elazar
@ MarkE.Haase Orang-orang yang dimaksud Hopper di sini adalah insinyur aplikasi dan ilmuwan yang menggunakan komputer untuk tugas-tugas perhitungan tertentu; mereka bukan "ilmuwan komputer". Ada beberapa cyberneticists sekitar pada tahun 1952, tetapi saya ragu bahwa dia berbicara dengan mereka.
Jim Balter
9

Program pertama ditulis dalam kode mesin (bukan bahasa rakitan) - angka aktual dicolokkan ke memori komputer menggunakan sakelar. Kami telah datang jauh ...

Kadang-kadang ini masih terjadi sebagian kecil - untuk menambal bit kode kecil atau membuat thunks. Saya ingat meninju angka ke dalam string Dasar yang kemudian dieksekusi sebagai subrutin kecil, cepat pada micros awal. Saya juga ingat toggling switch pada panel depan PDP-11 untuk memasukkan program bootloader ke dalam memorinya untuk kursus universitas.

Program-program ini kadang-kadang digunakan untuk memproses file teks untuk membuat program lain, dan bahasa pemrograman voila dibuat.

Michael Burr
sumber
Pertanyaannya adalah tentang kompiler pertama, bukan program pertama secara umum, meskipun kadang-kadang program adalah kompiler; sejarah keduanya tidak sama. (Sebuah analogi: jawaban atas pertanyaan kapan binatang pertama kali muncul di Bumi bukanlah jawaban atas pertanyaan kapan kucing pertama kali muncul di Bumi, meskipun kucing adalah binatang.)
Jim Balter