Jumat, 28 Oktober 2011

ENTEPRETER

Interpreter (komputasi)

Dari Wikipedia, ensiklopedia bebas
Dalam ilmu komputer , penerjemah biasanya berarti sebuah program komputer yang mengeksekusi , yaitu melakukan, instruksi ditulis dalam bahasa pemrograman . Penerjemah mungkin merupakan program yang baik
  1. mengeksekusi kode sumber secara langsung
  2. menerjemahkan kode sumber ke dalam beberapa efisien representasi intermediate (kode) dan segera mengeksekusi ini
  3. eksplisit mengeksekusi kode dikompilasi disimpan [1] yang dibuat oleh kompiler yang merupakan bagian dari sistem penerjemah
Versi awal dari bahasa pemrograman Lisp dan Dartmouth BASIC akan contoh-contoh dari tipe 1. Perl , Python , MATLAB , dan Ruby adalah contoh dari tipe 2, sedangkan UCSD Pascal adalah tipe 3: Sumber program dikompilasi depan waktu dan disimpan sebagai mesin yang independen kode, yang kemudian dihubungkan pada saat run-time dan dieksekusi oleh interpreter dan / atau kompiler (untuk JIT sistem). Beberapa sistem, seperti Smalltalk , versi kontemporer BASIC , Jawa dan lain-lain, juga dapat menggabungkan 2 dan 3.
Sementara menafsirkan dan kompilasi adalah dua sarana utama yang digunakan bahasa pemrograman dilaksanakan, ini tidak sepenuhnya saling eksklusif kategori, salah satu alasan adalah bahwa sistem menafsirkan sebagian besar juga melakukan beberapa pekerjaan penerjemahan, seperti compiler. Istilah " ditafsirkan bahasa "atau" bahasa yang dikompilasi "hanya berarti bahwa pelaksanaan kanonik bahasa yang merupakan penerjemah atau kompilator, bahasa tingkat tinggi pada dasarnya adalah sebuah abstraksi yang (idealnya) independen dari implementasi tertentu.

Isi

 [hide

[ sunting ] Sejarah

Yang pertama menafsirkan bahasa tingkat tinggi mungkin Lisp . Lisp pertama kali dilaksanakan oleh Steve Russell pada IBM 704 komputer. Russell telah membaca kertas McCarthy, dan menyadari (untuk kejutan McCarthy) bahwa fungsi Lisp eval bisa diimplementasikan dalam kode mesin. [2] Hasilnya adalah juru Lisp kerja yang dapat digunakan untuk menjalankan program Lisp, atau lebih tepat, 'mengevaluasi cadel ekspresi. "

[ sunting ] Keuntungan dan kerugian menggunakan interpreter

Biasanya programmer menulis program dalam tingkat tinggi kode, yang CPU tidak bisa mengeksekusi, sehingga kode sumber ini harus dikonversi ke dalam kode mesin. Konversi ini dilakukan oleh kompilator atau penerjemah. Sebuah kompiler membuat konversi hanya sekali, sementara penerjemah biasanya mengubahnya setiap kali program dijalankan (atau dalam beberapa bahasa seperti versi awal dari BASIC , setiap kali satu instruksi dijalankan).

[ sunting ] Pengembangan siklus

Selama pengembangan program, programmer membuat perubahan sering ke kode sumber. Dengan compiler, setiap kali programmer membuat perubahan ke kode sumber, s / ia harus menunggu untuk compiler untuk membuat kompilasi dari file sumber berubah, dan menghubungkan semua file kode biner bersama-sama sebelum program bisa dijalankan. Semakin besar program, programmer lagi harus menunggu untuk melihat hasil perubahan. Sebaliknya, seorang programmer menggunakan seorang penerjemah tidak banyak kurang menunggu, sebagai penerjemah biasanya hanya perlu untuk menerjemahkan kode yang bekerja pada representasi intermediate (atau tidak menerjemahkan sama sekali), sehingga membutuhkan banyak waktu kurang sebelum perubahan dapat diuji.

[ sunting ] Distribusi

Sebuah kompiler mengubah kode sumber ke dalam instruksi biner untuk arsitektur prosesor spesifik, 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 dijalankan tanpa penerjemahan lebih lanjut. Sebuah cross compiler dapat menghasilkan kode biner untuk mesin pengguna bahkan jika ia memiliki prosesor yang berbeda dari mesin di mana kode dikompilasi.
Sebuah program dapat didistribusikan ditafsirkan sebagai kode sumber. Hal ini perlu diterjemahkan dalam setiap mesin akhir, yang membutuhkan waktu lebih tetapi membuat distribusi program mandiri arsitektur mesin. Namun, portabilitas kode sumber ditafsirkan tergantung pada mesin target benar-benar memiliki seorang penerjemah yang cocok. Jika penafsir harus diberikan bersama dengan sumber, proses instalasi keseluruhan adalah lebih kompleks daripada pengiriman executable monolitik.
Fakta bahwa kode diinterpretasikan 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 mirip dengan kebingungan.

[ sunting ] 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 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 mengedit-menafsirkan-debug sering bisa jauh lebih pendek daripada siklus mengedit-kompilasi-run-debug.
Menafsirkan kode lebih lambat daripada menjalankan kode dikompilasi karena penafsir harus menganalisa setiap pernyataan dalam program setiap kali dijalankan dan kemudian melakukan tindakan yang diinginkan, sedangkan kode dikompilasi hanya melakukan tindakan dalam konteks tetap ditentukan oleh kompilasi. Ini analisis run-time yang dikenal sebagai "overhead interpretatif". Akses ke variabel juga lambat dalam penerjemah karena pemetaan pengenal lokasi penyimpanan harus dilakukan berulang kali pada saat run-time daripada pada waktu kompilasi.
Ada berbagai kompromi antara kecepatan perkembangan saat menggunakan seorang penerjemah dan kecepatan eksekusi ketika menggunakan kompilator. Beberapa sistem (seperti beberapa lisps ) memungkinkan diinterpretasikan dan dikompilasi kode untuk memanggil satu sama lain dan untuk berbagi variabel. Ini berarti bahwa setelah rutin telah diuji dan debugged bawah penafsir itu dapat dikompilasi dan dengan demikian manfaat dari eksekusi yang lebih cepat sementara rutinitas lain sedang dikembangkan. Banyak penafsir tidak mengeksekusi kode sumber seperti berdiri, tetapi mengubahnya menjadi bentuk internal yang lebih kompak. Banyak BASIC interpreter mengganti kata kunci dengan token byte tunggal yang dapat digunakan untuk mencari instruksi dalam tabel melompat . Lainnya mencapai tingkat yang lebih tinggi pemadatan program dengan menggunakan sedikit-berorientasi daripada struktur byte memori program berorientasi, di mana perintah token dapat menduduki mungkin 5 bit dari sebuah kata 16 bit, meninggalkan 11 bit untuk label mereka atau operan alamat.
Penerjemah mungkin menggunakan yang sama penganalisa leksikal dan parser sebagai compiler dan kemudian menginterpretasikan hasil pohon sintaks abstrak .

[ sunting ] regresi

Interpretasi tidak dapat digunakan sebagai metode tunggal eksekusi: meskipun seorang juru bahasa sendiri bisa ditafsirkan, program langsung dieksekusi diperlukan suatu tempat di bagian bawah tumpukan.

[ sunting ] Variasi

[ sunting ] Bytecode interpreter

Ada spektrum kemungkinan antara menafsirkan dan kompilasi, tergantung pada jumlah analisis yang dilakukan sebelum program dieksekusi. Sebagai contoh, Emacs Lisp dikompilasi ke bytecode , yang merupakan representasi yang sangat dikompresi dan dioptimalkan dari sumber Lisp, tetapi tidak kode mesin (dan karena itu tidak terikat pada hardware tertentu). Ini "dikompilasi" kode ini kemudian ditafsirkan oleh bytecode interpreter (itu sendiri ditulis dalam C ). Kode dikompilasi dalam hal ini adalah kode mesin untuk mesin virtual , yang dilaksanakan tidak dalam perangkat keras, tetapi dalam bytecode interpreter. Pendekatan yang sama digunakan dengan Forth kode yang digunakan dalam Open Firmware sistem: sumber bahasa dikompilasi ke dalam "kode F" (bytecode a), yang kemudian ditafsirkan oleh sebuah mesin virtual .
Kontrol tabel - yang belum tentu pernah perlu melewati fase kompilasi - algoritmik yang tepat mendikte aliran kontrol melalui interpreter disesuaikan dalam cara yang mirip dengan penafsir bytecode.

[ sunting ] Pohon Sintaks penafsir Abstrak

Dalam spektrum antara menafsirkan dan kompilasi, pendekatan lain adalah mengubah source code menjadi dioptimalkan Pohon Sintaks Abstrak (AST) kemudian melaksanakan program berikut ini struktur pohon, atau menggunakannya untuk menghasilkan kode asli Just-In-Time. [3] Dalam pendekatan ini, setiap kalimat harus dipecah hanya sekali. Sebagai keuntungan atas bytecode, AST membuat struktur program global dan hubungan antara pernyataan (yang hilang dalam sebuah representasi bytecode), dan ketika dikompresi memberikan representasi yang lebih kompak. [4] Jadi, dengan menggunakan AST telah diusulkan sebagai perantara yang lebih baik format untuk Just-in-time compiler dari bytecode. Juga, memungkinkan untuk melakukan analisis yang lebih baik selama runtime.
Namun, untuk penerjemah, AST yang menyebabkan overhead lebih dari bytecode interpreter, karena node yang berkaitan dengan sintaks tidak melakukan pekerjaan yang berguna, kurang representasi sekuensial (traversal dari pointer memerlukan lebih) dan overhead mengunjungi pohon. [5]

[ sunting ] Just-in-time kompilasi

Lebih lanjut mengaburkan perbedaan antara penafsir, byte-code interpreter dan kompilasi just-in-time kompilasi (atau JIT), suatu teknik di mana representasi menengah disusun untuk asli kode mesin pada saat runtime. Hal ini menganugerahkan efisiensi menjalankan kode asli, pada biaya waktu startup dan menggunakan memori meningkat ketika bytecode atau AST pertama dikompilasi. optimasi adaptif adalah teknik pelengkap di mana penafsir profil program berjalan dan mengkompilasi bagian yang paling sering dieksekusi ke dalam kode asli. Kedua teknik adalah beberapa dekade tua, muncul dalam bahasa seperti Smalltalk pada 1980-an. [6]
Just-in-time kompilasi telah mendapat perhatian utama antara bahasa pelaksana tahun terakhir, dengan Jawa , yang NET Framework. dan paling modern JavaScript implementasi sekarang termasuk JITs.

[ sunting ] Aplikasi

  • Interpreter sering digunakan untuk mengeksekusi perintah bahasa , dan bahasa lem karena setiap operator dieksekusi dalam bahasa perintah biasanya merupakan permintaan dari suatu rutin kompleks seperti editor atau compiler.
  • Cukup memodifikasi kode dengan mudah dapat diimplementasikan dalam bahasa ditafsirkan. Hal ini berkaitan dengan asal-usul interpretasi dalam Lisp dan kecerdasan buatan penelitian.
  • Virtualisasi . Mesin kode yang ditujukan untuk satu arsitektur perangkat keras dapat dijalankan di lain menggunakan mesin virtual , yang pada dasarnya adalah penerjemah.
  • Sandboxing : Sebuah penerjemah atau mesin virtual tidak dipaksa untuk benar-benar melaksanakan semua instruksi kode sumber itu pengolahan. Secara khusus, dapat menolak untuk mengeksekusi kode yang melanggar keamanan kendala itu beroperasi di bawah.

1 komentar: