Saya dapat memahami fakta bahwa Java membutuhkan kompiler dan interpreter.
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.
dan kemudian mesin virtual (pada Windows, Linux, Android, dll.) menerjemahkan bytecode itu ke kode mesin untuk arsitektur saat ini.
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.)
Tetapi mengapa Python membutuhkan kompiler dan interpreter?
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.
mengapa tidak menggunakan interpretasi saja?
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.
Sejauh yang saya tahu, Anda tidak dapat menjalankan program Python (dikompilasi ke bytecode) pada mesin Windows atau Linux apa pun tanpa modifikasi.
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 .