Tải bản đầy đủ (.pdf) (65 trang)

Giáo trình Lý thuyết ngôn ngữ lập trình (Nghề Lập trình máy tính): Phần 1 - Tổng cục dạy nghề

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (623.28 KB, 65 trang )

BỘ LAO ĐỘNG - THƯƠNG BINH VÀ XÃ HỘI
TỔNG CỤC DẠY NGHỀ
Dự án giáo dục kỹ thuật và dạy nghề (VTEP)



GIÁO TRÌNH
Mơ đun: LÝ THUYẾT NGƠN NGỮ LẬP TRÌNH
Mã số: ITPRG06
NGHỀ: LẬP TRÌNH MÁY TÍNH
Trình độ : Cao đẳng nghề

NĂM 2012


Tuyên bố bản quyền :
Tài liệu này thuộc loại sách giáo trình
Cho nên các nguồn thơng tin có thể được
phép dùng nguyên bản hoặc trích dùng cho
các mục đích về đào tạo và tham khảo .
Mọi mục đích khác có ý đồ lệch lạc hoặc
sử dụng với mục đích kinh doanh thiếu lành
mạnh sẽ bị nghiêm cấm.
Tổng Cục Dạy nghề sẽ làm mọi cách để bảo
vệ bản quyền của mình.
Tổng Cục Dạy Nghề cám ơn và hoan
nghênh các thông tin giúp cho việc tu sửa
và hoàn thiện tốt hơn tàI liệu này.

Địa chỉ liên hệ:
Dự án giáo dục kỹ thuật và nghề nghiệp


Tiểu Ban Phát triển Chương trình Học liệu
………………………………………………
................................................................

2


LỜI TỰA
Đây là tài liệu được xây dựng theo chương trình của dự án giáo dục kỹ thuật và dạy
nghề, để có đươc giáo trình này dự án đã tiến hành theo hai giai đoạn.
Giai đoạn 1 : Xây dựng chương trình theo phương pháp DACUM, kết quả của gian
đoạn này là bộ khung chương trình gồm 230 trang cấp độ 2 và 170 trang cấp độ 3.
Giai đoạn 2 : 29 giáo trình và 29 tài liệu hướng dẫn giáo viên cho nghề lập trình máy
tính 2 cấp độ.
Để có được khung chương trình chúng tơi đã mời các giáo viên, các chuyên gia đang
làm việc trong lĩnh vực cơng nghệ thơng tin cùng xây dựng chương trình.
Trong giai đoạn viết giáo trình chúng tơi cũng đã có những sự điều chỉnh để giáo
trình có tính thiết thực và phù hợp hơn với sự phát triển của lĩnh vực cơng nghệ thơng tin.
Trong q trình biên soạn, mặc dù đã cố gắng tham khảo nhiều tài liệu và giáo trình
khác nhưng tác giả khơng khỏi tránh được những thiếu sót và hạn chế. Tác giả chân thành
mong đợi những nhận xét, đánh giá và góp ý để cuốn giáo trình ngày một hồn thiện hơn.
Tài liệu này được thiết kế theo từng mô đun/ môn học thuộc hệ thống mơ đun/mơn
học của một chương trình, để đào tạo hồn chỉnh nghề Lập trình máy tính ở cấp trình độ
lành nghề và được dùng làm Giáo trình cho học viên trong các khố đào tạo, cũng có thể
được sử dụng cho đào tạo ngắn hạn hoặc cho các công nhân kỹ thuật, các nhà quản lý và
người sử dụng nhân lực tham khảo.
Đây là tài liệu thử nghiệm sẽ được hồn chỉnh để trở thành giáo trình chính thức
trong hệ thống dạy nghề.

3



MỤC LỤC
ĐỀ MỤC

TRANG

01. LỜI TỰA

3

02. MỤC LỤC

4

03. GIỚI THIỆU VỀ MÔN HỌC

5

04. SƠ ĐỒ MỐI LIÊN HỆ GIỮA CÁC MÔ ĐUN VÀ MƠN HỌC TRONG
CHƯƠNG TRÌNH

7

05: U CẦU ĐÁNH GIÁ HỒN THÀNH MƠN HỌC

8

06: BÀI 01: GIỚI THIỆU TỔNG QUAN VỀ NGƠN NGỮ LẬP TRÌNH


9

07: BÀI 02: CÁC LOẠI DỮ LIỆU CUẤ TRÚC

24

08: BÀI 03: HÀM THỦ TỤC

61

09: BÀI 04: ĐẶC TRƯNG CÚ PHÁP VÀ NGỮ NGHĨA TRƯƠNG TRÌNH

74

10: BÀI 05: ĐẶC TRƯNG LẬP TRÌNH CÂU LỆNH(LẬP TRÌNH THỦ TỤC)

85

11: BÀI 06: LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG

95

12: BÀI 07: LẬP TRÌNH LOGIC VÀ LẬP TRÌNH HÀM

103

13: BÀI 08: LẬP TRÌNH SONG SONG

118


14: BÀI 09: CÁC PHƯƠNG PHÁP NGÔN NGỮ LẬP TRÌNH KHÁC

120

15: BÀI 10: PHÂN TÍCH CÚ PHÁP VÀ TRƯƠNG TRÌNH DỊCH

125

16.THUẬT NGỮ CHUYÊN NGÀNH

137

17.TÀI LIỆU THAM KHẢO

140

4


GIỚI THIỆU VỀ MƠN HỌC
Vị trí, ý nghĩa, vai trị môn học 
Trong lĩnh vực công nghệ thông tin, không thể khơng nói đến các ngụn ngữ lập trỡnh. Bởi
vỡ, chỳng là cụng cụ cần thiết giỳp cho chỳng ta làm việc và giao tiếp với mỏy tớnh điện tử.
Vỡ vậy, việc nắm được các khái niệm cơ bản của các ngôn ngữ lập trỡnh là rất cần thiết đối
với những ai làm việc trong lĩnh vực cụng nghệ thụng tin hoặc cỏc lĩnh vực cú ứng dụng
cụng nghệ thụng tin.
Mục tiêu của môn học
Sau khi học xong môn học này học viên có khả năng:
Nắm được các khái niệm cơ bản của ngôn ngữ lập trỡnh chung, hiểu được các thành phần
của một ngôn ngữ lập trỡnh, biết phõn biệt cỏc đặc trưng khác nhau của các ngôn ngữ lập

trỡnh, nắm rừ cấu trỳc, quy trỡnh thực hiện của một ngụn ngữ lập trỡnh, nắm được xu
hướng phát triển của các ngôn ngữ lập trỡnh hiện đại và biết cách lựa chọn ngơn ngữ thích
hợp để viết chương trỡnh ứng dụng cụ thể.
Mục tiêu thực hiện của môn học
Học xong mơn học này học viên có khả năng:
Phân tích một bài tốn thành các thành phần cấu trúc chương trình


Phân tích chương trình nguồn thành các ứng dụng của kỹ thuật lập trình để giải
quyết các bài tốn ứng dụng



Đánh giá chất lượng của một chương trình.



Lựa chọn ngơn ngữ thích hợp cho lập trình ứng dụng



Mơ tả cấu trúc dữ liệu cho bài toán



Xây dựng các thủ tục, hàm thực hiện các chức năng trên các ngôn ngữ lập trình



Hiểu rõ các ngun nhân sai sót khi biên tập chương trình, dịch và thực hiện chương

trình.

Nội dung chính của mơn học


Lịch sử của ngơn ngữ lập trình



Giới thiệu tổng quan về Ngơn ngữ lập trình



Các loại dữ liệu cấu trúc



Hàm và thủ tục



Đặc trưng cú pháp chương trình



Đặc trưng ngữ nghĩa chương trình



Đặc trưng lập trình câu lệnh




Đặc trưng lập trình hướng đối tượng



Ngơn ngữ lập trình hướng đối tượng



Đặc trưng lập trình logic



Đặc trưng lập trình Hàm

5




Đặc trưng lập trình song song Logic có ký hiệu hàm



Các phương pháp lập trình khác




Vấn đề dịch ngơn ngữ



Dịch ngơn ngữ cấp cao



Lập trình di động (Mobile Code)

6


SƠ ĐỒ MỐI LIÊN HỆ GIỮA CÁC MÔ ĐUN VÀ MƠN HỌC TRONG CHƯƠNG TRÌNH
Học kỳ I
Hệ thống
máy tính

Học kỳ II
Giao diện
người máy
Lập trình
căn bản

Học kỳ III
Lập trình
nâng cao

Lập trình hướng
đối tượng


Mạng căn bản
Cấu trúc dữ liệu
và thuật giải

Kỹ năng tin học
văn phịng
Kỹ năng
Giao tiếp

Lập trình
Visual Basic
Mơi trường PT
Phần mềm
Anh văn
cho tin học

Phần cứng
máy tính

Phân tích thiết
kế hệ thống

Thiết kế hướng
đối tượng

Cơ sở dữ liệu
Công nghệ
phần mềm


Kỹ năng

Công nghệ Đa
phương tiện

Lập trình
Web

Ứng dụng CNTT
trong doanh nghiệp

Internet & WWW

Cơ sở tốn học

Học kỳ IV

Thiết kế Web
Quản lý dự án
phần mềm

Hệ cơ sở dữ
liệu

Hướng dẫn đồ
án tốt nghiệp

An toàn
lao động


Thi
tốt nghiệp

Trang

7


U CẦU VỀ ĐÁNH GIÁ HỒN THÀNH MƠN HỌC
Kỹ năng thực hành:
-

Sử dụng thành thạo phần mềm hỗ trợ thiết kế, hiểu được các ngơn ngữ lập trình

-

Lập tài liệu phân tích thiết kế

-

Hiểu được các kiểu dữ liệu và các loại ngơn ngữ lập trình

Thái độ học viên:
-

Cẩn thận lắng nghe ý kiến và thảo luận trong nhóm thiết kế

-

Học viên cần tuân thủ các bài tập thực hành theo thứ tự các chương, từ dễ đến khó.


Đánh giá thông qua kiểm tra trắc nghiệm:
-

Dùng phần mềm thi trắc nghiệm.

-

Kiểm tra trắc nghiệm có thể trên giấy hoặc trên máy tính.

-

Xây dựng ngân hàng câu hỏi, học viên sẽ nhận được một bộ để phát sinh ngẫu nhiên và
chất lượng các đề như nhau (trung bình, khá, giỏi, xuất sắc).

-

Thời gian làm bài tuỳ theo số lượng các câu trong đề.

-

Thang điểm 10 chia đều cho các câu.

-

Kết quả đánh giá dựa vào bài làm theo điểm đạt được.

Thực hành: Đánh giá thơng qua khả năng giải hồn thành chương trình (đề kiểm tra) đề ra.
Thang điểm: (đánh giá câu hỏi trắc nghiệm)
0-49


: Khơng đạt

50-69

: Đạt trung bình

70-85

: Đạt khá

86-100

: Đạt Giỏi

8


Bài 1
TÊN BÀI:GIỚI THIỆU TỔNG QUAN VỀ NGÔN NGỮ LẬP TRÌNH
Mã bài : ITPRG3-06.1

Giới thiệu
Trong lĩnh vực cơng nghệ thơng tin, khơng thể khơng nói đến các ngơn ngữ lập trình.
Bởi vì, chúng là cơng cụ cần thiết giúp cho chúng ta làm việc và giao tiếp với máy tính điện
tử. Vì vậy, việc nắm được các khái niệm cơ bản của các ngơn ngữ lập trình là rất cần thiết
đối với những ai làm việc trong lĩnh vực công nghệ thơng tin hoặc các lĩnh vực có ứng dụng
cơng nghệ thông tin.
Mục tiêu thực hiện
-


Nắm được các khái niệm cơ bản về ngơn ngữ lập trình

-

Hiểu được lịch sử phát triển của ngơn ngữ lập trình

-

Đánh giá sơ bộ về một ngơn ngữ lập trình

-

Xác định lĩnh vực ứng dụng của ngơn ngữ lập trình

Nội dung chính
Giới thiệu lịch sử phát triến của ngơn ngữ lập trình và các khái niệm của chúng. Chỉ ra
các yếu tố ảnh hưởng đến sự phát triển của ngơn ngữ lập trình và các lĩnh vực ứng dụng
của ngơn ngữ lập trình.
I.

Lịch sử phát triển của ngơn ngữ lập trình
Những ngơn ngữ lập trình (programming language) đầu tiên trên máy tính điện tử là

ngơn ngữ máy (machine language), tổ hợp của các con số hệ nhị phân, hay các bit (binary
digit) 0 và 1. Ngơn ngữ máy phụ thuộc vào hồn tồn kiến trúc phần cứng của máy tính và
các quy ước khắt khe của nhà chế tạo. Để giải các bài toán, những người lậ trình phải sử
dụng một tập hợp các lệnh điều khiển rất sơ cấp mà mỗi lệnh là tổ hợp các bit nhị phân nên
gặp rất nhiều khó khăn, mệt nhọc, rất dễ gặp phải sai sót, nhưng rất khó sửa lỗi.
Từ những năm 1950, để giảm nhẹ việc lập trình, người ta đưa vào kỹ thuật chương

trình con (sub-program hay sub-routine) và xây dựng các thư viện chương trình (library) đẻ
khi cần thì gọi đến hoặc dùng lại các đoạn chương trình đã viết.
Như thế, chúng ta nhận thấy ở vào giai đoạn sơ khai ban đầu của máy tính điện tử,
việc sử dụng máy tính là rất khó khăn, vì ngơn ngữ lập trình là phương tiện giao tiếp lại quá
phức tạp đối với người sử dụng. Người sử dụng máy tính vào giai đoạn này chỉ là các
chuyên gia về tin học. Như thế, ứng dụng của máy tính điện tử vẫn cịn rất hạn chế.
II.

Sự ra đời và thúc đẩy của ngơn ngữ lập trình
Cũng từ những năm 1950, ngôn ngữ hợp dịch, hay hợp ngữ (assembly) ra đời. Trong

hợp ngữ, các mã lệnh và địa chỉ các toán hạng được thay thế bằng các từ gợi nhớ, như
ADD, SUB, JUMP, … tương ứng với các phép toán số học +, -, lệnh chuyển điều khiển, …
9


Do máy tính chỉ hiểu ngơn ngữ máy, các chương trình viết bằng hợp ngữ khơng thể
chạy ngay được mà phải qua giai đoạn hợp dịch (assembler) thành ngôn ngữ máy. Tuy
nhiên, hợp ngữ vẫn còn phụ thuộc nhiều vào phần cứng và xa lạ với ngôn ngữ tự nhiên,
người lập trình vẫn gặp nhiều khó khăn khi giải các bài tốn trên máy tính, đặc biệt là các bài
tốn tương đối lớn.
Năm 1957, hãng IBM đưa ra ngôn ngữ FORTRAN (FORmula TRANslator). Đây là
ngơn ngữ lập trình đầu tiên gần gũi với ngôn ngữ tự nhiên với cách diễn đạt toán học.
FORTRAN cho phép giải quyết nhiều loại bài tốn khoa học, kỹ thuật và sau đó được nhanh
chóng ứng dụng rất rộng rãi cho đến ngày nay với kho tàng thư viện thuật toán rất đồ sộ và
tiện dụng.
Tiếp theo là sự ra đời của các ngôn ngữ ALGOL 60 (ALGOrithmic Language) vào năm
1960, COBOL (Common Business Oriented Language) vào năm 1964, Simula vào năm
1964, …
Theo sự phát triển của máy tính điện tử, các ngơn ngữ lập trình khơng ngừng được cải

tiến và hồn thiện đẻ ngày càng đáp ứng nhu cầu của người sử dụng và làm giảm nhẹ cơng
việc lập trình. Sự phát triển của ngơn ngữ lập trình đã làm xích gần lại “khoảng cách” giữa
người sử dụng và máy tính, nghĩa là máy tính khơng cịn chỉ được sử dụng bởi các chun
gia tin học mà có thể được sử dụng bởi rất nhiều người trong nhiều lĩnh vực khác nhau.
Rất nhiều ngôn ngữ lập trình đã được ra đời trên nền tảng lý thuyết tính tốn và hình
thành nên hai loại ngơn ngữ lập trình: ngơn ngữ bậc thấp và ngơn ngữ bậc cao.
Các ngôn ngữ bậc thấp (low-level language) gồm hợp ngữ và ngôn ngữ máy, thường
được dùng để viết các chương trình điều khiển và kiểm tra thiết bị, …
Các ngôn ngữ bậc cao (high-level language) là phương tiện giúp người làm tin học giải
quyết các vấn đề thực tế đồng thời cũng là nơi mà những thành tựu mới nhất của khoa học
máy tính được đưa vào.
Lĩnh vực nghiên cứu các ngơn ngữ lập trình vừa có tính truyền thống vừa có tính hiện
đại. Ngày nay, với các tiến bộ của khoa học cơng nghệ, người ta đã có thể sử dụng các
cơng cụ hình thức cho phép giảm nhẹ cơng việc xây dựng các hệ thống chương trình từ
phân tích, thiết kế cho đến sử dụng ngơn ngữ lập trình.
Chúng ta có thể có cài nhìn tồn cảnh hơn về lích sử của các ngơn ngữ lập trình qua
hình vẽ dưới đây:

10


Hình 1.Ngơn ngữ lập trình qua hình vẽ
III.

Phân loại các ngơn ngữ lập trình

Cho đến nay có hàng trăm ngơn ngữ lập trình được đề xuất nhưng trên thực tế chỉ có một số
ít ngơn ngữ được sử dụng rộng rãi. Ngồi cách phân loại theo bậc như đã nói ở trên, người
ta cịn phân loại ngơn ngữ lập trình theo phương thức (paradgm), theo mức độ quan trọng,
theo thế hệ, ...

Cách phân loại theo mức hay bậc là dựa trên mức độ trừu tượng so với các yếu tố phần
cứng, chẳng hạn như lệnh (instruction) và cấp phát bộ nhớ (memory allocation) dưới

đây:
Mức

Lệnh

Sử dụng bộ nhớ

Ví dụ

Thấp

Lệnh máy đơn giản

Truy cập và cấp phát trực tiếp

Hợp ngữ

Cao

Biểu thức và điều

Truy cập và cấp phát nhờ các

C, Pascal, Ada

kiện tương minh


phép gán

Máy trừu tượng

Truy cập ẩn và tự động cấp

Rất cao

phát

11

Prolog, Miranda


Những năm gần đây, ngơn ngữ lập trình phát triển theo phương thức lập trình (cịn
được gọi là phong cách hay kiểu lập trình). Một phương thức lập trình có thể được hiểu là
một tập hợp các tính năng trừu tượng đặc trưng cho một lớp ngơn ngữ mà có nhiều người
lập trình thường xuyên sử dụng chúng. Sau đây là sơ đồ minh họa sự phân cấp các phương
thức lập trình:

Phương thức lập trình
Mệnh lệnh

Thủ tục

Hướng
đối tượng

Khai báo


Xử lý
song
song

Logic

Hàm

Cơ sở dữ
liệu

Sau đây là một sốngơn ngữ lập trình quen thuộc liệt kê theo phương thức:


Các ngôn ngữ thủ tục (procedural language) có Fortran (1957), Cobol (1959),
Basic (1965), Pascal (1971), C (1969), Ada (1975), …



Các ngôn ngữ hướng đối tượng (object-oriented language) có Smalltalk (1971),
C++ (1985), Eiffel (1990), Java (1995), C# (2000), …



Các ngơn ngữ hàm (functional language) có Lisp (1958), ML (1973), Scheme
(1975), Caml (1987), Miranda (1982), …




Các ngôn ngữ dựa logic (logic-based language) chủ yếu là ngôn ngữ Prolog
(1972).



Các ngôn ngữ thao tác cơ sở dữ liệu SQL (1980),…



Các ngôn ngữ xử lý song song như Ada, Occam (1982), C-Linda, …

Ngồi ra cịn có một số phương thức lập trình đang được phát triển ứng dụng như:


Lập trình phân bổ (distributed programming).



Lập trình ràng buộc (constraint programming).



Lập trình hướng truy cập (access-oriented programming).



Lập trình theo luồng dữ liệu (dataflow programming).

Việc phân loại các ngơn ngữ lập trình theo mức độ quan trọng là dựa trên cái gì (what) sẽ
thao tác được, hay tính được, so với cách thao tác như thế nào (how). Một ngôn ngữ thể

hiện cái gì sẽ thao tác được mà khơng chỉ ra cách thao tác như thế nào được gọi là ngôn
ngữ định nghĩa (definitional) hay ngôn ngữ khai báo (declarative). Một ngôn ngữ thể hiện
cách thao tác như thế nào mà không chỉ ra cái gì sẽ thao tác được gọi là ngơn ngữ thao tác
(operational) hay khơng khai báo (non-declarative), đó là các ngơn ngữ mệnh lệnh.
Ngồi ra, các ngơn ngữ lập trình cũng được phân chia theo thế hệ như sau:


Thế hệ 1: ngôn ngữ máy



Thế hệ 2: hợp ngữ



Thế hệ 3: ngôn ngữ thủ tục
12


IV.



Thế hệ 4: ngôn ngữ áp dụng hay hàm



Thế hệ 5: ngôn ngữ suy diễn hay dựa logic




Thế hệ 6: mạng nơ-ron (neural networks)

Vai trò và ảnh hưởng của phần cứng đối với ngơn ngữ lập trình
Ngơn ngữ lập trình liên quan chặt chẽ đến kiến trúc máy tính (phần cứng) mà nó chạy

trên đó. Chương trình viết bằng một ngơn ngữ, dù là ngơn ngữ đó thế nào đi nữa thì cũng
phải chuyển sang mã máy để thực thi. Ngơn ngữ máy gắn chặt vào kiến trúc máy tính, vì vậy
hiểu quả thực thi của ngơn ngữ cũng phụ thuộc rất nhiều vào kiến trúc máy tính.
Một kiến trúc máy tính xử lý tuần tự khơng thể thực hiện song song thật sự nhiều phát
biểu trong chương trình, dù cho dạng đặc tả trong ngôn ngữ là xử lý song song. Một kiến
trúc máy tính chỉ cho phép đọc/ghi mỗi lần một từ nhớ không thể bảo đảm việc xử lý đồng
thời cả một đối tượng dữ liệu, dù rằng dạng đặc tả của hầu như tấct cả các ngơn ngữ lập
trình hiện nay là thao tác trên cả một đối tượng dữ liệu.
Kiến trúc may tính cũng ràng buộc q trình thiết kế ngơn ngữ chạy trên máy tính đó.
Ngơn ngữ lập trình càng xa ngơn ngữ máy bao nhiêu thì càng khó thực hiện bấy nhiêu.
Trong trường hợp đó chương trình dich sẽ phức tạp và địi hỏi mơ phỏng nhiều. Q trình
dịch cũng sẽ sinh ra những đaọn mã máy thừa, và do đó khó đạt được hiệu quả cao trong
việc sử dụng phần cứng máy tính.
Kiến trúc của hầu hết máy tính hiện nay là kiến trúc Von Neumann. Kiến trúc Von
Neumann có hai đặc điểm đáng chú ý sau:


Các lệnh được xử lý tuần tựtheo thứ tự sắp xếp trong bộ nhớ. Đặc điểm này thể
hiện rõ ở các ngơn ngữ lập trình thủ tục, trong đó các phát biểu được thực hiện
theo thứ tự sắp xếp trong chương trình. Các quá trình mang bản chất xử lý song
song không thể được thực hiện một cách hiệu quả trên kiến trúc Von Neumann.




Chỉ cho phép đọc/ghi mỗi lần một từ nhớ. Kết quả là đối tượng dữ liệu phải bị
phân nhỏ ra trước khi đọc/ghi đối tượng dữ liệu đó. Q trình xử lý dữ liệu do
vậy bị chậm đi gây nên sự tắc nghẽn trong ”giao thông” các đối tượng dữ liệu.

Giả sử s là một biến chuỗi, phép gán s:= ‘abc’ không làm thay đổi tức thời đối tượng
mà thông qua việc cắt từng kí tự của chuỗi ở vế phải vào s.
Các đối tượng dữ liệu kiểu bản ghi, như trong ngôn ngữ Pascal, không được xuất hiện
như sự xuất hiện của nó với tư cách là một thực thể hồn chỉnh trong chương trình. Chẳng
hạn, phép gán x := y, với x và y là hai biến cùng một kiểu bản ghi, được thực hiện bằng cách
đọc từng thành phần của y và chi vào thành phần tương ứng của x. Bản thân mỗi thành
phần x và y lại tiếp tục bị phân rã trong quá trình đọc/ghi.
Ngay cả việc đọc/ghi đối tượng dữ liệu đơn giản như số nguyên dài hai từ nhớ
(longint) cũng phải được thực hiện hai lần.
Các phương thức lập trình mới như lập trình hàm, lập trình hướng đối tượng, lập trình
logic đang từ bỏ dần dần kiến trúc Von Neumann. Lisp là ngôn ngữ điển hình của họ lập
trình hàm, tuy nhiên các đặc tính hàm ban đàu của Lisp cũng đã bị sửa đổi để có thể cài đặt
hiệu quả trên kiến trúc máy tính cổ điển. Prolog đại diện cho họ ngơn ngữ lập trình logic, là
một cơng cụ đặc tả vấn đề tốt, nhưng hiệu quả của nó chưa được như mong muốn do cách
13


giải quyêt vấn đề trên đặc tả của ngôn ngữ bị hạn chế bởi cơ chế điều khiển của kiến trúc
máy tính hiện thời.
Tóm lại, vì sự ảnh hưởng đáng kể của phần cứng như vừa trình bày đối với ngơn ngữ
lập trình, bước nhảy vọt thật sự trong ngơn ngữ lập trình, với một ngơn ngữ mới thay đổi tận
gốc, chỉ có khi có một kiến trúc máy tính mới bảo đảm cho sự cài đặt hiệu quả của ngơnngữ
mới trên đó.
V.

Các thuộc tính của ngơn ngữ lập trình tốt

Một ngơn ngữ lập trình tốt cần phải thỏa mãn một số yêu cầu cơ bản sau đây: dễ viết,

dễ đọc và tin cậy.
A. Tính dễ viết (writability)
Với tư cách là cơng cụ để viết chương trình, ngơn ngữ lập trình phải dễ sử dụng, tức là
dễ viết.
Ngơn ngữ phải có tính diễn đạt cao. Trường hợp lý tưởng là có ánh xạ từ những suy
nghĩ của người lập trình về vấn đề cần giải quyết và chiến lược giải quyết vấn đề vào ngơn
ngữ. Nó liên quan đến khả năng trừu tượng hóa dữ liệu và điều khiển của ngôn ngữ. Chẳng
hạn, các khiếm khuyết của ngôn ngữ Pascal như khơng có phát biểu nhập xuất cho kiểu liệt
kê hay hàm không thể trả về kết quả kiểu dãy hoặc kiểu bản ghi cũng gây trở ngại cho người
lập trình trong một số trường hợp.
Một ví dụ khác là khai niệm đệ quy. Đệ quy không chỉ là một kỹ thuật để lập trình mà
cịn là cơng cụ để tư duy. Có những vấn đề mà người lập trình khơng nghĩ ra một cách giải
quyết nào khác ngồi cách sử dụng đệ quy. Vì vậy, ngơn ngữ cần cho phép gọi đệ quy các
chương trình con. Tuy nhiên, các ngôn ngữ bậc cao đầu tiên như Fortran, Cobol không cho
phép gọi đệ quy. Muốn thực hiện lời giải đệ quy trên các ngôn ngữ này phải gỡ đệ quy, tức
là chuyển lời giải đệ quy thành lời giải lặp.
Ngôn ngữ phải đơn giản, để dễ học, dễ nhớ và dễ nắm vững. Ngôn ngữ không nên
đưa ra quá nhiều khái niệm làm cho người sử dụng thấy rối rắm. Chẳng hạn, như ngơn ngữ
C có q nhiều tốn tử. Nếu như trong Pascal các toán tử Not, And và Ỏ được dùng chung
cho kiểu dữ liệu logic và kiểu dữ liệu số học thì trong C lại có sự phân biệt: các toán tử !, &&,
|| dùng cho kiểu logic cịn các tốn tử ~, & và | dùng cho kiểu dữ liệu số học. Số lượng toán
tử nhiều, các kí hiệu lại gần giống nhau và khơng gợi nhớ đã làm tăng tính phức tạp của
ngơn ngữ C.
Ngơn ngữ phải linh hoạt, khơng nên q gị bó vào một nguyên tắc nào đó. Chẳng hạn
một trong những nguyên tắc của ngôn ngữ Pascal là: mỗi cấu trúc điều khiển chỉ có một ngõ
vào và một ngõ ra. Nó ngăn cấm sự kết thúc bất thường từ bên trong vịng lặp For và các
vịng lặp có điều kiện như While và Repeat, cũng như không cho nhiều điểm trở về trong
chương trình con. Nguyên tắc này nhằm đảm bảo tính cấu trúc của chương trình nhưng đơi

khi cũng gây trở ngại cho người lập trình. Ngơn ngữ C linh hoạt hơn với các phát biểu Break
và Return. Ví dụ, trong trường hợp sau, phát biểu Return của C tránh được các phát biểu if
lồng nhau:
Bằng C:
p ()
14


{
;
if (<điều kiện 1>) return;
;
if (<điều kiện 2>) return;
;
return;
}
Bằng Pascal:
Procedure p;
Begin
;
if not(<điều kiện 1>) then
begin
;
if not(<điều kiện 2>) then
begin
;
end;
end;
End;
B. Tính dễ đọc (readability)

Yêu cầu về tính dễ đọc của ngơn ngữ xuất phát từ u cầu về tính dễ đọc của chương
trình. Chương trình cần phải dễ đọc vì đọc chương trình là cơng việc thường xun trong
khi viết, bảo trì và phát triển chương trình. Tính dễ đọc càng có ý nghĩa khi người đọc khơng
phải là tác giả của chương trình. Nói một cách lý tưởng, chương trình được gọi là dễ đọc khi
một người bình thường khơng biết gì về ngơn ngữ dùng để viết chương trình, đọc mà vẫn
hiểu được chương trình làm gì.
Ngơn ngữ cần đảm bảo cho cấu trúc chương trình phản ánh được cấu trúc của vấn đề
cần giải quyết. Chương trình cũng như các bộ phận của chương trình cần thể hiện được
chúng làm những gì, trước khi người đọc cần biết những điều đó được thực hiện như thế
nào.
Các cấu trúc điều khiển của ngơn ngữ chỉ nên có một ngõ vào và một ngõ ra để người
đọc có thể theo dõi dễ dàng từng bộ phận của chương trình từ trên xuống dưới. Cũng do
vây ngơn ngữ cần có các cấu trúc điều khiển để thay thế phát biểu goto. Phát biểu goto làm
chương trình trở nên khó đọc, vì người đọc khơng thể đọc chương trình một mạch từ trên
xuống, mà ln phải dị theo các đích của goto.
Việc cho phép dấu gạch ngang dưới trong danh hiệu sẽ làm cho danh hiệu dễ đọc
hơn.
Các từ khóa của ngôn ngữ cũng cần phải gợi nhớ.

15


Ngồi ra, các chú thích trong chương trình là cách thức hữu hiệu để nâng cao tính dễ
đọc của chương trình.
Với các ngơn ngữ lập trình hiện nay, tính dễ đọc của chương trình cịn tùy thuộc vào
việc người đọc có quen thuộc với ngơn ngữ dùng để viét chương trình hay khơng, cũng như
phong cách và phương pháp lập trình của người viết chương trình.
C. Tính tin cậy (reliability)
Tính tin cậy của ngơn ngữ lập trình được đánh giá trên khả năng mà ngơn ngữ có thể
bảo đảm được cho tính tin cậy của chương trình viết bằng ngơn ngữ đó. Khơng có một định

nghĩa rõ ràng cho tính tin cậy của chương trình. Một cách khơng hình thức, chương trình
được xem là tin cậy nếu xác xuất chạy đúng của nó cao trong q trình sử dụng.
Nói chúng để chương trình có độ tin cậy cao, ngơn ngữ cần hạn chế sự xuất hiện của
các lỗi không thể ngờ được. Lỗi đó có thể sinh ra do một cấu trúc ngữ pháp nhiều ngữ
nghĩa. Ví dụ phát biểu sau đây trong Fortran:
Sum (i, j) = i + j
Có hai nghĩa: (1) đó là định nghĩa hàm tổng của hai đối số nguyên, (2) hoặc đó là phép
gán một biểu thức vào dãy biến. Nếu người lập trình quên khai báo biến dãy Sum thì phát
biểu trên sẽ được hiểu theo nghĩa thư nhất, chứ không phải là nghĩa thứ hai như mong
muốn (việc quên khai báo biến trong Fortran là bình thường vì Fortran cho phép sử dụng
biến mà không cần khai báo).
Hiệu ứng lề cũng là nguồn gây ra lỗi. Hiệu ứng lề, theo nghĩa rộng là hiệu ứng phụ
xuất hiện thường ngoài ý muốn, khi sử dụng một cấu trúc ngơn ngữ nào đó của ngơn ngữ.
Ví dụ, trong Pascal hiệu ứng lề nảy sinh do sự thay đổi trị của biến không cục bộ trong các
chương trình con mà biến có ý nghĩa.
Ngơn ngữ cần kiểm tra chặt chẽ sự tương hợp kiểu của các biến trong biểu thức và
phép gán, sự tương hợp của danh sách thơng số của chương trình con ở nơi gọi và nơi định
nghĩa. Lấy ví dụ đơn giản là phép gán một giá trị thực vào biến nguyên. Nếu khơng có sự
kiểm tra kiểu và báo lỗi, mà tự động đổi kiểu thì kết quả sau đó sẽ bị sai lệch đi vì giá trị thực
đã bị cắt hoặc làm tròn phần lẽ để thành giá trị nguyên.
Các bộ phận của chương trình cần có tính độc lập đối với nhau cao, cho phép kiểm tra
riêng rẽ tính đúng đắn từng bộ phận của chương trình. Tính dễ sửa đổi cũng liên quan với
tính tin cậy, vì trong q trình sửa đổi tính tin cậy vần phải được duy trì. Sự độc lập của các
bộ phận của chương trính sẽ làm cho việc sửa đổi dễ dàng hơn; việc sửa đổi ở một bộ phận
sẽ không ảnh hưởng đến các bộ phận cịn lại cảu chương trình.
Tính tin cậy đơi khi lại có thể bị ảnh hưởng bởi tính dễ viết của chương trình. Bởi vì
ngơn ngữ q linh hoạt dễ viết thì có thể khó làm chủ bởi người viết chương trình, có nghĩa
là chương trình dễ xảy ra lỗi hơn.
Cuối cùng, tính tin cậy của ngơn ngữ cịn phụ thuộc vào sự cài đặt ngơn ngữ ấy, tức là
phụ thuộc vào chất lượng của chương trình dịch.

Các lĩnh vực ứng dụng của ngơn ngữ lập trình
Vào những năm 1950, khi máy tính điện tử mới ra đời, ngơn ngữ lập trình chỉ là ngơn
ngữ máy hoặc cao hơn là hợp ngữ. Cho nên, việc xây dựng các ứng dụng tin học là rất
16


phức tạp và khó khăn. Vì thế, vào giai đoạn này ứng dụng của ngơn ngữ lập trình là rất hạn
chế.
Đi đôi với sự phát triển của phần cứng và sự ra đời của rất nhiều ngơn ngữ lập trình
khác nhau, khả năng và lĩnh vực ứng dụng của ngôn ngữ lập trình trở nên rất phong phú.
Dưới đây là một số ngơn ngữ lập trình và lĩnh vực ứng dụng của chúng:


Xây dựng các hệ thống thông tin quản lý trong các lĩnh vực sản xuất, xã hội, kinh
tế, ...: Delphi, Visual Basic, Access, SQL, ...

VI.



Xây dựng các hệ thống phân tán: Java, Corba, C++, ...



Xử lý ảnh và mơ hình hóa hình học: C++, Matlab, ...



Xây dựng các hệ chuyên gia: Prolog




Giải quyết các bài toán trong lĩnh vực trí tuệ nhân tạo: Lisp, Scheme, Prolog, ...



Xây dựng các hệ thống thời gian thực: C, Ada



Xây dựng các hệ thống nhúng, điều khiển thiết bị: C, Assembly, ...

Các lĩnh vực ứng dụng của ngơn ngữ lập trình
Hiện nay, số người quen với máy tính, với việc lập trình ngày một nhiều, PC đã trở nên

phổ biến. Nhu cầu được giao tiếp với thế giới bên trong máy tính khơng chỉ là một sở thích,
hay cơng việc riêng tư của những người làm tin học nữa. Chỉ với vốn tiếng Anh tương đối,
một chút trợ giúp là bạn đã có thể trở thành một nhà lập trình rồi, thế nhưng đó chỉ là các
điều kiện cần mà chưa đủ. Số lượng trình biên dịch, chủng loại, tính năng ngày một phong
phú, để chọn cho mình một ngơn ngữ lập trình, một trình biên dịch phù hợp với cơng việc
chun môn cũng như nhu cầu học tập, nghiên cứu, bạn khơng thể khơng khỏi có những
đắn đo. Những gì sau đây có thể giúp ích cho bạn ?
Để có cho mình một cơng cụ lập trình phù hợp về cả trình độ lẫn nhu cầu, bạn cần xác
định xem bạn sẽ dùng nó để làm gì; tìm hiểu thế giới bên trong máy tính, chỉ để học thêm
một ngơn ngữ lập trình mới nhằm phục vụ cho quá trình học tập, hay đó là một lựa chọn cho
một hướng phát triển phần mềm chuyên nghiệp ? Hơn thế nữa bạn cịn cần phải định
hướng rõ ràng; mơi trường thực hiện sẽ là môi trường phân tán hay môi trường cục bộ ? Có
thể là hơi rắc rối nhưng những suy tính ban đầu này sẽ có ảnh hưởng rất nhiều tới các bước
đi sau này.
Những người có ham muốn tìm hiểu sâu thế giới bên trong máy tính thường lấy hợp

ngữ (Assembly) làm cơng cụ, có thể nói đây là thứ ngôn ngữ đầu tiên tương đối độc lập đối
với các quá trình thực xảy ra trong các bộ vi xử lý. Qua một tập hữu hạn các lệnh được nhận
biết nhờ các từ gợi nhớ sơ đẳng, người lập trình có thể trực tiếp can thiệp vào q trình di
chuyển dữ liệu, sửa đổi dữ liệu, điều khiển thiết bị... Cơng việc cịn lại của trình dịch
Assembler rất ít, phần lớn nhiệm vụ của nó là ánh xạ các lệnh gợi nhớ trong chương trình
nguồn tới một tập cố định các lệnh của bộ vi xử lý, một số thao tác xử lý macro.
Để có được một chương trình hồn chỉnh, người lập trình sẽ phải tìm hiểu thấu đáo
tập lệnh, vì số lệnh, các chi tiết kỹ thuật cho tập lệnh có thể rất khác nhau giữa các bộ vi xử
lý; định hình rõ ràng trình tự các thao tác; khả năng mà trình dịch có thể làm được; và nhất là
xác định mức độ cần thiết của các thủ thuật lập trình. Chẳng hạn, trong khi các bộ vi xử lý
17


dòng Intel (x86 phổ dụng trong các máy PC) thường có khoảng 8 thanh ghi đa năng, 6 thanh
ghi đoạn, một thanh ghi con trỏ lệnh, cờ... thì các bộ vi xử lý dòng Motorola (MC680x0 phổ
dụng trong các máy MacIntosh, các máy trạm của Sun, trong các hệ thống máy tính nhiều
bộ vi xử lý, và trong rất nhiều máy PC) thì lại có tới khoảng 8 thanh ghi dữ liệu 80 bit, khoảng
ngần ấy số thanh ghi địa chỉ cùng hàng tá thanh ghi với rất nhiều công dụng khác nhau, chế
độ làm việc khác nhau.
Chính vì tính chỉ định phần cứng cao như vậy mà hiệu quả làm việc của một người
thông qua hợp ngữ phụ thuộc rất nhiều vào kinh nghiệm làm việc, theo đó các chương trình
này rất khó bảo trì, khó kiểm sốt khi số thao tác của chương trình tăng, và đơi khi cịn khó
hiểu đối với chính người viết ra nó nếu khơng có các văn bản bảo trì được ghi chép cẩn
thận. Nhưng bù lại, các chương trình thực hiện bằng hợp ngữ nói chung thường có kích
thước rất khiêm tốn, chạy nhanh nhất tính trên cùng một trình tự thao tác cụ thể so với các
ngôn ngữ khác.
Basic vốn là một ngơn ngữ phi cấu trúc, nó được phát triển để giúp người lập trình đỡ
phần vất vả khi làm việc trên các bộ vi xử lý khác nhau. Với nó, người lập trình khơng phải lo
lắng nhiều về sự khác nhau trong chi tiết kỹ thuật của từng bộ vi xử lý cụ thể, họ chỉ cần bận
tâm tới việc cấu trúc sao cho chương trình của họ được tối ưu. Để có được tính khả chuyển

trên nhiều loại vi xử lý, các chương trình Basic cần có một chương trình thơng dịch để kích
hoạt, trình thơng dịch này có nhiệm vụ ánh xạ mã đầu ra của trình dịch Basic vào tập lệnh cụ
thể của bộ vi xử lý khi chạy chương trình. Người ta đã từng đưa trình thơng dịch này vào
trong phần cứng, lưu trữ lâu dài trong các bộ nhớ chỉ đọc (ROM), và cung cấp các khả năng
tương tác tương đối thuận tiện, giúp người lập trình thiết kế và gỡ rối nhanh chóng các
chương trình Basic.
Ngày nay, Basic đã được cải tiến nhiều, về cả trình dịch lẫn bản thân ngơn ngữ, các
ứng dụng của Microsoft thường dùng Basic như một công cụ để người sử dụng tuỳ biến
chúng theo nhu cầu. Vì chạy thông dịch cho nên các ứng dụng viết bằng Basic chạy khơng
nhanh, nhưng vì tính phổ cập, rất nhiều nhà phát triển cơng cụ vẫn hỗ trợ nó. Sản phẩm hỗ
trợ Basic ở mức cao được nói đến ở đây là Visual Basic của Microsoft. Đây là một công cụ
phát triển được Công ty này rất ưu ái, hiện nó đang được ưu chuộng trong lĩnh vực phát
triển ứng dụng trên Windows. Visual Basic được hỗ trợ rất nhiều khả năng về cơ sở dữ liệu,
các kỹ thuật phát triển phần mềm mới như OLE, COM, DCOM...
Nếu như bạn chưa có ý định trở thành nhà phát triển phần mềm ứng dụng thì cũng
nên biết tới Basic, bởi vì hầu hết các ứng dụng lớn ngày này như Notes, bao gồm cả các
phần mềm xử lý bảng tính, văn bản của Mirosoft đều có sử dụng macro lệnh được thiết kế
dựa trên Basic, cho phép người sử dụng sửa đổi, bổ sung các tính năng mới theo nhu cầu.
Ngồi ra cịn phải nói tới Pascal, có thể nói đây là thứ ngơn ngữ vỡ lịng cho hầu hết
những người bắt đầu tiếp xúc với máy tính. Nó được biết tới khơng chỉ vì là một trong số các
ngơn ngữ cấu trúc ra đời đầu tiên trên thế giới, mà cịn là vì tính dễ đọc, dễ tiếp cận của nó.
Nếu bạn biết tiếng Anh, khơng nhất thiết phải biết về tin học, khi đọc một chương trình viết
trong ngơn ngữ này bạn sẽ thấy ngay về cơ bản nó đang nói về một q trình làm việc nào
đó.
18


Với thứ ngơn ngữ này, người lập trình khỏi phải đau đầu vì phải tổ chức lấy chương
trình, thay vào đó họ sẽ dùng các câu lệnh tiếng Anh rất dễ nhớ, dễ sử dụng. Việc xây dựng
một chương trình rất giống với việc mơ phỏng một q trình hoạt động, có đầu ra đầu vào,

mã nguồn của một chương trình như thế rất dễ đọc, dễ sửa đổi. Tất nhiên, trình dịch sẽ phải
làm việc vất vả hơn bởi nó phải phân giải cả một dãy lệnh vốn chỉ dễ hiểu đối với con người
nhưng lại... không thể hiểu nổi đối với các bộ vi xử lý. Hầu hết các ngơn ngữ lập trình cấu
trúc (tất nhiên trong đó có Pascal) đều lấy việc dịch sang hợp ngữ làm một bước trung gian,
theo đó các cấu trúc lệnh if...then, case...of, v.v. được chuyển thành các khối mã nguồn
Assembly. Tóm lại, việc cấu trúc chi tiết cho một chương trình cụ thể được thực hiện tự
động bởi trình dịch, lúc này các thủ thuật lập trình Assembly của người lập trình khơng cịn
có thể áp dụng vào đây, đơi khi nó cịn máy móc làm phình to mã cho dù đã sử dụng tới cả
chục thuật toán tối ưu.
Hầu hết các cơng cụ phát triển có hỗ trợ Pascal ngày nay đều đưa ra các khả năng kết
nối mới cho nó, mã trình có thể được viết riêng rẽ trên nhiều tệp rồi kết nối, hoặc được nạp
từ thư viện động... nhưng nói chung, đây là ngơn ngữ chỉ phù hợp với các ứng dụng nhỏ và
trung bình, phổ dụng trong lĩnh vực đào tạo. Nếu bạn là người mới tiếp xúc với máy tính,
muốn tìm hiểu cách hoạt động của một chương trình thì bạn hãy chọn ngơn ngữ này.
Delphi của Borland chỉ là một công cụ phát triển ứng dụng, nó được xây dựng bằng lõi
Pascal. Với cơng cụ này, sau một vài tiếng đồng hồ đọc help, nhất là có ai đó hướng dẫn đơi
chút, bạn hồn tồn có thể tự viết cho mình các ứng dụng đơn giản như trình xem tệp .AVI,
nghe nhạc, các thao tác tính tốn, lưu trữ đơn giản... Nó tỏ ra rất thích hợp với những bạn
thích khám phá nhưng khơng muốn tốn quá nhiều thời gian nghiền ngẫm.
Ngôn ngữ C là ngơn ngữ lập trình cấu trúc như Pascal và là thứ công cụ mạnh đã từng
được sử dụng để thiết kế hầu hết các hệ điều hành trên thế giới. Các hệ điều hành như
UNIX, AMOEBA... đều thực thi bằng C, và nói chung đây là thứ ngơn ngữ có tính khả
chuyển tương đối cao cho nên các hệ điều hành này có thể chạy trên rất nhiều phần cứng
khác nhau, ngay cả với WINDOWS cũng vậy, rất nhiều module của nó cũng được xây dựng
bằng C.
C++ là một bước phát triển tiếp theo của C trong xu thế 'đối tượng hố' ngơn ngữ, nói
như vậy là bởi hầu hết các trình dịch C++ đều lấy C làm nền cho tất cả các định hướng
nhằm tận dụng các ưu thế mà mơ hình thiết kế hướng đối tượng mang lại. Vốn dĩ C vẫn
chưa được chuẩn hoá mặc cho rất nhiều cố gắng đã được đưa ra, các trình dịch C++ lại
càng khó tìm được tiếng nói chung. Các nhà cung cấp trình dịch C đều muốn rằng sản phẩm

của họ được các nhà phát triển công cụ ưa dùng, thế nhưng các nhà cung cấp công cụ phát
triển lại muốn các trình dịch hướng theo mơ hình thiết kế vốn mn hình mn vẻ mà họ
đưa ra. Cứ như thế, C++ phát triển trong sự thiếu nhất quán, hệ thống từ khố khơng được
hỗ trợ đầy đủ, đơi khi khơng thống nhất, cách cấu trúc chương trình cũng khơng giống nhau
mặc dù chúng giống nhau về mơ hình.
Ngày nay, hầu hết các công cụ phát triển hệ thống mạnh như Visual C++, C++Builder,
Visual Age... đều hỗ trợ song song cả C lẫn C++. Nói chung đây là các công cụ mạnh, thể
hiện được ưu thế của chúng trong từng mơi trường phát triển cụ thể; ví dụ Visual C++ thích
19


hợp với những người muốn phát triển các ứng dụng nhất là các ứng dụng gắn với Windows,
C++Builder thân thiện ngay cả với những người không nhiều kinh nghiệm trong lĩnh vực lập
trình, ... Để tìm cho mình một trình dịch C++ phù hợp hãy lựa chọn; chẳng hạn, nếu bạn cần
hướng theo việc xây dựng các ứng dụng phục vụ, có liên quan tới các dịch vụ chuẩn của
Windows, khơng nhất thiết phải có màn hình giao tiếp phức tạp, hoặc cần có các ứng dụng
can thiệp sâu vào hệ thống... bạn hãy lựa chọn Visual C++. Công cụ này đưa ra khá nhiều
mẫu (wizard), theo khung định sẵn đó bạn chỉ cần thực thi các chi tiết là đã có một ứng dụng
hồn chỉnh rồi. Cịn nếu bạn không đủ thời gian cần thiết để nghiền ngẫm cả đống các văn
bản công bố từ Microsoft, mà lại muốn có các ứng dụng mang tính bề mặt, nhanh, đầy tính
tương tác, bạn hãy sử dụng C++Builder hay một số sản phẩm tương tự từ IBM, Symantec...
Java là ngôn ngữ thế hệ mới, thế hệ năm, nó kế thừa hầu hết những 'tư chất' tốt đẹp
của các bậc tiền bối, hướng đối tượng từ mơ hình thiết kế tới mơ hình thực thi, hỗ trợ đa
luồng một cách rất tinh tế, độ tin cậy cao, tính khả chuyển tuyệt vời... Java nay khơng cịn là
một cơn sốt bình thường, nó là một xu thế song song tồn tại với các mơ hình lập trình hiện
có, ngày càng nhiều lĩnh vực mà nó có mặt. Ban đầu, mục tiêu của các nhà thiết kế của
ngôn ngữ này là "Web đi tới đâu, Java đi tới đó", nay thì sao, nó đang len lỏi vào cả các hệ
thống đầy tính thương mại như các hệ quản trị dữ liệu của ORACLE, rồi cả các hệ thống
phục vụ cực lớn... Với phiên bản 2, từ tên ấn bản JDK được đổi thành SDK, Sun dần lộ rõ
những ham muốn rất lớn lao trong việc đưa Java vào đời sống tin học của mọi người trên

thế giới.
Java là ngôn ngữ mạnh, về cả mô hình thiết kế lẫn tính năng. Nếu bạn muốn thiết kế
các trang Web sống động, bạn hãy chọn nó, một khối mã .CLASS vài KB có thể làm được
nhiều điều hơn cả 100KB ảnh, nó là giải pháp cho một đường truyền tốc độ thấp. Nếu bạn
muốn thiết kế các chương trình phân tán, Java là một lựa chọn tốt, nó có một lượng thư viện
mạng được tổ chức hợp lý, thân thiện với người lập trình. Với nó bạn có thể tự thiết kế lấy
các giao thức (ngay cả các giao thức lạ lẫm chưa từng được nhắc tới trong RFC), các ứng
dụng phục vụ, và các ứng dụng sử dụng dịch vụ... mà khơng địi hỏi mất q nhiều thời gian
tìm hiểu hệ thống, tìm kiếm các cơng bố kỹ thuật. Nếu bạn cần viết các ứng dụng mà mã của
chúng có thể được sử dụng lại một cách linh hoạt, trên nhiều loại phần cứng, tốn ít thời gian
bảo trì...và hợp 'thời' nhất, bạn cũng nên chọn Java. Với các ngôn ngữ khác, việc sử dụng
lại mã rất khó, ví dụ bạn đã có một tệp .dll, cùng với hàng tá chi tiết kỹ thuật kèm theo bạn
cũng rất khó sử dụng lượng thư viện có trong đó, đấy là chưa tính tới việc mã thư viện động
này chỉ có thể sử dụng được trên các hệ thống Windows. Với Java thì lại khác, mơ hình thiết
kế của nó cho phép mã của mỗi lớp được gói trong một tệp .CLASS riêng, được kiểm sốt
trong khơng gian tên bởi hệ thống chạy Java, và được nạp một cách tường minh mỗi khi
chương trình cần tới các hành vi của chúng. Có thể xem mơi trường chạy Java lúc này là
một cái giỏ táo, mỗi quả táo là một đối tượng, vết kích hoạt của một chương trình Java rất
giống như lối của các con sâu, đục xuyên từ quả này sang quả khác... ứng với một con sâu,
chương trình có một luồng kích hoạt, nhiều con sâu ứng với một chương trình Java đa luồng
(multithread).

20


Mơi trường kích hoạt Java có xu hướng phân tán, các đối tượng kích hoạt có thể
khơng cùng nằm trên một máy duy nhất, theo đó nó có thể nằm rảI rác đâu đó trên mạng,
chúng 'liên kết' với nhau để hình thành một chương trình thơng qua mạng... Thế nhưng, khi
các ưu thế trên khơng có trong định hướng của bạn về một cơng cụ lập trình, bạn đừng nên
sử dụng nó. Thứ nhất, Java chạy thơng dịch, tốc độ chậm dù đã được cải thiện nhờ cơ chế

dịch JIT (một cơ chế nhận biết để ánh xạ một cách thông minh khối mã đầu vào cần thông
dịch và khối mã đầu ra cần kích hoạt nhằm tiết kiệm thời gian dịch), và dù có mong đợi thế
nào thì Java vẫn sẽ chạy thông dịch. Thứ hai, bản thân ngơn ngữ này đang trong thời gian
hồn thiện; hồn thiện về hệ thống từ khố, hồn thiện về cách tổ chức máy ảo, hồn thiện
về thư viện...
Có rất nhiều loại ngơn ngữ lập trình :Java,C#,VB.Net,PHP,ASP....
Java thì lập trình cho các thiết bị di động nhiều hơn.
Lập trình web thì có thể dùng Java hoặc PHP
Bạn có thể thiết kế web bằng ASP.NET, viết bằng ngơn ngữ C#, hoặc VB.NET
Ngồi ra cịn có cơng nghệ .NET của Microsoft, hỗ trợ rất nhiều ngơn ngữ
Về lập trình phần mềm thì có rất nhiều ngôn ngữ thông dụng tùy theo loại phần mềm
nào :
- Phần mềm quản lý chạy trên windows : Visual Basic 6.0, Visual Basic.NET , Visual
C#...
- Web : ASP, ASP.NET, PHP, JSP, CGI, Perl...
- Phần mềm mạng : Java, Visual C++
- Lập trình hệ thống : C/C++
- Trí tuệ nhân tạo : Prolog
ngồi ra cịn nhiều ngơn ngữ khác nữa phục vụ cho nhiều mục đích khác nhau...
VII.

Chuẩn hố ngơn ngữ lập trình
Là việc chọn lọc một ngơn ngữ theo một chuẩn ngơn ngữ nhất định nào đó phù hợp

để có thể phát triển và ứng dụng rộng rãi trong các cơng việc
Khi việc chuẩn hố ngơn ngữ hồn thành thì nó sẽ trở thành một ngơn ngữ tiêu chuẩn trên
toàn thế giới với các mức khác nhau của tiêu chuẩn
VIII.

Các vấn đề nảy sinh từ sử dụng ngôn ngữ lập trình

Mỗi ngơn ngữ, do hạn chế của mơi trường và bản thân ngôn ngữ cũng như do mục

tiêu sử dụng, có thể có một số luật cấm mà người lập trình khơng thể vi phạm. Những luật
cấm này có thể có những cách xử lý khác nhau như là:
Nhiều ngôn ngữ cho phép dùng các câu lệnh đặc biệt để lập trình viên có tồn quyền xử lý
lỗi và thường được gọi là ngoại lệ (hay exception). Những ngoại lệ này nếu khơng xử lý
đúng mức sẽ có thể gây ra những sai sót trong thời gian thi hành hay ngay cả trong thời gian
dịch. Dĩ nhiên, người viết mã có thể tùy theo tình huống mà viết các câu lệnh rẽ nhánh tránh
không để cho mã vi phạm các lỗi. Hay là dùng các câu lệnh xử lý các ngoại lệ này.
Một số ngôn ngữ không cung cấp khả năng xử lý ngoại lệ thì người viết mã buộc
phải tự mình phán đốn hết các tình huống có thể vi phạm lỗi và dùng câu lệnh điều kiện để
loại trừ.
21


Các loại lỗi về ngơn ngữ khi lập trình thường xảy ra là :
Lỗi cú pháp
Vi phạm khi đặt hay gọi tên biến và hàm: Lỗi loại này thường rất dễ tìm ra trong lúc phát
triển mã. Thường người ta có thể đọc lại các bảng tham chiếu về ngơn ngữ để tránh sai cú
pháp mẫu (prototype) của hàm hay tránh dùng các ký tự đặc biệt bị cấm không cho dùng
trong khi đặt tên. Trong khơng ít trường hợp người lập trình có thể đã định nghĩa cùng một
tên cho nhiều hơn một đối tượng khác nhau và lại có giá trị tồn cục. Trong nhiều trường
hợp chúng tạo thành lỗi ý nghĩa.
Lỗi chính tả: người viết mã có thể viết hay gọi sai tên hàm, tên biến. Trong nhiều ngơn
ngữ có kiểu tĩnh thì các lỗi này sẽ rất dễ bị phát hiện. Cịn đối với ngơn ngữ có kiểu động
hay có kiểu yếu thì nó có thể dẫn đến sai sót nghiêm trọng vì bản thân phần mềm dịch
khơng hề phát hiện ra.
Vượt q khả năng tính tốn: Bản thân máy tính và hệ điều hành cũng có rất nhiều giới
hạn về phần cứng, phần mềm và các đặc diểm chuyên biệt. Khi người lập trình yêu cầu máy
làm quá khả năng sẽ gây ra các lỗi mà đôi khi không xác định được như

Lỗi thời gian (timing error) thường thấy trong các hệ thống đa luồng hay đa nhiệm.
Lỗi chia cho 0: Bản thân phần cứng máy tính sẽ ở trạng thái bất định khi thực hiện phép
chia cho 0; trong nhiều trường hợp, mã sau khi dịch mới phát hiện ra trong lúc thi hành và
được đặt tên là lỗi division by 0.
Dùng hay gọi tới các địa chỉ hay các thiết bị mà bản thân máy hay hệ điều hành đang
thực thi lại không có hay khơng thể đạt tới. Đây là trường hợp rất khó lường. Bởi vì thường
ngưịi lập trình có thể viết mã trên một máy nhưng lại cho thi hành trong các máy khác và
các máy này lại không thỏa mãn các yêu cầu. Để giảm trừ các lỗi loại này thường người lập
trình nên xác định trước các điều kiện mà phần mềm làm ra sẽ hỗ trợ.
Thí dụ: trong nhiều phần mềm ngày nay ở trong vỏ hộp đều được ghi rõ các yêu cầu về
vận tốc, bộ nhớ tối thiểu, và quan trọng là hệ điều hành nào mà phần mềm đó hỗ trợ.
Gán sai dữ liệu: Tức là dùng một dữ liệu có kiểu khác với kiểu của biến để gán cho biến
đó một cách khơng chủ ý. Đối với các ngơn ngữ tĩnh hay có kiểu mạnh thì lỗi này dể tìm thấy
hơn. Cịn những ngơn ngữ động hay ngơn ngữ có kiểu yếu thì lỗi tạo ra sẽ có thể khó phát
hiện và thường xảy ra lúc thi hành.
Các lỗi biên: Lỗi biên thường xảy ra khi người viết mã không chú ý đến các giá trị ở biên
của các biến, các hàm. Những lỗi để thấy có thể là:
Gán giá trị của một số (hay một chuỗi) lên một biến mà nó vượt ngồi sự cho phép của
định nghĩa.
Thí dụ: Gán một giá trị lớn hơn 255 cho một biến có kiểu là short trong ngôn ngữ C
Tạo nên các lỗi khi biến chạy trong vịng lặp đạt giá trị ở biên.
Thí dụ: đoạn mã C/C++ sau đây sẽ gây ra lỗi biên -- Chia cho 0
for (m=10; m >= 0, m--) {
x= 8+ 2/m; }

22


Lỗi ý nghĩa
Lỗi về quản lý bộ nhớ. Trong nhiều loại ngơn ngữ người lập trình có thể xin đăng ký

một lượng nào đó của bộ nhớ để dùng làm chỗ chứa giá trị cho một biến (một hàm hay một
đối tượng). Thường thì sau khi dùng xong người viết mã phải có phần lệnh trả về các phần
bộ nhớ mà nó đã đăng ký dùng. Nếu khơng, sự trả về này chỉ xảy ra ở giai đoạn kết thúc
việc thi hành. Trong nhiều trường hợp, số lượng bộ nhớ xin đăng ký quá nhiều và không
được dùng đúng chỗ có thể làm cho máy kiệt quệ về mặt tài nguyên bộ nhớ và gây ra treo
máy. Điển hình nhất là việc xin đăng ký các phần của bộ nhớ trong các vòng lặp lớn để gán
cho các đối tượng bên trong vịng lặp nhưng khơng trả về sau khi xử dụng. Người ta thường
gọi lỗi kiểu này là lỗi rị rỉ bộ nhớ (memory leaking).
Sai sót trong thuật tốn: Trước khi viết một chương trình, để giảm thiểu sai sót về
mặt lập luận thì người ta có nhiều biện pháp để làm giảm lỗi trong đó có các phương pháp
vẽ lưu đồ, vẽ sơ đồ khối, hay viết mã giả. Những biện pháp này nhằm tạo nên các thuật toán
để giải quyết vấn đề. Tuy nhiên, một thuật toán không chặt chẽ, xử lý không rốt ráo mọi
trường hợp có thể xảy ra, khơng dự đốn được sự thay đổi trong lúc thi hành thì có thể tạo
nên các lỗi và các lỗi này thường khó thấy bởi vì nó chỉ xảy ra ở những chỗ, những thời
điểm mà người lập trình khơng ngờ trước. Một trong những phương pháp đơn giản làm
giảm thiểu lỗi thuật toán là phải chú ý xử lý mọi tình huống khi dùng câu lệnh điều kiện (hay
chẻ nhánh) mặc dù có thể có các trường hợp tưởng như hiển nhiên.
Lỗi về lập luận: Đây có thể xem là trường hợp đặc biệt của sai sót trong thuật tốn.
Trong các biểu thức tính giá trị, đôi khi không quen dùng đại số Bool (nhất là khi dùng luật
De Morgan để phủ định một biểu thức phức tạp) nên người lập trình có thể tính tốn sai, hay
định nghĩa sai các phép tốn. Do đó, giá trị trả về của các biểu thức logic hay biểu thức nhị
phân sẽ bị sai trong một vài trường hợp hay tồn bộ biểu thức. Trong những tình huống như
vậy phần mềm dịch sẽ không thể nào phát hiện ra cho đến khi chương trình được thi hành
và lọt vào tình huống tính sai của người lập trình.

23


Bài 2
TÊN BÀI:CÁC LOẠI DỮ LIỆU CẤU TRÚC

MÃ BÀI: ITPRG3_06.2
Giới thiệu :
Trong khi lập trình tạo ra sản phẩm, người lập trình cần phải hiểu được các kiến thức
liên quan đến các kiểu dữ liệu có cấu trúc đơn giản của cơng cụ (ngơn ngữ lập trình) đang
sử dụng để phát triển chương trình. Mặt khác, tất cả các kiễu dữ liệu có cấu trúc phức tạp
đều được hình thành bởi các thành phần chứa các cấu trúc cơ bản. Để đi sâu hơn về các
vấn đề được đề cập đến trong bài học này cũng nhưng trong những bài học tiếp theo, chúng
ta cần phải hiểu ngơn ngữ lập trình C/C++ đồng thời cần phải nghiên cứu lại các bài học đã
học trong chương trình Lập trình căn bản.
Mục tiêu thực hiện:
Học xong bài này học viên sẽ có khả năng:
- Hiểu và nắm được các kiểu dữ liệu cơ bản: kiểu số nguyên, số thực, ký tự, chuỗi,
mảng.
- Nắm được cách thức tổ chức bộ nhớ để lưu trữ các kiểu dữ liệu cơ bản
- Áp dụng giải một số bài tốn.
Nội dung chính:
2.1. Các kiểu dữ liệu cơ sở
Các kiểu dữ liệu cơ sở là các kiểu dữ liệu do ngơn ngữ lập trình dựng sẵn, ở đây
chúng ta xét ngơn ngữ lập trình C++ với cơng cụ lập trình Borland C++ 3.0.
Kiểu nguyên

Kiểu số nguyên được khai báo với từ khố int (short) có kích thước 2 byte,
với miền giá trị -32768..32767.
Tên kiểu

Kích thước Miền giá trị

int

02 byte


-32738 đến 32767  

unsign int

02 byte

0 đến 65335

Có thể gọi tắt là unsign

long

04 byte

-232 đến 231 -1

 

0 đến 232-1

 

unsign long 04 byte

Chú thích

Các phép tốn được trang bị để hỗ trợ cho số nguyên:
Phép cộng, trừ: Cộng, trừ hai số nguyên cho kết quả một số nguyên.
Phép chia: Chia hai số nguyên cho kết quả một số nguyên là phần nguyên của phép chia.

Phép lấy dư (%): Phép toán này lấy phần dư của phép chia hai số nguyên.
Kiểu thực
C/C++ có hai từ khố để khai báo số thực: float , double; được mơ tả trong bảng sau:
Tên kiểu

Kích thước Giá trị

float

4 byte

double

8 byte

Độ chính xác

3.410-38..3.41038
1.710

-308

..1.710

24

308

7 chữ số sau dấu thập phân
15 chữ số sau dấu thập phân



long double 10 byte

3.4E-4932… 1.1E4932

Số thực được hỗ trợ các phép tốn: cộng, trừ, nhân, chia nhưng khơng tồn tại phép
toán lấy dư (%).
Kiểu ký tự
Kiểu ký tự được hỗ trợ từ khoá char dùng để lưu 256 ký tự trong bảng mã ASCII mở rộng.
Một biến dùng kiểu ký tự để lưu trữ thực chất chỉ lưu trữ được một số nguyên theo mã số
trong bảng mã ASCII, do đó các phép tốn của số ngun đều dùng được với cùng một quy
cách với ký tự.
Để gán giá trị cho một biến ký tự người dùng có thể gán giá trị số nguyên (mã ASCII)
của ký tự đó hoặc gán tên ký tự được đóng bởi cặp dấu nháy đơn (Ví dụ: a=’B’).
Trong q trình lập trình, chúng ta cần phải chú ý đến các tình huống sau:
- Người lập trình có thể kết hợp các từ khố: unsigned, long để chỉ định kiểu dữ liệu có
dấu hoặc để tăng giá trị có thể lưu trữ được cho một biến. Ví dụ: Biến a có kiểu long int hoặc
long có thể lưu trữ được giá trị số nguyên có dấu giá trị khoảng 2 tỷ; biến b có kiểu unsigned
int có thể lưu trữ được giá trị số nguyên có độ lớn từ 0..65535; biến c có kiểu unsigned long
int có thể lưu trữ được số ngun khơng dấu giá trị khoảng 4,2 tỷ.
Kiểu logic
Borland C++ 3.0 trở lên có cung cấp một kiểu dữ liệu logic mang tên kiểu bool. Kiểu dữ
liệu này chứa một trong hai giá trị TRUE (đúng), FALSE (sai). Tuy nhiên, trong C/C++, khi sử
dụng giá trị bằng 0 được hiểu là FALSE, sử dụng giá trị khác 0 được hiểu là FALSE.
- Từ khố long khơng dùng được với kiểu char.
- Ngồi các các phép tốn chuẩn, người sử dụng phải cịn có thể sử dụng các hàm
dựng sẵn được cung cấp bởi các thư viện trong C/C++ để xử lý đối với từng kiểu dữ liệu
được yêu cầu của từng hàm.
- Kiểu trả về của một biểu thức số có kiểu dữ liệu là kiểu dữ liệu cao nhất trong các

phần tử trong biểu thức.
Ví dụ: Biểu thức 1/n với n là số nguyên sẽ trả về một giá trị nguyên. Chẳng hạn, 1/5 sẽ
trả về giá trị 0.
- Trong trường hợp muốn biểu thức cho ra một kết quả theo kiểu dữ liệu nào đó,
chúng ta phải thực hiện phép tốn ép kiểu.
Ví dụ 1: Viết chương trình thực hiện nhập vào một số nguyên dương n, sau đó in kết quả
của biểu thức
#include <conio.h>
#include <iostream.h>
void main()
{
float s;
int n;
int i;
25


×