Saya selalu bertanya-tanya, dan mungkin saya perlu pelajaran sejarah yang baik tentang bahasa pemrograman. Tetapi karena sebagian besar kompiler saat ini dibuat dalam C, bagaimana kompiler pertama dibuat (AKA sebelum C) atau semua bahasa hanya ditafsirkan?
Dengan itu dikatakan, saya masih tidak mengerti bagaimana bahkan bahasa assembly pertama dilakukan, saya mengerti apa bahasa assembly tapi saya tidak melihat bagaimana mereka membuat bahasa assembly pertama SANGAT bekerja (seperti, bagaimana mereka membuat yang pertama perintah (suka mov R21
) atau tidak diatur ke setara biner?
Jawaban:
Ha, saya sudah melakukan ini. Banyak CPU memiliki instruksi sederhana, ukuran tetap yang panjangnya hanya beberapa byte. Untuk CPU sederhana seperti Motorola 6800 misalnya, Anda dapat memasukkan semua instruksinya pada selembar kertas . Setiap instruksi akan memiliki opcode dua byte yang terkait dengannya, dan argumen. Anda dapat menyusun program dengan mencari opcode setiap instruksi. Anda kemudian akan menulis program Anda di atas kertas , membubuhi keterangan setiap instruksi dengan opcode yang sesuai. Setelah menulis program Anda, Anda dapat membakar setiap opcode secara berurutan ke EPROMyang kemudian akan menyimpan program Anda. Sambungkan EPROM ke CPU dengan instruksi yang tepat di alamat yang benar, dan Anda memiliki program kerja yang sederhana. Dan untuk menjawab pertanyaan Anda selanjutnya, ya. Itu menyakitkan (kami melakukan ini di sekolah menengah). Tapi saya harus mengatakan bahwa memasang setiap chip di komputer 8-bit dan menulis program secara manual memberi saya pemahaman mendalam tentang arsitektur komputer yang mungkin tidak bisa saya dapatkan dengan cara lain.
Chip yang lebih canggih (seperti x86) jauh lebih sulit untuk kode tangan, karena mereka sering memiliki instruksi panjang variabel. Prosesor VLIW / EPIC seperti Itanium hampir tidak mungkin untuk kode tangan secara efisien karena mereka berurusan dengan paket instruksi yang dioptimalkan dan dirakit oleh kompiler canggih. Untuk arsitektur baru, program hampir selalu ditulis dan dirakit di komputer lain terlebih dahulu, kemudian dimuat ke dalam arsitektur baru. Bahkan, untuk perusahaan seperti Intel yang benar-benar membangun CPU, mereka dapat menjalankan program aktual pada arsitektur yang belum ada dengan menjalankannya pada simulator. Tapi saya ngelantur ...
Sedangkan untuk kompiler, yang paling sederhana, mereka bisa sedikit lebih dari program "cut and paste". Anda dapat menulis "bahasa tingkat tinggi" yang sangat sederhana, tidak dioptimalkan, yang hanya mengelompokkan bersama instruksi bahasa rakitan sederhana tanpa banyak usaha.
Jika Anda ingin riwayat kompiler dan bahasa pemrograman, saya sarankan Anda GOTO sejarah FORTRAN .
sumber
Itulah kompilasi bootstrap tentang (karena tidak ada yang menyebutkan bagaimana itu disebut =).
sumber
Pada akhirnya semua komputer beroperasi pada kode biner, yang dimasukkan ke dalam CPU. Kode biner ini sangat alami untuk CPU, tetapi juga sangat tidak berguna bagi manusia. Salah satu cara pertama untuk menulis sebuah program adalah dengan membuat lubang pada kartu. Posisi lubang mewakili posisi bit tertentu dalam sebuah kata, dan ada atau tidaknya lubang ditafsirkan sebagai nol atau satu. Kartu-kartu ini dimasukkan ke dalam urutan yang benar dalam sebuah kotak, dan kemudian dimasukkan ke dalam pembaca kartu, yang secara efektif mengubahnya menjadi kode biner untuk CPU (dan hidup Anda secara efektif hangus jika Anda menjatuhkan kotak itu).
Jelas pemrogram pertama mengerjakan kode biner satu per satu dan memiliki mesin untuk meninju kartu. Ini pada dasarnya adalah pemrograman bahasa rakitan di tangan dan lutut Anda. Setelah Anda memilikinya, Anda dapat membuat semua hal lain dari itu: editor teks sederhana, kompiler bahasa assembly (untuk mengubah pernyataan perakitan teks menjadi kode biner), linker dan loader. Dan sisanya, seperti kata mereka, adalah sejarah.
sumber
Sedikit googling muncul Pesanan Awal EDSAC dari akhir 40-an. Karena itu adalah assembler pertama, itu mungkin dikodekan dalam bahasa mesin.
Kemudian datang assembler untuk mesin lain, seperti SOAP I dan II untuk IBM 650. SOAP saya juga mungkin dikodekan dalam bahasa mesin, meskipun saya belum menemukan pernyataan definitif.
Beberapa saat kemudian datang Fortran (penerjemah rumus), untuk IBM 704. Agaknya itu ditulis dalam assembler untuk 704. Assembler awal untuk 701 dikreditkan ke Nathan Rochester .
Jika Anda ingin mendapatkan ide bagaimana memprogram komputer dalam bahasa mesin, lihat salah satu situs favorit saya, komputer relai Harry Porter .
sumber
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.
sumber
Dengan asumsi Anda mulai dengan set instruksi kosong dan tidak ada yang lain, Anda akan mulai dengan membuat assembler atau kompiler minimal , yang hampir tidak berfungsi yang dapat memuat file, parsing subset minimal dari bahasa target, dan menghasilkan executable file sebagai output, dengan menulis kode mesin mentah menggunakan hex editor atau sejenisnya.
Anda kemudian akan menggunakan kompiler atau assembler yang baru saja berfungsi untuk mengimplementasikan kompiler atau assembler yang sedikit lebih mampu yang dapat mengenali subset yang lebih besar dari bahasa target. Busurkan, bilas, ulangi, sampai Anda memiliki produk akhir.
sumber
Tidak begitu sulit, seperti yang terlihat. Di masa kecil;) Saya membuat beberapa x86 dalam pikiran.
Anda bahkan tidak perlu mempelajarinya terutama. Itu hanya terjadi, ketika Anda dapat memprogram dalam ASM dan kemudian mencoba untuk memperbaiki biner pihak ketiga menggunakan disassembler interaktif. Atau saat menulis perlindungan Anda sendiri dengan enkripsi kode.
Yaitu kadang-kadang Anda bermigrasi bahkan dari bahasa ke kode tanpa heran.
sumber
Kompiler pertama diimplementasikan menggunakan bahasa assembly. Dan assembler pertama diimplementasikan oleh program pengkodean dalam biner ...
Belum lama ini bahwa pemrograman dalam biner masih merupakan keterampilan yang digunakan orang.
Ketika saya masih sarjana, saya ingat melakukan latihan pemrograman yang mengharuskan menulis sebuah program kecil dalam kode mesin PDP-8 (saya pikir), memasukkannya melalui saklar panel depan, dan menjalankannya. Saya beberapa tahun kemudian, saya membeli sendiri kit pengembangan sistem 6502 yang memiliki tombol hex untuk memasukkan program ... dan 4k byte RAM.
sumber
JAWABAN SANGAT SEDERHANA Misalkan kita menulis program bawaan dan menyimpannya dalam ROM. Itu dapat dianggap sebagai kompiler. Jadi saya hanya ingin mengatakan bahwa kompiler pertama adalah bawaan. Ketika teknologi ditingkatkan, kompiler sederhana ini kemudian digunakan untuk menulis kompiler tingkat tinggi.
sumber