Saya dapat memahami fakta bahwa Java membutuhkan kompiler dan interpreter. Ini mengkompilasi kode sumber untuk bytecode dan kemudian mesin virtual (pada Windows, Linux, Android, dll.) Menerjemahkan bytecode ke kode mesin untuk arsitektur saat ini.
Tetapi mengapa Python membutuhkan kompiler dan interpreter? Karena Python bukan platform independen, mengapa tidak menggunakan interpretasi saja? Sejauh yang saya tahu, Anda tidak dapat menjalankan program Python (dikompilasi ke bytecode) pada mesin Windows atau Linux apa pun tanpa modifikasi. Atau saya salah?
Jawaban:
Anda salah. Bytecode python adalah lintas platform. Lihat Apakah bytecode python bergantung pada versi? Apakah ini tergantung platform? pada Stack Overflow. Namun, itu tidak kompatibel antar versi. Python 2.6 tidak dapat menjalankan file Python 2.5. Jadi sementara lintas-platform, umumnya tidak berguna sebagai format distribusi.
Kecepatan. Interpretasi yang ketat lambat. Sebenarnya setiap bahasa "yang ditafsirkan" sebenarnya mengkompilasi kode sumber menjadi semacam representasi internal sehingga tidak harus berulang kali menguraikan kode. Dalam kasus python menyimpan representasi internal ini ke disk sehingga dapat melewati proses parsing / kompilasi saat berikutnya ia membutuhkan kode.
sumber
Tidak. Tidak ada dalam Spesifikasi Bahasa Jawa yang mengatakan bahwa Java perlu memiliki kompiler. Juga tidak ada dalam Spesifikasi Bahasa Jawa yang mengatakan bahwa Java perlu memiliki juru bahasa.
Apakah menggunakan penerjemah, kompiler, atau kombinasi keduanya, sepenuhnya tergantung pada kebijaksanaan implementor.
Bahkan, ada yang implementasi dari Java yang mengkompilasi langsung ke kode mesin, misalnya GNU Compiler untuk Java
gcj
. Secara teknis, kompiler Oracle OpenJDK Java juga mengkompilasi ke kode mesin, khususnya, kode byte JVM. Sekarang, Anda mungkin berkata, tunggu sebentar, itu bukan kode mesin! Tapi, ada penerjemah perangkat lunak untuk kode mesin x86, dan ada CPU perangkat keras yang dapat mengeksekusi kode byte JVM, jadi apa yang membuat satu "asli" dan yang lainnya tidak?Perhatikan bahwa kode byte JVM berada di luar Spesifikasi Bahasa Jawa, seperti halnya kode mesin x86.
Sekali lagi, itu sepenuhnya tergantung pada implementor.
Sun JVM asli tidak pernah menerjemahkan, selalu ditafsirkan. Oracle OpenJDK JVM menginterpretasikan saat ini, dan hanya bagian-bagian yang dieksekusi yang sering dikompilasi. VM Riset Maxine selalu mengkompilasi JIT. Implementasi Excelsior.JET mengkompilasi sekali, sebelumnya. IKVM.NET JVM mengkompilasi ke kode byte CIL. Android Runtime mengkompilasi sebelumnya, sekali, selama instalasi. (Juga, Android Runtime tidak mengerti kode byte JVM, ia menggunakan kode byte Dalvik, yang merupakan bahasa yang sama sekali berbeda.)
Lagi-lagi tidak. Tidak ada dalam Spesifikasi Bahasa Python yang mengatakan bahwa Python perlu memiliki kompiler. Ada juga tidak ada dalam Spesifikasi Bahasa Python yang mengatakan bahwa Python perlu berlindung seorang juru bahasa.
Perhatikan bahwa sebenarnya, Python tidak pernah diartikan. Semua implementasi Python yang ada selalu mengkompilasi Python ke bahasa yang berbeda. Bahasa itu mungkin atau mungkin tidak kemudian, pada gilirannya, ditafsirkan, tetapi bahasa itu adalah bahasa yang berbeda dari Python. Python tidak ditafsirkan.
Karena Python tidak dirancang untuk mudah ditafsirkan oleh mesin. Ini dirancang agar mudah ditafsirkan oleh manusia. Otoh, CPython kode byte, yang dirancang untuk dapat dengan mudah ditafsirkan oleh mesin. Jadi, masuk akal untuk menulis kode dalam bahasa yang dirancang untuk manusia dan menafsirkan dalam bahasa yang dirancang untuk mesin, dan untuk berpindah dari satu ke yang lain, Anda harus mengompilasinya.
Ya kamu bisa. VM CPython tersedia untuk Windows dan Linux, seperti halnya PyPy, Jython dan IronPython.
Bahasa tidak harus dikompilasi atau ditafsirkan. Bahasa hanya ada . Bahkan, bahasa sempurna bisa eksis tanpa harus setiap interpreter atau kompiler! Misalnya, Plankalkül Konrad Zuse yang ia desain pada 1930-an tidak pernah diterapkan selama masa hidupnya. Anda masih bisa menulis program di dalamnya, Anda bisa menganalisis program-program itu, alasan tentang mereka, membuktikan properti tentang mereka ... Anda tidak bisa menjalankannya. (Yah, sebenarnya, bahkan itu salah: Anda tentu saja dapat menjalankannya di kepala Anda atau dengan pena dan kertas.)
Sekarang, implementasi bahasa tertentu dapat menggunakan kompiler (atau bahkan beberapa kompiler), penerjemah, atau kombinasi apa pun. Tapi itu adalah sifat implementasi , bukan bahasa. Setiap bahasa dapat diimplementasikan dengan kompiler, dan setiap bahasa dapat diimplementasikan dengan penerjemah.
Namun, perhatikan bahwa Anda tidak dapat menjalankan program tanpa juru bahasa. Kompiler hanya menerjemahkan program dari satu bahasa ke bahasa lain. Tapi begitulah. Sekarang Anda memiliki program yang sama, hanya dalam bahasa yang berbeda. Satu- satunya cara untuk benar-benar mendapatkan hasil dari program adalah menafsirkannya . Kadang-kadang, bahasa tersebut adalah bahasa mesin biner yang sangat sederhana, dan penerjemahnya sebenarnya dikodekan dalam silikon (dan kami menyebutnya "CPU"), tetapi itu masih interpretasi.
Anda mungkin juga tertarik dengan jawaban saya ini, yang menjelaskan perbedaan dan berbagai cara menggabungkan juru bahasa, kompiler JIT dan kompiler AOT dan jawaban ini berkaitan dengan perbedaan antara kompiler AOT dan kompiler JIT .
sumber
Benar bahwa bytecode tidak cocok sebagai format distribusi, tetapi itu tidak berarti itu tidak berguna. Selain meningkatkan waktu startup pada mesin yang diberikan, setelah menjalankan pertama, menafsirkan bytecode juga jauh lebih sederhana daripada menafsirkan AST atau, Tuhan melarang, menafsirkan baris demi baris.
Bytecode adalah representasi kode yang lebih rendah, lebih teratur, lebih kompak (baik secara semantik maupun tata letak memori). Urutan operasi sudah dijabarkan, nama variabel lokal telah diselesaikan ke bentuk yang lebih sederhana (indeks integer). Tidak ada sintaks yang rumit untuk diikuti, hanya satu instruksi sederhana demi satu. Selain itu, diperlukan lebih sedikit keadaan: untuk menafsirkan baris demi baris Anda pada dasarnya perlu menjaga seluruh pengurai, dan juru bahasa AST meledakkan tumpukan panggilan dengan traversal pohonnya, sedangkan penerjemah bytecode hanya membutuhkan tumpukan kecil untuk nilai sementara dan penduduk setempat.
Faktor-faktor ini dan lainnya berkonspirasi untuk membuat penerjemah bytecode secara signifikan lebih cepat daripada penerjemah lainnya.
sumber