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 đó.
const fromMySoul = true
var shouldDoIt = false if (shoudDoIt = fromMySoul) console.log ("Ok. We'll do it.")
else console.log ("Nah. We're not gonna do it.")
Đó 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.
with Ada.Text_IO; procedure Greet is -- khu vực khai báo các biến
begin -- in "Hello, Ada !" ra cửa sổ dòng lệnh Ada.Text_IO.Put_Line ("Hello, Ada !");
end Greet;
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
hayJavaScript
. - Một chương trình con
sub-program
trongAda
có thể là một Thủ Tụcprocedure
hoặc một Hàmfunction
. Và một Thủ Tụcprocedure
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ácmodule
bên ngoài. Yếu tố này tương đương vớiimport
trong nhiều ngôn ngữ khác, và#include
trongC
hayC++
. Chúng ta sẽ tìm hiểu chi tiết về hoạt động củawith
ở phần sau. - Khác với các ngôn ngữ như
C
hayC++
, chương trình chính trongAda
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òngmulti-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 C
và C++
, 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.
with Ada.Text_IO; use Ada.Text_IO; procedure Greet is -- khu vực khai báo các biến
begin -- in "Hello, Ada !" ra cửa sổ dòng lệnh Put_Line ("Hello, Ada !");
end Greet;
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
Ada
vàC
- 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ácpackage
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.
sudo apt update && sudo apt upgrade
sudo apt install gnat-12 gprbuild
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:\GNAT\2021\bin
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
:
setx path "%PATH%;C:\GNAT\2021\bin"
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:
gnat --version
gprbuild --version
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