You are on page 1of 4

5.

1 HỌ NGÔN NGỮ LẬP TRÌNH ALGOL:


5.1.1 Algol 60
Algol 60 được thiết kế từ năm 1958 đến 1963 bởi một ủy ban bao gồm nhiều nhà tiên
phong về máy tính, như John Backus (nhà thiết kế của Fortran), John McCarthy (nhà thiết
kế của Lisp) và Alan Perlis. Algol 60 được dự định là một ngôn ngữ có mục đích chung,
vào thời điểm đó có nghĩa là có sự nhấn mạnh vào các ứng dụng khoa học và số. So với
Fortran, Algol 60 cung cấp các cách tốt hơn để biểu diễn các cấu trúc dữ liệu và, giống
như LISP, cho phép các hàm được gọi là đệ quy. Cho đến khi Pascal phát triển, Algol 60
là tiêu chuẩn học thuật để mô tả các thuật toán phức tạp trong các ấn phẩm khoa học và
kỹ thuật.
Các đặc điểm sau đây là một số tính năng quan trọng của Algol 60:
 Cú pháp hướng câu lệnh đơn giản, liên quan đến chuỗi các câu lệnh được phân
tách bằng dấu hai chấm
 Các khối được biểu thị bằng begin ... End (tương ứng với dấu ngoặc nhọn {...}
Trong c)
 Chức năng đệ quy và phân bổ lưu trữ ngăn xếp
 Ít hạn chế ad hoc hơn các ngôn ngữ trước.
 Một hệ thống kiểu tĩnh nguyên thủy, sau này được cải tiến trong algol 68 và
pascal.
Ví dụ về cú pháp một chương trình của Algol 60:
real procedure average(A,n);
real array A; integer n;
begin
real sum; sum := 0;
for i = 1 step 1 until n do
sum := sum + A[i];
average := sum/n
end;
Có một số điểm rắc rối trong Algol 60 đã thúc đẩy các nhà khoa học máy tính phát triển
các ngôn ngữ lập trình tốt hơn:
 Một số quy luật khuôn mẫu của Algol 60 còn nhiều thiếu sót.
 Algol 60 được thiết kế xung quanh hai cơ chế truyền tham số, pass-by-value và
pass-by-name.
 Có một số vấn đề khó xử liên quan đến luồng điều khiển, chẳng hạn như quản lý
bộ nhớ, khi một chương trình nhảy ra khỏi một khối lồng nhau.
5.1.2 Algol 68
Algol 68 được dự định để loại bỏ một số hạn chế trong Algol 60 và để cải thiện tính diễn
cảm của ngôn ngữ. Tuy nhiên, ủy ban Algol 68 đã tạo ra một thiết kế có vấn đề hơn so
với Algol 60. Vấn đề chính là, mặc dù lập trình trong Algol 68 có vẻ không khó hơn so
với Algol 60, nhưng một số tính năng của Algol 68 đã tạo ra thật khó để biên dịch hiệu
quả. Một nguồn khó khăn là sự kết hợp của các tham số thủ tục và giá trị trả về thủ tục,
điều này không được hiểu rõ tại thời điểm đó. Một lý do khác khiến Algol 68 không hoàn
toàn thành công là các tác giả đã chọn định nghĩa thuật ngữ hoàn toàn mới cho ngôn ngữ
và tài liệu tham khảo của nó.
Một đóng góp của Algol 68 là hệ thống kiểu dữ liệu có chuyên môn, có hệ thống. Vì một
số lý do, các nhà thiết kế Algol 68 đã chọn gọi các chế độ kiểu dữ liệu. Các chế độ của
Algol 68 là kiểu dữ liệu nguyên thủy hoặc hỗn hợp. Các kiểu dữ liệu nguyên thủy bao
gồm int, real, char, bool, string, complex, bits, bytes, semaphore, format, file.
Các kiểu dữ liệu hỗn hợp bao gồm các chế độ được hình thành với các hình thức như
mảng, cấu trúc, thủ tục, tập hợp và con trỏ.
Một số tiến bộ khác trong Algol 68 là trong lĩnh vực quản lý bộ nhớ và truyền tham số.
Quản lý bộ nhớ Algol 68 liên quan đến một ngăn xếp cho các biến cục bộ và lưu trữ heap
cho dữ liệu dự định sống ngoài cuộc gọi hàm hiện tại. Như trong C, dữ liệu Algol 68 trên
heap được phân bổ rõ ràng, nhưng không giống như C, dữ liệu heap được thu hồi bằng
cách thu gom rác. Sự kết hợp giữa phân bổ rõ ràng và bộ sưu tập rác được chuyển sang
Pascal. Truyền tham số Algol 68 là pass-by-value, với tham chiếu pass-by-reference được
thực hiện bởi các loại con trỏ. Đây thực chất là thiết kế giống như được áp dụng trong C
vài năm sau đó. Quyết định cho phép các cấu trúc độc lập được kết hợp mà không hạn
chế cũng dẫn đến một số tính năng phức tạp, chẳng hạn như các biến thủ tục có thể gán.
5.1.3 Pascal
Pascal được thiết kế vào những năm 1970 bởi Niklaus Wirth, người đã sử dụng các ý
tưởng cấu trúc dữ liệu do C.A.R. (Tony) Hoare. Wirth lần đầu tiên thiết kế và thực hiện
một ngôn ngữ gọi là Algol W và sau đó tinh chỉnh thiết kế của Algol W để sản xuất
Pascal. Wirth đã thiết kế Pascal xung quanh một loạt các bài tập giảng dạy, được liệt kê
trong cuốn sách Thuật toán + Cấu trúc dữ liệu = Chương trình (Prentice-Hall, 1975). Ông
cũng thiết kế ngôn ngữ để nó có thể có trình biên dịch một lượt đơn giản.
Pascal đơn giản hơn đáng kể so với Algol 68 và đạt được sự chấp nhận rộng rãi hơn cả
Algol 60 hoặc Algol 68. Mặc dù việc sử dụng Pascal đã giảm trong những năm 1990,
Pascal là một trong những ngôn ngữ lập trình được sử dụng rộng rãi nhất trong khoảng
thời gian 20 năm. Pascal đã rất thành công khi trở thành ngôn ngữ lập trình cho giảng
dạy, một phần vì nó được thiết kế rõ ràng cho mục đích này. Pascal cũng được sử dụng
cho một số lượng đáng kể sản xuất.
Một đóng góp quan trọng của hệ thống kiểu Pascal là tập hợp các khái niệm cấu trúc dữ
liệu phong phú. Chúng bao gồm các bản ghi (tương tự như các cấu trúc C), các bản ghi
biến thể (một dạng của loại kết hợp) và các phần phụ.các dự án lập trình, bao gồm các hệ
điều hành và ứng dụng cho Apple Macintosh.
5.1.4 Modula
Ngôn ngữ lập trình Modula là hậu duệ của Pascal, được phát triển bởi nhà thiết kế Pascal
Niklaus Wirth ở Thụy Sĩ vào cuối những năm 1970. Sự đổi mới chính của Modula so với
Pascal là một hệ thống mô-đun, được sử dụng để nhóm các bộ khai báo liên quan thành
các đơn vị chương trình.
5.2 SỰ PHÁT TRIỂN CỦA C
Mặc dù Pascal là một ngôn ngữ học thuật và giảng dạy thành công, C cuối cùng đã làm lu
mờ Pascal như một ngôn ngữ lập trình sản xuất. Có nhiều lý do cho sự thành công của C.
Một lý do, không liên quan đến thiết kế ngôn ngữ mà nó tự tạo ra, đó là sự phổ biến của
hệ điều hành Unix, được viết bằng C. Khi các chương trình được viết để chạy trong Unix,
tất cả các lệnh gọi hệ thống cơ bản ngay lập tức có sẵn trong C. Do đó, việc viết nhiều
ứng dụng Unix bằng C dễ dàng hơn so với các ngôn ngữ lập trình khác. Một lý do khác
cho sự phổ biến của C là nó có một mô hình bộ nhớ đặc biệt gần với phần cứng bên dưới.
Mặc dù C có nhiều khái niệm giống như Pascal, nhưng C ít cứng nhắc hơn trong việc
thực thi các nguyên tắc và hạn chế cơ bản. Nhiều lập trình viên C thích sự linh hoạt của
C.
C ban đầu được thiết kế và triển khai từ năm 1969 đến năm 1973, là một phần của dự án
hệ điều hành Unix tại Phòng thí nghiệm Bell. C được thiết kế bởi Dennis Ritchie, một
trong những nhà thiết kế ban đầu của Unix, để anh và Ken Thompson có thể xây dựng
Unix theo ngôn ngữ mà họ thích. Thiết kế phát triển từ ngôn ngữ B của Ritchie và
Thompson (do đó tên C, chữ cái tiếp theo trong bảng chữ cái), lần lượt dựa trên một ngôn
ngữ gọi là BCPL. Những thay đổi đáng kể trong C xảy ra từ năm 1977 đến năm 1979, là
một phần trong nỗ lực đạt được tính di động của hệ thống Unix và vào giữa những năm
1980 khi ủy ban của Viện Tiêu chuẩn Quốc gia Hoa Kỳ (ANSI) chuẩn hóa ngôn ngữ.
BCPL là một ngôn ngữ lập trình hệ thống được thiết kế vào những năm 1960 và được sử
dụng bởi các thành viên của Phòng thí nghiệm Bell trong dự án hệ điều hành Multics. B
là phiên bản rút gọn của BCPL, được thiết kế để chạy trên máy tính nhỏ (PDP) được sử
dụng bởi dự án Unix. Sự khác biệt chính giữa B và C là B được tháo ra trong khi ngôn
ngữ C có các loại và quy tắc type-checking.
Một đặc điểm để phân biệt C với các ngôn ngữ phổ biến khác là xử lý các vị trí bộ nhớ,
mảng và con trỏ. Phần này của C được kế thừa từ BCPL và B.
Mảng và con trỏ trong C
Trong C, con trỏ và mảng được khai báo khác nhau, như thể con trỏ và mảng là các loại
giá trị khác nhau. Ví dụ: đoạn mã sau khai báo một con trỏ p đến một vị trí nguyên và
một mảng A gồm các số nguyên:
int * p;
int A [5];
Trong hầu hết các ngôn ngữ, có một số thao tác để hủy bỏ con trỏ. Dereferences là hoạt
động trả về vị trí được trỏ bởi con trỏ. Trong hầu hết các ngôn ngữ có mảng, có một hoạt
động lập chỉ mục có thể được sử dụng để tìm một trong các vị trí trong mảng.
Mỗi khi một định danh của kiểu mảng xuất hiện trong một biểu thức, nó được chuyển đổi
thành một con trỏ thành thành viên đầu tiên của mảng .... Theo định nghĩa, toán tử đăng
ký [] được hiểu theo cách mà
"E1 [E2]" giống hệt với "* ((E1) + (E2))." Do các quy tắc chuyển đổi áp dụng cho +, nếu
E1 là một mảng và E2 là một số nguyên, thì E1 [E2] đề cập đến thành viên thứ 2 của E1.
Không có ngôn ngữ lập trình nào khác được sử dụng rộng rãi cho phép số học con trỏ
theo cách này.
Bài phê bình
Mặc dù một số lập trình viên C thích khả năng viết và biên dịch chương trình với lỗi kiểu
dữ liệu nhưng hầu hết các lập trình viên C cuối cùng đã xem xét việc kiểm tra kiểu yếu
của nhiều trình biên dịch C là một bất lợi. Trong thực tế, một trong những lợi thế được
trích dẫn phổ biến nhất của C ++ so với C là thực tế là C ++ cung cấp kiểm tra kiểu dữ
liệu tốt hơn.
Như Dennis Ritchie đã nói trong Sự phát triển của ngôn ngữ C (hội thảo về ngôn ngữ lập
trình thứ hai của ACM, ACM 1993), "C là kỳ quặc, thiếu sót và thành công to lớn". Mặc
dù tai nạn lịch sử chắc chắn đã giúp ích, C rõ ràng đã thỏa mãn nhu cầu về ngôn ngữ thực
hiện hệ thống đủ hiệu quả để thay thế ngôn ngữ lắp ráp, nhưng đủ trừu tượng và trôi chảy
để mô tả các thuật toán và tương tác trong nhiều môi trường khác nhau.

You might also like