Lập trình

Ngôn ngữ lập trình Static Typing và Dynamic Typing, là gì và khác nhau thế nào?

Trong bài đầu tiên của chuyên mục mới: Lập trình – mình sẽ chia sẻ với các bạn thông tin về Dynamic …

Trong bài đầu tiên của chuyên mục mới: Lập trình – mình sẽ chia sẻ với các bạn thông tin về Dynamic Typing và Static Typing nó khác nhau thế nào. Khi nhắc tới một ngôn ngữ lập trình, chắc chắn bạn cần phải biết nó thuộc vào các loại nào, static typing, strong typing, dynamic typing hay weak typing…

Những thuật ngữ sau đây đề có liên quan tới chủ đề bài viết này và đều có thể hiểu giống nhau: Dynamic typed language, Strong typed language, weakly typed language

Dynamic Typed language

Đây là loại ngôn ngữ lập trình cho phép thay đổi kiểu biến tùy biến. Thích thay thế nào cũng được. Mình lấy ví dụ như Javascript, PHP, Python là hai ngôn ngữ lập trình phổ biến dạng này. Kiểu của biến được tự do gán như số, chuỗi, số nguyên, mảng, đối tượng … Và kiểu của biến thường được xác định trong lúc runtime chứ không phải complied-time. Nó không yêu cầu khai báo rõ kiểu trước khi chạy.

Các bạn có thể hiểu hơn khi xem ví dụ mã Javascript này:

var You = "Hien"; /* kiểu dữ liệu: String */
var Friend = You + 12; /* Ra: Hien12 */

Hoặc kiểu này:

var Family; // undefined
Family = {'first': 'father'}; // object

Hoặc mã PHP

$stock = '3'; // string
$main_stock = $stock + 2; // 5 <-- tự động convert kiểu biến

Như bạn thấy đấy, các kiểu của biến được tùy tiện thay đổi mà không cần khai báo trước. Trong các phần mềm nghiệp vụ, nhất là kế toán, kiểu Dynamic typed như PHP hay Javascript không được ưa chuộng bởi một biến có thể thành một chuỗi nhờ sự “vô tình” chỗ nào đó. Kết quả có thể bị sai lệch trong quá trình output.

Javascript là một Dynamic-typed language nhưng nếu các bạn xài TypeScript để viết Javascript, thì nó lại mang các đặc tính của Strong Typed Language.

Strong typed language

Java, C/C++, Go là những ngôn ngữ lập trình phổ biến hiện nay, và nó là Static Typed language hoặc Strong typed language.

Những ngôn ngữ này yêu cầu biến bạn khai báo phải khai báo kiểu cho biến trước khi gán. Và chúng sẽ được kiểm tra sớm trong phần Complied-time. Sự sai khác trong kiểu dữ liệu khi khai báo và khi gán sẽ được phát hiện rất sớm. Bạn cần phải nghĩ về kiểu dữ liệu trước khi khai báo một biến nào đó.

Ví dụ trong Java:

String ME  = "Hello Hiển";
Integer AGE = 32;
ME = 1; // Báo lỗi ngay ...

Tương tự, bạn không thể truyền vào một String trong Go-lang sau đây:

func silly(a int) {
  if (a > 0) {
      fmt.Println("Hi")
  } else {
      fmt.Println("3" + 5)
  }
}

Vì kiểu biến “a” được gán là một số nguyên.

Ưu nhược điểm của Dynamic Typed Language và Static Typed Language

Phải thú nhận rằng, khi mình làm việc lâu với Javascript và PHP thì khi chuyển sang một ngôn ngữ Strong Typed Language như Java, mình đã hơi bị choáng lúc đầu. Bởi phải nhớ biến, kiểu, rồi khai báo cho đúng. Không thể input và gán linh tinh được, nó sẽ báo lỗi.

Còn với những người đang xài Strong typed language như C/C++ hay Java mà chuyển sang ngôn ngữ Dynamic typed thì sẽ cảm thấy rất “vớ vẩn” bởi không cần nhớ kiểu cách gì hết, gán bừa gán bãi vẫn okay.

Tính chặt chẽ

Dynamic typed language cho phép gán biến và kiểu lộn xộn, không cần phải xác định trước. Cho nên bạn cảm thấy chúng không có tính chặt chẽ và khoa học. Nếu không cẩn thận, bạn có thể ghi đè các biến của phía trước nó với một kiểu dữ liệu khác hoàn toàn.

Với Strong typed language thì khác. Bạn cần phải biết kiểu dữ liệu nào gán cho biến nào. Nếu gán giá trị mới mà sai kiểu, nó sẽ báo lỗi trước khi chạy.

Các cụ lập trình thường sợ các trường hợp “âm thầm đổi kiểu” của các loại biến trong PHP hay Javascript. Nhất là khi cho khách hàng input vào, cần phải kiểm tra rất kỹ kiểu dữ liệu, nhiều code không kiểm tra kiểu đâm ra sai kiểu, vẫn chạy phà phà!

Hiệu năng

Do hệ thống xác định được kiểu trước khi chạy của Static Typed language nên nó sẽ chạy nhanh và tốt hơn Dynamic typed language. Loại Dynamic typed thường phải xác định kiểu trong lúc chạy nên chúng hoạt động tốn bộ nhớ, tốn tài nguyên.

Khả năng đọc code và debug

Static Typed language chiếm ưu thế. Bởi những khai báo kiểu dữ liệu cho biến nên bạn có thể dễ dàng hiểu hơn về hàm/class mình đang refector code. Còn với Dynamic type, gán kiểu tùy ý vào biến nên sẽ khó khăn hơn cho việc xác định và đọc code.

Ngoài ra, Static Typed thông báo lỗi ngay khi viết nếu gán sai kiểu. Còn Dynamic type thì không, nên debug rất dễ đối với Static Typed.

Tốc độ triển khai code

Không thích hợp cho các dự án lớn, Dynamic typed lại có ưu điểm hơn hẳn so với Strong typed. Nhờ gán kiểu tùy ý và có thể gán đi gán lại các loại dữ liệu khác nhau, nên Dynamic typed cho cảm giác dễ xài. Bạn không bao giờ phải nghĩ kiểu dữ liệu cho biến trước khi code.

Ngoài ra, code sẽ ngắn và đơn giản hơn rất nhiều do không cần phải khai báo các thể loại Interface hay Type trên đầu 😀

Trên đây là một vài chia sẻ của mình trong chuyên mục mới. Hi vọng các bạn thích và ghé ủng hộ! Sẽ có rất nhiều bài viết hay ho trên chuyên mục này các bạn hãy đón xem nha!

Thông tin liên quan

Bạn đang xem bài viết Dynamic typing tại blog cá nhân của Jam. Còn rất nhiều các bài viết khác tại chuyên mục Lập trình đang được yêu thích.