Procedural Programming + Ada, Bài 2 – Một Ngôn Ngữ Imperative

Tram Ho

Ada là một ngôn ngữ hỗ trợ triển khai logic của nhiều mô hình lập trình khác nhau, trong đó có cả Lập Trình Hướng Đối Đượng OOP và một số yếu tố của Lập Trình Hàm FP. Tuy nhiên thì thiết kế cốt lõi của Ada lại là một ngôn ngữ trọng tâm Lập Trình Tuần Tự Imperative giống với C hoặc Pascal.

Có một điểm khác biệt quan trọng giữa Ada và phần lớn các ngôn ngữ lập trình khác, đó là các câu lệnh và các biểu thức được phân biệt rất rõ ràng trong Ada. Nếu như chúng ta cố gắng sử dụng một biểu thức ở vị trí mà đáng lẽ cần xuất hiện một câu lệnh thì chắc chắn sẽ nhận được thông báo lỗi khi tiến hành biên dịch code.

Nguyên tắc này bổ trợ cho một trong số những tiêu chí thiết kế ngôn ngữ đã kể trước đó: Đó là các biểu thức thì được sử dụng để truyền tải các giá trị, chứ không tạo ra bất kỳ hiệu ứng biên nào khác. Điều này sẽ giúp sàng lọc được một số lỗi lập trình trong một số tình huống, ví dụ như khi chúng ta sử dụng nhầm phép so sánh tương đương ở vị trí mà đáng ra phải là một câu lệnh gán giá trị cho một biến nào đó.

Đó là một ví dụ logic rẽ nhánh trong JavaScript, khi mà chúng ta dự định rằng: Nếu dự tính shoulDoIt cũng đồng thuận với tiềm thức fromMySoul thì sẽ thực hiện một dự định. Trong trường hợp này khi chúng ta biểu thị nhầm bằng phép gán giá trị như trên thì hiển nhiên kết quả sẽ luôn luôn là "Ok. We'll do it.". Và đó là điều mà Ada sẽ không để xảy ra.

Hello, Ada !

Trước khi nói đến việc cài đặt và chuẩn bị môi trường cho Ada thì chúng ta sẽ nhìn lướt qua chương trình Hello World giống như khi bắt đầu học bất kỳ ngôn ngữ lập trình nào khác.

Có một vài điểm đáng lưu ý trong chương trình này:

  • Chúng ta đang có một ngôn ngữ sử dụng cú pháp dạng indentation style với các câu lệnh được xem là cùng khối nếu có cùng khoảng trống thụt vào ở đầu dòng, thay vì block style với các dấu ngoặc xoắn {} như C hay JavaScript.
  • Một chương trình con sub-program trong Ada có thể là một Thủ Tục procedure hoặc một Hàm function. Và một Thủ Tục procedure như trong code ví dụ ở trên sẽ không bao giờ trả về một giá trị nào tại vị trí được gọi.
  • Từ khóa with được sử dụng để tham chiếu tới các module bên ngoài. Yếu tố này tương đương với import trong nhiều ngôn ngữ khác, và #include trong C hay C++. Chúng ta sẽ tìm hiểu chi tiết về hoạt động của with ở phần sau.
  • Khác với các ngôn ngữ như C hay C++, chương trình chính trong Ada có thể được đặt tên tùy ý, như trong ví dụ trên là Greet, thay vì Main.
  • Các nội dung chú thích comment được mở đầu với ký hiệu -- và kéo dài đến hết dòng đó. Chúng ta sẽ không có cú pháp chú thích nhiều dòng multi-line comment và nếu cần thiết thì sẽ phải tạo ra nhiều dòng chú thích đơn.

Về mặt ý nghĩa biểu thị thì các Thủ Tục procedure tương đương với các sub-program trong các ngôn ngữ khác nếu trả về các giá trị vô nghĩa. Ví dụ như void trong CC++, hay undefined trong JavaScript, v.v… Chúng ta sẽ điểm qua thao tác định nghĩa Hàm function trong Ada ở phần sau. Còn bây giờ thì chúng ta sẽ chỉnh sửa lại chương trình Hello World một chút.

Lần này chúng ta sử dụng thêm tính năng use đi kèm với with. Cú pháp sử dụng là use package-name. Và ở vị trí gọi thủ tục Put_Line, chúng ta đã có thể lược giản tên tham chiếu tới package ở phía trước.

Cài Đặt Môi Trường

Mặc dù được sử dụng chủ yếu trong các lĩnh vực khoa học công nghệ cao và các ứng dụng mang tính chất enterprise, bộ công cụ hỗ trợ phát triển ứng dụng của Ada có cung cấp phiên bản cộng đồng community edition miễn phí với trình biên dịch đầy đủ tính năng tương đương với phiên bản thương mại pro edition cho các doanh nghiệp.

Bạn có thể tải về GNAT Community cho Windows tại đây:

  • GNAT Community – bộ công cụ tích hợp kèm trình soạn thảo code IDE dành riêng cho AdaC
  • GTA-Ada – plug-in hỗ trợ tạo project với thư viện GUI của Gnome.org cho nhu cầu phát triển ứng dụng đa nền tảng. Viết code 1 lần duy nhất và biên dịch ra các package cho Windows, Linux, BSD, Mac, v.v…

Nếu bạn đang sử dụng một phiên bản Linux nào đó thì có thể tìm trong thư viện repository mặc định gói gnat-12 (phiên bản mới nhất là Ada 2012) và công cụ quản lý dự án gprbuild (GNAT Project Build). Trong đó thì gnat-12 là phần lõi của môi trường phát triển và chúng ta sẽ học cách sử dụng ngay gprbuild để thiết lập project và quản lý các thư mục code.

Hiện tại mình đang sử dụng Ubuntu 22.10 và vì vậy nên có thể đảm bảo lệnh cài đặt dưới đây sẽ hoạt động tốt. Các bản phân phối Linux tiêu biểu khác như Fedora và OpenSUSE cũng đều có liệt kê các package trên trong các trang tra cứu thư viện.

Nói riêng về thao tác sử dụng thì trong loạt bài viết hướng dẫn ở đây, mình sẽ sử dụng gprbuild bằng cửa sổ dòng lệnh và chỉnh sửa tệp khai báo project thủ công. Bạn cũng có thể để dành cái trình soạn thảo tích hợp IDE cho đến khi muốn tạo ra một project ứng dụng thực tế. Và vì vậy nên ở đây mình cần lưu ý một chút về thao tác cài đặt trên Windows.

Tất cả các thao tác với bộ cài đều là Next, Next, và Next với các tùy chọn đã được thiết lập mặc định. Tuy nhiên thì bộ cài của GNAT Community cho Windows sẽ không tự động khai báo biến môi trường cho các thao tác trên cửa sổ dòng lệnh CMD. Do đó nên sau khi chạy bộ cài xong thì chúng ta sẽ cần phải mở thư mục cài đặt của GNAT và tìm tới thư mục bin. Sau đó copy/paste đường dẫn đầy đủ của thư mục C:GNAT2021bin vào biến môi trường Path.

Environment Variables > System Variables > Path > Edit > New

Hoặc mở cửa sổ dòng lệnh CMD với quyền Admin:

Sau đó trong cửa sổ dòng lệnh, chúng ta có thể gõ lệnh kiểm tra phiên bản GNAT đã được cài đặt:

Ok.. mọi thứ đều đã sẵn sàng, chúng ta hãy bắt đầu tìm hiểu chi tiết về ngôn ngữ Ada và công cụ quản lý gprbuild.

Procedural Programming + Ada, Bài 3 – Các Cú Pháp Imperative

Chia sẻ bài viết ngay

Nguồn bài viết : Viblo