Apakah ada perbedaan di antara keduanya? Sesuai dengan buku Ullman , kompiler mengonversi satu bahasa ke bahasa lain (biasanya tingkat rendah), dan begitu juga assembler. Bagaimana keduanya berbeda?
terminology
compilers
gpuguy
sumber
sumber
Jawaban:
Assembler menerjemahkan kode assembly ke kode mesin. Terjemahan bersifat mekanis, dan dapat dilakukan hanya dengan satu cara. Sebaliknya, kompiler memiliki lebih banyak kebebasan ketika mengkompilasi bahasa pemrograman yang relevan - ia dapat mengoptimalkan, misalnya, dan bahkan kompiler yang tidak mengoptimalkan menghasilkan kode yang berbeda. Juga, kompiler dapat ditulis dengan cara yang memisahkan "front-end" (sesuai dengan bahasa pemrograman) dan "back-end" (sesuai dengan arsitektur komputer), sedangkan dengan assembler keduanya selalu sama.
sumber
Intinya adalah bahwa menulis kompiler lebih menyenangkan daripada assembler. Bahasa assembly biasanya dirancang hampir sepele untuk parse dan ketik cek dan cenderung melibatkan banyak generator yang digerakkan oleh tabel ("opcode untuk add adalah 01110", "untuk instruksi pemuatan register operan tujuan ditentukan oleh bit 17 hingga 21). "). Biasanya bagian yang paling menarik dari assembler adalah bagian yang menyelesaikan label simbolik menjadi angka.
Namun , sebagian besar perakit dapat melakukan sejumlah kecil aritmatika (menambahkan label simbolik dengan konstanta kecil, misalnya) dan sebagian besar perakit baik memiliki atau terintegrasi dengan fasilitas pemrosesan makro. (Pada sebagian besar sistem Unix, fitur makro sebenarnya disediakan dengan menjalankan pra-prosesor C di atas unit sebelum meneruskannya ke assembler.)
Assembler MIPS harus melangkah lebih jauh dari itu dan membuat beberapa keputusan pembuatan kode yang menarik dan melakukan sedikit optimasi. Bahasa mesin MIPS memerlukan urutan kode yang berbeda untuk memuat konstanta yang berbeda, misalnya, dan karenanya assembler harus memilih urutan kode setelah membangun konstanta . Lebih lanjut, kode mesin MIPS memiliki konsep slot keterlambatan , tetapi merupakan tanggung jawab assembler untuk mengabstraksikan ini dan menyajikan bahasa assembly abstrak yang lebih "normal" ke kompiler. Jadi assembler MIPS perlu melakukan beberapa penjadwalan instruksi lokal.
Perbedaan ini semakin kabur oleh beberapa karya Norman Ramsey , khususnya bahasa rakitan C- portable-nya. (Makalah yang relevan adalah Ramsey dan Peyton Jones, "Bahasa Menengah Tunggal yang Mendukung Berbagai Implementasi Pengecualian", Prog. Lang. Impl. Dan Dsgn. , (PLDI-21): 285–298, 2000. ) Dan akhirnya, ada juga merupakan Typed Assembly Language dari David Walker dan Greg Morrisett dengan assembler yang dapat menjamin keamanan memori.
sumber
Sedikit jawaban yang disederhanakan di sini, kenyataannya lebih rumit. Saya berharap perbedaan antara Assembler (A) dan Compiler (C) antara lain:
Kita cenderung menyebut bahasa assembly "level rendah" dan bahasa sumber yang dipahami oleh kompiler "level tinggi" (ini adalah penyederhanaan, tapi tetap saja).
Dalam bahasa assembly Anda dapat melakukan operasi tambah dengan mengatakan:
Dalam bahasa tingkat tinggi Anda dapat menulis:
Dan ini dapat menghasilkan satu instruksi atau ratusan instruksi tergantung pada sejumlah keadaan, salah satunya adalah apa yang CPU buat untuk kompiler.
Seperti yang Anda lihat, bahasa sumber assembly paling sering: (A) satu baris kode sumber memberikan satu baris opcode CPU dan sangat tergantung pada CPU yang Anda targetkan. Kompiler bahasa tingkat tinggi (C) menangani semua detail ini untuk Anda - satu baris kode sumber bisa menjadi nol, satu atau banyak opcode CPU dan kompiler menangani rincian apa yang dapat dilakukan CPU.
Kompiler saat ini sering terdiri dari beberapa tahapan yang berbeda. Mereka bisa dinamai frontend / backend atau beeing disebut hal-hal lain. Saya biasanya melihatnya sebagai empat tahap:
Menulis kompiler yang baik adalah profesi yang sangat terampil - membuat kompiler bahasa mainan dapat dilakukan pada sore hari oleh amatuer (atau well, sedikit lebih lama).
sumber