Apa yang datang lebih dulu, kompiler, atau sumbernya?

17

Saya ingin tahu tentang kelahiran kompiler. Bagaimana pemrograman dimulai? Apakah orang pertama kali membangun perangkat keras yang mengenali serangkaian perintah tertentu, atau apakah orang menentukan bahasa dan kemudian membangun perangkat keras di sekitarnya? Dan pada catatan terkait, apa bahasa pemrograman pertama?

David Cowden
sumber
1
Salah satu sub pertanyaan adalah pertanyaan itu sendiri: Apa bahasa pemrograman pertama yang ditulis untuk komputer? .
Mark Booth
Tentunya ini sesuatu yang bisa Anda cari ?
Caleb
@ Caleb membaca komentar dalam jawaban SkyDan ..
David Cowden
2
@Brian Valid asumsi, tetapi ternyata salah. Ini bukan masalah ayam-telur sama sekali, ada jawaban yang sangat jelas (petunjuk: yang paling banyak dipilih di bawah ini salah). Kode sumber lama sebelum penyusun.
Konrad Rudolph

Jawaban:

30

Ini memiliki jawaban yang sangat jelas, sebenarnya: Kode sumber datang lebih dulu - dengan margin besar.

Sebelum memberikan rincian teknis, sedikit perspektif:

Bahasa pemrograman pertama semuanya diterjemahkan ke dalam bahasa mesin atau assembler dengan tangan . Gagasan menggunakan perangkat lunak untuk mengotomatisasi terjemahan ini (baik melalui kompiler atau evaluator) selalu muncul kemudian, dan jauh dari intuitif.

Pertimbangkan kutipan artikel Wikipedia ini tentang FORTRAN yang menggambarkan keengganan yang harus dihadapi penyusun:

... kompiler FORTRAN pertama [disampaikan] pada bulan April 1957. Ini adalah kompiler optimisasi pertama, karena pelanggan enggan menggunakan bahasa pemrograman tingkat tinggi kecuali jika kompilernya dapat menghasilkan kode yang kinerjanya sebanding dengan bahasa assembly kode tangan . [penekanan milikku]

=> Pada saat kompiler FORTRAN memasuki pasar (1957), orang sudah dengan senang hati memprogram baik dalam bahasa assembly maupun FORTRAN.

Kasusnya serupa untuk LISP (dari Peretas & Pelukis ):

Steve Russell berkata, lihat, mengapa saya tidak memprogram eval ini ..., dan saya berkata kepadanya, ho, ho, Anda membingungkan teori dengan praktik, eval ini dimaksudkan untuk membaca, bukan untuk komputasi. Tetapi dia terus maju dan melakukannya. Yaitu, dia mengkompilasi eval di kertas saya ke dalam kode mesin IBM 704, memperbaiki bug, dan kemudian mengiklankan ini sebagai interpreter Lisp, yang tentu saja itu. Jadi pada saat itu Lisp pada dasarnya memiliki bentuk yang dimilikinya hari ini ... "

Sekali lagi, tidak hanya kode sumber (dalam LISP) mendahului penerjemah, yang terakhir bahkan tidak tersirat dalam yang sebelumnya.

Namun perkembangan ini relatif terlambat. Meskipun tidak mempertimbangkan Mesin Analitik Charles Babbage dan program pertama terkait Ada Lovelace , ada bahasa pemrograman pada abad ke-20 yang mendahului penyusun:

Plankalkül Konrad Zuse dan konstruksi matematis λ-calculus yang diperkenalkan oleh Gereja Alonzo. Keduanya merupakan bahasa pemrograman yang ditentukan secara formal, tetapi tidak ada yang memiliki kompiler pada saat itu.

Untuk menempatkan ini ke dalam perspektif, λ-kalkulus adalah dari tahun 1930-an, dan Plankalkül dikembangkan sekitar tahun 1945. Sebaliknya, kompiler FORTRAN pertama keluar pada tahun 1957 (tetapi sekali lagi tiga tahun setelah FORTRAN ditentukan).

Konrad Rudolph
sumber
Jawaban yang bagus! Saya tidak tahu kode yang digunakan untuk dikompilasi dengan tangan, tetapi itu masuk akal.
ckb
10

Pemrograman dimulai dengan orang-orang menulis kode mesin langsung ke memori, ke kartu berlubang dan pita kertas atau bahkan hubungan arus pendek pada panel patch. Apakah perangkat keras dibangun di sekitar kebutuhan perangkat lunak atau sebaliknya sulit untuk diceritakan. Tentu saja desain yang paling awal untuk komputer turing lengkap yang dapat diprogram, mesin Analitik Babbage , pra-tanggal program terdokumentasi pertama Ada Lovelace .

Mengenai bahasa pemrograman pertama, saya berpendapat bahwa itu adalah bahasa mesin mesin analitik Babbage (dari pertanyaan. Apa bahasa pemrograman pertama yang ditulis untuk komputer? )

Untuk menjawab pertanyaan dalam judul pertanyaan Anda, karena bahasa rakitan adalah kode sumber , dan bahasa rakitan bahasa tingkat tinggi pra-tanggal yang dapat dikompilasi menjadi assembler, kode sumber datang terlebih dahulu.

Juga, kompiler tidak pernah diperlukan , hanya nyaman.

Sangat mungkin untuk menulis perangkat lunak secara langsung ke dalam memori jika Anda telah menghafal tabel op-code yang sesuai . Bahkan, beberapa komputer awal mengharuskan pengguna untuk memasukkan kode bootstrap pada keypad hex panel depan untuk mem-boot-nya, tetapi Anda dapat memanfaatkan kode yang Anda suka dan itu akan dijalankan.

Diakui karena CPU menjadi lebih kompleks, ini menjadi lebih sulit, tetapi set instruksi sederhana seperti 6809 , atau Z80 (mengabaikan semua mode indeks yang aneh) relatif mudah diprogram bahkan tanpa assembler , apalagi kompiler dari bahasa tingkat tinggi.

Jika mesin analitik Babbage pernah dibuat, saya yakin akan ada Mel steampunk , yang menulis program yang dioptimalkan langsung ke kartu alat tenun.

Mark Booth
sumber
1
Apakah Anda benar-benar membaca definisi kode sumber di tautan wikipedia yang Anda pasang? Seperti dikatakan di atas, kode mesin bukan kode sumber. Dan kode mesin! = Perakitan. Kode mesin ada di sana dulu.
occulus
@MarkBooth Saya pikir MIPS dan AVR bahkan lebih sederhana ..
David Cowden
4
@occulus - Dengan cara apa bahasa assembly bukan kode sumber ? Bahasa assembly memetakan satu instruksi bahasa assembly ke satu kode mesin dan dapat dengan mudah dirakit di kepala Anda, jika Anda tahu tabel kode op Anda. Jujur, anak-anak hari ini ... * 8 ')
Mark Booth
1
Bagi saya, perakitan bahasa adalah movl $0, -20(%rbp), sedangkan kode mesin adalah C745EC00000000, dan itu yang terakhir (baik, sesuatu seperti itu) yang pertama kali secara manual masuk atau membaca dari pita kertas. Mengenai apakah kode mesin dianggap sebagai kode sumber , saya cenderung mengatakan "apa pun yang mengapung perahu Anda". Jika Anda mengaktifkannya secara manual, maka ya, saya akan mengatakan itu penting.
John Bode
@ JohnBode - Oh saya setuju, tetapi mengingat korespondensi 1: 1 antara instruksi perakitan dan instruksi kode mesin, assembly hanya masalah terjemahan mekanis (assembly), logikanya identik. Kompilasi menyiratkan banyak lebih kompleks: banyak terjemahan (meskipun Occam adalah bahasa tingkat tinggi dan banyak pernyataan Occam memetakan 1: 1 ke instruksi Transputer karena arsitektur MISC -nya . * 8 ').
Mark Booth
6

Kompiler adalah yang pertama . Itu langsung ditulis dalam kode mesin, karena sumber tidak dapat dikompilasi tanpa kompiler.

Artikel Wikipedia seperti ini tentang Bahasa Komputer dapat menjawab sebagian besar pertanyaan. Jika tidak, pilih saja salah satu buku karya Tanenbaum, seperti Structured Computer Organization , yang dapat menjawab lebih banyak pertanyaan daripada yang dapat Anda tanyakan :)

Saya tidak bisa mengatakan sesuatu yang lebih spesifik, karena pertanyaan Anda terlalu luas.

SkyDan
sumber
20
Dapat juga dikatakan bahwa sumbernya adalah yang pertama, karena untuk "komputer" yang pertama, sumbernya setara dengan biner (yaitu, mereka diprogram secara langsung dalam bahasa yang dapat dibaca mesin).
Joachim Sauer
5
@ Joachim Menurut definisi, kode sumber adalah teks yang dapat dibaca manusia yang diterjemahkan oleh kompiler ke dalam kode mesin. Karenanya kode mesin itu sendiri bukan kode sumber.
SkyDan
11
Compiler pertama kali, tetapi diimplementasikan dalam jaringan saraf biologis.
Den
8
Mengapa ini sangat dipilih? Itu salah. Kode sumber dalam bahasa tingkat tinggi (terutama λ-calculus, Plankalkül dan LISP) telah lama ada sebelum penyusun dan penerjemah. Ini bahkan tidak memperhitungkan program semi formal yang ditulis oleh Lovelace.
Konrad Rudolph
4
@SkyDan Lalu apa definisi Anda? Saya tahu tidak ada definisi yang masuk akal yang jawaban Anda benar (baik untuk "kompiler" dan "kode sumber dalam bahasa tingkat tinggi" - apalagi tingkat rendah).
Konrad Rudolph
4

Penerjemah ada sebelum kompiler sehingga kode sumber ada sebelum kompiler.

Ada beberapa makalah yang sangat menarik tentang sejarah komputasi di sini . Kode sumber untuk kompiler FORTRAN II seharusnya tersedia, tetapi tautan tersebut rusak.

Makalah ini , dari tahun 1954, menggambarkan penerjemah Whirlwhind.

Jon Strayer
sumber
1

Pertanyaan ini sangat penting pada interpretasi semantik kami tentang 'kode sumber'. Jika kita mendefinisikannya sebagai 'instruksi komputer berbasis teks yang dikompilasi', maka mungkin kompilator yang lebih dulu.

Saya lebih cenderung untuk pergi dengan sesuatu yang lebih otoritatif, seperti makalah Mark Harman "Mengapa Analisis Kode Sumber dan Manipulasi Akan Selalu Penting" dipresentasikan pada Konferensi Kerja Internasional IEEE Kesepuluh tentang Analisis Kode Sumber dan Manipulasi

Definisi 1 (Kode Sumber): Untuk tujuan kejelasan 'kode sumber' diartikan sebagai deskripsi yang dapat dieksekusi sepenuhnya dari sistem perangkat lunak. Oleh karena itu sangat ditafsirkan untuk memasukkan kode mesin, bahasa tingkat yang sangat tinggi dan representasi grafis dari sistem.

Dan saya pikir jawaban Anda tersirat dalam definisi itu - kode sumber pasti datang lebih dulu.

Kirk Broadhurst
sumber
“Mungkin kompiler yang diutamakan” - hanya jika Anda mendefinisikan “dikompilasi” sebagai “diterjemahkan oleh alat otomatis”, daripada “diterjemahkan ke kode mesin dengan tangan”.
Konrad Rudolph
Kertas yang sangat menarik. Saya suka definisi kode sumber - walaupun itu membuat pertanyaan saya benar-benar non-pertanyaan ..
David Cowden
@KonradRudolph bukan unit yang melakukan kompilasi, apakah itu intervensi mesin, manusia, atau ilahi, yang disebut 'kompiler'?
Kirk Broadhurst
0

Algoritma dipilah di atas kertas, kemudian alus dihubungkan secara fisik / mekanis (kabel bergerak). untuk mengubah program, Anda memindahkan kabel dan menjalankan lagi.

Kemudian bahasa assembly disortir di atas kertas, diterjemahkan ke kode mesin dengan tangan, kemudian menggunakan sakelar, dll untuk memasukkannya ke ram. Atau kartu punch, dll. Pada akhirnya Anda dapat membuat assembler, kemudian Anda dapat memprogram dalam assembly bukan kode mesin, lalu Anda dapat membuat compiler. Akhirnya Anda bisa bootstrap kompiler itu. Dan membuat bahasa baru dan kompiler baru, dll.

Bahasa pertama bukan bahasa, kemudian bahasa pertama adalah bahasa rakitan. untuk setiap prosesor bahasa pertama adalah bahasa rakitan (berasal dari kode mesin). Set instruksi dirancang terlebih dahulu kemudian perangkat keras untuk mengimplementasikannya kemudian assembler, kemudian kompiler.

old_timer
sumber