Tất cả các ngôn ngữ lập trình đều như nhau?

Bài viết được dịch từ blog Coding Horror

Có một biểu đồ trong cuốn sách kinh điển Code Complete về việc so sánh năng suất làm việc trong nhiều ngôn ngữ lập trình khác nhau:

Các lập trình viên đang làm việc với các ngôn ngữ lập trình bậc cao (high-level languages) thì thu được năng suất và chất lượng tốt hơn là những người làm việc với những ngôn ngữ lập trình bậc thấp hơn (lower-level languages). Các ngôn ngữ lập trình như C++, Java, Smalltalk, và Visual Basic có mức tín nhiệm cao hơn trong việc nâng cao năng suất, độ tin cậy và tính dễ hiểu gấp từ 5 đến 15 lần so với các ngôn ngữ lập trình cấp thấp như Assembly và C (theo 3 công trình nghiên cứu của các nhà khoa học Brooks vào năm 1987, Jones năm 1998, Boehm năm 2000). Bạn tiết kiệm được thời gian khi không cần phải có một bài diễn văn dài dòng mỗi lần một câu lệnh C làm công việc mà nó phải làm. Ngoài ra, các ngôn ngữ lập trình bậc cao hơn thì diễn đạt tốt hơn các ngôn ngữ lập trình bậc thấp. Mỗi dòng lệnh có ý nghĩa nhiều hơn. Bảng sau đây sẽ cho ta thấy tỷ lệ điển hình của các câu mã lệnh trong một vài ngôn ngữ lập trình bậc cao và sự tương đương trong mã lệnh được viết bằng ngôn ngữ C. Một tỷ lệ cao hơn nghĩa là mỗi dòng lệnh trong ngôn ngữ đó hoàn thành được nhiều hơn so với mỗi dòng mã lệnh viết trong ngôn ngữ C.

Liệu tất cả các ngôn ngữ lập trình cũng đều như nhau?Liệu tất cả các ngôn ngữ lập trình đều cũng như nhau?

Ngôn ngữ Mức độ liên quan tới C
C 1
C++ 2.5
Fortran 2
Java 2.5
Perl 6
Python 6
Smalltalk 6
MS Visual Basic 4.5

Des Traynor đã thắc mắc rằng liệu bảng tỷ lệ nói trên có đúng hay không, vì vậy anh ta đã tiến hành một phép thử đơn giản: anh ta cung cấp các ví dụ của một ứng dụng nhỏ là “đọc một file và in nó ra màn hình console” trong các ngôn ngữ Java, Perl, Python, và Ruby. Tôi sẽ đăng lại cái phiên bản nhỏ nhất ở đây, đây là đoạn code thực thi trong ngôn ngữ Python:

filename = "readAFile.py"
try:
for line in open(filename, 'r').readlines(): print line
except: print "Problem with %s" % filename

Để tiện so sánh, thì đây là phiên bản viết bằng VB.NET 2005:

Module Module1
Sub Main()
Dim filename As String = "readAFile.vb"
Try
For Each line As String In System.IO.File.ReadAllLines(filename)
Console.WriteLine(line)
Next
Catch
Console.WriteLine("Error reading file, or file not found.")
End Try
End Sub
End Module

Và phiên bản viết bằng C# 2005:

class Module1 {
static void Main(string[] args)    {
string filename = @"readAFile.cs";
try {
foreach (string line in System.IO.File.ReadAllLines(filename)) {
System.Console.WriteLine(line);
}
}
catch {
System.Console.WriteLine("File not found or error reading file.");
}
}
}

Tôi đã phải chỉnh sửa ví dụ trong C# đó một chút để bỏ đi những thứ mà sẽ làm cho việc đếm số lượng dòng code cho ra một số rất lớn đến mức buồn cười. Đáng kể nhất là tôi đã bỏ đi những dòng khai báo namespace ngu ngốc khi nào cũng phải có, và bổ sung thêm tiền tố System để tránh việc phải sử dụng nhiều cặp ngoặc xoắn trong cùng dòng đó.

Dù sao thì tất cả những ví dụ được cung cấp trên trang web của Des, đã mang lại cho chúng ta kết quả tổng số dòng code trong mỗi ngôn ngữ như sau:

Ngôn ngữ Số lượng dòng code
Java 15
C# 2005 8
VB.NET 2005 8
Ruby 6
Perl 5
Python 4

Vì vậy, thậm chí chỉ với một ví dụ khá tầm thường như ở trên, có một khoảng cách rất lớn giữa các ngôn ngữ “scripting” và “non-scripting” khi chúng ta quan sát số dòng code. Cũng có rất nhiều nghiên cứu đang tồn tại để hỗ trợ cho tuyên bố rằng các ngôn ngữ lập trình scripting thì mang lại hiệu suất cao hơn, như là nghiên cứu 2000 IEEE paper An Empirical Comparison of Seven Programming Languages (Một so sánh theo kinh nghiệm của 7 ngôn ngữ lập trình của tổ chức IEEE vào năm 2000) – bạn có thể xem bản nháp dạng PDF tại đây:

Bất chấp những điều kể trên, việc so sánh trực tiếp giữa các ngôn ngữ lập trình khác nhau có thể cung cấp những thông tin hết sức ý nghĩa. Ví dụ, tôi đã rút ra kết luận từ nghiên cứu đó rằng bộ nhớ overhead của Java thì vẫn lớn hơn nhiều khi so sánh với C hoặc C++, vì vậy hiệu quả thực thi của nó trở nên tương đối chấp nhận được. Tuy nhiên, các ngôn ngữ scripting đưa ra lý do hợp lý để thay thế C và C++, thậm chí đối với các tác vụ phải quản lý một số lượng khá lớn việc tính toán và dữ liệu. Sự liên quan của chúng giữa sự thực thi và việc tiêu tốn bộ nhớ overhead sẽ thường là chấp nhận được, và chúng có thể đưa ra những lợi thế quan trọng cùng với sự lưu tâm tới hiệu suất của lập trình viên, ít nhất là cho các chương trình nhỏ giống như là vấn đề phonecode.

Đoạn trích trên được viết vào năm 2000. Năm năm sau đó, tôi đang tự hỏi mình rằng liệu sự phân biệt giữa các ngôn ngữ lập trình “scripting” và “non-scripting” thì có ý nghĩa gì không trong thế giới của .NET. Nếu bạn nghiên cứu đoạn code mẫu ở trên, bạn sẽ chú ý rằng hầu hết phần overhead trong các ngôn ngữ “non-scripting” đến từ sự kết hợp của các lớp, hàm và hướng đối tượng. Vòng lặp làm việc chính thì hầu như giống hệt nhau trong mọi ngôn ngữ!

Vì vậy, nếu ngôn ngữ không tạo ra sự khác biệt thực sự, thì nó là cái gì? Có một tài liệu so sánh trong cùng ngôn ngữ đã giúp chúng ta sáng tỏ câu hỏi này:

Đối với tất cả các khía cạnh chương trình được khảo sát, sự thay đổi về tốc độ thực thi có nguồn gốc từ các lập trình viên khác nhau trên cùng một ngôn ngữ lập trình — được thể hiện bởi tỷ lệ xấu-tới-tốt (bad-to-good) — thì nhìn chung lớn hơn sự thay đổi xung quanh các ngôn ngữ lập trình khác nhau.

Nếu ai đó hỏi tôi về những cảm xúc cuồng tín hiện tại khi cho rằng ngôn ngữ Ruby đang làm thay đổi bộ mặt của ngành phát triển phần mềm. Thì tôi có thể tôn trọng lòng đam mê phía đằng sau tuyên bố đó, nhưng dữ liệu thực tế không ủng hộ tuyên bố đó chút nào. Mà bạn hãy quan tâm đến ..

  1. loại bỏ C++ và C ra khỏi những ngôn ngữ lập trình chính
  2. sự ảnh hưởng to lớn trong kỹ năng của các lập trình viên riêng lẻ
  3. sự thay đổi chậm nhưng mà chắc của các quy ước ngôn ngữ scripting/dynamic vào trong Java và .NET

.. có thể tất cả các ngôn ngữ lập trình hiện đại thực ra thì cũng như nhau.

Các bài viết liên quan:

Về tác giả bài viết:

Jeff_atwood_coding_horrorJeff Atwood là một chuyên gia công nghệ tại Mỹ, hiện đang sinh sống và làm việc tại Berkeley, CA. Anh là một kỹ sư phần mềm chuyên về công nghệ Microsoft .NET, và là một blogger nổi tiếng trong cộng đồng công nghệ với blog Coding Horror, anh là người sáng lập và kiêm Giám đốc điều hành (CEO) của trang web hỏi đáp uy tín Stack Overflow và cũng là đồng sáng lập của Stack ExchangeDiscourse.

Advertisements

Trả lời

Mời bạn điền thông tin vào ô dưới đây hoặc kích vào một biểu tượng để đăng nhập:

WordPress.com Logo

Bạn đang bình luận bằng tài khoản WordPress.com Log Out / Thay đổi )

Twitter picture

Bạn đang bình luận bằng tài khoản Twitter Log Out / Thay đổi )

Facebook photo

Bạn đang bình luận bằng tài khoản Facebook Log Out / Thay đổi )

Google+ photo

Bạn đang bình luận bằng tài khoản Google+ Log Out / Thay đổi )

Connecting to %s