Chọn ngôn ngữ lập trình tối ư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.

pdf8 trang | Chia sẻ: lylyngoc | Lượt xem: 1806 | Lượt tải: 1download
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.