Lập trình ký hiệu (tiếng Anh Symbolic Programming) là phương pháp lập trình xem chương trình và các thành phần của chương trình (công thức, biến) thuần túy là dãy các ký hiệu.
Khái niệm cơ bản[sửa]
Trong LTKH, ký hiệu là loại dữ liệu phổ quát. Ký hiệu có thể biểu thị con số, các từ tiếng Việt hoặc tiếng Anh (ví dụ như THỨ BA, hoặc TUESDAY), một cụm từ (ví dụ: TỪ ĐIỂN BÁCH KHOA), hoặc các từ khóa (như SQRT - căn bậc hai). Ngoài ra còn có các ký tự đặc biệt, như dấu gạch nối (-).
Điểm quan trọng của dữ liệu ký hiệu là trung tính, độc lập về mặt ngữ nghĩa trong chương trình. Điều này trái ngược với các biến trong các ngôn ngữ lập trình thủ tục thông thường, luôn phải có một kiểu giá trị nào đó. Ví dụ, trong ngôn ngữ lập trình JavaScript, máy tính không thể thực hiện thao tác x + x, trừ khi x được gán giá trị. Trong khi đó, với các ngôn ngữ lập ký hiệu x + x có ý nghĩa và được xem là 2*x.
Mục tiêu của LTKH tương tự như việc thao tác với các ký hiệu toán học như trong ví dụ trên. Cụ thể, LTKH sử dụng các tính toán dựa trên ký hiệu. Những chương trình phức tạp có thể được phát triển thêm để tạo ra những chương trình phức tạp hơn nữa bằng cách kết hợp các ký hiệu lại với nhau. Theo đó, chương trình có thể tự thay đổi chính nó và có thể "học" hay nói một cách khác là phát triển thêm để thích hợp với các ngữ cảnh hoạt động.
LISP là một trong các ngôn ngữ LTKH tiêu biểu.
Ngôn ngữ lập trinh LISP[sửa]
LISP là tên viết tắt của List Processor (bộ xử lý danh sách). Ý tưởng chính của ngôn ngữ này là cho phép lập trình viên viết các biểu thức dưới dạng danh sách. Ví dụ, thay vì viết 2+3, lập trình viên sẽ viết (+ 2 3). Đây là một danh sách 3 phần tử với ký hiệu + là phần tử đầu tiên và các số 2 và 3 là các phần tử khác của danh sách này. Lý do cho việc sử dụng danh sách là vì các danh sách có thể coi là dữ liệu.
Trong ngôn ngữ lập trình LISP, lập trình viên không thực thi quá trình đánh giá một biểu thức, trừ khi thật cần thiết. Ví dụ, với các ngôn ngữ lập trình khác, khi lập trình viên viết 2 + 3, kết quả nhận được sẽ là 5. Do đó, hoàn toàn có thể viết 5 ngay từ đầu trong chương trình. Ngược lại, trong LISP, khi viết (+ 2 3), lập trình viên có thể thực hiện phép tính (đánh giá) để nhận được 5, hoặc họ có thể thực hiện các thao tác khác với dữ liệu trong danh sách này mà chưa đánh giá kết quả phép tính ngay. Ví dụ như sắp xếp lại các phần tử của danh sách hoặc sử dụng danh sách đó trong các biểu thức khác.
Cú pháp[sửa]
Cấu trúc chung của LISP là danh sách liên kết biểu thị bởi cặp ngoặc đơn, bên trong là các phần ngăn cách bởi dấu khoảng trắng (space).
(phần tử-1, phần tử-2, phần tử-3,..)
Trong đó mỗi phần tử có thể là:
- Hàm: trong LISP, hàm có nghĩa rộng bao gồm cả chương trình con, thủ tục, các câu lệnh, các toán tử trong các ngôn ngữ lập trình thủ tục nói chung.
- Biến: một biến trong LISP có thể nhận bất kỳ kiểu dữ liệu nào.
- Nguyên tố (atom): bao gồm các giá trị số (nguyên/thực), ký tự, chuỗi ký tự, boolean và ký hiệu (symbol). Riêng ở trong LISP còn có kiểu phân số (ratio) cho phép giải các bài toán sơ cấp.
Ví dụ:
- Hàm căn bậc hai: (sqrt 2)
- Lệnh in ra màn hình: (princ "Common Lisp")
- Phép tính cộng trong đó hàm là toán tử: (+ 3 5)
Một số cú pháp cụ thể của Lisp như sau:
Khai báo hàm:
(defun tên-hàm (danh-sách-tham-số) (nội-dung-của-hàm))
Gán: (setq tên-biến biểu-thức
Khối lệnh:
(progn (lệnh-1) (lệnh-2)...)
Chọn / rẽ nhánh
(if (biểu-thức-điều-kiện) (nhánh-đúng) (nhánh-sai))
(cond
( (biểu-thức-1) (nhánh-1))
( (biểu-thức-2) (nhánh-2))
...
)
Lặp
(while (điều-kiện)
(lệnh)
)
Quy ước đặt tên[sửa]
Trong thư viện chuẩn của LISP, các hàm/vị từ logic (predicate) trả lại kết quả đúng (T) hoặc sai (NIL) đều kết thúc với chữ (p). Chẳng hạn: zerop là hàm kiểm tra một số bằng 0 hay không.
Hướng đối tượng[sửa]
Mặc dù được phát triển với định hướng ban đầu là lập trình hàm, ngôn ngữ LISP cũng được bổ sung các tính năng cho phép lập trình hướng đối tượng. Chẳng hạn với Common Lisp, đối tượng được thể hiện qua CLOS (Common Lisp Object System – hệ thống đối tượng của Common Lisp), với các tính năng cơ bản cho phép định nghĩa các lớp, tạo các đối tượng trong mỗi lớp và định nghĩa các phương thức và hàm tổng quát.
Các phiên bản của LISP[sửa]
Trong quá trình phát triển, có nhiều phiên bản LISP khác nhau như: MacLisp, ZetaLisp, Franz LISP. Với nguyện vọng thống nhất một chuẩn chung cho LISP, Common Lisp (CL) đã ra đời. Tuy vậy, hiện nay cũng có nhiều phiên bản của Common LISP như Allegro CL, LispWork (các phiên bản thương mại) và CMU CL, SBCL (các phiên bản phần mềm tự do). Một nhánh phát triển khác của LISP là Scheme, là ngôn ngữ LISP rút gọn với một số thay đổi về các từ khóa.
Sau khi ra đời năm 1958, LISP dần trở thành ngôn ngữ chuyên dụng trong ngành Trí tuệ nhân tạo. Ngoài ra, LISP còn là công cụ lập trình hiệu quả trong các chương trình AutoCAD và Emacs. Phiên bản Scheme của LISP là ngôn ngữ được giảng dạy phổ biến trước đây, tuy nhiên cùng với sự phát triển của các ngôn ngữ lập trình kịch bản, hiện nay, LISP đã được thay thế bằng Python.
Tài liệu tham khảo[sửa]
- Lorenzo, Mark Jones. "Endless loop: The history of the basic programming language (beginner's all-purpose symbolic instruction code). " (2017).
- Touretzky, David S. Common LISP: a gentle introduction to symbolic computation. Courier Corporation, 2013.
- Michael A. Covington (2010-08-23). "CSCI/ARTI 4540/6540: First Lecture on Symbolic Programming and LISP" (PDF). University of Georgia. Archived from the original (PDF) on 2012-03-07. Retrieved 2014-12-29.