So sánh dynamic programming và statis programmiing năm 2024
Trên con đường đến với đạo lập trình, chắc các bạn cũng từng nghe đến các khái niệm như Hơn nữa, nhiều người vẫn đang nhầm tưởng rằng static đồng nghĩa với strong typing và dynamic đồng nghĩa với weak typing. Vậy bạn hãy cùng tôi dạo qua bài viết này để có một cái nhìn cụ thể hơn. Strong vs Weak typingHiện tại thì người ta vẫn chưa thống nhất một định nghĩa chuẩn thế nào là một ngôn ngữ strong typing hay weak typing. Và đây cũng là một chủ đề gây ra rất nhiều tranh luận mỗi khi có ai đó nêu ra. Ở đây tôi muốn nêu ra khái niệm được nhiều người chấp nhận và theo tôi thấy thì cũng ngắn gọn và dễ hiểu nhất: Strong typing means that the type of a value doesn't suddenly change. Theo đó, các ngôn ngữ strong typing đảm bảo rằng kiểu (types) của một object không thay đổi một cách đột ngột, không tường minh. Hay nói cách khác, ta phải chỉ rõ thao tác (thông qua lời gọi hàm, ép kiểu, ...) khi muốn chuyển đổi kiểu của một object. Những ngôn ngữ không đáp ứng yêu cầu trên là weak typing. Nói nhiều quá, lấy một số ví dụ cho dễ hiểu nào? Xét đoạn code PHP sau:
Ta thấy ở câu lệnh trên, kiểu của string
0, dẫn đến giá trị của biến
1 là
2. Tương tự, số nguyên
3 đã ngầm định chuyển thành string
4. Do đó PHP là một ngôn ngữ weak typing. Tương tự, Javascript cũng là ngôn ngữ weak typing:
Trái lại, ta cùng xem đoạn code Python dưới đây:
Ta thấy rằng, khi cố gắng thực hiện phép toán cộng giữa một object string và một số nguyên, trình thông dịch Python sẽ thông báo lỗi
5 bởi vì ta không được phép ngầm định chuyển đổi object kiểu int sang kiểu string. Thay vào đó, ta phải chỉ rõ tưòng minh thao tác chuyển đổi kiểu thông qua hàm
6. Nếu không quá khắt khe thì ta có thể coi Python là ngôn ngữ strong typing, bởi vì Python vẫn có một số ngoại lệ, ví dụ như biểu thức
7 sẽ cho ra giá trị là số thực
8 (số nguyên
9 đã tự động chuyển sang kiểu số thực). Với strong typing, chương trình của chúng ta sẽ rõ ràng, dễ debug và kiểm soát hơn so với weak typing. Bất cứ khi nào ta thực hiện một thao tác với các đối tượng có kiểu không tương thích nhau, chương trình sẽ xuất ra một thông báo lỗi sai kiểu (chẳng hạn
5 exception trong Python). Chúng ta không cần phải nhớ một đống quy tắc tự động chuyển đổi kiểu trong các phép toán cơ bản ( ví dụ như, khi nào thì string sẽ tự động chuyển sang kiểu số, và ngược lại, ...) và hơn nữa, rất khó để debug khi biến âm thầm đổi kiểu mà ta không biết. Static vs Dynamic typingTrong các ngôn ngữ static typing (C/C++, Java), mỗi biến (variable) có một kiểu cố định liên kết với nó. Kiểu của biến được kiểm tra lúc compiled-time và trình biên dịch yêu cầu ta phải khai báo rõ kiểu của biến trước khi sử dụng. Ví dụ về khai báo biến trong C:
Nếu ta đã khai báo một biến có kiểu nguyên, ta sẽ không thể gán các giá trị có kiểu khác tới nó. Trái lại, với dynamic typing, mỗi biến chỉ đơn giản là một cái nhãn (label) được liên kết với một object. Mỗi object sẽ có kiểu riêng của nó (ví dụ trong Python, ta có kiểu
Dynamic typing trong Python:
Tuy rằng có thể gán các object có kiểu khác nhau cho cùng một biến trong các ngôn ngữ dynamic typing nhưng việc đấy được xem như bad practice trong coding. Bởi vì việc thay đổi kiểu của biến tùy tiện sẽ làm cho code của chương trình rất khó đọc và khó debug. Nghe cũng thú vị đấy, nói nghe ưu nhược điểm của từng loại xem nào? Dưới đây là so sánh ưu nhược điểm của static với dynamic typing theo một số tiêu chí phổ biến:
Kết luậnPhần này chỉ đơn giản là tóm tắt lại những gì được nói ở trên. Strong typing đảm bảo rằng kiểu của một object không tự động thay đổi, hay nói cách khác là không thay đổi một cách ngầm định. Trong khi đó, với static typing, một biến chỉ có một kiểu duy nhất và phải được khai báo trước khi sử dụng, kiểu của biến được kiểm tra tại thời điểm biên dịch chương trình. Với weak typing, kiểu của một object có thể tự động thay đổi (cái này Tây họ gọi là "implicit conversions"). Trong khi đó, với các ngôn ngữ dynamic typing, ta có thể gán các object có kiểu khác nhau cho cùng một biến và kiểu của object gắn liền với biến được kiểm tra lúc chạy chương trình. Qua bài viết, hi vọng bạn đã có thêm một số kiến thức cũng như biết được sự khác nhau giữa các hệ thống kiểu (typed system) trong ngôn ngữ lập trình. |