Mengapa kompiler pertama ditulis sebelum penerjemah pertama?

72

Kompiler pertama ditulis oleh Grace Hopper pada tahun 1952 sedangkan interpreter Lisp ditulis pada tahun 1958 oleh murid John McCarthy Steve Russell. Menulis kompiler sepertinya masalah yang jauh lebih sulit daripada seorang juru bahasa. Jika demikian, mengapa kompiler pertama ditulis enam tahun sebelum penerjemah pertama?

anguyen
sumber
67
karena ada lebih banyak kebutuhan untuk kompiler daripada seorang penerjemah pada saat itu
ratchet freak
23
Untuk mengkompilasi interpreter pertama? : P (hanya sebagian lidah di pipi, seorang juru bahasa adalah kompleks (lebih dari kompiler sederhana) dan akan sulit untuk menulis yang efisien dalam kode mesin)
Vality
4
Jika Anda mengambil instruksi eksekusi CPU Anda sebagai menafsirkannya, yang merupakan cara saya melihatnya (namun diimplementasikan melalui perangkat keras), maka klaim bahwa juru bahasa pertama ditulis setelah kompiler pertama tidak berlaku. Btw, saya tahu ini tidak membantu dengan pertanyaan / jawaban. Itu hanya dimaksudkan sebagai komentar yang menarik pada sudut pandang yang berbeda.
Pedro Henrique A. Oliveira
11
McCarthy tidak menulis penerjemah LISP. McCarthy menemukan formalisme matematika. Steve Russell, salah satu siswa di MIT AI Lab pada saat itu, menyadari bahwa ia dapat menulis penerjemah untuk mengeksekusi penerbangan mewah McCarthy, dan sisanya adalah sejarah.
John R. Strohm
5
Bahkan, saya mendengar bahwa McCarthy percaya LISP tidak dapat diterapkan. Russell yang menyadari bahwa fungsi universal McCarthy dari manual LISP a) adalah seorang juru bahasa dan b) dapat diterapkan.
Jörg W Mittag

Jawaban:

97

Menulis kompiler sepertinya masalah yang jauh lebih sulit daripada seorang juru bahasa.

Itu mungkin benar hari ini, tetapi saya berpendapat bahwa itu tidak terjadi sekitar 60 tahun yang lalu. Beberapa alasan mengapa:

  • Dengan penerjemah, Anda harus menyimpannya dan program dalam ingatan. Di zaman di mana memori 1kb adalah kemewahan besar, menjaga agar jejak memori tetap rendah adalah kuncinya. Dan menafsirkan membutuhkan sedikit lebih banyak memori daripada menjalankan program yang dikompilasi.
  • CPU modern sangat kompleks dengan katalog besar instruksi. Jadi menulis kompiler yang bagus benar-benar sebuah tantangan. CPU lama jauh lebih sederhana, jadi kompilasi pun lebih sederhana.
  • Bahasa modern jauh lebih kompleks daripada bahasa lama, jadi bahkan kompiler jauh lebih kompleks. Dengan demikian, bahasa-bahasa lama akan memiliki kompiler yang lebih sederhana.
Euforia
sumber
65
dan tanpa kompiler, Anda harus menulis juru bahasa di assembly
ratchet freak
34
Kompiler pertama di mana orang. (Ketika orang menjadi penerjemah, kami tidak membutuhkan komputer). Maka seseorang pasti mempertimbangkan untuk menulis kompiler dalam bahasa yang dikompilasi (satu-satunya yang mereka miliki, tetapi sebagai waktu mengkompilasi manusia saya).
ctrl-alt-delor
1
Sebenarnya .... Saya baru-baru ini membaca bahwa Komputer Panduan Apollo yang digunakan dalam penerbangan bulan 60-an memiliki penerjemah: entri wiki "... penerjemah memberikan lebih banyak instruksi daripada yang didukung secara AGC ..." Saya kira "penerjemah" ini adalah lebih seperti juru bahasa "Sweet 16" yang tertanam di komputer Apple II lama daripada sesuatu seperti LISP.
Calphool
6
@ scratchetfreak Dan itu. Seperti kompiler pertama.
RBarryYoung
3
@ Richard: Ketika orang menjadi penerjemah / kalkulator, jabatan mereka disebut "komputer". Jadi ketika orang menjadi penerjemah, mereka adalah komputer, secara literal. Proyek Manhattan mempekerjakan ribuan "komputer" (jabatan yang sebenarnya, dengan serius) dan para fisikawan nuklir mengirim perhitungan mereka melalui pos untuk dieksekusi. Sebenarnya, proyek ini juga mempekerjakan ahli matematika yang menjebol perhitungan dari para insinyur yang merumuskan perhitungan dari teori-teori fisikawan untuk dikirim ke "komputer".
Slebetman
42

Poin mendasar adalah bahwa lingkungan perangkat keras komputasi tahun 1950-an membuatnya sedemikian rupa sehingga hanya sebuah kompiler yang layak diberikan pemrosesan batch yang berorientasi pada komputer saat itu.

Pada saat itu antarmuka pengguna yang lebih baik terutama terbatas pada kartu punch dan printer teletype . Pada tahun 1961 sistem SAGE menjadi tampilan Cathode-Ray Tube (CRT) pertama di komputer. Jadi sifat interpreter yang interaktif tidak disukai atau alami sampai kemudian.

Banyak komputer pada 1950-an menggunakan switch panel depan untuk memuat instruksi, dan outputnya hanyalah deretan lampu / LED, dan penggemar bahkan menggunakan switch & LED panel depan ke tahun 1970-an. Mungkin Anda terbiasa dengan Altair 8800 yang terkenal itu .

Keterbatasan perangkat keras lainnya juga membuat juru bahasa menjadi tidak layak. Ada ketersediaan ekstrim terbatas memori primer (misalnya RAM) di komputer pada 1950-an. Sebelum sirkuit terintegrasi semikonduktor (yang tidak datang sampai 1958) memori terbatas pada memori inti magnetik atau memori jalur tunda yang diukur dalam bit atau kata - kata , tanpa awalan. Dikombinasikan dengan lambatnya memori penyimpanan sekunder (misalnya disk atau kaset), akan dianggap boros, jika tidak mustahil memiliki banyak memori yang digunakan untuk penerjemah, bahkan sebelum program yang ditafsirkan dimuat.

Keterbatasan memori masih menjadi faktor utama ketika tim yang dipimpin oleh John Backus di IBM menciptakan compiler FORTRAN pada tahun 1954-57. Kompiler inovatif ini hanya berhasil karena kompiler yang mengoptimalkan .

Sebagian besar komputer di tahun 1950-an nyaris tidak memiliki Sistem Operasi apa pun , apalagi fitur-fitur modern seperti penghubung dinamis dan manajemen memori virtual, sehingga gagasan seorang penerjemah terlalu radikal dan tidak praktis pada waktu itu.

Tambahan

Bahasa tahun 1950-an adalah primitif. Mereka termasuk hanya kecil segelintir operasi, sering dipengaruhi baik oleh instruksi perangkat keras yang mendasari atau definisi masalah penggunaan ditargetkan mereka.

Pada waktu itu, komputer jarang menjadi komputer tujuan umum dalam arti yang kita pikirkan tentang komputer saat ini. Bahwa mereka dapat diprogram ulang tanpa harus dibangun kembali dianggap sebagai konsep revolusioner - sebelumnya orang telah menggunakan mesin elektromekanis (biasanya kalkulator) untuk menghitung atau menghitung jawaban (sebagian besar aplikasi pada tahun 1950 bersifat numerik).

Dari sudut pandang Ilmu Komputer, kompiler dan interpreter sama-sama penerjemah , dan secara umum memiliki kompleksitas yang sama untuk diimplementasikan.

mctylr
sumber
Apakah komputer menggunakan teletipe sebelum waktu berbagi? Saya berharap mereka menggunakan printer garis atau spool untuk tape. Kalau tidak, 1-8 detik komputer harus menunggu setelah setiap baris teks akan mewakili 1-8 detik bahwa komputer bisa - tetapi tidak - melakukan sesuatu yang bermanfaat.
supercat
2
@supercat - ya, teletype digunakan, tetapi mereka jauh dari "interaktif". Komputer pertama yang saya programkan memiliki memori yang terdiri dari 18 bit kata - 1K di antaranya. Memori itu sendiri adalah drum yang berputar , jadi ketika Anda menyalakan komputer Anda harus menunggu sampai memori datang dengan kecepatan. Itu memiliki teletype yang terpasang dan Anda dapat A) membaca karakter yang diketik dari keyboard atau dibaca oleh pembaca pita kertas (dari sudut pandang komputer keduanya sama), B) menulis karakter ke "printer "Dari teletype. Ah, hari yang menyenangkan - Hari yang luar biasa ..! APAKAH GRUEL SAYA HANGAT?!?!? :-)
Bob Jarvis
@ BobJvis: Tahun berapa tahun itu?
supercat
1
@supercat - 1973 - tetapi komputer yang dipermasalahkan (EDP-18, oleh Educational Data Products) relatif lebih tua bahkan saat itu. Namun, itu apa yang kita miliki (dan memiliki setiap komputer untuk main-main dengan di sekolah tinggi di awal-pertengahan 70-an tidak biasa) sehingga kami pikir itu cukup menakjubkan. :-)
Bob Jarvis
2
Ini adalah jawaban yang jauh lebih baik dan lengkap daripada jawaban yang diterima.
Jim Garrison
12

Bahasa pemrograman pertama cukup sederhana (tidak ada rekursi misalnya) dan dekat dengan arsitektur mesin yang juga sederhana. The terjemahan kemudian proses sederhana .

Kompiler lebih sederhana sebagai sebuah program daripada seorang juru bahasa yang harus menyatukan data untuk eksekusi program dan tabel untuk menginterpretasikan kode sumber. Dan penerjemah akan mengambil lebih banyak ruang , untuk dirinya sendiri, untuk kode sumber program dan untuk tabel simbolik.

Memori bisa sangat langka (untuk alasan biaya dan arsitektur) sehingga kompiler bisa menjadi program yang berdiri sendiri yang menimpa sistem operasi (saya memang menggunakan salah satunya). OS harus dimuat ulang setelah dikompilasi untuk menjalankan program yang dikompilasi. ... yang membuatnya jelas bahwa menjalankan juru bahasa untuk pekerjaan nyata sama sekali bukan pilihan .

Memang benar, kesederhanaan yang diperlukan dari kompiler adalah sedemikian rupa sehingga kompiler tidak terlalu bagus (optimasi kode masih dalam masa pertumbuhan, ketika dipertimbangkan sama sekali). Kode mesin tulisan tangan memiliki, setidaknya sampai akhir tahun enam puluhan di beberapa tempat, reputasi secara signifikan lebih efisien daripada kode yang dihasilkan kompiler. Bahkan ada konsep rasio ekspansi kode , yang membandingkan ukuran kode yang dikompilasi dengan pekerjaan programmer yang sangat baik. Biasanya lebih besar dari 1 untuk sebagian besar (semua?) Kompiler, yang berarti program lebih lambat, dan, lebih penting lagi, program yang lebih besar membutuhkan lebih banyak memori. Ini masih menjadi masalah di tahun enam puluhan.

Ketertarikan kompiler adalah kemudahan pemrograman, terutama bagi pengguna yang tidak menghitung spesialis, seperti ilmuwan di berbagai bidang. Minat ini bukan kinerja kode. Tapi tetap saja, waktu programmer dianggap sumber yang murah. Biaya itu dalam waktu komputer, hingga 1975-1980, ketika biaya beralih dari perangkat keras ke perangkat lunak. Yang berarti bahwa bahkan kompiler tidak dianggap serius oleh beberapa profesional .

Biaya waktu komputer yang sangat tinggi adalah alasan lain untuk mendiskualifikasi penafsir , sampai-sampai ide itu sangat menggelikan bagi kebanyakan orang.

Kasus Lisp sangat istimewa, karena itu adalah bahasa yang sangat sederhana yang membuatnya layak (dan komputer menjadi sedikit lebih besar di 58). Lebih penting lagi, interpreter Lisp adalah bukti konsep mengenai self definability Lisp ( meta-circularity ), terlepas dari masalah kegunaan.

Keberhasilan Lisp sebagian besar disebabkan oleh kenyataan bahwa definisi diri ini membuatnya menjadi testbed yang sangat baik untuk mempelajari struktur pemrograman dan merancang bahasa baru (dan juga untuk kenyamanannya untuk komputasi simbolik).

babou
sumber
3
Wah, berani sekali .
Pharap
@Pharap Apakah itu gaya yang tidak pantas? Tujuan saya adalah untuk membuat informasi penting lebih mudah ditemukan, sementara memungkinkan gaya yang lebih bebas daripada penghitungan fakta sederhana. Saya harus mengakui bahwa sepertinya tidak terlalu efektif di situs SE ini.
babou
@ anonim-downvoter Downvoting tanpa komentar yang jelas menunjukkan bahwa seseorang mungkin bodoh. Namun, tidak disebutkan siapa.
babou
4

Saya tidak setuju dengan premis pertanyaan.

Adm. Kompiler pertama Hopper (A-0) lebih seperti linker atau bahasa makro. Dia menyimpan subrutin pada kaset (masing-masing diberi nomor) dan program-programnya akan ditulis sebagai daftar subrutin dan argumen. Kompiler akan menyalin subrutin yang diminta dari tape dan memesannya kembali ke dalam program yang lengkap.

Dia menggunakan kata "kompilasi" dalam arti yang sama seperti seseorang menyusun antologi puisi: mengumpulkan berbagai item menjadi satu volume.

Kompiler pertama itu tidak memiliki lexer atau parser, sejauh yang saya tahu, yang membuatnya menjadi leluhur jauh dari kompiler modern. Dia kemudian membuat kompiler lain (B-0, alias FLOW-MATIC) dengan tujuan sintaksis yang lebih mirip bahasa Inggris, tetapi tidak selesai sampai 1958 atau 1959 - sekitar waktu yang sama dengan interpreter Lisp.

Karena itu, saya pikir pertanyaannya sendiri agak keliru. Tampaknya para penyusun dan penafsir ikut berevolusi hampir persis pada saat yang sama, tidak diragukan lagi karena berbagi gagasan yang akan membuat banyak ilmuwan berpikir sepanjang garis yang sama pada masa itu.

Jawaban yang lebih baik dengan kutipan di sini: https://stackoverflow.com/a/7719098/122763 .

Mark E. Haase
sumber
3

Bagian lain dari persamaan adalah bahwa kompiler adalah abstraksi langkah di atas assembler. Pertama, kami memiliki kode mesin hard-coded. "Kami" adalah assembler. Setiap lompatan dan offset, dll. Dihitung tangan menjadi hex (atau oktal) dan kemudian ditinju ke pita kertas atau kartu. Jadi ketika perakit datang ke tempat kejadian, itu adalah penghemat waktu yang sangat besar. Langkah selanjutnya adalah assembler makro. Itu memberi kemampuan untuk menulis makro yang akan berkembang menjadi seperangkat instruksi mesin. Jadi Fortran dan Cobol adalah langkah maju yang besar. Kurangnya sumber daya (penyimpanan, memori, dan siklus CPU) berarti bahwa penerjemah serba guna harus menunggu teknologi tumbuh. Kebanyakan penerjemah awal adalah mesin byte-code (seperti Java atau CLR saat ini, tetapi dengan kemampuan yang jauh lebih sedikit). UCSD Pascal adalah bahasa yang sangat populer (dan cepat). MS Basic adalah mesin kode byte di bawah tenda.

Dalam hal overhead instruksi, itu benar-benar tergantung pada prosesor apa yang sedang dijalankan. Industri ini mengalami pergolakan besar RISC vs CISC untuk sementara waktu. Saya pribadi menulis assembler untuk IBM, Data General, Motorola, Intel (ketika mereka muncul), TI, dan beberapa lainnya. Ada perbedaan yang cukup signifikan dalam set instruksi, register, dll. Yang akan mempengaruhi apa yang diperlukan untuk "menafsirkan" kode-p.

Sebagai referensi waktu, saya mulai pemrograman di perusahaan telepon sekitar tahun 1972.

Bill Brothers
sumber
2

Jika Anda tidak menyimpan semuanya dalam memori, kode yang dikompilasi jauh lebih cepat. Jangan lupa, bahwa pada saat-saat ini fungsi digabungkan dengan kode yang dikompilasi. Jika Anda tidak mengkompilasi, Anda tidak tahu fungsi apa yang Anda perlukan. Jadi, Anda memanggil fungsi dari ... Oh, belum dari disk, kami berada di awal 50-ikatan, tetapi dari kartu! Dalam runtime!

Tentu saja, adalah mungkin untuk menemukan solusi, tetapi mereka belum ditemukan, karena bahasa sangat sederhana dan tidak jauh dari kode mesin. Dan kompilasi itu mudah dan cukup.

Gangnus
sumber
1

Sebelum kompiler pertama ditulis, orang menulis kode assembler yang merupakan kemajuan besar dibandingkan dengan kode biner biasa. Pada saat itu, ada argumen kuat bahwa kode yang dikompilasi oleh kompiler akan kurang efisien daripada kode assembler - pada saat itu hubungan (biaya komputer) dengan (biaya programmer) jauh, jauh berbeda dari hari ini. Jadi ada resistensi yang kuat terhadap kompiler dari sudut pandang itu.

Tetapi kompiler jauh lebih efisien daripada penerjemah. Jika Anda menyarankan untuk menulis juru bahasa pada saat itu, orang akan mengira Anda gila. Dapatkah Anda bayangkan membeli komputer jutaan dolar dan kemudian menghabiskan 90% dari kekuatannya untuk menafsirkan kode?

gnasher729
sumber
Saya tidak tahu banyak tentang komputer tahun 1950-an, tetapi setidaknya untuk mesin von Neumann sederhana pada dekade-dekade berikutnya, overhead juru bahasa adalah dua hingga lima instruksi (mungkin total empat hingga sepuluh siklus) per instruksi yang ditafsirkan: Dekode, lompat tidak langsung, mungkin dekode argumen tambahan. Jika Anda membuat instruksi yang diartikan menjadi set level cukup tinggi (jadi Anda menjalankan beberapa instruksi mesin per instruksi juru bahasa) ini akan kurang dari 90% dan bahkan mungkin dapat diterima. Lihat juga: Keempat.
3
Sebelum kompiler pertama ditulis, sebagian besar program sebenarnya ditulis dalam kode mesin aktual, bukan bahasa assembly (mnemonics op-code).
mctylr
2
@delnan Sistem-sistem itu berjalan dengan jam di kiloHertz, sehingga membuang pengurangan 3-5 kali dalam kinerja kemungkinan akan menjadi perbedaan antara program yang berhasil diselesaikan sebelum sistem gagal karena kegagalan perangkat keras (yaitu tabung vakum ditiup) atau tidak. Kegagalan perangkat keras adalah kejadian sehari-hari pada 1950-an jika saya ingat dengan benar.
mctylr
delnan: Tunjukkan pada saya seorang penerjemah yang dapat menginterpretasikan dengan overhead lima instruksi. Dan Keempat bukan bahasa yang ditafsirkan, itu adalah kekejian :-). Maaf, maksud saya bahasa utas. Sesuatu seperti BASIC membutuhkan banyak instruksi untuk menafsirkan satu pernyataan.
gnasher729
@gnasher: Pada tahun 1974, saya membangun penerjemah BASIC kinerja tinggi untuk Keronix (ahem, klon Data General Nova) yang menggunakan kode-byte yang berorientasi byte untuk menyandikan pernyataan BASIC. Butuh sekitar 25-50 instruksi mesin untuk "menafsirkan" kode p, 10 di antaranya untuk byte yang mengambil sendiri. (Saya melakukan token berdasarkan pada tahun 1969 yang mengambil lebih banyak karena harus memparsing ulang ekspresi). Tapi itu bukan dan bukan "gazillions".
Ira Baxter
1

Sebelum program pengulangan dapat ditafsirkan, harus disimpan dalam media yang dapat dibaca berulang kali. Dalam kebanyakan kasus, satu-satunya media yang cocok adalah RAM. Karena kode biasanya akan dimasukkan pada kartu berlubang yang - untuk bahasa yang dapat dibaca manusia - kemungkinan besar kosong, beberapa jenis pemrosesan harus dilakukan pada kode sebelum disimpan dalam RAM. Dalam banyak kasus, memproses teks kartu berlubang menjadi bentuk yang sesuai untuk eksekusi langsung oleh prosesor sebenarnya tidak lebih sulit daripada memprosesnya menjadi bentuk yang dapat ditangani secara efisien melalui juru bahasa.

Perhatikan bahwa tujuan dari kompiler awal bukan untuk menghasilkan file kode bahasa-bahasa atau objek-perakitan pada disk, melainkan untuk mengakhiri kode dalam RAM yang siap dijalankan. Ini sebenarnya sangat mudah ketika tidak ada sistem operasi yang menghalangi. Kompiler dapat menghasilkan kode mulai dari satu ujung memori dan mengalokasikan variabel dan target cabang mulai dari yang lain. Jika pernyataan ditandai dengan label "1234", kompiler akan menyimpan dalam variabel yang disebut "1234" instruksi untuk melompat ke alamat pembuatan kode saat ini, membuat variabel itu jika tidak ada. Pernyataan "goto 1234" akan membuat variabel "1234" jika tidak ada, dan kemudian melompat ke variabel itu [yang diharapkan akan memiliki lompatan ke lokasi yang tepat disimpan di dalamnya sebelum pernyataan itu dijalankan].gotolabel yang belum didefinisikan, karena ia tahu kapan gotokompilasi di mana ia akan melompat - ke variabel. Itu mungkin bukan cara yang paling efisien untuk menghasilkan kode, tetapi itu cukup untuk ukuran program yang diharapkan dapat ditangani oleh komputer.

supercat
sumber
1
Disk? Ummmm ... tidak. Tape. Kaset besar, lambat, dan berputar-putar. Dan banyak dari mereka. Saya ingat pergi ke kuliah yang diberikan oleh Grace Murray Hopper (sangat menarik bagi saya karena saya adalah seorang jurusan analisis sistem DAN seorang midshipman di detasemen ROTC Angkatan Laut di kampus, dan CAPT Hopper adalah seorang perwira angkatan laut yang bertugas). Dia menceritakan sebuah kisah di mana, katanya, dia muncul dengan ide untuk menulis bagian-bagian yang tidak terpakai dari sebuah program untuk direkam - dia menyebutnya "menggunakan penyimpanan tambahan". "Tapi", katanya, "idenya tidak masuk sampai IBM melakukan hal yang sama dan menyebutnya Memori Virtual". CAPT Hopper benar-benar tidak menyukai IBM ... :-)
Bob Jarvis
@ BobJvis: Saya tidak mempertimbangkan aspek itu, tetapi desain satu-pass umum yang sama yang akan digunakan untuk mengkompilasi kode siap-pakai untuk RAM dapat bekerja dengan baik dengan tape drive; output dari compiler akan menuju ke tape, kemudian tape tersebut akan diputar ulang dan dibaca menjadi alamat memori berurutan dan dijalankan secara langsung, tanpa perlu memiliki bagian dari kompiler dalam memori pada saat yang sama.
supercat
0

Karena penerjemah membutuhkan kompiler untuk bekerja.

Pernyataan di atas tidak benar. Sebenarnya, Anda dapat membuat juru bahasa tanpa pernah menggunakan atau berinteraksi dengan kompiler. Tetapi hasil dari melakukan ini tidak akan terlihat seperti apa yang saya pikir Anda maksud dengan istilah-istilah itu.

Dalam arti yang ketat, kompiler dan penerjemah melakukan hal yang sama sekali berbeda. Compiler membaca teks dari beberapa sumber, dan mengubahnya menjadi beberapa format lain: bahasa assembly, kode mesin, bahasa tingkat tinggi lainnya, struktur data, atau apa pun. Seorang penerjemah, sementara itu, mengambil struktur data dari beberapa jenis, dan melakukan instruksi berdasarkan itu.

Apa yang kita anggap sebagai "kompiler" saat ini sebenarnya adalah kompiler yang telah dipasangkan dengan generator kode : program yang mengambil data dari beberapa sumber, dan kode keluaran dalam beberapa format berdasarkan pada apa yang dilihatnya. Itu penggunaan yang cukup intuitif untuk kompiler, dan itu adalah salah satu hal pertama yang dibuat untuk kompiler. Tetapi jika Anda melihatnya dengan cara lain, ini tampak sangat mirip dengan apa yang dilakukan penerjemah. Selalu mengeluarkan kode alih-alih melakukan operasi yang lebih umum, tetapi prinsipnya sama.

Jika kita melihatnya dari sisi lain, seorang juru bahasa perlu mendapatkan datanya dari suatu tempat . Ini hanya data, jadi Anda bisa membangunnya dengan cara yang sama seperti membangun data apa pun lainnya. Karena kita sedang berbicara tentang interpretasi, tampaknya wajar bahwa Anda dapat membangun data Anda berdasarkan instruksi dalam file teks. Tetapi untuk melakukan itu, Anda perlu sesuatu untuk dibaca dalam teks dan membuat struktur data Anda, dan itu adalah kompiler . Ini terhubung ke juru alih-alih ke generator kode, tapi itu adalah kompiler yang sama.

Itu sebabnya kompiler ditulis terlebih dahulu. Gagasan menafsirkan struktur data bukanlah hal baru bahkan ketika kompiler disusun, tetapi kompiler adalah "mata rantai yang hilang" yang memungkinkan pemrogram membangun struktur tersebut dari teks.

Spooniest
sumber
Interpreter Dasar asli untuk Apple] [adalah, dari apa yang saya mengerti, diterjemahkan secara manual ke dalam kode mesin dan tidak pernah ada dalam format kode-kode yang dapat dibaca mesin. Saya tidak yakin apa "kompiler" yang akan Anda katakan digunakan untuk memproduksinya.
supercat
@supercat: Saya tidak tahu bagaimana juru bahasa dasar yang Anda sebutkan diproduksi, tapi saya tidak berbicara tentang kompiler yang digunakan untuk menghasilkan juru bahasa. Saya berbicara tentang kompiler yang merupakan bagian dari penerjemah. Sebagai bagian dari kodenya, Apple] [penerjemah BASIC memerlukan beberapa cara untuk membaca file teks yang berisi kode BASIC dan membuat pohon sintaks dari teks tersebut, yang kemudian dieksekusi. Kode yang melakukan ini adalah kompiler; itu tidak menghasilkan kode mesin, tetapi masih melakukan tugas membaca dalam kode dan menerjemahkannya ke bentuk lain.
The Spooniest
Penerjemah BASIC mikrokomputer tipikal tidak menghasilkan apa pun yang bahkan menyerupai pohon sintaksis. Saya tidak terbiasa dengan juru bahasa BASIC Apple asli (disebut "integer BASIC") tetapi juru bahasa BASIC diimplementasikan oleh Microsoft untuk Apple ("Applesoft BASIC"), Commodore, dan berbagai perusahaan lain menyimpan teks program apa adanya kecuali untuk dua hal : (1) setiap baris didahului dengan nomor baris 16-bit dan alamat 16-bit dari baris berikutnya, dan diikuti oleh byte nol; (2) setiap kata kunci diganti dengan satu byte yang memiliki set bit tinggi. Selain itu, ekspresi diurai ...
supercat
... karakter demi karakter, kiri ke kanan; pernyataan seperti A = 1234 "akan mengubah angka 1, 2, 3, dan 4 menjadi angka floating-point pada saat run-time.
supercat
@supercat: Kedengarannya lebih dekat ke bytecode daripada pohon sintaks, jadi, saya salah dalam hal tertentu. Tetapi poin utama masih ada: pseudo-bytecode masih harus dibangun dari teks, dan kode yang melakukan ini adalah kompiler.
The Spooniest
-1

Faktor lain: Ketika kompiler pertama ditulis, biaya waktu mesin jauh lebih tinggi daripada sekarang. Juru bahasa menggunakan lebih banyak waktu mesin.

Loren Pechtel
sumber