Tôi có thể hiểu thực tế rằng Java cần cả trình biên dịch và trình thông dịch.
Nó không. Không có gì trong Đặc tả ngôn ngữ Java nói rằng Java cần phải có trình biên dịch. Cũng không có gì trong Đặc tả ngôn ngữ Java nói rằng Java cần phải có trình thông dịch.
Việc sử dụng trình thông dịch, trình biên dịch hay kết hợp cả hai, hoàn toàn tùy thuộc vào người thực hiện.
Trong thực tế, có các triển khai Java biên dịch thẳng vào mã máy, ví dụ Trình biên dịch GNU cho Java gcj
. Về mặt kỹ thuật, trình biên dịch Java OpenJDK cũng biên dịch thành mã máy, cụ thể là mã byte JVM. Bây giờ, bạn có thể nói, đợi một chút, đó không phải là mã máy! Nhưng, có các trình thông dịch phần mềm cho mã máy x86 và có các CPU phần cứng có thể thực thi mã byte JVM, vậy điều gì làm cho một "bản địa" còn cái kia thì không?
Lưu ý rằng mã byte JVM nằm ngoài Đặc tả ngôn ngữ Java, giống như mã máy x86.
và sau đó một máy ảo (trên Windows, trên Linux, trên Android, v.v.) dịch mã byte đó thành mã máy cho kiến trúc hiện tại.
Một lần nữa, đó là hoàn toàn tùy thuộc vào người thực hiện.
Sun JVM ban đầu không bao giờ dịch, nó luôn luôn diễn giải. Các trình thông dịch JVM của Oracle OpenJDK hiện tại và chỉ những phần được thực thi thường được biên dịch. Maxine Research VM luôn biên dịch JIT. Việc triển khai Excelsior.JET biên dịch một lần, trước thời hạn. JVM IKVM.NET biên dịch thành mã byte CIL. Android Runtime biên dịch trước thời gian, một lần, trong khi cài đặt. (Ngoài ra, Android Runtime không hiểu mã byte JVM, nó sử dụng mã byte Dalvik, một ngôn ngữ hoàn toàn khác.)
Nhưng tại sao Python cần cả trình biên dịch và trình thông dịch?
Một lần nữa, nó không. Không có gì trong Đặc tả ngôn ngữ Python nói rằng Python cần phải có trình biên dịch. Cũng không có gì trong Đặc tả ngôn ngữ Python nói rằng Python cần phải có trình thông dịch.
Lưu ý rằng thực sự, Python không bao giờ được giải thích. Tất cả các cài đặt Python hiện có luôn biên dịch Python sang một ngôn ngữ khác. Lần lượt, ngôn ngữ đó có thể hoặc không, được dịch, nhưng ngôn ngữ đó là ngôn ngữ khác với Python. Python không được giải thích.
Tại sao không chỉ sử dụng giải thích?
Bởi vì Python không được thiết kế để có thể dễ dàng giải thích bằng máy. Nó được thiết kế để dễ dàng được giải thích bởi con người. OTOH, mã byte CPython, được thiết kế để dễ dàng diễn giải bằng máy. Vì vậy, thật hợp lý khi viết mã bằng ngôn ngữ được thiết kế cho con người và diễn giải bằng ngôn ngữ được thiết kế cho máy móc, và để có được từ cái này sang cái khác, bạn phải biên dịch.
Theo như tôi biết, bạn không thể thực thi chương trình Python (được biên dịch thành mã byte) trên bất kỳ máy Windows hoặc Linux nào mà không sửa đổi.
Vâng, bạn có thể. Máy ảo CPython có sẵn cho cả Windows và Linux, cũng như PyPy, Jython và IronPython.
Ngôn ngữ không phải được biên dịch hoặc giải thích. Ngôn ngữ chỉ là . Trong thực tế, một ngôn ngữ hoàn toàn có thể tồn tại mà không cần bất kỳ trình thông dịch hoặc trình biên dịch! Ví dụ, Plankalkül của Konrad Zuse mà ông thiết kế vào những năm 1930 không bao giờ được thực hiện trong suốt cuộc đời của ông. Bạn vẫn có thể viết các chương trình trong đó, bạn có thể phân tích các chương trình đó, lý do về chúng, chứng minh các thuộc tính về chúng. Bạn không thể thực hiện chúng. (Chà, thực ra, thậm chí điều đó là sai: tất nhiên bạn có thể chạy chúng trong đầu hoặc bằng bút và giấy.)
Bây giờ, bất kỳ triển khai cụ thể nào của ngôn ngữ đều có thể sử dụng trình biên dịch (hoặc thậm chí nhiều trình biên dịch), trình thông dịch hoặc bất kỳ kết hợp nào. Nhưng đó là một đặc điểm của việc thực hiện , không phải ngôn ngữ. Mọi ngôn ngữ đều có thể được thực hiện với trình biên dịch và mọi ngôn ngữ đều có thể được thực hiện với trình thông dịch.
Tuy nhiên, lưu ý rằng bạn không thể chạy chương trình mà không có trình thông dịch. Một trình biên dịch chỉ đơn giản là dịch một chương trình từ ngôn ngữ này sang ngôn ngữ khác. Nhưng kia là nó. Bây giờ bạn có cùng một chương trình, chỉ bằng một ngôn ngữ khác. Cách duy nhất để thực sự có được kết quả của chương trình là diễn giải nó. Đôi khi, ngôn ngữ là ngôn ngữ máy nhị phân cực kỳ đơn giản và trình thông dịch thực sự được mã hóa bằng silicone (và chúng tôi gọi nó là "CPU"), nhưng đó vẫn là phiên dịch.
Bạn cũng có thể quan tâm đến câu trả lời này của tôi, nó giải thích sự khác biệt và các phương tiện kết hợp trình thông dịch, trình biên dịch JIT và trình biên dịch AOT khác nhau và câu trả lời này liên quan đến sự khác biệt giữa trình biên dịch AOT và trình biên dịch JIT .