Đây là câu hỏi rất thường gặp và thường được tranh luận bởi những người học Python. Hy vọng bạn sẽ có câu trả lời sau khi đọc bài viết này.
1. Về thuật ngữ
1.1 Ngôn ngữ biên dịch (compiled language)
Như cái tên của nó, đối với những ngôn ngữ lập trình kiểu biên dịch (complied programming languages), mã nguồn sẽ được dịch sang mã máy bởi trình biên dịch (compiler), sau đó máy tính sẽ thực hiện các lệnh theo file mã máy nhận được.
Nhóm này gồm có: C, C++, Fortran, Java, Julia, Pascal,… Thông thường, việc phát triển chương trình bằng ngôn ngữ biên dịch tốn thời gian hơn ngôn ngữ thông dịch. Tuy nhiên một khi mã nguồn đã được dịch thì có thể tái sử dụng nhiều lần, làm cho việc thực thi sau này nhanh hơn. Còn với ngôn ngữ thông dịch, mỗi lần chạy chương trình là mỗi lần dịch lại mã nguồn.
1.2 Ngôn ngữ thông dịch (interpreted language)
Trong khi đó, với những ngôn ngữ lập trình kiểu thông dịch (interpreted programming languages) từng dòng lệnh của mã nguồn sẽ được trình thông dịch (interpreter) thực hiện ngay tức thời mà không cần phải dịch trước cả file mã nguồn.
Tình huống này giống với việc bạn phát biểu bằng một ngôn ngữ khác trước đám đông vậy, sẽ có một thông dịch viên giúp bạn dịch từng câu một, chứ không phải đợi bạn phát biểu hết rồi mới đọc lại bài dịch của bài phát biểu của bạn.
Những ngôn ngữ lập trình thường được xếp vào kiểu thông dịch gồm có: MATLAB, Python, R, JavaScript, PHP, GNU Octave, Mathematica,…Đặc trưng của ngôn ngữ lập trình kiểu thông dịch đó là thường có một Interactive Prompt đi kèm. Interactive Prompt cho phép bạn tương tác “trực tiếp” với máy tính để thực hiện những câu lệnh độc lập.
Với ngôn ngữ không có Interactive Prompt, bạn thường phải chạy lại từ đầu cả chương trình chỉ để kiểm tra một đoạn code.
Tuy nhiên, hai nhóm biên dịch và thông dịch không hẳn là loại trừ lẫn nhau. Như bạn sẽ thấy sau đây.
2. Mức độ thông dịch của ngôn ngữ lập trình
Trong khoa học máy tính, người ta chia việc thông dịch thành hai mức độ:
- Đọc từng dòng lệnh, chuyển sang mã máy và thực hiện nó ngay tức thời. Mình tạm gọi là pure-interpreted.
- Dịch từng dòng lệnh sang ngôn ngữ trung gian và thực thi dòng lệnh kết quả trên một máy ảo (virtual machine, VM), tạm gọi là semi-interpreted.
Ở mức độ thứ hai,
ngôn ngữ trung gian
thường là
bytecode
và máy ảo đóng vai trò là một trình thực thi cho bytecode, máy ảo có thể được viết bằng những ngôn ngữ khác nhau. Lưu ý, máy ảo ở đây không phải là máy ảo để các bạn cài thêm một hệ điều hành đâu nhé. Nó chỉ đơn giản là một execution software.
Như vậy, mặc dù được xếp vào nhóm interpreted, nhưng bản chất khi thực thi lệnh Python là: dòng lệnh được dịch sang bytecode, sau đó bytecode tiếp tục được thực thi bởi VM. Cho nên, nếu hiểu theo nghĩa rộng thì sẽ không sai khi nói Python cũng là một ngôn ngữ biên dịch (complied language). Tuy nhiên người ta thường gọi Python là ngôn ngữ thông dịch bởi vì quá trình dịch sang bytecode và thực thi bytecode hoàn toàn ẩn bởi Interactive Prompt của Python.
3. Kết luận
Bài viết chưa thể so sánh chi tiết mà chỉ cung cấp cái nhìn tổng quát về ngôn ngữ lập trình kiểu biên dịch và thông dịch.
Từng dòng lệnh Python không được thực thi trực tiếp, mà được dịch sang bytecode trước khi cho vào máy ảo để thực thi.
Vì thế, nói rằng Python là compiled language cũng không sai. Nhưng vì quá trình dịch và thực thi bytecode là hoàn toàn tự động và ẩn, nên Python thường được gọi là ngôn ngữ lập trình kiểu thông dịch.