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 từ python là gì ?
C : Python là ngôn từ 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 hoàn toàn có thể hiểu và chạy .
V : Có những ngôn từ 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 từ 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ĩ vấn đáp 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 từ 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 vấn đáp trên stackoverflow để mọi người hiểu rõ hơn về sự độc lạ :

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 từ 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 trọn vẹn do source code của ngôn từ 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ề tương quan tới ngôn từ lập trình bậc cao hay thấp mà là do implementation của ngôn từ đó .

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 vấn đáp ở 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 hoàn toàn 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ụ so 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 hoàn toàn 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 trải 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 những bạn mới học hay mắc phải. Nhìn vào câu truyện phỏng vấn trên, hoàn toàn có thể thấy khi bạn vấn đáp 1 câu hỏi, thì người phỏng vấn sẽ dựa vào câu mà bạn vấn đáp để hỏi tiếp. Vậy nên hãy nỗ lực vấn đáp lái sai thế mạnh của mình, và hãy nâng cao năng lực 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 nhầ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 văn minh .

ĐÁNH GIÁ post
Bài viết liên quan

Tư vấn miễn phí (24/7) 094 179 2255