Hiểu nhầm về ngôn ngữ lập trình, tai hại như thế nào?

Chuyện là trong 1 lần mình và bạn mình (tạm gọi là C) phỏng vấn với 1 anh trainer (tạm gọi là V), do phỏng vấn cùng nhau nên mình có nghe được vài câu với nội dung sau:

V: Theo em ngôn ngữ python là gì?

C: Python là ngôn ngữ thông dịch được thường được dùng để…

V: Trình thông dịch hoạt động như thế nào với ngôn ngữ python?

C: Khi chương trình chạy thì trình thông dịch sẽ đọc từng dòng trong file source và chuyển nó thành mã máy để máy có thể hiểu và chạy.

V: Có các ngôn ngữ biên dịch nào?

C: C/C++, C#, java.

V: Theo em C/C++ hay Python chạy nhanh hơn.

C: C/C++ là ngôn ngữ bậc thấp nên nó sẽ chạy nhanh hơn Python.

Tới đây chắc sẽ có rất nhiều bạn nghĩ trả lời thế là chuẩn rồi mà, có sai gì đâu. Nếu bạn nghĩ vậy thì bài viết này sẽ giúp bạn có một cái nhìn khác.

1. Nhầm lẫn giữa Language và Language implementation

Nói Python là một ngôn ngữ thông dịch cũng giống như việc nói “tiếng Việt chỉ được đọc và hiểu bởi người Việt”.

Mình xin trích lại 1 câu trả lời trên stackoverflow để mọi người hiểu rõ hơn về sự khác biệt:

Implementation của một ngôn ngữ được hiểu đơn giản là thứ mà hiểu và chạy được ngôn ngữ đó như gcc, g++ là hai trong những implementation của C/C++, Cython, Jython, Ironthon là các implementation của Python, CLR là implementation của C#…

Trước khi tới với Python mình cũng bị mắc phải nhầm lẫn này do hầu hết các implementation của các ngôn ngữ khác như C++, C#, java, php đều là biên dịch hoặc thông dịch dẫn tới nhầm lẫn khi nói một ngôn ngữ là biên dịch hay thông dịch. Nhưng khi mình học Python thì mình nhận ra Python có nhiều implementation như Cython (thông dịch), Jython (thông dịch), Pypy (biên dịch) và vỡ ra được lẽ phải rằng ngôn ngữ không liên quan gì tới biên dịch hay thông dịch.

Hầu hết mọi người đều dùng Cython để chạy code Python và Cython là thông dịch nên dẫn tới sự nhầm lẫn rằng Python là ngôn ngữ thông dịch.

2. Ngôn ngữ lập trình bậc cao sẽ chạy chậm hơn ngôn ngữ lập trình bậc thấp.

Điều này là sai hoàn toàn do source code của ngôn ngữ nào thì cũng sẽ đều được chuyển thành mã máy (machine code), nên việc chạy nhanh hay chậm không hề liên quan tới ngôn ngữ lập trình bậc cao hay thấp mà là do implementation của ngôn ngữ đó.

Hầu hết mọi người đều mắc sai lầm này do thấy code ngôn ngữ C/C++ (bậc thấp hơn) chạy nhanh hơn code C#, Java (bậc cao hơn). Nhưng thực ra C/C++ thường chạy nhanh hơn C#, Java là do các implementation của C# và Java phải làm thêm 1 số công việc khác để đảm bảo tính an toàn như:

  • Tự động giải phóng bộ nhớ không sử dụng như mảng, con trỏ. Ở C/C++ bạn phải phải tự làm bằng tay và rất dễ bị memory leak. Còn đối với C#và Java  thì trong hầu hết mọi trường hợp bạn không cần quan tâm về việc giải phóng bộ nhớ.
  • Kiểm tra việc bạn có truy xuất tới vùng nhớ không hợp lệ không. Với C++ bạn có thể truy xuất tới phần tử thứ 11 của một mảng có 10 phần tử mà không gặp lỗi còn đối với C#, Java thì sẽ có lỗi ngay.

3. Nhầm lẫn về trình thông dịch và biên dịch.

Trích lại câu trả lời ở trên:

C: Khi chương trình chạy thì trình thông dịch sẽ đọc từng dòng trong file source và chuyển nó thành mã máy để máy có thể hiểu và chạy.

Ở hầu hết các ngôn ngữ hiện nay như C#, Java, Python trình biên dịch và thông dịch không làm việc trực tiếp với source code để chuyển source code thành mã máy mà làm việc với bytecode (một loại code được biên dịch từ source bạn viết).

Ví dụ đối với python thì source của bạn (file .py) khi chạy sẽ được biên dịch thành file bytecode (file .pyc) và trình thông dịch sẽ đọc file bytecode này và chuyển nó thành mã để máy có thể hiểu và chạy. File .pyc chỉ được tạo ra khi chưa có hoặc đã có nhưng modified date của file .pyc khác với modified date của file .py.

Đối với C# thì file .exe chính là file bytecode, với java thì là file .class.

Với C++ thì source code của bạn sẽ được biên dịch ra mã máy luôn mà không thông qua bước trung gian (không tạo ra file bytecode).

Tạm kết

Trên đây là 3 nhầm lẫn mình thấy các bạn mới học hay mắc phải. Nhìn vào câu chuyện phỏng vấn trên, có thể thấy khi bạn trả lời 1 câu hỏi, thì người phỏng vấn sẽ dựa vào câu mà bạn trả lời để hỏi tiếp. Vậy nên hãy cố gắng trả lời lái sai thế mạnh của mình, và hãy nâng cao khả năng tìm tòi, học hỏi của mình tại đây nhé. 

Anh em còn phát hiện những hiểu lầm gì khác hoặc đã từng trải qua những đau thương nào, hãy để lại comment ở đây để mọi người cùng nhau tiến bộ.

Rate this post

Viết một bình luận