Khi lập kế hoạch cho một giải pháp phần mềm, bạn có nhiều ngôn ngữ lập trình khác nhau để lựa
chọn và thật dễ bị lạc vào mớ bòng bong của từng ngôn ngữ. Sự lựa chọn của bạn có thể phụ
thuộc vào nhiều nhân tố. Nếu dùng nó cho một dự án hay sở thích cá nhân, bạn có thể phải chấp
nhận một ngôn ngữ mà bạn biết. Nếu sự lựa chọn của bạn phải phụ thuộc vào những gì sẵn có thì
có thể bạn sẽ phải miễn cưỡng chấp nhận và tiếp cận một cách không dễ dàng. Hoặc, bạn sẽ tốn
nhiều thời gian để phát triển lại các thành phần mà lẽ ra có thể tái sử dụng được, điều này khiến
cho các tài liệu trở thành cơn ác mộng.
Bài này không so sánh rườm rà về các ngôn ngữ hàm, hướng đối tượng và thủ tục. Với các ví dụ
và kịch bản thực tế, bài này cho thấy cách chọn một ngôn ngữ có hiệu quả tối đa và dễ phát triển
cho dự án của bạn. Nó giúp bạn xem xét các nhân tố để cân nhắc khi lựa chọn một ngôn ngữ lập
trình, cho dù áp dụng cho cá nhân hay cho một dự án lớn trong một tổ chức.
8 trang |
Chia sẻ: lylyngoc | Lượt xem: 1806 | Lượt tải: 1
Bạn đang xem nội dung tài liệu Chọn ngôn ngữ lập trình tối ưu, để tải tài liệu về máy bạn click vào nút DOWNLOAD ở trên
Chọn ngôn ngữ lập trình tối ưu
Giới thiệu
Khi lập kế hoạch cho một giải pháp phần mềm, bạn có nhiều ngôn ngữ lập trình khác nhau để lựa
chọn và thật dễ bị lạc vào mớ bòng bong của từng ngôn ngữ. Sự lựa chọn của bạn có thể phụ
thuộc vào nhiều nhân tố. Nếu dùng nó cho một dự án hay sở thích cá nhân, bạn có thể phải chấp
nhận một ngôn ngữ mà bạn biết. Nếu sự lựa chọn của bạn phải phụ thuộc vào những gì sẵn có thì
có thể bạn sẽ phải miễn cưỡng chấp nhận và tiếp cận một cách không dễ dàng. Hoặc, bạn sẽ tốn
nhiều thời gian để phát triển lại các thành phần mà lẽ ra có thể tái sử dụng được, điều này khiến
cho các tài liệu trở thành cơn ác mộng.
Bài này không so sánh rườm rà về các ngôn ngữ hàm, hướng đối tượng và thủ tục. Với các ví dụ
và kịch bản thực tế, bài này cho thấy cách chọn một ngôn ngữ có hiệu quả tối đa và dễ phát triển
cho dự án của bạn. Nó giúp bạn xem xét các nhân tố để cân nhắc khi lựa chọn một ngôn ngữ lập
trình, cho dù áp dụng cho cá nhân hay cho một dự án lớn trong một tổ chức.
Các nhân tố cần xem xét
Không chỉ có một nhân tố cần xem xét khi chọn một ngôn ngữ lập trình. Ví dụ, trong khi phát
triển một trang web động, bạn có thể coi JavaServer Pages (JSP)/servlets là sự lựa chọn tốt nhất
và những người khác có thể thích sử dụng PHP hay một ngôn ngữ tạo kịch bản lệnh tương tự.
Không có ngôn ngữ duy nhất nào là "sự lựa chọn tốt nhất" cả. Mặc dù bạn có thể ưu tiên cho các
nhân tố nào đó, chẳng hạn như hiệu năng và bảo mật trong các ứng dụng doanh nghiệp, các nhân
tố khác, chẳng hạn như ít dòng mã hơn, có thể là ưu tiên thấp hơn. Luôn luôn có một số lý do
nào đó.
Sau khi người ta giao cho bạn một dự án hoặc nhiệm vụ, thường cần làm công tác chuẩn bị trước
khi giải quyết vấn đề thực tế. Việc lựa chọn ngôn ngữ là thành phần thường hay bị bỏ sót nhiều
nhất trong công tác chuẩn bị này.
Khi lựa chọn một ngôn ngữ cho một dự án cá nhân, bạn có thể chọn một ngôn ngữ theo sở thích
riêng. Ở đây quan trọng là các dòng mã; tất nhiên bạn sẽ chọn một ngôn ngữ có thể hoàn thành
công việc trong 10 dòng thay vì 20 dòng mã. Trước tiên bạn cần phải có giải pháp trước rồi hãy
quan tâm tới sự ngắn gọn hay hiệu năng.
Đối với các dự án được xây dựng cho một tổ chức lớn, thì lại một kịch bản khác. Các nhóm làm
việc sẽ xây dựng các thành phần tương tác và kết nối với nhau để giải quyết một vấn đề cụ thể.
Việc lựa chọn ngôn ngữ có thể bao gồm các nhân tố như chương trình có thể được chuyển sang
một nền tảng khác hoặc có thể lấy được tài nguyên dễ dàng hay không.
Việc chọn đúng ngôn ngữ lập trình có thể mang lại các giải pháp cô đọng, dễ debug (gỡ lỗi), dễ
mở rộng, dễ làm tài liệu và dễ bảo trì. Các nhân tố cần xem xét khi lựa chọn một ngôn ngữ lập
trình là:
Nền tảng đích
Tính co giãn của ngôn ngữ
Thời gian làm ra sản phẩm
Hiệu năng
Cộng đồng và khả năng hỗ trợ
Nền tảng đích
Nhân tố quan trọng nhất cần xem xét là nền tảng mà ở đó chương trình sẽ chạy. Hãy suy nghĩ về
ngôn ngữ Java™ và C. Nếu chương trình được viết bằng C và cần được chạy trên các máy
Windows® và Linux®, thì nó sẽ yêu cầu các trình biên dịch nền tảng và hai chương trình có thể
chạy được khác nhau. Với ngôn ngữ Java, mã byte được tạo ra sẽ đủ để chạy chương trình trên
bất kỳ máy tính nào đã cài đặt một máy ảo Java (JVM).
Một lập luận giống như vậy áp dụng cho các trang web. Tất cả chúng đều hiển thị và hoạt động
như nhau trên tất cả các trình duyệt. Việc sử dụng các thẻ CSS3, HTML5, mà không kiểm tra
tính tương thích của trình duyệt, sẽ làm cho trang web giống nhau hiển thị và chạy một cách
khác nhau trên các trình duyệt.
Tính co giãn
"Tính co giãn" của một ngôn ngữ là sự dễ dàng thêm bớt các tính năng mới bằng ngôn ngữ đó
vào các chương trình hiện có. Tính co giãn có thể gồm việc thêm một tập hợp hàm mới hoặc việc
sử dụng một thư viện hiện có để thêm một tính năng mới. Hãy xem xét những câu hỏi sau đây có
liên quan đến tính co giãn.
Tôi có thể bắt đầu sử dụng một khả năng của ngôn ngữ mà không bao gồm thư viện mới
không?
Nếu không, khả năng đó có sẵn trong thư viện của ngôn ngữ không?
Nếu nó không phải là một khả năng có sẵn như là một thư viện, thì phải làm gì để xây
dựng các tính năng từ ban đầu?
Trước khi quyết định, bạn nên biết chương trình đã được thiết kế ra sao và những tính năng nào
được để dành cho các cải tiến trong tương lai.
Mặc dù việc so sánh các ngôn ngữ này là không đúng về kỹ thuật, nhưng hãy xem xét Perl và
Python. Perl có sự hỗ trợ biểu thức chính quy được xây dựng như là một tính năng có sẵn để
dùng. Trong trường hợp của Python, bạn phải nhập khẩu mô đun re từ thư viện chuẩn.
Thời gian đưa ra sản phẩm
Thời gian đưa ra sản phẩm là thời gian cần dùng để đưa chương trình đi vào vận hành—khi mã
code đã sẵn sàng để thành phẩm và hoạt động như lập trình. Logic trình bày nên được thêm vào
logic điều khiển khi tính toán thời gian ra sản phẩm.
Thời gian đưa ra sản phẩm phụ thuộc nhiều vào độ lớn của mã code. Về mặt lý thuyết, một ngôn
ngữ càng dễ học thì lượng mã càng nhỏ và, do đó, thời gian đi vào vận hành sẽ ngắn hơn.
Ví dụ, có thể phát triển một trang web quản lý nội dung trong vài ngày bằng cách sử dụng các
kịch bản lệnh PHP trong khi có thể mất vài tháng nếu dùng mã servlets, giả sử bạn đang học cả
hai ngôn ngữ từ đầu.
Hiệu năng
Bạn có thể nhận được nhiều hiệu năng với sức mạnh của một chương trình và một nền tảng, và
ngôn ngữ được dùng để phát triển chương trình cũng tác động đến hiệu năng. Có rất nhiều
nghiên cứu so sánh các ngôn ngữ lập trình chạy nhanh như thế nào trong cùng một môi trường.
Bạn có thể tham khảo các điểm chuẩn (benchmark) của máy tính khác nhau, mặc dù các số liệu
này không đánh giá cụ thể về hiệu năng của bất cứ ngôn ngữ nào.
Hãy xem xét một ứng dụng web được viết bằng cả mã Java và Python. Dữ liệu hiệu năng, như
thể hiện trong điểm chuẩn, sẽ dẫn bạn đến kết luận rằng, căn cứ vào các môi trường như nhau,
ứng dụng được viết bằng ngôn ngữ Java sẽ chạy nhanh hơn so với ứng dụng được viết bằng
Python. Còn bản thân môi trường thì sao? Nếu môi trường là một lõi Q6600 của Intel Ubuntu
x86, thì đó là một trò chơi công bằng vì sức mạnh tính toán bị hạn chế. Điều gì sẽ xảy ra nếu ứng
dụng web ở trong đám mây, chạy trên Google App Engine? Bây giờ bạn có thể có quyền truy
cập với sức mạnh xử lý hầu như không bị hạn chế và cả hai chương trình sẽ trả về các kết quả
hầu như tại cùng một thời điểm. Bây giờ nhân tố lựa chọn tập trung vào các dòng mã và khả
năng bảo trì.
Hiệu năng của một ngôn ngữ sẽ có tầm quan trọng khi môi trường đích không cung cấp nhiều
phạm vi để mở rộng quy mô. Các thiết bị cầm tay là một ví dụ về môi trường như vậy.
Cộng đồng và khả năng hỗ trợ
Cũng như phần mềm tốt cần một cộng đồng những người ủng hộ để giúp nó phát triển, một ngôn
ngữ lập trình cũng cần có một cộng đồng mạnh mẽ đằng sau nó. Một ngôn ngữ có một diễn đàn
năng động có thể nổi tiếng hơn so với một ngôn ngữ tuyệt vời mà không có trợ giúp bên cạnh.
Sự hỗ trợ của cộng đồng tạo ra các thư viện wiki, các diễn đàn, các hướng dẫn và quan trọng
nhất là các thư viện bổ sung giúp ngôn ngữ phát triển. Đã qua rồi cái thời mà mọi người hoạt
động khép kín. Mọi người không muốn đọc lướt tất cả các tài liệu hướng dẫn để nhận được một
vấn đề nhỏ cần được giải quyết. Nếu một ngôn ngữ có một lực lượng ủng hộ tốt, rất có thể một
người nào khác đã phải đối mặt với vấn đề giống như của bạn và đã viết về nó trong một wiki
hoặc diễn đàn.
Perl là một ví dụ tốt về tầm quan trọng của cộng đồng. Comprehensive Perl Archive Network
(CPAN - Mạng lưu trữ Perl toàn diện) là một nỗ lực dựa vào cộng đồng. Mục đích chính của
CPAN là để giúp các nhà lập trình xác định vị trí các mô đun và các chương trình không có trong
bản phân phối tiêu chuẩn của Perl. Cấu trúc của nó là phân cấp; các tác giả duy trì và cải thiện
các mô đun riêng của họ. Việc phân nhánh và tạo ra các mô đun cạnh tranh cho cùng một nhiệm
vụ hoặc mục đích, là phổ biến.
Về đầu trang
Các kịch bản
Các kịch bản dự án trong phần này minh họa các nhân tố khác nhau ảnh hưởng đến quá trình ra
quyết định khi chọn một ngôn ngữ.
Dịch vụ REST cho hoạt động bổ sung
Một trình đọc nguồn cấp dữ liệu đơn giản (feed reader)
Các ứng dụng doanh nghiệp
Nghiên cứu các dự án
Dịch vụ REST cho hoạt động bổ sung
Kịch bản này dùng cho một dịch vụ sẽ thực hiện thêm vào định dạng của một dịch vụ REST.
Bạn sẽ gọi một URL, và kết quả sẽ chứa tổng của
hai số được chuyển tới nó. Bạn có thể viết chương trình này bằng cách sử dụng các ngôn ngữ
khác nhau. Ví dụ ở đây, Liệt kê 1 sử dụng JSP, và Liệt kê 2 sử dụng PHP. Chương trình JSP
được viết bằng Eclipse IDE.
Liệt kê 1. Dịch vụ REST sử dụng JSP
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"">
Sum
<% if (request.getParameter("num1") == null ||
request.getParameter("num2") == null) { %>
Wrong URL!!!
Enter URL in this format:
http://<url>?num1=number1&num2=number2
Number 1:
Number 2:
Sum:
<%= Integer.parseInt(request.getParameter("num1")) +
Integer.parseInt(request.getParameter("num2")) %>
Liệt kê 2 cho thấy chương trình tương tự viết bằng PHP.
Liệt kê 2. Dịch vụ REST sử dụng PHP
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"">
Sum
Wrong URL!!!
Enter URL in this format:
http://<url>?num1=number1&num2=number2
Number 1:
Number 2:
Sum:
Không có nhiều sự khác biệt giữa hai ví dụ. Bản thân chương trình không nghiên cứu tất cả các
khả năng của hai ngôn ngữ. Nó chứng tỏ rằng, khi nói đến các vấn đề cơ bản, cả hai ngôn ngữ
đều như nhau.
Các tính năng của JSP cho phép nó được sử dụng nhiều hơn ở mức doanh nghiệp. Ví dụ, với
JSP, ngay lần đầu tiên chương trình này được gọi, nó đã được nạp vào bộ nhớ như là một servlet.
Đối với tất cả các yêu cầu tiếp theo, chương trình nằm trong bộ nhớ được gọi, mang lại thời gian
đáp ứng tốt hơn nếu có các cuộc gọi tiếp theo. Đó cũng là mô hình lý tưởng trong một môi
trường Java. Tuy nhiên, với PHP, mỗi lần chương trình được gọi thì nó mới được nạp vào bộ
nhớ, dẫn đến có thể làm tăng thời gian đáp ứng với các ứng dụng quan trọng.
Một tính năng đáng chú ý làm cho JSP trở thành một sự lựa chọn tốt hơn trong một doanh nghiệp
là các khả năng đa luồng. PHP không có sự hỗ trợ dựng sẵn nào cho hoạt động đa luồng.
Một trình đọc nguồn cấp dữ liệu đơn giản (feed reader)
Mục tiêu trong kịch bản này là cung cấp chương trình kết nối với các dữ liệu feed. Chương trình
phải nhận được feed và liệt kê tất cả tiêu đề trong feed. Thú vị hơn một chút, bạn sẽ đăng ký một
feed theo định dạng JSON mà không theo định dạng RSS.
Đoạn mã trong Liệt kê 3 là của O'Reilly và được viết bằng mã Java.
Liệt kê 3. Một trình đọc feed sử dụng mã Java
import java.io.InputStream;
import java.net.URL;
import java.net.URLConnection;
import org.apache.commons.io.IOUtils;
import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
import net.sf.json.JSONSerializer;
public class JsonParser {
public static void main(String[] args) throws Exception {
String urlString =
"
_render=json&
textinput1=and&urlinput1=http%3A%2F%2Ffeeds.wired.com%2Fwired%2Findex";
URL url = new URL(urlString);
URLConnection urlCon = url.openConnection();
InputStream is = urlCon.getInputStream();
String jsonTxt = IOUtils.toString(is);
JSONObject json = (JSONObject) JSONSerializer.toJSON(jsonTxt);
JSONObject value = json.getJSONObject("value");
JSONArray items = value.getJSONArray("items");
String title;
for (Object item : items) {
title=((JSONObject)item).getString("title");
System.out.println("\n" + title);
}
}
}
Liệt kê 4 cho thấy chương trình viết bằng Python.
Liệt kê 4. Một trình đọc feed sử dụng Python
#!/usr/bin/python
import urllib.request
url = "
_id=df36e60df711191549cf529e1df96884&_render=json&
textinput1=and&urlinput1=http%3A%2F%2Ffeeds.wired.com%2Fwired%2Findex"
HTTPdata = urllib.request.urlopen(url)
json_data = eval(HTTPdata.read())
for item in json_data['value']['items']:
print (item['title'])
Chương trình Python có thể được rút gọn hơn nữa thành đúng ba dòng. Giữ lại hai dòng đầu tiên
của Liệt kê 4 và thay thế phần mã còn lại bằng dòng trong Liệt kê 5.
Liệt kê 5. Dòng mã thứ ba được rút gọn
for item in
eval((urllib.request.urlopen("
_id=df36e60df711191549cf529e1df96884&_render=json&textinput1=and&
urlinput1=http%3A%2F%2Ffeeds.wired.com%2Fwired%2Findex"))
.read()))['value']['items']:print (item['title'])
Ứng dụng ví dụ đã cho thấy tính co giãn của các ngôn ngữ này. Không có ngôn ngữ nào trong số
chúng có các thư viện sẵn có; bạn phải nhập khẩu (import) các gói cần thiết. Với Python thì đơn
giản hơn vì mặc định đã hỗ trợ thao tác với JSON. Còn với Java, có khó khăn hơn một chút vì
bạn phải nhận được các thư viện JSON và các phụ thuộc của chúng để thực hiện công việc của
chương trình.
Các ứng dụng doanh nghiệp
Với các ứng dụng doanh nghiệp, các nhà thiết kế và các nhà lập trình cần phải mạo hiểm khi đề
cập đến hiệu năng, bảo mật, bảo trì và thời gian phát triển. Đó không chỉ là về cách sử dụng ngôn
ngữ lập trình để có thể mang lại cho bạn các số liệu hiệu năng tốt nhất. Các nhân tố quan trọng
khác bao gồm: thời gian đưa ra sản phẩm, tính co giãn và chương trình có thể tích hợp với cơ sở
hạ tầng hiện có tốt ra sao.
Môi trường sẽ sử dụng chương trình cũng đóng một phần quan trọng. Các chương trình được viết
ở mức doanh nghiệp không bao giờ độc lập. Mỗi chương trình là một thành phần của một
chương trình lớn hơn, do đó, tính tương thích sẽ là một nhân tố.
Hãy tưởng tượng rằng một doanh nghiệp có các dịch vụ web của mình được thực hiện bằng mã
Java muốn thêm WebSphere® MQ làm một nền tảng tin cậy. Chẳng hợp lý gì cả khi sử dụng các
API C của WebSphere MQ để viết ứng dụng; sự lựa chọn sẽ phải là mã Java.
Nghiên cứu các dự án
Giả sử dự án tiếp theo của bạn là nghiên cứu trong các lĩnh vực không liên quan đến công nghệ
thông tin và máy tính. Ví dụ, dự án có thể liên quan đến xử lý ảnh, xử lý âm thanh, tạo hình mờ
hoặc khả năng nghiên cứu thị trường cổ phần. Bạn cần tạo mã để mô phỏng một số hành vi thời
gian thực, nhưng bạn không thực sự là một chuyên viên máy tính.
Dự án này đòi hỏi rất nhiều mã nguồn nhanh và thô. Nhân tố thích hợp nhất là thời gian đưa ra
sản phẩm . Trong trường hợp này, thời gian đưa ra sản phẩm có nghĩa là bạn có thể thực hiện
công việc của từng thành phần nhanh đến mức nào để cho bạn có thể quay lại với nhiệm vụ lớn
hơn tiếp theo. Ở giai đoạn này, nó giống như viết những nhánh rẽ nhỏ, mà không để ý đến tính
tương thích. Dự án có thể trở thành một sản phẩm có đủ tính năng, nhưng ngay bây giờ nó vẫn
đang ở giai đoạn ban đầu. Yêu cầu chính của bạn là tạo nguyên mẫu.
Các ngôn ngữ như là MATLAB và LISP có thể hỗ trợ. Nếu bạn bắt đầu tạo nguyên mẫu trong C,
bạn sẽ đi sâu vào các chi tiết của các biến và các con trỏ mà không thấy nhiều kết quả thực tế về
mặt nghiên cứu. MATLAB có sự tích hợp với C/C++ và Fortran, cho phép mã C được gọi từ
MATLAB và ngược lại.