Apakah bahasa dinamis selalu ditafsirkan?

18

Melihat sebagian besar (jika tidak semua) bahasa dinamis (misalnya Python, PHP, Perl dan Ruby), semuanya ditafsirkan. Koreksi saya jika saya salah. Apakah ada contoh bahasa dinamis yang melewati fase kompilasi? Apakah bahasa dinamis identik dengan bahasa yang ditafsirkan?

Joshua Partogi
sumber
4
Tetapkan bahasa dinamis, apakah ini diketik secara dinamis?
BenjaminB
3
Objective-C menunjukkan banyak properti "dinamis".
Edward Strange
4
@ Ayub, orang bisa melakukannya dengan Lisp selama beberapa dekade. Dan itu dikompilasi dan diketik secara dinamis. Jadi, tidak pernah ada batas pasti antara kompilasi dan interpretasi.
SK-logic
2
@Darien Anda dapat mengompilasinya pada saat dijalankan juga dan menjalankan kode setelahnya. Sebenarnya, ini bukan interpretasi.
xmm0
3
@Darien Tidak ada yang mencegah kompiler menyimpan informasi tabel simbol dalam biner yang dikompilasi dan menghasilkan kode untuk mengaksesnya pada saat dijalankan. Memang benar bahwa beberapa bahasa memberikan interpretasi lebih dari kompilasi, tetapi intinya adalah mungkin untuk memiliki kompiler untuk bahasa tersebut. Hal penting lain yang perlu diperhatikan adalah bahwa beberapa orang menganggap kompiler harus menghasilkan semacam kode mesin. Dalam praktiknya, ada kompiler yang hanya melakukan transformasi level sumber di dua bahasa (atau bahkan bahasa yang sama, seperti beberapa Javascript minifiers).
xmm0

Jawaban:

33

Melihat sebagian besar (jika tidak semua) bahasa dinamis [yaitu Python, PHP, Perl dan Ruby], semuanya ditafsirkan.

Tidak benar. Anda dapat mengkompilasi sumber Python. Itu salah satu bukti eksistensial.

Ada penerjemah untuk bahasa yang diketik secara statis, dan kompiler untuk bahasa yang diketik secara dinamis. Kedua konsep itu ortogonal.

Catatan: Secara umum, bahasa hanya itu: bahasa, dengan seperangkat konstruksi sintaksis untuk mengekspresikan semantik. Jika Anda menulis Python di papan tulis, itu masih disebut Python! Ini adalah implementasi yang bisa menjadi juru atau kompilator. Diketik secara statis atau diketik secara dinamis (sejenis hibrida keduanya) adalah properti dari bahasa tersebut, sementara mengeksekusi program dengan menafsirkan atau mengkompilasi adalah properti dari implementasi.

xmm0
sumber
19
Keakurasian apa yang harus dimasukkan pada papan tulis agar Python valid secara sintaksis? ;)
edA-qa mort-ora-y
1
Anda tidak dapat mengkompilasi Python. PYC hanya mempercepat muatan modul. Dan py2exe hanya menanamkan interpreter ke exe dengan file sumber.
BenjaminB
8
@ Ubiquité: .pycfile adalah bytecode. Kode sumber python diuraikan, dioptimalkan dan dikompilasi untuk membuatnya. Instruksi bytecode relatif tinggi dan implementasi yang paling populer adalah interpreter biasa (untuk kontras, lihat PyPy yang mengkompilasi bytecode JIT ke kode mesin yang sangat pintar saat runtime), tetapi Python tidak kurang dikompilasi daripada Java atau C #. Python hanya "tidak dikompilasi" jika "kompilasi" terbatas pada kompilasi asli sebelumnya , tetapi tidak ada yang mengatakan apa-apa tentang itu dan secara umum itu dapat merujuk pada transformasi bahasa-ke-bahasa.
4
@ Ubiquité: Ya, itu benar, tetapi itu tidak ada hubungannya dengan klaim Anda bahwa "Anda tidak dapat mengkompilasi Python" atau apakah mungkin untuk mengkompilasi Python. Pertama dan terpenting, Anda sedang mencampur Pythondan CPython, sedangkan yang terakhir adalah implementasi dari yang pertama, begitu juga PyPy.
phant0m
2
@ClemC SEMUA properti bahasa dibangun menjadi kompiler atau juru bahasa, jika tidak, juru bahasa atau kompiler adalah sesuatu untuk bahasa lain.
Pieter B
15

Lisp umum diketik secara dinamis (dan sangat) dan biasanya dikompilasi .

Karena kedinamisan ini tercapai pada saat runtime, ada beberapa arahan yang dapat Anda gunakan dalam kode sumber untuk meyakinkan kompiler bahwa simbol hanya akan menyimpan jenis nilai tertentu, sehingga kompiler dapat mengoptimalkan kode yang dihasilkan dan meningkatkan kinerja.

Federico klez Culloca
sumber
12

C # 4.0 mendukung tipe dinamis (pengikatan lanjut) dan dikompilasi.

Matt H
sumber
4

node.js didasarkan pada mesin javascript V8 Google. V8 melakukan kompilasi runtime. V8 sangat cepat mengingat fakta itu. Cukup periksa http://shootout.alioth.debian.org dan bandingkan V8 dengan bahasa yang ditafsirkan di atas.

LLeo
sumber
3

Tidak - tentu saja memungkinkan untuk menyusun bahasa dinamis.

Bahkan ada beberapa bahasa dinamis yang selalu dikompilasi oleh desain (misalnya Clojure).

Namun pertanyaan menyentuh pada poin terkait yang penting: meskipun bahasa dinamis dapat dikompilasi, sering kali bahasa dinamis tidak dapat dikompilasi ke kode yang seefisien bahasa yang diketik secara statis . Ini karena ada beberapa fitur bawaan dalam bahasa dinamis yang memerlukan pemeriksaan runtime yang tidak diperlukan dalam bahasa yang dikompilasi secara statis.

Contoh dari ini: bahasa yang memungkinkan patch runtime objek (misalnya Ruby) sering mengharuskan objek untuk diperiksa (dengan pencarian yang hashtable atau serupa) setiap kali Anda memanggil metode pada objek. Bahkan jika ini dikompilasi, kompiler harus membuat kode untuk melakukan pencarian metode saat runtime. Dalam beberapa hal pencarian metode ini tidak berbeda dengan apa yang harus dilakukan oleh seorang juru bahasa.

Ini menambahkan overhead yang signifikan bila dibandingkan dengan pemanggilan metode dalam bahasa seperti Java, di mana metode yang benar dapat secara statis ditentukan oleh kompiler dari definisi kelas dan dikurangi menjadi pemanggilan fungsi sederhana dalam kode asli.

Saya percaya ini adalah efek ini lebih dari apa pun yang menghasilkan bahasa dinamis memiliki kinerja lebih lambat rata-rata daripada rekan-rekan mereka yang dikompilasi secara statis. Seperti yang dapat Anda lihat dari tolok ukur yang cacat , itu adalah bahasa yang diketik secara statis (C, Java, Fortran dll.) Yang cenderung lebih cepat dengan bahasa dinamis (Perl, Python, Ruby, PHP, dll.) Di bagian bawah peringkat.

mikera
sumber
2

Sekali waktu, BASIC ditafsirkan. Dan beberapa varian BASIC memiliki pengetikan dinamis. Dan Anda bisa mendapatkan kompiler untuk mereka juga.

(Ini kembali pada zaman 100K floppy drive, ketika dinosaurus masih menjelajahi bumi dan makan pengembang s / w tidak curiga untuk sarapan.)

dengan cepat_now
sumber
... tetapi hanya ketika mereka menggunakan GOTO. (Yang, tentu saja, sangat umum jika mereka berkembang di BASIC. AHA! Itu menjelaskannya!)
Mason Wheeler
BASIC pada waktu desainnya adalah bahasa yang dikompilasi.
Pemrogram
2

Implementasi Smalltalk yang berbeda menangani hal ini secara berbeda, tetapi beberapa di antaranya mengkompilasi bytecode yang berjalan pada VM kinerja tinggi.

Randy Coulman
sumber
2

Bahkan sebagian besar dari apa yang disebut "ditafsirkan" bahasa melewati / memungkinkan kompilasi just-in-time untuk membuatnya berjalan lebih cepat. Dan beberapa dari mereka harus dikompilasi ke kode byte sebelum Anda dapat menjalankannya.

Sebenarnya dinamis dan ditafsirkan sama sekali 2 ide yang berbeda, meskipun ada korelasi. Alasannya adalah siapa yang pernah merasakan pengetikan dinamis membuat pekerjaan mereka lebih mudah dan lebih cepat, mereka tidak akan keberatan kode itu dijalankan sedikit lebih lambat tetapi portabel.

pengguna658991
sumber
1

Chrome, IE9 dan Firefox 3.1+ semuanya mengkompilasi JavaScript ke binari asli, dan JavaScript diketik secara dinamis.

Saya pikir alasan bahwa bahasa dinamis secara historis cenderung ditafsirkan adalah karena pengetikan dan penafsiran dinamis (atau lebih khusus, kurangnya kompilasi) keduanya cenderung fitur yang berguna untuk bahasa scripting dan tugas penulisan skrip secara umum.

Kinerja juga tidak (tidak) lebih menjadi perhatian untuk jenis program yang ditulis dalam bahasa-bahasa ini, jadi sekali lagi, overhead dari pengetikan dan interpretasi yang dinamis tidak menjadi masalah besar seperti dalam bahasa kinerja nilai itu.

Rei Miyasaka
sumber
1

Python biasanya dikompilasi. Diakui dikompilasi ke kode byte yang kemudian ditafsirkan.

Perl bekerja dengan cara yang sama.

Lisp umum, biasanya, mengkompilasi ke salah satu kode asli atau byte. Ini berbeda antara implementasi (dan, pada tingkat tertentu, dalam implementasi, tergantung pada berbagai pengaturan optimasi).

Vatine
sumber
-5

Iya. Semua bahasa dinamis adalah bahasa yang ditafsirkan (tetapi bahasa yang ditafsirkan bisa menjadi non-dinamis).

Alasannya sederhana: jika dinamis, perlu juru bahasa untuk melakukan dinamisme pada tingkat kompilasi biner.

ex. : ketika kita memasukkan data dalam variabel PHP, lalu satu lagi dari jenis yang berbeda, program kita tidak dapat dikompilasi menjadi kode biner karena masing-masing jenis memiliki format representasi biner sendiri; penerjemah mengelola pergeseran pada tingkat biner secara dinamis

Pikiran jernih
sumber
2
Salah. Bahasa dinamis dapat dikompilasi (dan kadang-kadang sangat efisien, misalnya menggunakan teknik kompilasi JIT dan adaptif)
Basile Starynkevitch
"Kira-kira, kompilasi JIT menggabungkan kecepatan kode yang dikompilasi dengan fleksibilitas interpretasi, dengan overhead penerjemah ..." en.wikipedia.org/wiki/Just-in-time_compilation program Anda tidak dikompilasi: dikompilasi oleh juru bahasa untuk Anda
ClearMind
Baca makalah terkait dengan DIRI
Basile Starynkevitch
Tentu. Tautan Anda menyebutkan: "Salah satu fitur dari Self adalah bahwa ia didasarkan pada jenis sistem mesin virtual yang sama dengan yang digunakan sistem Smalltalk sebelumnya. Artinya, program bukan entitas yang berdiri sendiri seperti dalam bahasa seperti C, tetapi membutuhkan seluruh lingkungan memori untuk dijalankan. " tidak berdiri sendiri = tidak biner mengkompilasi mesin virtual diperlukan untuk melakukan kompilasi biner
ClearMind
1
Definisi kompiler Anda terlalu ketat. Tidak setiap kompiler menghasilkan file yang dapat dieksekusi biner. Untuk sampel tandingan baru-baru ini, pelajari penerapan SBCL . Baca Buku Naga terbaru dan Lisp In Small Pieces
Basile Starynkevitch