Compiler And Interpreter Kelas IT 1 Aeu Nama : Yogi Dika Saputra (4812010024) Muhammad Faisal Ghefari (4812010015) Jl. Prof. G.A. Siwabessi, Kampus UI, Depok , Telepon 0217270036, Faksimili )21 7270035, www.pnj.ac.id KATA PENGANTAR Puji syukur penulis panjatkan kehadirat Allah SWT, yang atas rahmat-Nya maka penulis dapat menyelesaikan penyusunan makalah yang berjudul “Compiler And Interpreter”. Penulisan makalah merupakan salah satu tugas dan persyaratan untuk menyelesaikan tugas mata kuliah Fundamental of ICT Politeknik Negeri Jakarta. Dalam penulisan makalah ini penulis menyampaikan ucapan terima kasih yang tak terhingga kepada pihak-pihak yang membantu dalam menyelesaikan makalahini, Secara khusus penulis menyampaikan terima kasih kepada keluarga tercinta yang telah memberikan dorongan dan bantuan serta pengertian yang besar kepada penulis. Semua pihak yang tidak dapat disebutkan satu persatu, yang telah memberikan bantuan dalam penulisan makalah ini. Akhirnya penulis berharap semoga Allah memberikan imbalan yang setimpal pada mereka yang telah memberikan bantuan, dan dapat menjadikan semua bantuan ini sebagai ibadah, Amiin Yaa Robbal ‘Alamiin. Jakarta 24 September 2012 Compiler dan Interpreter Page 2 Daftar Isi 1. Compiler 4 2. Sejarah 5 3. Compiler Keluaran 6 4. Bahasa Disusun vs Ditafsirkan 7 5. Kompilasi Hardware 8 6. Compiler Satu-pass vs multi-pass 9 7. Front end 11 8. Back End 13 9. Interpeter 15 10. Sejarah 16 11. Keuntungan dan kerugian dari menggunakan interpreter 16 12. Siklus Pengembangan 16 13. Distribusi 17 14. Efisiensi 18 15. Regress 20 16. Variasi 20 17. Interpreter Abstrak Sintaks Pohon 21 18. Just-in-time kompilasi 21 Compiler dan Interpreter Page 3 Compiler Compiler komputer adalah (atau set sebuah program program) yang mengubah kode sumber yang ditulis dalam bahasa pemrograman (bahasa sumber) ke dalam bahasa komputer (bahasa target, seringkali memiliki bentuk biner yang dikenal sebagai kode obyek ). Alasan paling umum untuk ingin mengubah kode sumber adalah untuk menciptakan sebuah eksekusi program. Nama "compiler" untuk program terutama digunakan yang menerjemahkan kode sumber dari bahasa pemrograman tingkat tinggi ke bahasa tingkat rendah (misalnya, bahasa assembly atau kode mesin ). Jika program dikompilasi dapat dijalankan pada komputer yang CPU atau sistem operasi yang berbeda dari satu di mana compiler berjalan, compiler dikenal sebagai cross compiler- . Sebuah program yang menerjemahkan dari bahasa tingkat rendah ke tingkat yang lebih tinggi satu adalah decompiler . Sebuah program yang menerjemahkan antara bahasa tingkat tinggi biasanya disebut penerjemah bahasa , penerjemah sumber ke sumber, atau bahasa converter. Sebuah bahasa rewriter biasanya sebuah program yang menerjemahkan bentuk ekspresi tanpa perubahan bahasa. Compiler adalah kemungkinan untuk melakukan banyak atau semua operasi berikut: analisis leksikal , preprocessing , parsing , analisis semantik ( Sintaks-diarahkan terjemahan ), generasi kode , dan kode optimasi . Compiler dan Interpreter Page 4 Program kesalahan yang disebabkan oleh perilaku compiler yang salah bisa sangat sulit untuk melacak dan bekerja di sekitar, karena itu, pelaksana compiler melakukan upaya yang signifikan untuk memastikan kebenaran dari perangkat lunak mereka . Istilah compiler-compiler kadang-kadang digunakan untuk merujuk kepada parser generator , alat sering digunakan untuk membantu membuat lexer dan parser . Sejarah Software untuk komputer awal terutama ditulis dalam bahasa assembly. Bahasa tingkat tinggi pemrograman tidak ditemukan sampai imbalan untuk dapat menggunakan kembali perangkat lunak pada berbagai jenis CPU mulai menjadi signifikan lebih besar daripada biaya menulis kompilator. Terbatasnya memori kapasitas komputer awal menyebabkan tantangan teknis substansial ketika mendesain compiler pertama. Menjelang akhir mesin-independen bahasa pemrograman Selanjutnya 1950 pertama kompiler dikembangkan. kali beberapa Compiler pertama diusulkan. percobaan ditulis oleh Grace Hopper , pada tahun 1952, untuk bahasa pemrograman A-0 . The FORTRAN tim yang dipimpin oleh John Backus di IBM umumnya dikreditkan sebagai telah memperkenalkan compiler lengkap pertama pada tahun 1957. COBOL adalah bahasa awal untuk dikompilasi pada beberapa arsitektur, pada tahun 1960. Compiler dan Interpreter Page 5 Dalam domain aplikasi banyak ide untuk menggunakan bahasa tingkat tinggi dengan cepat tertangkap. Karena fungsi memperluas didukung oleh lebih baru bahasa pemrograman dan meningkatnya kompleksitas arsitektur komputer, compiler telah menjadi lebih kompleks. Kompiler Awal ditulis dalam bahasa assembly. Yang pertama hosting pribadi compiler - mampu kompilasi sumber sendiri kode dalam bahasa tingkat tinggi - diciptakan pada tahun 1962 untuk Lisp oleh Tim Hart dan Mike Levin di MIT .Sejak tahun 1970-an telah menjadi praktek umum untuk menerapkan compiler dalam bahasa itu mengkompilasi, meskipun keduanya Pascal dan C telah pilihan populer untuk implementasi bahasa. Membangun compiler diri hosting adalah bootstrap masalah-compiler seperti pertama untuk bahasa harus disusun baik dengan tangan atau dengan compiler yang ditulis dalam bahasa yang berbeda, atau (seperti dalam Hart dan Levin Lisp compiler) disusun dengan menjalankan compiler di sebuah interpreter . Compiler keluaran Salah satu klasifikasi kompiler adalah dengan platform yang di mana kode yang dihasilkan mereka mengeksekusi. Hal ini dikenal sebagai platform target. Sebuah kompiler asli atau host adalah salah satu yang keluaran dimaksudkan untuk langsung menjalankan pada jenis yang sama dari sistem komputer dan operasi yang compiler itu sendiri berjalan pada. Output dari compiler silang dirancang untuk dijalankan pada platform yang berbeda. Compiler dan Interpreter Page 6 Kompiler lintas sering digunakan ketika mengembangkan perangkat lunak untuk embedded system yang tidak dimaksudkan untuk mendukung lingkungan pengembangan perangkat lunak. Output dari compiler yang menghasilkan kode untuk mesin virtual (VM) mungkin atau tidak mungkin dijalankan pada platform yang sama sebagai compiler yang menghasilkannya. Untuk alasan ini compiler tersebut biasanya tidak diklasifikasikan sebagai kompiler asli atau lintas. Bahasa merupakan mungkin tingkat target sendiri rendah dari yang kompilator menjadi bahasa pemrograman tingkat tinggi . C , sering dipandang sebagai semacam portabel assembler , juga dapat menjadi bahasa target kompilator. Misalnya: Cfront , compiler asli untuk C + + C digunakan sebagai bahasa target. C diciptakan oleh seperti kompilator biasanya tidak dimaksudkan untuk dibaca dan dipelihara oleh manusia. Jadi indent gaya dan cantik C kode menengah tidak relevan. Beberapa fitur C mengubahnya menjadi bahasa target yang baik. Misalnya: C kode dengan #line arahan dapat dihasilkan untuk mendukung debugging dari sumber aslinya. Bahasa Disusun vs ditafsirkan Bahasa tingkat tinggi pemrograman biasanya muncul dengan jenis terjemahan dalam pikiran: baik dirancang sebagai bahasa dikompilasi atau bahasa ditafsirkan . Namun, dalam prakteknya jarang ada apa-apa tentang bahasa yang membutuhkan untuk secara eksklusif dikompilasi atau ditafsirkan secara eksklusif, meskipun ada kemungkinan untuk merancang bahasa yang bergantung pada re- Compiler dan Interpreter Page 7 interpretasi pada waktu berjalan. Kategorisasi ini biasanya mencerminkan implementasi yang paling populer atau luas bahasa misalnya, BASIC kadang-kadang disebut bahasa ditafsirkan, dan C yang dikompilasi, meskipun keberadaan kompiler BASIC interpreter dan C. Interpretasi tidak menggantikan kompilasi sepenuhnya. Ini hanya menyembunyikan itu dari pengguna dan membuatnya bertahap. Meskipun penerjemah sendiri bisa diartikan, sebuah program langsung dieksekusi diperlukan suatu tempat di bagian bawah tumpukan (lihat bahasa mesin ). Tren modern menuju just-in-time kompilasi dan interpretasi bytecode pada waktu mengaburkan kategorisasi tradisional kompiler dan interpreter. Beberapa spesifikasi bahasa mengeja bahwa implementasi harus mencakup pusat kompilasi, misalnya, Common Lisp . Namun, tidak ada yang melekat dalam definisi Common Lisp yang berhenti dari ditafsirkan. Bahasa lain memiliki fitur yang sangat mudah untuk mengimplementasikan dalam seorang penerjemah, namun membuat tulisan kompilator jauh lebih sulit, misalnya, APL , SNOBOL4 , dan bahasa scripting banyak memungkinkan program untuk membangun source code sewenang-wenang pada saat runtime dengan operasi string biasa, dan kemudian jalankan bahwa kode dengan melewatkan ke fungsi evaluasi khusus. Untuk menerapkan fitur ini dalam bahasa dikompilasi, program biasanya harus dikirim dengan perpustakaan runtime yang mencakup versi dari kompiler sendiri. Kompilasi Hardware Output dari beberapa kompiler dapat menargetkan perangkat keras komputer pada tingkat yang sangat rendah, misalnya Gerbang Lapangan Array Programmable (FPGA) atau terstruktur aplikasi-spesifik Compiler dan Interpreter Page 8 sirkuit terpadu (ASIC). Kompiler tersebut dikatakan hardware kompiler atau alat sintesis karena kode sumber mereka kompilasi efektif mengontrol konfigurasi akhir dari perangkat keras dan bagaimana ia beroperasi, output dari kompilasi tidak instruksi yang dijalankan secara berurutan - hanya interkoneksi transistor atau lookup tabel. Misalnya, XST adalah Sintesis Xilinx Alat yang digunakan untuk mengkonfigurasi FPGA. Alat serupa yang tersedia dari Altera, Synplicity, Synopsys dan vendor lainnya. Compiler Satu-pass vs multi-pass Klasifikasi kompiler dengan jumlah lintasan memiliki latar belakang dalam keterbatasan sumber daya perangkat keras komputer. Kompilasi melibatkan banyak melakukan pekerjaan dan komputer awal tidak memiliki memori yang cukup untuk mengandung satu program yang melakukan semua pekerjaan ini. Jadi compiler dibagi menjadi program kecil yang masing-masing dibuat lulus atas sumber (atau beberapa representasi dari itu) melakukan beberapa analisis yang diperlukan dan terjemahan. Kemampuan untuk mengkompilasi dalam single pass yang klasik dilihat sebagai keuntungan karena menyederhanakan tugas menulis compiler dan satu-pass compiler umumnya melakukan kompilasi lebih cepat daripada multi-pass compiler . Dengan demikian, sebagian didorong oleh keterbatasan sumber daya dari sistem awal, bahasa awal banyak yang dirancang khusus sehingga mereka dapat dikompilasi dalam satu lulus (misalnya, Pascal ). Dalam beberapa kasus desain fitur bahasa mungkin memerlukan compiler untuk melakukan lebih dari satu pass atas sumber. Misalnya, mempertimbangkan deklarasi muncul pada baris 20 dari sumber yang Compiler dan Interpreter Page 9 mempengaruhi terjemahan dari pernyataan muncul pada baris 10. Dalam kasus ini, lulus pertama perlu untuk mengumpulkan informasi tentang deklarasi muncul setelah pernyataan bahwa mereka mempengaruhi, dengan terjadinya terjemahan yang sebenarnya selama lulus berikutnya. Kerugian kompilasi dalam satu lulus adalah bahwa hal itu tidak mungkin untuk melakukan banyak canggih optimasi yang diperlukan untuk menghasilkan kode berkualitas menghitung persis berapa banyak tinggi. Ini bisa sulit untuk melewati sebuah compiler mengoptimalkan membuat. Misalnya, fase yang berbeda dari optimasi dapat menganalisis satu ekspresi berkali-kali tetapi hanya menganalisis ekspresi lain sekali. Memisahkan kompilator menjadi program kecil adalah teknik yang digunakan oleh para peneliti yang tertarik dalam memproduksi kompiler provably benar. Membuktikan kebenaran seperangkat program kecil sering membutuhkan sedikit usaha daripada membuktikan kebenaran dari sebuah program, lebih besar tunggal, setara. Sementara compiler multi-pass khas output kode mesin dari lulus akhir, ada beberapa jenis lain: Sebuah " sumber-to-source compiler "adalah jenis compiler yang mengambil bahasa tingkat tinggi sebagai masukan dan output bahasa tingkat tinggi. Sebagai contoh, sebuah parallelizing otomatis compiler akan sering mengambil dalam program bahasa tingkat tinggi sebagai Compiler dan Interpreter Page 10 masukan dan kemudian mengubah kode dan menjelaskannya dengan penjelasan kode paralel (misalnya OpenMP ) atau konstruksi bahasa (misalnya Fortran ini DOALL pernyataan). Tahap compiler yang mengkompilasi dengan bahasa assembly dari mesin teoritis, seperti beberapa Prolog implementasi o Mesin Prolog juga dikenal sebagai Mesin Abstrak Warren (atau WAM). o Bytecode compiler untuk Java , Python , dan banyak lagi yang juga merupakan subtipe ini. Just-in-time compiler , yang digunakan oleh Smalltalk dan sistem Jawa, dan juga oleh Microsoft NET. Common Language Menengah (CIL) o Aplikasi yang disampaikan dalam bytecode, yang dikompilasi ke kode mesin asli sesaat sebelum eksekusi. Front end Ujung depan menganalisis kode sumber untuk membangun sebuah representasi internal dari program, yang disebut representasi antara atau IR. Hal ini juga mengelola tabel simbol , struktur data pemetaan setiap simbol dalam kode sumber untuk informasi yang terkait seperti lokasi, jenis dan ruang lingkup. Hal ini dilakukan melalui beberapa tahap, yang mencakup beberapa hal sebagai berikut: 1. Jalur rekonstruksi. Bahasa yang kulit pengasah kata kunci atau memungkinkan spasi sewenang-wenang dalam pengidentifikasi memerlukan fase sebelum parsing, yang mengubah urutan karakter masukan ke bentuk kanonik siap untuk parser. The top-down , recursiveketurunan , meja-driven parser digunakan dalam tahun 1960-an biasanya membaca sumber satu karakter pada satu waktu dan tidak memerlukan fase tokenizing terpisah. Atlas Autocode , dan Imp (dan beberapa implementasi dari ALGOL dan Coral 66 ) adalah contoh dari bahasa stropped yang kompiler akan memiliki fase Rekonstruksi Line. Compiler dan Interpreter Page 11 2. Analisis leksikal istirahat teks kode sumber menjadi potongan-potongan kecil yang disebut token. Setiap bukti merupakan unit atom tunggal bahasa, misalnya sebuah kata kunci , identifier atau nama simbol . Sintaks token biasanya bahasa biasa , sehingga negara yang terbatas robot dibangun dari ekspresi reguler dapat digunakan untuk mengenalinya. Fase ini disebut juga lexing atau memindai, dan perangkat lunak melakukan analisis leksikal disebut penganalisis leksikal atau pemindai. 3. Preprocessing . Beberapa bahasa, misalnya, C , memerlukan fase preprocessing yang mendukung makro substitusi dan kompilasi bersyarat. Biasanya tahap preprocessing terjadi sebelum analisis sintaksis atau semantik, misalnya dalam kasus C, preprocessor memanipulasi token leksikal ketimbang bentuk sintaksis. Namun, beberapa bahasa seperti Skema mendukung substitusi makro didasarkan pada bentuk-bentuk sintaksis. 4. Analisis sintaks melibatkan parsing urutan token untuk mengidentifikasi struktur sintaksis dari program. Fase ini biasanya membangun pohon parse , yang menggantikan urutan linear token dengan struktur pohon dibangun sesuai dengan aturan dari tata bahasa formal yang mendefinisikan sintaks bahasa itu. Pohon parse sering dianalisis, ditambah, dan diubah oleh tahap selanjutnya di compiler. 5. Analisis semantik adalah fase di mana compiler menambahkan informasi semantik dengan pohon parse dan membangun tabel simbol. Fase ini melakukan pemeriksaan semantik seperti pemeriksaan tipe (memeriksa kesalahan jenis), atau mengikat objek (menghubungkan variabel dan referensi fungsi dengan definisi mereka), atau tugas tertentu (mengharuskan semua variabel lokal harus diinisialisasi sebelum digunakan), menolak program yang salah atau mengeluarkan peringatan. Analisis semantik biasanya membutuhkan pohon parse lengkap, yang berarti bahwa fase ini secara logis mengikuti parsing fase, dan logis mendahului generasi kode fase, meskipun sering mungkin Compiler dan Interpreter Page 12 untuk melipat beberapa tahap menjadi satu lulus atas kode dalam implementasi compiler. Back End Back end Istilah kadang-kadang bingung dengan kode generator karena fungsi tumpang tindih menghasilkan kode assembly. Beberapa literatur menggunakan end menengah untuk membedakan analisis generik dan fase optimasi di bagian belakang dari mesin tergantung generator kode. Tahapan utama dari bagian belakang meliputi: 1. Analisis : Ini adalah pengumpulan informasi program dari representasi antara yang berasal dari input. Analisis khas adalah aliran data analisis untuk membangun menggunakan-mendefinisikan rantai , analisis ketergantungan , analisis alias , analisis pointer , analisis melarikan diri dll Analisis yang akurat adalah dasar untuk setiap optimasi compiler. The grafik panggilan dan grafik kontrol aliran biasanya juga dibangun selama fase analisis. 2. Optimasi : representasi bahasa menengah berubah menjadi bentuk setara tapi lebih cepat (atau lebih kecil) fungsional. Optimasi populer adalah ekspansi inline , penghapusan kode mati , propagasi konstanta , transformasi lingkaran , mendaftar alokasi dan bahkan paralelisasi otomatis . 3. Generasi kode : bahasa perantara berubah diterjemahkan ke dalam bahasa output, biasanya asli bahasa mesin dari sistem. Ini melibatkan keputusan sumber daya dan penyimpanan, seperti memutuskan mana variabel untuk masuk ke dalam register dan memori dan seleksi dan penjadwalan instruksi mesin yang sesuai bersama dengan mode pengalamatan terkait mereka (lihat juga Sethi-Ullman algoritma ). Data Debug juga mungkin perlu dihasilkan untuk memfasilitasi debugging . Compiler dan Interpreter Page 13 Analisis Compiler adalah prasyarat untuk setiap optimasi compiler, dan mereka bekerja sama erat. Sebagai contoh, analisis ketergantungan sangat penting untuk transformasi lingkaran . Selain itu, ruang lingkup analisis kompilator dan optimasi sangat bervariasi, dari sekecil blok dasar ke tingkat prosedur / fungsi, atau bahkan lebih dari seluruh program ( optimasi interprosedural ). Jelas, kompilator berpotensi dapat melakukan pekerjaan yang lebih baik menggunakan pandangan yang lebih luas. Tapi itu pandangan yang luas tidak bebas: lingkup analisis besar dan optimasi yang sangat mahal dalam hal waktu kompilasi dan ruang memori, hal ini terutama berlaku untuk analisis interprosedural dan optimasi. Analisis program dan optimasi yang umum di kompiler komersial modern dari HP , IBM , SGI , Intel , Microsoft , dan Sun Microsystems . Open source GCC dikritik untuk waktu yang lama untuk kurang optimasi interprosedural kuat, namun berubah dalam hal ini. Lain compiler open source dengan analisis lengkap dan infrastruktur optimasi Open64 , yang digunakan oleh banyak organisasi untuk tujuan penelitian dan komersial. Karena waktu ekstra dan ruang yang dibutuhkan untuk analisis dan optimasi compiler, beberapa kompiler melewatkan mereka secara default. Pengguna harus menggunakan opsi kompilasi secara eksplisit memberitahu compiler yang optimasi harus diaktifkan. Compiler dan Interpreter Page 14 Interpeter Dalam ilmu komputer , seorang penerjemah adalah program komputer mengeksekusi melakukan, , instruksi yang yaitu tertulis dalam bahasa pemrograman . Penerjemah umumnya menggunakan salah satu strategi berikut untuk eksekusi program: 1. mengeksekusi kode sumber secara langsung 2. menerjemahkan kode sumber ke dalam beberapa efisien representasi menengah dan segera mengeksekusi ini 3. eksplisit mengeksekusi kode dikompilasi disimpan yang dibuat oleh compiler yang merupakan bagian dari sistem penerjemah Versi awal dari pemrograman Lisp bahasa dan Dartmouth BASIC akan menjadi contoh dari tipe pertama. Perl , Python , MATLAB , dan Ruby adalah contoh yang kedua, sedangkan UCSD Pascal adalah contoh dari jenis ketiga. Source program dikompilasi sebelumnya dan disimpan sebagai kode mesin yang independen, yang kemudian dihubungkan pada saat run-time dan dieksekusi oleh interpreter dan / atau compiler (untuk JIT sistem). Beberapa sistem, seperti Smalltalk , versi kontemporer BASIC , Jawa dan lain-lain juga dapat menggabungkan dua dan tiga. Sementara interpretasi dan kompilasi adalah dua cara utama yang digunakan bahasa pemrograman dilaksanakan, mereka tidak saling eksklusif, karena sistem menafsirkan kebanyakan juga melakukan Compiler dan Interpreter Page 15 beberapa pekerjaan penerjemahan, seperti kompiler. Istilah " ditafsirkan bahasa "atau" bahasa dikompilasi "menandakan bahwa pelaksanaan kanonik bahasa yang merupakan interpreter atau kompiler, masingmasing. Sebuah bahasa tingkat tinggi idealnya merupakan abstraksi independen dari implementasi tertentu. Sejarah Yang pertama ditafsirkan bahasa tingkat tinggi mungkin Lisp . Lisp pertama kali dilaksanakan oleh Steve Russell pada 704 IBM komputer. Russell telah membaca John McCarthy paper, dan menyadari (mengejutkan McCarthy) bahwa fungsi Lisp eval dapat diimplementasikan dalam kode mesin. Hasilnya adalah interpreter Lisp kerja yang dapat digunakan untuk menjalankan program Lisp, atau lebih tepat , "mengevaluasi ekspresi Lisp". Keuntungan dan kerugian dari menggunakan interpreter Program biasanya ditulis dalam tingkat tinggi kode, yang harus diubah menjadi kode mesin untuk CPU untuk melaksanakannya. Konversi ini dilakukan dengan baik compiler atau interpreter. Sebuah compiler membuat konversi hanya sekali, sedangkan penerjemah biasanya mengkonversi setiap kali program dijalankan (atau dalam beberapa bahasa seperti versi awal BASIC , setiap kali satu instruksi dijalankan). Siklus Pengembangan Selama siklus pengembangan perangkat lunak , programmer membuat perubahan sering ke kode sumber. Bila menggunakan Compiler dan Interpreter Page 16 compiler, setiap kali perubahan dibuat ke kode sumber, mereka harus menunggu compiler untuk menerjemahkan sumber file diubah dan menghubungkan semua file kode biner bersama-sama sebelum program bisa dijalankan. Semakin besar program, semakin lama menunggu. Sebaliknya, seorang programmer menggunakan juru melakukan banyak kurang menunggu, sebagai penerjemah biasanya hanya perlu menerjemahkan kode yang bekerja pada sebuah representasi intermediate (atau tidak menerjemahkannya sama sekali), sehingga membutuhkan waktu lebih sedikit sebelum perubahan dapat diuji Distribusi Sebuah compiler mengubah kode sumber kedalam instruksi biner untuk arsitektur prosesor yang spesifik ini, sehingga membuatnya kurang portable. Konversi ini dibuat hanya sekali, pada lingkungan pengembang, dan setelah itu biner yang sama dapat didistribusikan ke mesin pengguna di tempat yang dapat dieksekusi tanpa terjemahan lanjut. Sebuah cross compiler dapat menghasilkan kode biner untuk mesin pengguna bahkan jika itu memiliki prosesor yang berbeda dari mesin di mana kode dikompilasi. Program ditafsirkan dapat didistribusikan sebagai kode sumber. Hal ini perlu membutuhkan diterjemahkan waktu lebih dalam tetapi setiap mesin membuat akhir, program yang distribusi independen dari arsitektur mesin. Namun, portabilitas kode sumber ditafsirkan tergantung pada mesin target sebenarnya memiliki interpreter yang cocok. Jika penafsir perlu diberikan bersama dengan Compiler dan Interpreter Page 17 sumber, proses instalasi secara keseluruhan lebih kompleks daripada pengiriman executable monolitik Fakta bahwa kode ditafsirkan dengan mudah dapat dibaca dan disalin oleh manusia dapat menjadi perhatian dari sudut pandang hak cipta . Namun, berbagai sistem enkripsi dan kebingungan ada. Pengiriman kode menengah, seperti bytecode, memiliki efek yang sama dengan kebingungan, tapi bytecode dapat diterjemahkan dengan decompiler atau disassembler . Efisiensi Kerugian utama dari penafsir adalah bahwa ketika sebuah program sedang ditafsirkan, biasanya berjalan lebih lambat daripada jika itu telah disusun . Perbedaan dalam kecepatan bisa menjadi kecil atau besar, sering urutan besarnya dan kadang-kadang lebih. Ini biasanya memerlukan waktu lebih lama untuk menjalankan program di bawah penerjemah daripada menjalankan kode dikompilasi tetapi dapat mengambil sedikit waktu untuk menafsirkannya dari total waktu yang dibutuhkan untuk mengkompilasi dan menjalankannya. Hal ini terutama penting ketika prototyping dan kode pengujian ketika siklus edit-menafsirkan-debug sering bisa jauh lebih pendek daripada siklus edit-kompilasi-run-debug Menafsirkan kode lebih lambat daripada menjalankan kode dikompilasi karena penerjemah harus menganalisa setiap pernyataan dalam program setiap kali dieksekusi dan kemudian melakukan tindakan yang diinginkan, sedangkan kode dikompilasi hanya melakukan tindakan dalam konteks tetap ditentukan oleh kompilasi. Ini run-time analisis dikenal sebagai "overhead interpretatif". Akses ke variabel juga lambat dalam penerjemah karena pemetaan pengenal Compiler dan Interpreter Page 18 lokasi penyimpanan harus dilakukan berulang-ulang pada saat run-time daripada di waktu kompilasi . Ada kompromi antara berbagai kecepatan pembangunan saat menggunakan seorang penerjemah dan kecepatan eksekusi ketika menggunakan compiler. Beberapa sistem (seperti beberapa lisps ) memungkinkan ditafsirkan dan dikompilasi kode untuk memanggil satu sama lain dan berbagi variabel. Ini berarti bahwa setelah rutin telah diuji dan debugged bawah penafsir dapat dikompilasi dan dengan demikian mendapatkan keuntungan dari eksekusi lebih cepat, sementara rutinitas lain sedang dikembangkan . Banyak penafsir tidak mengeksekusi kode sumber seperti berdiri, tetapi mengubahnya menjadi beberapa bentuk internal yang lebih kompak. Banyak BASIC interpreter mengganti kata kunci dengan satu byte token yang dapat digunakan untuk mencari instruksi dalam tabel melompat . Sebuah penafsir Beberapa, seperti PBASIC interpreter, mencapai tingkat yang lebih tinggi dari pemadatan program dengan menggunakan sedikit-berorientasi daripada struktur byte berorientasi memori program, di mana perintah token menempati mungkin 5 bit, nominal "16-bit" konstanta disimpan dalam kode variabel-panjang membutuhkan 3, 6, 10, atau 18 bit, dan operan alamat termasuk "sedikit offset". Interpreter BASIC Banyak dapat menyimpan dan membaca kembali representasi internal mereka sendiri tokenized. Penerjemah mungkin juga menggunakan yang sama penganalisa leksikal dan parser sebagai compiler dan kemudian menafsirkan dihasilkan pohon sintaks abstrak . Compiler dan Interpreter Page 19 Regress Interpretasi tidak dapat digunakan sebagai satu-satunya metode eksekusi: meskipun seorang juru sendiri bisa ditafsirkan dan seterusnya, sebuah program langsung dieksekusi diperlukan suatu tempat di bagian bawah tumpukan. Variasi Interpreter Bytecode Ada spektrum kemungkinan antara menafsirkan dan kompilasi, tergantung pada jumlah analisis dilakukan sebelum program dijalankan. Misalnya, Emacs Lisp dikompilasi untuk bytecode , yang merupakan representasi sangat padat dan dioptimalkan dari sumber Lisp, namun tidak kode mesin (dan karena itu tidak terikat pada hardware tertentu). Ini "dikompilasi" Kode ini kemudian diinterpretasikan oleh juru bytecode (sendiri ditulis dalam C ). Kode dikompilasi dalam hal ini adalah kode mesin untuk mesin virtual , yang dilaksanakan tidak dalam perangkat keras, tetapi dalam interpreter bytecode. Pendekatan yang sama digunakan dengan Forth kode yang digunakan dalam Open Firmware sistem: bahasa sumber dikompilasi menjadi "kode F" (bytecode a), yang kemudian diinterpretasikan oleh mesin virtual Tabel kontrol - yang tidak selalu merasa perlu untuk melewati fase kompilasi - mendikte sesuai algoritma kontrol aliran melalui penerjemah disesuaikan dalam cara yang mirip dengan interpreter bytecode. Compiler dan Interpreter Page 20 Interpreter Abstrak Sintaks Pohon Dalam spektrum antara interpretasi dan kompilasi, pendekatan lain adalah mengubah kode sumber menjadi dioptimalkan Pohon Sintaks Abstrak (AST) kemudian melaksanakan program ini mengikuti struktur pohon, atau menggunakannya untuk menghasilkan kode asli Just-In-Time. Dalam pendekatan ini, setiap kalimat perlu diurai hanya sekali. Sebagai keuntungan lebih bytecode, AST membuat struktur program global dan hubungan antara pernyataan (yang hilang dalam representasi bytecode), dan ketika dikompresi memberikan representasi yang lebih kompak. Dengan demikian, menggunakan AST telah diusulkan sebagai perantara yang lebih baik Format untuk Just-in-time compiler dibandingkan bytecode. Juga, memungkinkan untuk melakukan analisis yang lebih baik saat runtime. Namun, untuk juru, AST menyebabkan lebih overhead daripada interpreter bytecode, karena node yang berkaitan dengan sintaks melakukan tidak ada pekerjaan yang berguna, dari representasi kurang berurutan (membutuhkan traversal pointer lebih) dan overhead mengunjungi pohon. Just-in-time kompilasi Lebih lanjut mengaburkan perbedaan antara penerjemah, bytecode interpreter dan kompilasi just-in-time kompilasi (atau JIT), suatu teknik di mana representasi antara dikompilasi untuk asli kode mesin pada saat runtime. Ini menganugerahkan efisiensi menjalankan kode asli, Compiler dan Interpreter Page 21 pada biaya waktu startup dan penggunaan memori meningkat ketika bytecode atau AST pertama kali disusun. Otimasi adaptif adalah teknik pelengkap di mana profil penerjemah program berjalan dan mengkompilasi bagian yang paling sering dieksekusi menjadi asli kode. Kedua teknik yang beberapa dekade tua, muncul dalam bahasa seperti Smalltalk pada 1980-an. Just-in-time kompilasi telah mendapat perhatian utama di antara pelaksana bahasa dalam beberapa tahun terakhir, dengan Jawa , yang Kerangka. NET dan paling modern JavaScript implementasi sekarang termasuk JITs. Compiler dan Interpreter Page 22 Kata Penutup Demikian yang dapat kami paparkan mengenai materi yang menjadi pokok bahasan dalam makalah ini, tentunya masih banyak kekurangan dan kelemahan, karena terbatasnya pengetahuan dan kurangnya rujukan atau referensi yang ada hubungannya dengan makalah ini. Penulis banyak berharap para pembaca yang budiman memberikan kritik dan saran yang membangun kepada penulis demi mempersempurnakan makalah ini dan penulisan makalah pada kesempatan-kesempatan berikutnya. Semoga Berguna pada penulis khususnya juga para pembaca yang budiman pada umumnya. Compiler dan Interpreter Page 23 Referensi http://tyatyol.blogspot.com/2012/01/eis-executive-information-system.html http://dosen.narotama.ac.id/wp-content/uploads/2012/01/SELUK-BELUK-SISTEMINFORMASI-EKSEKUTIF.pdf http://mhd.blog.ittelkom.ac.id/blog/files/2010/01/Bab-7-Executive-InformationSystem.pdf http://www.blogerch.com/2009/05/executive-information-system-eis.html http://mistercela21.wordpress.com/2010/01/12/sistem-informasi-eksekutifexecutive-information-system/ http://albertus19.wordpress.com/2010/10/26/edp-electronic-data-processing/ Compiler dan Interpreter Page 24