Để tính ý nghĩa của biểu thức, cây phân tích cú pháp được duyệt (traverse) từ dưới lên.
Tính phép nhân trước rồi đến phép cộng. Lúc này, trình biên dịch sẽ tạo các lệnh máy
tương ứng để thực thi biểu thức. Đây là giai đoạn cuối cùng được gọi là sinh mã (code generation).
Bạn đang xem trước 20 trang tài liệu Bài giảng Các vấn đề cơ sở của khoa học máy tính - Chương 4 Phần mềm, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
Chương 4:
PHẦN MỀM
Nội Dung
1. Các thệ hệ của ngôn ngữ lập trình.
2. Trình biên dịch và trình thông dịch.
3. Máy ảo.
4. Lập trình thủ tục.
5. Lập trình hướng đối tượng.
6. Ngôn ngữ kịch bản.
7. Ngôn ngữ lập trình hàm.
8. Cú pháp ngôn ngữ và ngữ nghĩa.
2
Các Vấn Đề Cơ Sở của KHMT ThS. GVC Tô Oai Hùng
Các Thế Hệ của Ngôn Ngữ Lập Trình
• Các nhà khoa học máy tính gọi chung các
ngôn ngữ lập trình, các chương trình và các
sản phẩm là phần mềm (software).
• Một lệnh máy là một dãy các bit 0 và 1 được
chứa trong bộ nhớ máy tính.
• Khi máy tính đọc bộ nhớ, nó xác định xem
dãy bit đã đọc có phải là lệnh máy không.
Nếu đúng, máy tính thực thi lệnh đó, ngược
lại máy tính sẽ dừng vì lệnh không hợp lệ.
• Mỗi máy tính (một họ CPU) có một tập lệnh
máy hữu hạn. Hầu hết các máy tính ngày nay
có từ 75 đến 150 lệnh máy trong tập lệnh.
• Mỗi kiến trúc máy tính được thể hiện trong
3
Các Vấn Đề Cơ Sở của KHMT ThS. GVC Tô Oai Hùng
Các Thế Hệ của Ngôn Ngữ Lập Trình
tập lệnh. Các tập lệnh của các kiển trúc khác
nhau sẽ khác nhau. Ví dụ, tập lệnh của Intel
Pentium khác với của Sun SPARC. Cả khi
thực hiện cùng một tác vụ, một lệnh của kiến
trúc này cũng sẽ khác với kiến trúc khác.
• Trong các máy tính trước đây, việc lập trình
được thực hiện trực tiếp bằng lệnh máy.
Người lập trình làm việc với các bit 0 và 1 để
viết mã cho mỗi lệnh. Ví dụ sau là ba lệnh
của máy tính 16 bit để cộng hai giá trị được
chứa trong bộ nhớ tại địa chỉ 64 và 65 và lưu
kết quả vào địa chỉ 66:
4
Các Vấn Đề Cơ Sở của KHMT ThS. GVC Tô Oai Hùng
Các Thế Hệ của Ngôn Ngữ Lập Trình
0110000001000000 Nạp giá trị tại 64 vào AX
0100000001000001 Cộng với giá trị tại 65.
0111000001000010 Chứa giá trị AX vào 66.
• Khi tất cả lệnh máy được tạo, người lập trình
lưu chúng vào bộ nhớ. Sau đó, thiết lập thanh
ghi PC trỏ đến lệnh đầu tiên của chương trình
và thực thi.
• Các thao tác cơ bản của máy tính là đọc lệnh
trong bộ nhớ được trỏ bởi thanh ghi PC, tăng
thanh ghi PC, thực thi lệnh và lặp lại.
• Một sự cải tiến trước đây để lập trình hiệu
quả hơn là sử dụng hợp ngữ (assembly
language). Trong hợp ngữ, chúng ta có thể
5
Các Vấn Đề Cơ Sở của KHMT ThS. GVC Tô Oai Hùng
Các Thế Hệ của Ngôn Ngữ Lập Trình
đọc mã lệnh bằng từ gợi nhớ (chữ và số -
mnemonic) thay vì mã máy và mỗi từ gợi nhớ
ứng với một lệnh máy.
• Hợp ngữ được gọi là ngôn ngữ thế hệ thứ hai
(second-generation language). Trong hợp
ngữ, người lập trình viết mã lệnh gợi nhớ và
nó sẽ được biên dịch (bằng trình hợp dịch –
assembler) trực tiếp thành mã máy. Một số từ
gợi nhớ tiêu biểu như sau:
- LDA m: Nạp giá trị tại địa chỉ m vào thanh
ghi AX.
- ADA m: Cộng giá trị của AX với giá trị tại địa
chỉ m, kết quả chứa trong AX.
6 Các Vấn Đề Cơ Sở của KHMT ThS. GVC Tô Oai Hùng
Các Thế Hệ của Ngôn Ngữ Lập Trình
- ALS: Dịch các bit trong AX sang trái 1 đơn
vị.
- SSA: Nếu bit msb của AX là 1, bỏ qua lệnh
kế tiếp. Ngược lại, thực thi lệnh kế tiếp.
- JMP m: Nhảy đến địa chỉ m.
• Sau đây là mã hợp ngữ để viết lại 3 lệnh máy
ở trên:
LDA 100 // 100 octal = 64
ADA 101 // 101 octal = 65
STA 102 // 102 octal = 66
• Người lập trình thường sử dụng hợp ngữ để
viết chương trình vì nó gần gũi với phần
7
Các Vấn Đề Cơ Sở của KHMT ThS. GVC Tô Oai Hùng
Các Thế Hệ của Ngôn Ngữ Lập Trình
cứng máy tính hoặc những chương trình tối
ưu tốc độ hay bộ nhớ.
• Như là một công cụ giáo dục, lập trình hợp
ngữ rất quan trọng, bởi vì nó là cách tốt nhất
để biết được máy tính làm gì và làm như thế
nào.
• Vào năm 1954, ngôn ngữ thế hệ thứ ba ra đời.
Ngôn ngữ đó là FORTRAN, do John Backus
của IBM phát minh.
• FORTRAN là chữ viết tắt của FORmula
TRANslation. Ngôn ngữ này giúp người lập
trình làm việc ở mức trừu tượng cao hơn.
• Thay vì bị hạn chế bởi tập lệnh máy, người
8
Các Vấn Đề Cơ Sở của KHMT ThS. GVC Tô Oai Hùng
Các Thế Hệ của Ngôn Ngữ Lập Trình
lập trình bây giờ sử dụng các câu lệnh giống
như tiếng Anh và các biểu thức toán học.
Ngôn ngữ cũng bao gồm các lệnh rẽ nhánh,
lặp và nhập/xuất.
• Sau đây là câu lệnh của FORTRAN. Các tên
biến X, Y và Z trở thành tên đại diện cho các
vị trí nhớ. Câu lệnh sẽ cộng nội dung của Y
với Z và chứa tổng vào X:
X = Y + Z
• So sánh với hợp ngữ, câu lệnh của FORTRAN
dễ đọc, dễ viết và ngắn gọn hơn.
• FORTRAN là “ngôn ngữ thủ tục” (procedural
language). Nghĩa là, người lập trình phải tổ
9
Các Vấn Đề Cơ Sở của KHMT ThS. GVC Tô Oai Hùng
Các Thế Hệ của Ngôn Ngữ Lập Trình
chức hợp lý một dãy các bước cần thiết để
thực thi tác vụ nào đó.
• Các ngôn ngữ thủ tục còn được gọi là các
“ngôn ngữ mệnh lệnh” (imperative language),
bởi vì các câu lệnh của ngôn ngữ là những
mệnh lệnh cho máy tính – các bước của
chương trình chỉ định mỗi hành động của
máy tính.
• Khác với các ngôn ngữ mệnh lệnh là các
ngôn ngữ “hướng đối tượng” (object-
oriented). Hầu hết, nhưng không phải là tất cả
các chương trình ngày nay được viết bằng
các ngôn ngữ mệnh lệnh.
10
Các Vấn Đề Cơ Sở của KHMT ThS. GVC Tô Oai Hùng
Các Thế Hệ của Ngôn Ngữ Lập Trình
• Cho đến nay, các ngôn ngữ thế hệ thứ ba
gồm: LISP (for LISt Processing), Cobol, PL/1,
BASIC, ADA, C, Smalltalk, C++, Java. Trong
đó, Smalltalk, C++ và Java là các ngôn ngữ
lập trình hướng đối tượng.
11
Các Vấn Đề Cơ Sở của KHMT ThS. GVC Tô Oai Hùng
Trình Biên Dịch và Trình Thông Dịch
• Với sự ra đời của FORTRAN, chương trình
trở nên phức tạp hơn để tạo ra mã máy. Một
chương trình khác được gọi là trình biên dịch
(compiler) dùng để dịch ngôn ngữ lập trình
cấp cao thành mã máy.
• Đầu vào của trình biên dịch là mã nguồn
được viết bằng ngôn ngữ cấp cao. Đầu ra của
trình biên dịch là mã máy.
• Ví dụ sau là đoạn mã của ngôn ngữ
FORTRAN:
DIMENSION X(1000)
READ(*, 1) N, M
FORMAT(2I5)
WRITE(*, 2) M, N
12 Các Vấn Đề Cơ Sở của KHMT ThS. GVC Tô Oai Hùng
Trình Biên Dịch và Trình Thông Dịch
FORMAT('AVERAGES ON ', I6, ' TESTS
FOR EACH OF ', I6, 1’ SUBJECTS’)
EM=M
DO 5 J=1, N
READ(*, 3) ID, (X(K), K=1, M)
FORMAT(I5, 25F3.0/ (5X, 25F3.0))
SUM = 0.0
DO 4 K=1, M
SUM = SUM + X(K)
AV = SUM / EM
WRITE(*, 6 ) J, ID, AV
FORMAT(I6, 3X, 'SUBJECT ', I6, 3X,
'AV= ', F9.2)
STOP
END 13
Các Vấn Đề Cơ Sở của KHMT ThS. GVC Tô Oai Hùng
Trình Biên Dịch và Trình Thông Dịch
• Trình biên dịch xử lý mã nguồn qua hàng loạt
các bước:
1. Bước đầu tiên gọi là “quét” (scanning) hay
“phân tích từ vựng” (lexical analysis) và
xuất ra một chuỗi các “token” (từ tố/thẻ từ).
Token là từ của ngôn ngữ, ví dụ “READ”,
“FORMAT”, “AV”, “4” và “3X” là các token
trong chương trình ví dụ.
2. Kế đến, trình biên dịch “phân tích từ loại”
(parse) chuỗi token đó. Bước này được gọi
là “phân tích cú pháp” (syntax analysis).
Xem xét “văn phạm” hay các qui tắc của
ngôn ngữ. Trình biên dịch sử dụng “cây
14
Các Vấn Đề Cơ Sở của KHMT ThS. GVC Tô Oai Hùng
Trình Biên Dịch và Trình Thông Dịch
phân tích cú pháp” (parse tree) để thẩm tra
các lệnh trong mã nguồn là những lệnh
hợp lệ của ngôn ngữ. Tại bước này, trình
biên dịch trả về thông báo lỗi, ví dụ thiếu
dấu phẩy hay sai từ khoá.
3. Nếu tất cả câu lệnh đều hợp lệ, trình biên
dịch tiếp tục “phân tích ngữ nghĩa”
(semantic analysis). Trong giai đoạn này, ý
nghĩa (meaning) của các lệnh được tạo, các
lệnh sẽ được chuyển thành các mã thực thi
(executable code).
• Các trình biên dịch ngày nay thường biên
dịch chương trình nguồn thành “ngôn ngữ
15
Các Vấn Đề Cơ Sở của KHMT ThS. GVC Tô Oai Hùng
Trình Biên Dịch và Trình Thông Dịch
trung gian” (intermediate language) và sau đó
sẽ chuyển thành mã máy. Trong khi các trình
biên dịch trước đây hoặc là tạo mã hợp ngữ
và sau đó sẽ hợp dịch (assemble) bằng trình
hợp dịch (assembler) hoặc là tạo trực tiếp
thành mã máy.
• Ưu điểm của trình biên dịch ngày nay là có
thể biên dịch nhiều ngôn ngữ khác nhau
thành mã trung gian ở dạng tổng quát, không
phụ thuộc vào môi trường/nền (platform) và
sau đó có thể sinh ra mã máy tối ưu cho từng
loại máy.
• Kết quả của sự biên dịch chương trình là tập
16
Các Vấn Đề Cơ Sở của KHMT ThS. GVC Tô Oai Hùng
Trình Biên Dịch và Trình Thông Dịch
tin mã đối tượng (object code). Nó là tập tin
nhị phân của các lệnh máy và sẽ thực thi khi
chương trình chạy.
• Trình biên dịch thực hiện dịch mã nguồn
thành mã thực thi chỉ 1 lần, khi chương trình
chạy, các mã này sẽ thực thi ngay lập tức.
• Đối với trình thông dịch (interpreter) thì khác.
Trình thông dịch thực hiện dịch từng dòng mã
nguồn thành mã máy ở mỗi thời điểm khi
chương trình thực thi. Ví dụ, BASIC là ngôn
ngữ sử dụng trình thông dịch.
• Nói chung, một chương trình được thực thi
bằng trình thông dịch sẽ chạy chậm hơn
17
Các Vấn Đề Cơ Sở của KHMT ThS. GVC Tô Oai Hùng
Trình Biên Dịch và Trình Thông Dịch
chương trình đã được biên dịch thành mã
máy. Bởi vì, ở mỗi thời điểm trình thông dịch
phải phân tích từng dòng lệnh và chuyển nó
thành mã máy khi chương trình chạy.
• Trình thông dịch thường cung cấp thông báo
chuẩn đoán tốt hơn vì nó làm việc trực tiếp
với từng dòng lệnh.
• Sự khác biệt giữa ngôn ngữ sử dụng trình
biên dịch và thông dịch đôi khi cũng không rõ
ràng. Có một số ngôn ngữ sử dụng cả trình
thông dịch và biên dịch như BASIC, PERL,
LISP, Java,
18
Các Vấn Đề Cơ Sở của KHMT ThS. GVC Tô Oai Hùng
Máy Ảo
• Máy ảo (virtual machine) là máy tính được
định nghĩa bởi phần mềm hơn là phần cứng.
Máy ảo chạy các chương trình giống như máy
tính thật, nhưng máy ảo thực sự được điều
khiển bởi chương trình khác, một sự tạo
dựng bởi phần mềm đó là lấy, giải mã và thực
thi các lệnh của chương trình.
• Thuật ngữ máy ảo mô tả một lớp trừu tượng
được thêm vào giữa người dùng và phần
cứng, vì thế các nhà khoa học máy tính cũng
sử dụng thuật ngữ này để mô tả phần mềm
tạo nên sự thể hiện ở các dạng khác nhau
của máy tính.
19
Các Vấn Đề Cơ Sở của KHMT ThS. GVC Tô Oai Hùng
Lập Trình Thủ Tục
• Theo nhiều người, lập trình thủ tục
(procedural programming) là mô hình tự
nhiên. Một chương trình được mô tả đơn giản
chỉ là một danh sách các lệnh được thực thi
theo trình tự, tức là một thủ tục.
• Các ngôn ngữ lập trình thủ tục cũng được gọi
là các ngôn ngữ mệnh lệnh (imperative
language).
• Trong lập trình thủ tục, mã lệnh cho một công
việc cụ thể được chứa trong một thủ tục có
tên. Thủ tục cũng còn được gọi là subroutine.
Cho ví dụ, hãy tạo một thủ tục để tìm độ lệch
chuẩn của một dãy số.
20
Các Vấn Đề Cơ Sở của KHMT ThS. GVC Tô Oai Hùng
Lập Trình Thủ Tục
• Độ lệch chuẩn được định nghĩa như sau. Gọi
σ là độ lệch chuẩn và 𝒙𝒙� là trung bình của các
phần tử trong dãy số:
𝝈𝝈 = (�𝒙𝒙𝒊𝒊𝟐𝟐 − 𝒏𝒏𝒙𝒙�𝟐𝟐)𝒏𝒏
𝒊𝒊=𝟏𝟏
/𝒏𝒏
• Sau đây là thủ tục được viết bằng mã giả để
tính độ lệch chuẩn:
21
Các Vấn Đề Cơ Sở của KHMT ThS. GVC Tô Oai Hùng
Lập Trình Thủ Tục
SUM = 0.0, SUMSQUARES = 0.0
n = size of the array of scores
Start with the first score and
continue until all the scores
have been processed
SUM = SUM + score
SUMSQUARES = SUMSQUARES + score2
End of loop
MEAN = SUM / n
Return SquareRoot((SUMSQUARES
− n * MEAN2) / n)
• Sau đây là đoạn mã lệnh được viết bằng Java
với lớp Sd chứa phương thức stdDev():
22
Các Vấn Đề Cơ Sở của KHMT ThS. GVC Tô Oai Hùng
Lập Trình Thủ Tục
import java.lang.Math;
class Sd
{
public static void main(String
args[]) {
float[] numbers = {3, 5, 7, 9};
System.out.println("Std. dev. = "
+ stdDev(numbers));
}
public static float stdDev(float
scores[]) {
float sum = 0;
float sumSquares = 0;
int n = scores.length;
23
Các Vấn Đề Cơ Sở của KHMT ThS. GVC Tô Oai Hùng
Lập Trình Thủ Tục
for(int i = 0; i < n; i++)
{
sum = sum + scores[i];
sumSquares = sumSquares +
scores[i]*scores[i];
}
float mean = sum / n;
float variance = (sumSquares -
n * mean * mean) / n;
return (float)Math.sqrt(variance);
}
}
24
Các Vấn Đề Cơ Sở của KHMT ThS. GVC Tô Oai Hùng
Lập Trình Thủ Tục
• Trong lập trình thủ tục, các mã lệnh có thể
được viết trong một khối gọi là thủ tục
(procedure)/hàm (function). Khối này được
truy xuất thông qua tên của nó và có thể tái
sử dụng.
• Thủ tục nhận tập giá trị nhập và trả về tập kết
quả. Lưu ý là các biến bên trong thủ tục như
sum và sumSquares có tầm vực (scope) chỉ
bên trong thủ tục đó. Điều này giúp tránh lẫn
lộn các biến đang sử dụng với các biến cùng
tên ở tầm vực/khối bao.
• Một thủ tục có thể được truy xuất bởi chương
trình khác. Chỉ đơn giản là chúng ta thêm thủ
tục đó vào thư viện.
25
Các Vấn Đề Cơ Sở của KHMT ThS. GVC Tô Oai Hùng
Lập Trình Thủ Tục
• Khái niệm lập trình cấu trúc (structured
programming) được hiểu như là tập con của
lập trình thủ tục. Phương pháp lập trình cấu
trúc thường đi đôi với phương pháp phân
tích trên xuống (top-down). Tác vụ của
chương trình được chia thành nhiều thủ
tục/hàm. Điều này rất quan trọng trong thiết
kế chương trình, bởi vì chương trình được
cục bộ hóa nên dễ đọc, dễ bảo trì, độ tin cậy
cao, tái sử dụng và tạo thư viện .
• Lập trình cấu trúc sử dụng các lệnh có cấu
trúc như các lệnh rẽ nhánh, lặp để gọi các thủ
tục/hàm đã được định nghĩa. Các ngôn ngữ
26
Các Vấn Đề Cơ Sở của KHMT ThS. GVC Tô Oai Hùng
Lập Trình Thủ Tục
hỗ trợ lập trình cấu trúc như ALGOL, ADA,
Pascal, C,
• Nhược điểm: Trong lập trình cấu trúc, giải
thuật luôn phụ thuộc chặt chẽ vào cấu trúc
dữ liệu, do đó khi thay đổi cấu trúc dữ liệu,
phải thay đổi giải thuật. Nghĩa là phải viết lại
chương trình.
• Khái niệm lập trình không cấu trúc
(unstructured/non-structured programming)
được hiểu là chương trình có sử dụng các
lệnh GOTO hay JUMP. Kết quả sẽ làm cho
chương trình khó đọc, khó tìm lỗi, khó tái sử
dụng.
• Các ngôn ngữ hỗ trợ lập trình không cấu trúc
như Assembly, BASIC,
27
Các Vấn Đề Cơ Sở của KHMT ThS. GVC Tô Oai Hùng
Lập Trình Hướng Đối Tượng
• Lập trình hướng đối tượng (Object-oriented
programming – OOP) được phát triển sau
này, nó cung cấp độ tin cậy và tái sử dụng
phần mềm xa hơn nữa.
• Thay vì lập trình thủ tục, lập trình hướng đối
tượng dựa vào các đối tượng phần mềm như
là các đơn vị của chương trình.
• Một đối tượng là một thể hiện (instance) của
một “lớp” (class). Để tạo ra một thể hiện,
người ta sử dụng các đặc tả của lớp đó. Ví dụ
MyCar là một thể hiện của lớp Automobile:
có 4 bánh, có động cơ, có ghế ngồi,
28
Các Vấn Đề Cơ Sở của KHMT ThS. GVC Tô Oai Hùng
Lập Trình Hướng Đối Tượng
• Một thể hiện của một lớp có “trạng thái” hay
các nét đặc trưng (characteristic) của riêng
nó. Ví dụ, màu của thể hiện MyCar là đỏ và
của YourCar là xanh. Hoặc MyCar có 170 hp
(mã lực) và YourCar có 200 hp, Tất cả các
đặc trưng màu sắc, dung tích động cơ (và các
đặc trưng khác) được gọi là thuộc tính
(attribute) hay các biến thể hiện (instance
variable).
• Các đối tượng cũng có “hành vi” (behavior).
Hành vi được xác định bởi các thủ tục của
lớp đó, các thủ tục như thế được gọi là các
phương thức (method). Ví dụ, lớp
29
Các Vấn Đề Cơ Sở của KHMT ThS. GVC Tô Oai Hùng
Lập Trình Hướng Đối Tượng
Automobile có phương thức như
changeSpeed() để thay đổi tốc độ xe nhanh
hay chậm hơn, park() xác định kích thước
của chỗ đậu xe. Phương thức còn được gọi
là phương thức thể hiện (instance method)
• Lập trình hướng đối tượng “đóng gói”
(encapsulate) trạng thái và hành vi của đối
tượng. Chương trình chỉ có thể truy xuất các
thuộc tính public và phương thức public
của đối tượng.
• Một ý tưởng quan trọng trong lập trình hướng
đối tượng là “sự thừa kế” (inheritance). Nghĩa
là chúng ta có thể tạo một lớp mới “mạnh
30
Các Vấn Đề Cơ Sở của KHMT ThS. GVC Tô Oai Hùng
Lập Trình Hướng Đối Tượng
hơn” bằng cách thừa kế từ lớp trước đó và
thêm những tính năng mới của nó. Ví dụ, lớp
Limousine thừa kế từ lớp Automobile.
• Có liên quan đến thừa kế là khái niệm về “tính
đa hình” (polymorphism) - tính chất thể hiện
nhiều hình thái của đối tượng. Tính đa hình là
sự thực thi của một phương thức có thể cho
kết quả khác nhau phụ thuộc vào lớp của đối
tượng mà phương thức đó được gọi.
• Ví dụ, lớp Automobile và Limousine (xe ô tô
hạng sang) đều có phương thức park(). Tuy
nhiên, phương thức park() của Limousine
yêu cầu chỗ đậu xe lớn hơn trong phương
thức park() của Automobile. 31
Các Vấn Đề Cơ Sở của KHMT ThS. GVC Tô Oai Hùng
Ngôn Ngữ Kịch Bản
• Ngày nay, có một số ngôn ngữ lập trình là
ngôn ngữ kịch bản (scripting language). Ý
tưởng ban đầu của “script” (kịch bản) là một
tập các lệnh của hệ điều hành được đặt trong
tập tin. Khi người sử dụng thực thi tập tin
kịch bản (script file), tập lệnh trong đó được
thực thi. Các kịch bản rất hữu dụng trong
việc tự động hoá công việc thường ngày.
• Do tính hữu dụng của ngôn ngữ kịch bản đã
khơi dậy nhiều nhà phát minh phát triển ngôn
ngữ mới với nhiều tính năng và tiện lợi hơn.
Các ngôn ngữ như Perl, PHP, Python,
JaVaScript, là những ngôn ngữ kịch bản.
Tuy nhiên, ngôn ngữ kịch bản được thông
dịch, vì thế tốc độ thực thi không phải là ưu
điểm chính của nó. 32
Các Vấn Đề Cơ Sở của KHMT ThS. GVC Tô Oai Hùng
Ngôn Ngữ Lập Trình Hàm
• Các ngôn ngữ lập trình hàm (functional
programming language) được phát minh từ
rất sớm trong lịch sử máy tính. Năm 1958,
John McCarthy đã cho ra đời ngôn ngữ LISP
(LISt Processing).
• Ngôn ngữ lập trình hàm thường dùng để xử
lý các hàm toán học. Một hàm cần một hay
nhiều đối số và trả về một trị. Cho ví dụ,
phương trình của đường parabol là:
f(x) = 2x2 + 5
Khi chúng ta cung cấp giá trị cho x (ví dụ x =
3), thì hàm trên sẽ trả về kết quả như sau:
f(3) = 2(3)2 + 5 = 23
33
Các Vấn Đề Cơ Sở của KHMT ThS. GVC Tô Oai Hùng
Ngôn Ngữ Lập Trình Hàm
• Với ngôn ngữ lập trình hàm, việc tính toán
được thực hiện bằng cách truyền các đối số
đến một hàm và nhận kết quả trả về của hàm
đó.
• Trong các ví dụ, chúng ta sẽ sử dụng ngôn
ngữ Scheme. Ngôn ngữ Scheme được gọi là
ngôn ngữ thao tác ký hiệu (symbolic
manipulation), ra đời năm 1975 và thuộc họ
LISP.
• Một biểu thức trong Scheme là một atom
(nguyên tử) hay một list (danh sách). Một
atom là một số, ký tự, tên hay hàm. Một list là
một tập các biểu thức được chứa trong dấu
34
Các Vấn Đề Cơ Sở của KHMT ThS. GVC Tô Oai Hùng
Ngôn Ngữ Lập Trình Hàm
ngoặc (). Các phần tử trong list có thể là
atom hay là một list khác.
• Trong bất kỳ ngôn ngữ lập trình hàm nào, một
số hàm cơ bản sẽ được tạo sẵn. Ngoài ra,
người lập trình có thể tự định nghĩa hàm. Sau
đây là một số ví dụ về Scheme:
1.(+ 3 5) → 8
2.(+ 3 5 7 4 2) → 21
3.(/ (+ 3 5) (- 7 5)) → 4
4.(list 1 5 6) →(1 5 6)
5.(car (list 1 5 6)) → 1
6. (cdr (list 1 5 6)) → (5 6)
35
Các Vấn Đề Cơ Sở của KHMT ThS. GVC Tô Oai Hùng
Scheme/
LISP
Ngôn Ngữ Lập Trình Hàm
7.(define sum
(lambda (n m)
(+ n m)))
> (sum 4 3)
7
Trong ví dụ trên, định nghĩa hàm sum sử dụng
ký pháp lambda (lambda notation). Ưu điểm là
không phân biệt định nghĩa hàm với định
nghĩa giá trị.
8.(define factorial
(lambda (n)
(if (<= n 1) 1 (* n (factorial(
- n 1))))))
36
Các Vấn Đề Cơ Sở của KHMT ThS. GVC Tô Oai Hùng
Ngôn Ngữ Lập Trình Hàm
> (factorial 5)
120
• Lưu ý: Thay vì sử dụng các lệnh if lồng
nhau, Scheme cho phép sử dụng lệnh cond.
Ví dụ:
cond((>= grade 8) “Gioi”)
((>= grade 7) “Kha”)
((>= grade 6) “TB kha”)
((>= grade 5) “Trung binh”)
(else “Kem”)))
37
Các Vấn Đề Cơ Sở của KHMT ThS. GVC Tô Oai Hùng
Ngôn Ngữ Lập Trình Hàm
9.(define listSum
(lambda (n)
(cond ((null? n) 0)
((null? (cdr n)) (car n))
(else (+ (car n) (listSum(
cdr n))))
)))
> (listSum (list 2 4 5))
11
• Lập trình hàm thường được sử dụng trong trí
tuệ nhân tạo (artificial intelligence) và hệ
chuyên gia (expert system).
38 Các Vấn Đề Cơ Sở của KHMT ThS. GVC Tô Oai Hùng
Cú Pháp Ngôn Ngữ và Ngữ Nghĩa
• Trước khi biên dịch chương trình ngôn ngữ
cấp cao thành mã máy, bộ xử lý ngôn ngữ
(chương trình dịch) phải thực hiện nhiều tác
vụ như phân tích từ vựng (lexical analysis),
phân tích cú pháp (syntax analysis) và sinh
mã (phân tích ngữ nghĩa - semantic analysis).
• Trong bước phân tích từ vựng, chương trình
dịch đọc dãy ký tự từ tập tin mã nguồn và tạo
các token của ngôn ngữ đó. Token là từ của
ngôn ngữ và có nhiều dạng, có thể là từ khoá
(key word) như String, một ký hiệu như ‘+’,
một danh hiệu như myCount, một hằng như
3.14 hay một chuỗi ký tự như “Please
enter your name:”. 39
Các Vấn Đề Cơ Sở của KHMT ThS. GVC Tô Oai Hùng
Cú Pháp Ngôn Ngữ và Ngữ Nghĩa
• Sau khi các token được tạo, bộ phân tích cú
pháp (parser) xây dựng cây phân tích cú pháp
(parse tree) theo các qui tắc văn phạm của
ngôn ngữ và tìm lỗi nếu có.
• Cú pháp của ngôn ngữ mô tả các lệnh hợp lệ
của ngôn ngữ đó. Cú pháp đúng, không đảm
bảo là kết quả của chương trình đúng, nhưng
một chương trình đúng phải có cú pháp
đúng.
• Ngày nay, các qui tắc cú pháp thường biểu
diễn ở dạng Backus-Naur form (BNF) hay BNF
mở rộng (EBNF). Từ “Backus-Naur” được
40
Các Vấn Đề Cơ Sở của KHMT ThS. GVC Tô Oai Hùng
Cú Pháp Ngôn Ngữ và Ngữ Nghĩa
ghép từ tên John Backus là nhà phát minh ra
ngôn ngữ FORTRAN và Peter Naur.
• BNF sử dụng một tập các qui tắc hay luật
sinh (production rule) để mô tả văn phạm hay
cú pháp.
• Bên trái của luật sinh, BNF cho thấy một khái
niệm ngôn ngữ học được biết như là các “ký
hiệu không kết thúc” (non-terminal). Ví dụ, ký
hiệu không kết thúc trong tiếng Anh là “câu”
(sentence) và “ngữ động từ” (verb phrase).
Trong ngôn ngữ lập trình, ký hiệu không kết
thúc có thể là “expression” hay “term”.
41
Các Vấn Đề Cơ Sở của KHMT ThS. GVC Tô Oai Hùng
Cú Pháp Ngôn Ngữ và Ngữ Nghĩa
• Bên phải của luật sinh, BNF cho thấy sự kết
hợp của ký hiệu không kết thúc và/hoặc ký
hiệu kết thúc thay thế cho ký hiệu không kết
thúc bên trái.
• Ví dụ sau là văn phạm của các biểu thức toán
học:
1.expression → term | expression addop
term
2.term → factor | term multop factor
3.factor → identifier | number | -factor
| (expression)
4.addop → + | -
5.multop → * | /
42
Các Vấn Đề Cơ Sở của KHMT ThS. GVC Tô Oai Hùng
Cú Pháp Ngôn Ngữ và Ngữ Nghĩa
• Các vạch đứng “|” nghĩa là “hoặc”. Các luật
sinh 3, 4, và 5 tạo các ký hiệu kết thúc.
• Trong luật sinh 1, một biểu thức có thể là
term hoặc là một biểu thức khác addop (+ | -)
với term.
• Trong luật sinh 2, term có thể là factor hoặc
là một term khác multop(* | /) với factor.
• Cho ví dụ, phân tích cú pháp biểu thức sau
dựa vào văn phạm ở trên:
X * 3 + 4
• Áp dụng luật sinh 1:
X * 3 + 4 → (X * 3) addop term
expr + 4
43
Các Vấn Đề Cơ Sở của KHMT ThS. GVC Tô Oai Hùng
Cú Pháp Ngôn Ngữ và Ngữ Nghĩa
• Áp dụng luật sinh 2 và 3 cho term:
term → factor → number
4
• Áp dụng luật sinh 1 và 2 cho (X * 3):
(X * 3) → term → term multop factor
(X * 3) X * 3
• Áp dụng luật sinh 3 cho factor:
factor → number
4
• Áp dụng luật sinh 2 và 3 cho term:
term → factor → identifier
X X X
44
Các Vấn Đề Cơ Sở của KHMT ThS. GVC Tô Oai Hùng
Cú Pháp Ngôn Ngữ và Ngữ Nghĩa
• Sự phân tích một biểu thức thành các ký hiệu
kết thúc dựa vào các qui tắc văn phạm được
gọi là dẫn xuất (derivation). Kết quả của sự
dẫn xuất thành công là cây phân tích cú pháp
hay cây cú pháp (syntax tree). Sau đây là cây
phân tích cú pháp của dẫn xuất mà chúng ta
vừa thực hiện:
45
Các Vấn Đề Cơ Sở của KHMT ThS. GVC Tô Oai Hùng
Cú Pháp Ngôn Ngữ và Ngữ Nghĩa
46
Các Vấn Đề Cơ Sở của KHMT ThS. GVC Tô Oai Hùng
Cú Pháp Ngôn Ngữ và Ngữ Nghĩa
• Để tính ý nghĩa của biểu thức, cây phân tích
cú pháp được duyệt (traverse) từ dưới lên.
Tính phép nhân trước rồi đến phép cộng. Lúc
này, trình biên dịch sẽ tạo các lệnh máy
tương ứng để thực thi biểu thức. Đây là giai
đoạn cuối cùng được gọi là sinh mã (code
generation).
47
Các Vấn Đề Cơ Sở của KHMT ThS. GVC Tô Oai Hùng
Các file đính kèm theo tài liệu này:
- khoa_hoc_may_tinh_c4_1715.pdf