Saya membaca buku The Elements of Computing Systems: Membangun Komputer Modern dari Prinsip Pertama , yang memuat proyek-proyek yang mencakup pembuatan komputer dari gerbang boolean hingga aplikasi tingkat tinggi (dalam urutan itu). Proyek saat ini yang sedang saya kerjakan adalah menulis assembler menggunakan bahasa tingkat tinggi pilihan saya, untuk menerjemahkan dari kode perakitan Hack ke kode mesin Hack (Hack adalah nama platform perangkat keras yang dibangun pada bab-bab sebelumnya). Walaupun semua perangkat keras telah dibangun dalam sebuah simulator, saya telah mencoba untuk berpura-pura bahwa saya benar-benar membangun setiap level hanya menggunakan alat yang tersedia untuk saya pada saat itu dalam proses nyata.
Yang mengatakan, itu membuat saya berpikir. Menggunakan bahasa tingkat tinggi untuk menulis assembler saya memang mudah, tetapi untuk assembler pertama yang pernah ditulis (yaitu dalam sejarah), tidakkah perlu ditulis dalam kode mesin, karena hanya itu yang ada pada saat itu?
Dan pertanyaan yang berhubungan ... bagaimana dengan hari ini? Jika arsitektur CPU baru keluar, dengan set instruksi baru, dan sintaks perakitan baru, bagaimana assembler akan dibangun? Saya berasumsi Anda masih bisa menggunakan bahasa tingkat tinggi yang ada untuk menghasilkan binari untuk program assembler, karena jika Anda tahu sintaks dari bahasa assembly dan mesin untuk platform baru Anda, maka tugas menulis assembler sebenarnya hanyalah sebuah tugas analisis teks dan secara inheren tidak terkait dengan platform itu (yaitu perlu ditulis dalam bahasa mesin platform itu) ... yang merupakan alasan saya dapat "menipu" saat menulis peretas Hack saya pada tahun 2012, dan menggunakan beberapa yang sudah ada sebelumnya bahasa tingkat tinggi untuk membantu saya.
Jawaban:
Belum tentu. Tentu saja versi pertama dari assembler harus ditulis dalam kode mesin, tetapi tidak cukup kuat untuk disebut assembler. Itu tidak akan mendukung bahkan setengah fitur assembler "nyata", tetapi itu akan cukup untuk menulis versi berikutnya dari dirinya sendiri. Kemudian Anda bisa menulis ulang v0.00 di subset dari bahasa assembly, sebut saja v0.01, gunakan untuk membangun set fitur berikutnya assembler v0.02 Anda, kemudian gunakan v0.02 untuk membangun v0.03, dan seterusnya, sampai Anda mencapai v1.00. Akibatnya, hanya versi pertama yang akan berada dalam kode mesin; versi pertama yang dirilis akan dalam bahasa assembly.
Saya telah mem-boot pengembangan kompiler bahasa template menggunakan trik ini. Versi awal saya menggunakan
printf
pernyataan, tetapi versi pertama yang saya gunakan di perusahaan saya menggunakan prosesor template yang sedang diproses. Fase bootstrap berlangsung kurang dari empat jam: begitu prosesor saya dapat menghasilkan output yang hampir tidak berguna, saya menulis ulang dalam bahasanya sendiri, mengkompilasi, dan membuang versi non-templated.sumber
diff
melawan pembuat kode saat ini untuk melihat bahwa bagian kode yang dihasilkan tidak berubah dengan cara yang tidak terduga, mengganti kode di tempat, dan menjalankannya sekali lagi untuk menyelesaikan siklus.Menurut Wikipedia, bahasa assembler / assembly pertama kali diimplementasikan untuk IBM 701 oleh Nathaniel Rochester . (Tanggal-tanggalnya agak tidak pasti dari artikel Wikipedia. Ini menyatakan bahwa Rochester bergabung dengan IBM pada tahun 1948, tetapi halaman Wikipedia lain menyatakan bahwa 701 diumumkan secara publik pada tahun 1952. Dan halaman IBM ini menyatakan bahwa "[a] desain virtual dimulai pada bulan Februari). 1, 1951 dan selesai setahun kemudian " .)
Namun "Assemblers and Loaders" oleh David Salomon menyatakan (di halaman 7) bahwa EDSAC juga memiliki assembler:
Dengan asumsi kita menerima bahwa "Pesanan Initial" diutamakan, kita memiliki bukti yang jelas bahwa assembler pertama itu dilaksanakan dalam kode mesin.
Pola ini (menulis perakit awal dalam kode mesin) akan menjadi norma hingga 1950-an. Namun, menurut Wikipedia , "[a] ssembler adalah alat bahasa pertama yang melakukan bootstrap sendiri". Lihat juga bagian ini yang menjelaskan bagaimana kode mesin tertulis assembler primordial digunakan untuk mem-bootstrap assembler yang lebih maju yang dikodekan dalam bahasa assembly.
Saat ini assembler dan kompiler ditulis dalam bahasa tingkat yang lebih tinggi, dan assembler atau kompiler untuk arsitektur mesin baru biasanya dikembangkan pada arsitektur yang berbeda dan dikompilasi silang.
(FWIW - menulis dan men-debug program-program non-sepele dalam kode mesin adalah proses yang sangat melelahkan. Seseorang yang mengembangkan assembler dalam kode mesin kemungkinan besar akan bootstrap ke assembler yang ditulis dalam assembler secepat mungkin.)
Halaman Wikipedia ini tentang kompilasi dan perakit bootstrap patut dibaca ... jika ini semua membingungkan Anda.
sumber
Saya berasumsi bahwa assembler pertama ditulis dalam kode mesin, karena seperti yang Anda katakan, tidak ada lagi yang tersedia saat itu.
Namun hari ini, ketika arsitektur CPU baru keluar, kami menggunakan apa yang dikenal sebagai Cross-Compiler , yang merupakan kompiler yang menghasilkan kode mesin bukan untuk arsitektur yang digunakannya, tetapi untuk arsitektur yang berbeda.
(Sebenarnya, karena saya yakin Anda akan mengetahui nanti dalam buku yang sedang Anda baca, sama sekali tidak ada yang membuat kompiler lebih cocok untuk menghasilkan kode mesin untuk arsitektur yang menjalankannya daripada pada sembarang arsitektur lain. Hanya masalah arsitektur mana yang akan Anda targetkan, sebagai pencipta kompiler.)
Jadi, hari ini bahkan dimungkinkan (setidaknya secara teori) untuk membuat arsitektur baru dan memiliki kompiler bahasa tingkat tinggi yang berjalan secara native (dikompilasi pada arsitektur lain menggunakan kompiler silang) sebelum Anda bahkan memiliki assembler untuk arsitektur tersebut.
sumber
Pada awalnya, "assembly" ditulis di atas kertas dan kemudian secara manual "dikompilasi" ke kartu punch.
Kakek saya bekerja dengan ZRA1 (maaf, halaman hanya ada dalam bahasa Jerman, tetapi terjemahan Google tidak apa-apa sampai Anda benar-benar dapat mengambil fakta yang paling penting: D).
Modus operandi adalah menuliskan kode Anda di atas kertas dalam semacam bahasa rakitan dan sekretaris akan benar-benar melakukan transkripsi ke kartu punch, kemudian meneruskannya ke operator dan hasilnya akan diserahkan kembali keesokan paginya.
Semua ini pada dasarnya sebelum pemrogram memiliki kemewahan memasukkan data melalui keyboard dan melihatnya di layar.
sumber
Sulit untuk memastikan tentang sangat assembler pertama (sulit bahkan mendefinisikan apa itu). Bertahun-tahun yang lalu, ketika saya menulis beberapa assembler untuk mesin yang tidak memiliki assembler, saya masih menulis kode dalam bahasa assembly. Kemudian, setelah saya memiliki bagian kode yang cukup lengkap saya menerjemahkannya ke dalam kode mesin dengan tangan. Itu masih dua fase yang sepenuhnya terpisah - ketika saya menulis kode, saya tidak bekerja atau berpikir pada tingkat kode mesin sama sekali.
Saya harus menambahkan bahwa dalam beberapa kasus, saya melangkah lebih jauh: Saya menulis sebagian besar kode dalam bahasa assembly yang saya temukan lebih mudah digunakan, kemudian menulis sebuah kernel kecil (kurang lebih apa yang sekarang kita sebut mesin virtual) untuk menafsirkan bahwa pada prosesor target. Itu sangat lambat (terutama pada prosesor 1 MHz, 8-bit), tapi itu tidak masalah, karena biasanya hanya berjalan sekali (atau paling banyak, beberapa kali).
sumber
Anda tidak perlu assembler untuk merakit tangan kode bahasa assembly ke dalam kode mesin. Sama seperti Anda tidak memerlukan editor untuk menulis kode bahasa majelis.
Perspektif sejarah
Assembler pertama mungkin ditulis dalam bahasa assembly dan kemudian dirakit dengan tangan ke dalam kode mesin. Bahkan jika prosesor tidak memiliki 'bahasa assembly' resmi maka programmer mungkin melakukan sebagian besar pekerjaan pemrograman menggunakan beberapa jenis kode semu sebelum menerjemahkan kode itu ke dalam instruksi mesin.
Bahkan di hari-hari awal komputasi , programmer menulis program dalam semacam notasi simbolik dan diterjemahkan ke dalam kode mesin sebelum makan ke dalam komputer mereka. Dalam hal Augusta Ada King, ia akan diperlukan untuk menerjemahkannya ke dalam kartu menekan untuk Babbage 's Analytical Engine , tapi sayangnya itu tidak pernah dibangun.
Pengalaman pribadi
Komputer pertama yang saya miliki adalah Sinclair ZX81 (Timex 1000 di AS). Bagian belakang manual memiliki semua informasi yang Anda butuhkan untuk menerjemahkan bahasa assembly Z80 ke dalam kode mesin (bahkan memasukkan semua mode indeks aneh opcode yang dimiliki Z80).
Saya akan menulis sebuah program (di atas kertas) dalam bahasa assembly dan jalankan-kering melalui kode. Ketika saya senang bahwa program saya bebas bug, saya akan mencari setiap instruksi di bagian belakang manual, menerjemahkannya ke dalam kode mesin dan menuliskan kode mesin di atas kertas juga. Akhirnya saya mengetik semua instruksi kode mesin ke ZX81 saya sebelum menyimpannya ke tape dan mencoba menjalankannya.
Jika tidak berhasil, saya akan memeriksa rakitan tangan saya dan jika ada terjemahan yang salah saya akan menambal byte yang dimuat dari tape sebelum menyimpannya kembali dan mencoba lagi untuk menjalankan program.
Dari pengalaman, saya dapat memberitahu Anda bahwa jauh lebih mudah untuk men-debug kode Anda jika ditulis dalam bahasa assembly daripada dalam kode mesin - karenanya popularitas disassembler. Bahkan jika Anda tidak memiliki assembler, perakitan tangan lebih sedikit kesalahan daripada mencoba untuk menulis kode mesin secara langsung, meskipun saya kira Programmer nyata seperti Mel mungkin tidak setuju. * 8 ')
sumber
Tidak ada perbedaan dulu atau sekarang. Anda ingin menciptakan bahasa pemrograman baru, Anda memilih salah satu bahasa yang tersedia untuk Anda hari ini untuk membuat kompiler pertama. selama beberapa periode waktu, jika itu adalah tujuan dari proyek, Anda membuat kompiler dalam bahasa itu dan kemudian dapat menjadi tuan rumah sendiri.
Jika yang Anda miliki hanyalah pensil dan kertas dan beberapa sakelar atau kartu punch sebagai antarmuka pengguna Anda ke set instruksi baru pertama atau berikutnya, Anda menggunakan satu atau semua item yang tersedia untuk Anda. Anda bisa saja menulis bahasa assembly, di atas kertas, dan kemudian menggunakan assembler, Anda, untuk mengubahnya menjadi kode mesin, mungkin dalam oktal, kemudian di beberapa titik yang masuk ke antarmuka ke mesin.
Ketika set instruksi baru ditemukan hari ini, tidak berbeda, tergantung pada perusahaan / individu, praktik, dll. Sangat mungkin bahwa insinyur perangkat keras mungkin pemrograman dalam Verilog atau VHD, menulis beberapa program pengujian pertama dengan tangan di kode mesin (mungkin dalam hex atau biner). tergantung pada kemajuan tim perangkat lunak mereka mungkin sangat cepat atau tidak untuk waktu yang sangat lama beralih ke bahasa assembly dan kemudian kompiler.
Mesin komputasi pertama bukanlah mesin keperluan umum yang dapat Anda gunakan untuk membuat perakit dan kompiler. Anda memprogramnya dengan memindahkan beberapa kabel antara output dari alu sebelumnya ke input berikutnya. Akhirnya Anda memiliki prosesor tujuan umum sehingga Anda bisa menulis assembler di assembly, merakitnya sendiri, memasukkannya ke dalam kode mesin, kemudian menggunakannya untuk mengurai ebcdic, ascii, dll. Dan kemudian host-sendiri. menyimpan biner ke beberapa media yang nantinya bisa Anda baca / muat tanpa harus terus membalik sakelar ke kode mesin umpan tangan.
Pikirkan kartu punch dan pita kertas. Alih-alih membalik saklar Anda pasti bisa membuat mesin yang sepenuhnya mekanis, perangkat hemat tenaga kerja, yang menciptakan media yang akan dibaca komputer. Alih-alih harus memasukkan bit kode mesin dengan sakelar seperti altair, Anda malah dapat memasukkan pita kertas atau kartu punch (menggunakan sesuatu yang mekanis, bukan prosesor yang digerakkan, yang mengumpankan memori atau prosesor, ATAU menggunakan kode mesin kecil boot loader tertulis). Ini bukan ide yang buruk karena Anda bisa membuat sesuatu, didorong oleh komputer yang juga bisa secara mekanis menghasilkan kaset kertas atau kartu punch, dan kemudian memberi makan mereka kembali. Dua sumber kartu punch, perangkat hemat tenaga kerja mekanik non-komputer berbasis , dan mesin yang digerakkan komputer. keduanya menghasilkan "binari" untuk komputer.
sumber
Ada satu atau dua contoh di kebun binatang komputer Brook di mana ia mengatakan sesuatu seperti "mnemonik adalah penemuan kami, perancang hanya menggunakan opcode numerik atau karakter yang kodenya adalah opcode", jadi di mana mesin yang bahkan tidak ada bahasa campuran.
Memasuki program dan debugging di panel depan (bagi mereka yang belum melakukannya, itu adalah cara mengatur memori, Anda mengatur beberapa sakelar ke alamat, beberapa yang lain ke nilai dan menekan tombol, atau tombol lain untuk baca nilai) sudah umum jauh di kemudian hari. Beberapa timer tua menyombongkan diri bahwa mereka masih dapat memasukkan kode boot untuk mesin yang mereka gunakan secara luas.
Kesulitan menulis secara langsung kode mesin dan membaca program dari memory dump sangat tergantung pada bahasa mesin, beberapa dari mereka relatif mudah (bagian tersulit adalah melacak alamat), x86 adalah salah satu yang lebih buruk.
sumber
Saya membangun sebuah komputer pada tahun 1975. Komputer ini sangat canggih dibandingkan dengan Altair sezamannya, karena memiliki 'monitor rom' yang memungkinkan saya memasuki program dengan mengetikkan kode mesin dalam hex dan melihat kode ini pada monitor video, sedangkan dengan Altair setiap instruksi mesin harus dimasukkan sedikit pada waktu menggunakan deretan sakelar.
Jadi ya, pada hari-hari awal komputer dan sekali lagi pada hari-hari awal komputer pribadi orang memang menulis aplikasi dalam kode mesin.
sumber
Anekdot:
Ketika saya belajar bahasa assembly, di Apple] [, Ada program yang termasuk dalam ROM yang disebut micro-assembler. Itu terjemahan langsung instruksi perakitan ke byte, saat Anda memasukkannya. Ini berarti tidak ada label - jika Anda ingin melompat atau memuat, Anda harus menghitung sendiri offsetnya. Itu jauh lebih mudah daripada mencari tata letak instruksi dan memasukkan nilai hex.
Tidak diragukan lagi, assembler asli pertama kali ditulis menggunakan micro-assembler, atau beberapa lingkungan lain yang tidak cukup lengkap.
sumber