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

Nhập môn kỹ nghệ phần mềm - Chương 4 pdf

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 (427.69 KB, 22 trang )


Chơng IV -
Nguyễn Quốc Toản- Nguyên văn Vỵ - Vu Đức Thi Lê Đình Phùng
89


Chơng IV
lập trình hiệu quả


IV.1.Các đặc trng ngôn ngữ lập trình

IV.1.1.Đặc trng tâm lí
IV.1.2.Mô hình cú pháp/ngữ nghĩa
IV.1.3.Hớng quan điểm kỹ nghệ
IV.1.4.Việc chọn ngôn ngữ
IV.1.5.Ngôn ngữ lập trình và kỹ nghệ phần mềm

IV.2.Nền tảng của ngôn ngữ lập trình

IV.2.1.Kiểu dữ liệu và định kiểu dữ liệu
IV.2.2 .Chơng trình con
IV.2.3.Cấu trúc điều khiển
IV.2.4.Cách tiếp cận hớng đối tợng
IV.2.5.Các lớp ngôn ngữ
IV.2.6.Các công cụ lập trình

IV.3.Phong cách lập trình

IV.3.1.Tài liệu chơng trình
IV.3.2.Khai báo dữ liệu


IV.3.3.Xây dựng câu lệnh
IV.3.4.Vào/ra

IV.4.Tính hiệu quả

IV.4.1.Kỹ thuật lập trình hớng hiệu quả
IV.4.2.Độ tin cậy của phần mềm
IV.4.3.Tính di chuyển đợc của hệ ứng dụng
IV.4.4.Một vài hớng dẫn lập trình hớng hiệu quả

IV.5.Thẩm định v xác minh

IV.5.1.Đại cơng về việc thẩm định và xác minh
IV.4.2.Sơ lợc về tiến trình thử nghiệm

Chơng IV -
Nguyễn Quốc Toản- Nguyên văn Vỵ - Vu Đức Thi Lê Đình Phùng
90

Chơng IV
lập trình hiệu quả



IV.1.Các đặc trng ngôn ngữ lập trình

Ngôn ngữ lập trình là phơng tiện để liên lạc giữa con ngời và máy tính. Tiến trình lập trình
- sự liên lạc thông qua ngôn ngữ lập trình - là một hoạt động con ngời. Lập trình là bớc cốt lõi
trong tiến trình kĩ nghệ phần mềm.


IV.1.1.Đặc trng tâm lí
Trong cuốn sách Tâm lí phần mềm,Ben Shneiderman đã viết về vai trò của nhà tâm lí
phần mềm: tập trung vào mối quan tâm của con ngời nh tính dễ dùng, đơn giản khi học, nâng
cao độ tin cậy, giảm tần suất lỗi và tăng sự thoả mãn với ngời dùng, trong khi không quên về tính
hiệu quả của máy, khả năng phần mềm và sự ràng buộc phần cứng.
Một nhà tâm lí học phần mềm khác, Gerald Weinberg gợi ý rằng chúng ta có thể mở rộng
chuyện ngụ ngôn Ngời thợ may thiên tài thành câu chuyện về ngời thiết kế thiên tài. Ngời
thiết kế ngôn ngữ lập trình thờng bóp cách tiếp cận tới vấn đề sao cho cách tiếp cận sẽ khớp với
những ràng buộc do ngôn ngữ lập trình riêng áp đặt. Vì nhân tố con ngời có tầm quan trong chủ
chốt trong thiết kế lập trình nên các đặc trng tâm lý của ngôn ngữ có tác động mạnh mẽ lên sự
thành công của thiết kế để dịch và cài đặt.
Một số đặc trng của tâm lý xuất hiện nh kết quả của thiết kế ngôn ngữ lập trình. Mặc dầu
những đặc trng này không đo đợc theo bất cứ cách thức định lợng nào, chúng ta thừa nhận biểu
hiện của chúng trong mọi ngôn ngữ lập trình.
Tính đồng đều: chỉ ra mức độ theo đó ngôn ngữ kí pháp nhất quán .
Tính mơ hồ: ngôn ngữ lập trình đợc ngời lập trình cảm nhận. Trình biên dịch bao giờ
cũng diễn giải một câu lệnh theo một cách, nhng độc giả con ngời có thể hiểu câu lệnh đó theo
cách khác. Tại đây có sự mơ hồ tâm lý. Việc thiếu tính đồng đều và sự xuất hiện sự mơ hồ tâm lý
thờng đi kèm nhau. Nếu ngôn ngữ lập trình để lộ ra những khía cạnh tiêu cực của các đặc trng này
thì chơng trình gốc sẽ khó đọc và việc dịch từ thiết kế ra dễ sinh lỗi nhiều hơn.
Tính gọn gàng: chỉ dẫn về khối lợng thông tin h
ớng chơng trình mà trí nhớ con ngời
phải ghi nhớ. Trong các thuộc tính ngôn ngữ đo tính gọn gàng có:
Mức độ ngôn ngữ hỗ trợ cho các kết cấu có cấu trúc và giải quyết việc khó theo lôgic .
Loại từ khoá và cách viết tắt có thể đợc dùng
Sự phong phú của các kiểu dữ liệu và đặc trng mặc định
Số các phép toán logic và số học
Số các hàm có sẵn
Apl là một ngôn ngữ lập trình gọn gàng ngoại lệ (thành khó đọc và khó hiểu).
Các đặc trng của ký ức con ngời có một tác động mạnh lên cách ta dùng ngôn ngữ. Kí ức

con ngời và việc nhận dạng con ngời và việc nhận dạng con ngời có thể đợc chia thành các lĩnh
vực toàn thái và tuần tự. Kí ức toàn thái cho phép chúng ta nhớ và nhận lại mọi thứ nh một tổng
thể. Chẳng hạn ta nhận ra khuôn mặt ngời ngay tức thì; chúng ta không tính toán có ý thức về từng
phần riêng biệt của khuôn mặt trớc khi nhận dạng. Kí ức tuần tự cung cấp một phơng tiện để nhớ
lại phần tử tiếp trong một dãy (nh dòng tiếp theo trong bài hát, khi đợc cho những dòng trớc đó).
Mỗi đặc trng này đều có ảnh hởng tới đặc trng ngôn ngữ lập trình vẫn đợc gọi là tính cục bộ và

Chơng IV -
Nguyễn Quốc Toản- Nguyên văn Vỵ - Vu Đức Thi Lê Đình Phùng
91
tính tuyến tính.
Tính cục bộ là đặc trng toàn thái của ngôn ngữ lập trình.Tính cục bộ đợc làm nổi bật khi
các câu lệnh có thể đợc tổ hợp thành các khối, khi các kết cấu có cấu trúc có thể đợc cài đặt trực
tiếp, và khi thiết kế và chơng trình gốc đều mang tính mô đun và cố kết cao độ. Một đặc trng cuả
ngôn ngữ hỗ trợ hay khuyến khích cho xử lí biệt lệ (nh xử lý điều kiện ON trong PL/1 hay ERR=
trong bản mở rộng của FOTRAN) đều vi phạm vào tính cục bộ này.
Tính tuyến tính là một đặc trng tâm lý có liên quan chặt chẽ với khái niệm bảo trì của lĩnh
vực chức năng. Tức là, nhận biết con ngời đợc thuận lợi khi gặp một dãy tuyến tính các thao tác
lôgic. Những nhánh nhảy xa (các chu trình lớn) vi phạm tính tuyến tính của xử lý. Một lần nữa, việc
cài đặt thông tin trực tiếp cho các kết cấu có cấu trúc trợ giúp cho tính tuyến tính của ngôn ngữ lập
trình.
Khả năng của chúng ta học một ngôn ngữ mới bị ảnh hởng bởi truyền thống. Các kết cấu là
tơng tự nhau, hình dạng thì tơng thích và cảm giác về định dạng ngôn ngữ lập trình đợc bảo
toàn.
Truyền thống cũng ảnh hởng tới mức độ đổi mới trong thiết kế của ngôn ngữ lập trình mới. Mặc dầu ngôn ngữ
lập trình mới thờng đợc tiến hoá không ngừng. Chẳng hạn, PASCALkhá gần với ALGOL. Tuy nhiên, một cải tiến chủ
yếu trong ngôn ngữ PASCAL là việc cài đặt kiểu dữ liệu trừu tợng, một dạng không tồn tại trong các ngôn ngữ trớc đó
có gắn với PASCALtheo truyền thống. Ada, một ngôn ngữ đã trởng thành từ truyền thốngALGOL-PASCAL, mở rộng
cả hai ngôn ngữ này với nhiều cấu trúc và kiểu đổi mới .
Các đặc trng tâm lý của ngôn ngữ lập trình có ý nghĩa quan trọng tới khả năng của chúng ta

trong việc học, áp dụng và duy trì chúng. Tóm lại, ngôn ngữ lập trình tạo ra mầu sắc cho chúng ta
cách nghĩ về chơng trình và giới hạn cố hữu cách chúng ta liên lạc với máy tính.

IV.1.2.Mô hình cú pháp/ngữ nghĩa
Shniderman đã phát triển một mô hình cú pháp - ngữ nghĩa cho tiến trình lập trình có liên
quan đến việc xem xét các bớc lập trình. Khi ngời lập trình áp dụng các phơng pháp kĩ nghệ
phần mềm (nh phân tích yêu cầu,thiết kế) vốn độc lập với ngôn ngữ lập trình thì động tới vấn đề tri
thức ngữ nghĩa. Tri thức ngữ nghĩa mặt khác lại là độc lập với ngôn ngữ, tập trung vào các đặc trng
của một ngôn ngữ xác định.
Về các kiểu tri thức này, tri thức ngữ nghĩa là khó thu nhận đợc hơn cả và đòi hỏi dùng
nhiều trí tuệ. Tất cả các bớc kĩ nghệ phần mềm trớc phần lập trình đều dùng rất nhiều tri thức ngữ
nghĩa. Bớc lập trình áp dụng tri thức cú pháp vốn là bất kỳ và theo lệnh đợc học theo kiểu vẹt.
Khi học một ngôn ngữ lập trình mới thì thông tin cú pháp mới đợc thêm vào kí ức Một ngôn ngữ
lập trình mới có thể buộc ngời kĩ s phần mềm phải học thông tin ngữ nghĩa mới. Nhiều vấn đề
liên quan tới phần mềm máy tính đã không là quan trọng do việc thiếu tri thức cú pháp, nhng lại
quan trọng trong phạm vi tri thức ngữ nghĩa và khả năng của chúng ta để áp dụng nó. Mục tiêu của
kĩ nghệ phần mềm là mở rộng tri thức về ngữ nghĩa của việc phát triển phần mềm.

IV.1.3.Hớng quan điểm kỹ nghệ
Cách nhìn kĩ nghệ phần mềm về các đặc trng của ngôn ngữ lập trình tập trung vào nhu
cầu xác định dự án phát triển phần mềm riêng. Mặc dầu ngời ta vẫn cần các yêu cầu riêng cho
chơng trình gốc, có thể thiết lập đợc một tập hợp tổng quát những đặc trng kĩ nghệ:
(1) dễ dịch thiết kế sang chơng trình,
(2) có trình biên dịch hiệu quả,
(3) khả chuyển chơng trình gốc,
(4) có sẵn công cụ phát triển,
(5) dễ bảo trì.
Bớc lập trình bắt đầu sau khi thiết kế chi tiết đã đợc xác định, xét duyệt và sửa đổi nếu
cần. Về lý thuyết, việc sinh chơng trình gốc từ một đặc tả chi tiết nên là trực tiếp. Dễ dịch thiết kế
sang ch

ơng trình đa ra một chỉ dẫn về việc một ngôn ngữ lập trình phản xạ gần gũi đến mức nào

Chơng IV -
Nguyễn Quốc Toản- Nguyên văn Vỵ - Vu Đức Thi Lê Đình Phùng
92
cho một biểu diễn thiết kế. Một ngôn ngữ cài đặt trực tiếp cho các kết cấu có cấu trúc, các cấu trúc
dữ liệu phức tạp, vào/ ra đặc biệt, khả năng thao tác bit, và các kết cấu hớng sự vật sẽ làm cho việc
dịch từ thiết kế sang chơng trình gốc dễ hơn nhiều (nếu các thuộc tính này đợc xác định trong
thiết kế).
Mặc dầu những tiến bộ nhanh chóng trong tốc độ xử lý và mật độ nhớ đã bắt đầu làm giảm
nhẹ nhu câù chơng trình siêu hiệu quả, nhiều ứng dụng vẫn còn đòi hỏi các chơng trình chạy
nhanh, gọn (yêu cầu bộ nhớ thấp). Các ngôn ngữ với trình biên dịch tối u có thể là hấp dẫn nếu
hiệu năng phần mềm là yêu cầu chủ chốt.
Tính khả chuyển chơng trình gốc là một đặc trng ngôn ngữ lập trình có thể đợc hiểu
theo ba cách khác nhau:
1. Chơng trình gốc có thể đợc chuyển từ bộ xử lý này sang bộ xử lý khác và từ trình biên
dịch nọ sang trình biên dịch kia với rất ít hoặc không phải sửa đổi gì.
2. Chơng trình gốc vẫn không thay đổi ngay cả khi môi trờng của nó thay đổi (nh việc cài
đặt bản mới của hệ điều hành ).
3. Chơng trình gốc có thể đợc tích hợp vào trong các bộ trình phần mềm khác nhau với ít
hay không cần thay đổi gì vì các đặc trng của ngôn ngữ lập trình.
Trong số ba cách hiểu về tính khả chuyển này thì cách thứ nhất là thông dụng nhất.Việc
chuẩn hoá (do tổ chức tiêu chuẩn quốc tế IFO và /hoặc Viện tiêu chuẩn quốc gia Mĩ-ANSI) nhằm
nâng cao tính khả chuyển ngôn ngữ lập trình.
Tính sẵn có của công cụ phát triển có thể làm ngắn bớt thời gian cần để sinh ra chơng
trình gốc và có thể cải thiện chất lợng của chơng trình. Nhiều ngôn ngữ lập trình có thể cần tới
một loạt công cụ kể cả trình biên dịch gỡ lỗi, trợ giúp định dạng chơng trình gốc, các tiện nghi
soạn thảo có sẵn, các công cụ kiểm soát chơng trình gốc ,th viện chơng trình con mở rộng trong
nhiều lĩnh vực ứng dụng, các trình duyệt , trình biên dịch chéo cho phát triển bộ vi xử lý, khả năng
bộ xử lý macro,công cụ kĩ nghệ ngợc và những công cụ khác. Trong thực tế, khái niệm về môi

trờng phát triển phần mềm tốt (bao hàm cả các công cụ) đã đợc thừa nhận nh nhân tố đóng góp
chính cho kĩ nghệ phần mềm thành công.
Tính dễ bảo trì của chơng trình gốc có tầm quạn trọng chủ chốt cho tất cả các nỗ lực phát
triển phần mềm không tầm thờng. Việc bảo trì không thể đợc tiến hành chừng nào ngời ta còn
cha hiểu đợc phần mềm. Các yếu tố của cấu hình phần mềm (nh tài liệu thiết kế ) đa ra một nền
tảng cho việc hiểu biết, nhng cuối cùng thì chơng trình gốc vẫn phải đợc đọc và sửa đổi theo
những thay đổi trong thiết kế .
Tính dễ dịch thiết kế sang chơng trình là một yếu tố quan trọng để dễ bảo trì chơng trình
gốc. Bên cạnh đó, các đặc trng tự làm tài liệu của ngôn ngữ (nh chiều dài đợc phép của tên gọi,
định dạng nhãn, định nghĩa kiểu, cấu trúc dữ liệu) có ảnh hởng mạnh đến tính dễ bảo trì.

IV.1.4.Việc chọn ngôn ngữ
Việc chọn ngôn ngữ lập trình cho một dự án riêng phải tính tới cả các đặc trng kĩ nghệ và
tâm lý. Tuy nhiên, vấn đề liên quan đến việc chọn lựa có thể bàn tới chỉ nếu một ngôn ngữ là có sẵn
hay đợc quy định bởi ngời yêu cầu. Meek gợi ý một quan điểm tổng quát khi phải chọn một ngôn
ngữ lập trình: " nghệ thuật chọn ngôn ngữ là bắt đầu từ vấn đề, quyết định xem cái gì là yêu cầu
của nó và tầm quan trọng tơng đối của chúng, vì có thể sẽ không thể nào thoả mãn đợc chúng nh
nhau (với một ngôn ngữ ) các ngôn ngữ có sẵn nên đợc sánh với danh sách các yêu cầu "
Các tiêu chuẩn đợc áp dụng khi đánh giá về ngôn ngữ có sẵn. Miền ứng dụng của dự án là
một tiêu chuẩn hay đợc áp dụng nhất trong việc lựa chọn các ngôn ngữ .
C thờng là một ngôn ngôn ngữ hay đợc chọn cho việc phát triển hệ thống phần mềm,trong khi các ngôn ngữ
nh Ada,C,Modula-2 (cùng với FOTRAN và hợp ngữ) hay gặp trong ứng dụng thời gian thực. COBOL là ngôn ngữ cho
ứng dụng kinh doanh nhng việc ngày càng dùng nhiều các ngôn ngữ thế hệ thứ t đã thay thế dần nó ở vị trí trội vợt.
Trong lĩnh vực kĩ nghệ /khoa học thì FOTRAN vẫn còn là ngôn ngữ thống trị (mặc dầu ALGOL, PL/1,PASCAL và C
cũng đợc dùng rộng rãi). Những ứng dụng phần mềm nhúng dùng cùng các ngôn ngữ đợc áp dụng trong các hệ thống

Chơng IV -
Nguyễn Quốc Toản- Nguyên văn Vỵ - Vu Đức Thi Lê Đình Phùng
93
và ứng dụng thời gian thực. Ngôn ngữ thống trị cho ngời dùng máy tính cá nhân vẫn là BASIC nhng ngôn ngữ đó

hiếm khi đợc những ngời phát triển C, dùng. Các ứng dụng trí tuệ nhân tạo dùng các ngôn ngữ nh LISP, PROLOG
hay OPS5 mặc dầu nhiều ngôn ngữ lập trình qui ớc khác cũng đợc dùng.
Xu hớng phát triển phần mềm hớng đối tợng xuyên suốt phần lớn các miền ứng dụng đã mở
ra nhiều ngôn ngữ mới và các dị bản ngôn ngữ qui ớc. Các ngôn ngữ lập trình hớng đối tợng
đợc dùng rộng rãi nhất là Smalltalk ,C+ +Objective C. Ngoài ra còn có Eiffel,Object-
PASCAL,Flavos và nhiều ngôn ngữ khác.
Sự phát triển gia tăng của các ngôn ngữ lập trìnhmới và tốt hơn vẫn tiếp tục. Mặc dầu nhiều
ngôn ngữ này khá hấp dẫn, đôi khi tốt hơn cả vẫn là chọn ngôn ngữ yếu hơn (cũ) đã có tài liệu
chắc chắn và phần mềm hỗ trợ, quen thuộc với nhiều ngời trong nhóm phát triển phần mềm và đã
từng áp dụng thành công trong quá khứ. Tuy nhiên, nên có đánh giá kĩ càng về các ngôn ngữ mới và
việc chuyển dịch từ ngôn ngữ cũ sang ngôn ngữ mới nếu có, với việc thừa nhận sự kháng cự về tâm
lý đối với thay đổi thờng hay gặp phải trong mọi tổ chức.

IV.1.5.Ngôn ngữ lập trình và kỹ nghệ phần mềm
Bất kể đến khuôn cảnh kĩ nghệ phần mềm, ngôn ngữ lập trình sẽ có tác động tới việc vạch kế
hoạch dự án, phân tích, thiết kế, lập trình, kiểm thử và bảo trì.
Trong khi lập kế hoạch dự án, hiếm khi ngời ta tiến hành xem xét các đặc trng kĩ thuật của
ngôn ngữ lập trình. Tuy nhiên, việc lập kế hoạch cho các công cụ hỗ trợ có liên quan tới tài nguyên
cần có, có thể yêu cầu rằng một trình biên dịch chuyên dụng (và phần mềm liên kết) hay môi trờng
lập trình đợc xác định.
Một khi các yêu cầu phần mềm đã đợc thiết lập, thì các đặc trng của ngôn ngữ lập trình
ứng cử viên trở thành quan trọng hơn. Nếu cần tới cấu trúc dữ liệu phức tạp thì ngôn ngữ với sự hỗ
trợ cho các cấu trúc dữ liệu phức tạp (nh Pascal hay các ngôn ngữ khác) nên đợc tính tới một cách
cẩn thận. Nếu cần khả năng cao, thời gian thực thì ngôn ngữ đợc thiết kế cho ứng dụng thời gian
thực (nh Ada) hay hiệu quả về tốc độ nhớ (nh C) có thể đợc xác định. Nếu cần đa ra nhiều báo
cáo và thao tác tệp thì các ngôn ngữ nh COBOL hay RPG có thể thích hợp. Một cách lý tởng, các
yêu cầu phần mềm nên kết tinh việc chọn lựa ngôn ngữ thích hợp nhất cho việc xử lý cần thực hiện.
Tuy nhiên trong thực hành, một ngôn ngữ thờng đợc chọn lựa bởi vìnó là ngôn ngữ duy nhất mà
chúng ta có chạy trên máy của mình !.
Chất lợng của thiết kế phần mềm đợc thiết lập theo cách độc lập với các đặc trng ngôn

ngữ lập trình (một ngoại lệ đáng đợc lu ý là thiết kế hớng sự vật). Tuy nhiên thuộc tính ngôn
ngữ đóng một vai trò trong chất lợng của thiết kế đợc cài đặt và ảnh hởng (cả có ý thức lẫn vô
thức) tới cách thiết kế đ
ợc xác định.Một số độ đo định tính và định lợng của thiết kế tốt. Các khái
niệm về tính modul và sự độc lập modul cũng đợc nhấn mạnh.Các đặc trng kĩ thuật của nhiều
ngôn ngữ lập trình có thể ảnh hởng tới những khái niệm này trong việc cài đặt thiết kế.
Thiết kế dữ liệu cũng có thể bị ảnh hởng bởi các đặc trng ngôn ngữ. Các ngôn ngữ lập
trình nh Ada, C++, Smalltalk đều hỗ trợ cho khái niệm về kiểu dữ liệu trừu tợng một công cụ
quan trọng trong thiết kế và đặc tả dữ liệu. Các ngôn ngữ thông dụng khác, nh PASCAL, cho phép
định nghĩa các kiểu dữ liệu do ngời dùng xác định và việc cài đặt trực tiếp danh sách móc nối và
những cấu trúc dữ liệu khác. Các tính năng này cung cấp cho ngời thiết kế phạm vi rộng hơn trong
các bớc thiết kế sơ bộ và chi tiết
ảnh hởng của các đặc trng ngôn ngữ tới các bớc thiết kế bao gồm khó khăn trong
việc đánh giá kiểm thử phần mềm. Các ngôn ngữ trực tiếp hỗ trợ cho các kết cấu có cấu trúc có
khuynh hớng giảm bớt độ phức tạp của chơng trình, do đó một cách nào đó làm cho nó dễ dàng
kiểm thử. Các ngôn ngữ hỗ trợ cho việc đặc tả các chơng trình con và thủ tục ngoài (nh
FOTRAN) thờng làm cho việc kiểm thử tích hợp ít sinh lỗi hơn. Mặt khác một số đặc trng kĩ
thuật của ngôn ngữ có thể gây trở ngại cho việc kiểm thử. Chẳng hạn cấu trúc khối trong ALGOL có
thể đợc xác định theo cách làm mất dữ liệu trung gian khi việc ra khỏi khối xuất hiện, do đó làm
cho trạng thái của chơng trình khó xác nhận hơn. Giống nh kiểm thử, hiệu quả cuả các đặc trng

Chơng IV -
Nguyễn Quốc Toản- Nguyên văn Vỵ - Vu Đức Thi Lê Đình Phùng
94
ngôn ngữ lập trình về mặt bảo trì phần mềm cũng cha đợc hiểu thật đầy đủ .

IV.2.Nền tảng của ngôn ngữ lập trình

Nền tảng của ngôn ngữ lập trình đợc thể hiện trong ngữ cảnh bốn chủ đề đại thể: định
kiểu, cơ chế chơng trình con, cấu trúc điều khiển và hỗ trợ cho cách tiếp cận hớng đối tợng. Mọi

ngôn ngữ lập trình đều có thể đợc đặc trng theo những chủ đề này và chất lợng toàn bộ của một
ngôn ngữ lập trình có thể đợc đánh giá theo điểm mạnh và điểm yếu có liên quan đến từng chủ đề.


IV.2.1.Kiểu dữ liệu và định kiểu dữ liệu
Ngày nay, ích lợi của các ngôn ngữ lập trình đợc đánh gía không chỉ ở cú pháp và sự
phóng khoáng của các kết cấu thủ tục của nó. Định kiểu dữ liệu ,và các kiểu dữ liệu đặc biệt đợc
ngôn ngữ lập trình hỗ trợ là khía cạnh quan trọng của chất lợng ngôn ngữ.
Pratt mô tả kiểu dữ liệu và định kiểu dữ liệu là một lớp các đối tợng dữ liệu cùng với
một tập các phép toán để tạo ra và thao tác trên chúng". Một đối tợng dữ liệu kế thừa một tập các
thuộc tính nền tảng của kiểu dữ liệu mà nó thuộc vào. Một đối tợng dữ liệu có thể lấy một giá trị
nằm bên trong miền giá trị hợp lệ cho kiểu dữ liệu đó và có thể bị các phép toán của kiểu dữ liệu đó
thao tác.
Các kiểu dữ liệu đơn trải trên một miền rộng bao gồm các kiểu số (nh nguyên, phức, số
dấu phẩy động), kiểu liệt kê (nh kiểu dữ liệu do ngời dùng định nghĩa có trong PASCAL), kiểu
logic (nh true hay false) và kiểu xâu string (nh dữ liệu chữ số). Các kiểu dữ liệu phức tạp hơn bao
gồm các cấu trúc dữ liệu trải qua hết từ mảng một chiều đơn giả (vectơ) cho tới các cấu trúc danh
sách tới các mảng và bản ghi đa tạp phức tạp.
Các phép toán có thể đợc thực hiện trên một kiểu dữ liệu đặc biệt và theo cách thức mà
trong đó các kiểu khác nhau có thể đợc thao tác trong cùng câu lệnh sẽ đợc điều khiển bởi việc
kiểm tra kiểu vốn đợc cài đặt bên trong trình biên dịch hay thông dịch ngôn ngữ lập trình. Fairley
đa ra năm mức kiểm tra kiểu thờng gặp trong các ngôn ngữ lập trình:
Mức 0: Phi kiểu
Mức 1: Bó buộc kiểu tự động
Mức 2: Kiểu hỗn hợp
Mức 3: Kiểm tra kiểu giả mạnh
Mức 4: Kiểm tra kiểu mạnh
Ngôn ngữ lập trình phi kiểu không có ý nghĩa tờng minh đối với việc định kiểu và do đó không buộc việc
kiểm tra kiểu. Các ngôn ngữ nh BASIC, APL, LISP và ngay cả COBOL đều rơi vào phạm trù này. Mặc dầu từng ngôn
ngữ đều có thể cho phép ngời dùng định nghĩa ra cấu trúc dữ liệu nhng biểu diẽn của dữ liệu đợc chứa trong từng sự

vật dữ liệu là định sẵn.
Bó buộc kiểu tự động là một cơ chế kiểm tra kiểu cho phép ngời lập trình trộn lẫn nhiều kiểu dữ liệu,
nhng rồi tự chuyển các toán hạng về kiểu tơng hợp, do vậy cho phép các phép toán cần có xuất hiện. Chẳng hạn, PL/1
gán giá trị số 0 cho giá trị logic false và giá trị số 1 cho giá trị true. Do đó các phép toán số học (thông thờng đợc áp
dụng cho các kiểu dữ liệu số ) có thể đợc áp dụng cho kiểu dữ liệu boolean trong PL/1.
Chuyển đổi mốt kiểu hỗn hợp tơng tự về nhiều phơng diện với bó buộc kiểu tự đọng. Các kiểu dữ liệu
khác nhau bên trong cùng phạm trù kiểu (nh hai kiểu số khác nhau) đợc chuyển đổi thành một kiểu đích để có thể
ứng dụng đợc một phép toán xác định. Số học hỗn hợp của FORTRAN (một tính năng nên tránh nhất) có thể làm cho
các số nguyên và thực đợc dùng trong một câu lệnh ngôn ngữ lập trình.
Kiểm tra kiểu giả mạnh có tất cả các đặc trng của kiểm tra kiểu mạnh nhng đợc cài đặt theo cách đa
ra một hay nhiều lỗ hổng. Chẳng hạn, mặc dầu PASCAL kiểm tra tính tơng hợp giao diện bên trong một chơng trình
đã biên dịch, nó không làm nh vậy cho các thủ tục đợc dịch tách biệt (mô đun)- do đó, có một lỗ hổng trong việc bắt
buộc kiểm tra kiểu mạnh.

IV.2.2 .Chơng trình con
Chơng trình con là một thành phần của chơng trình dịch đợc tách biệt có chứa dữ liệu và cấu

Chơng IV -
Nguyễn Quốc Toản- Nguyên văn Vỵ - Vu Đức Thi Lê Đình Phùng
95
trúc điều khiển. Mô đun là cách biểu hiện tổng quát của chơng trình con. Tuỳ theo ngôn ngữ lập
trình mà một chơng trình con có thể đợc gọi là trình con, thủ tục, hàm hay bất kì tên gọi đặc biệt
nào. Bất kể đến tên của nó, chơng trình con vẫn bộc lộ ra một tập các đặc trng tổng quát:
(1) Phần mô tả có chứa tên của nó và mô tả giao điện ;
(2) Phần cài đặt có chứa dữ liệu và cấu trúc điều khiển;
(3) Một cơ chế kích hoạt làm cho chơng trình con đợc gọi tới từ một nơi nào đó khác
trong chơng trình.
Trong các ngôn ngữ lập trình qui ớc ,mỗi chơng trình con bản thân nó đều là một thực thể,
vận hành trên dữ liệu theo một cách đợc chỉ đạo bởi cấu trúc điều khiển của chơng trình lớn hơn.
Trong các ngôn ngữ lập trình hớng đối tợng, cách nhìn lớp chơng trình con đợc thay thế bởi đối

tợng.

IV.2.3.Cấu trúc điều khiển
Tại mức cơ bản ,mọi ngôn ngữ lập trình hiện đại đều cho phép ngời lập trình biểu diễn sự
tuần tự, tuyển chọn và lặp - các kết cấu logic lập trình có cấu trúc.Phần lớn các ngôn ngữ hiện đại
đều đa ra một cú pháp cho đặc tả trực tiếp về if-then-else ,do-while repeat-until (cũng nh CASE).
Các ngôn ngữ khác nh LISP và APL đòi hỏi ngời lập trình phải mô phỏng các kết cấu bên trong
giới hạn cú pháp của ngôn ngữ đó.
Bên cạnh các kết cấu thủ tục cơ sở của lập trình có cấu trúc, các cấu trúc điều khiển khác
cũng có thể có. Đệ qui tạo ra sự kích hoạt lần thứ hai của chơng trình con trong lần kích hoạt thứ
nhất. Tức là, chơng trình con gọi tới hay kích hoạt bản thân nó nh một phần của thủ tục đã xác
định. Tơng tranh đa ra sự hỗ trợ cho việc tạo ra nhiều nhiệm vụ, đồng bộ hoá các nhiệm vụ này và
liên lạc nói chung giữa các nhiệm vụ ấy. Tính năng ngôn ngữ này là vô giá khi phải thực hiện các
ứng dụng hệ thống hay thời gian thực. Có tính năng ngôn ngữ lập trình đặt bẫy các điều kiện lỗi hệ
thống hay của ngời dùng rồi truyền điều khiển cho bộ điều khiển đặc biệt để xử lý.

IV.2.4.Cách tiếp cận hớng đối tợng
Về lý thuyết, việc tạo ra các đối t
ợng và kết cấu của phần mềm hớng đối tợng có thể
đợc thực hiện bằng cách dùng bất kì ngôn ngữ lập trình qui ớc nào (nh C hay PASCAL). Nhng
trong thực tế, việc hỗ trợ cho các cách tiếp cận hớng đối tợng nên đợc xây dựng trực tiếp bên
trong ngôn ngữ lập trình sẽ đợc dùng để cài đặt thiết kế hớng đối tợng. Ngôn ngữ lập trình hớng
đối tợng nên cung cấp sự hỗ trợ trực tiếp cho định nghĩa lớp, kế thừa, bao bọc và truyền thông báo.
Định nghĩa về lớp là cơ sở cho cách tiếp cận hớng đối tợng. Ngôn ngữ lập trình hớng đối
tợng định nghĩa tên một lớp và xác định các thành phần chung và riêng của lớp đó. Một lớp mới có
thể đợc suy dẫn từ định nghĩa lớp cơ sở. Các đối tợng đợc suy từ lớp mới có thể dùng tất cả các
phơng pháp đợc xác định cho lớp cha. Định nghĩa về lớp bao quát cả trừu tợng dữ liệu và
thành phần chơng trình (phơng pháp) vận hành trên chúng.
Các chi tiết cài đặt và thuật ngữ cho định nghĩa lớp, kế thừa, bao bọc và truyền thông báo sẽ thay
đổi từ ngôn ngữ nọ sang ngôn ngữ kia, nhng khái niệm nền tảng về lớp vẫn không thay đổi. Tơng

tự kế thừa, bao bọc và truyền thông báo đợc cài đặt với với một cú pháp khác, nhng cùng nền
tảng. Mỗi kết cấu sẽ có sẵn trong bất kì ngôn ngữ nào thực sự hớng đối tợng.

IV.2.5.Các lớp ngôn ngữ
Có hàng trăm ngôn ngữ lập trình đã đợc sử dụng vào lúc này lúc khác trong những nỗ lực phát
triển phần mềm nghiêm chỉnh. Có bốn thế hệ ngôn ngữ lập trình đại diện:

1.Ngôn ngữ thế hệ thứ nhất.
Thế hệ ngôn ngữ thứ nhất lập trình theo mức mã máy (một số công việc với ngôn ngữ thế hệ
thứ nhất vẫn còn tiếp tục đến ngày nay). Chơng trình mã máy và dạng tơng đơng của nó dễ đọc

Chơng IV -
Nguyễn Quốc Toản- Nguyên văn Vỵ - Vu Đức Thi Lê Đình Phùng
96
hơn cho con ngời. Hợp ngữ biểu thị cho thế hệ ngôn ngữ thứ nhất. Các ngôn ngữ phụ thuộc máy
này trng bầy mức độ trừu tợng thấp nhất mà một chơng trình có thể đợc biểu diễn.
Có nhiều hợp ngữ nh các kiến trúc bộ xử lý với tập lệnh rút gọn theo yêu cầu. Từ quan điểm
của kĩ nghệ phần mềm, những ngôn ngữ nh vậy chỉ nên dùng khi ngôn ngữ cấp cao không thể đáp
ứng đợc hay không đợc hỗ trợ.

2.Ngôn ngữ thế hệ hai.
Ngôn ngữ thế hệ hai đã đợc phát triển từ cuối những năm 1950 và đầu những năm 1960 và
phục vụ nh nền tảng cho mọi ngôn ngữ lập trình hiện đại (thế hệ ba). Các ngôn ngữ thế hệ hai đợc
đặc trng bởi việc sử dụng rộng rãi một th viện phần mềm quen thuộc. FOFTRAN, COBOL,
ALGOL và BASIC là các ngôn ngữ nền tảng.
Với những ứng dụng chỉ sử dụng số thì FORTRAN vẫn là ngôn ngữ đợc lựa chọn, nhng với các ứng dụng hệ
thống, thời gian thực hay phần mềm sản phẩm nhúng thì các ngôn ngữ khác có u thế cạnh tranh hơn hẳn.
COBOL, giống nh FORTRAN, đã đạt tới độ chín muồi và là ngôn ngữ chuẩn đợc chấp nhận cho các ứng
dụng xử lí dữ liệu thơng mại. Mặc dầu ngôn ngữ này đôi khi cũng bị chỉ trích là thiếu tính gọn gàng, nó vẫn có những
khả năng định nghĩa dữ liệu tuyệt vời và có khả năng tự làm dữ liệu.

ALGOL là ngời tiên phong trong nhiều ngôn ngữ lập trình thế hệ ba và đa ra một kho cực kì phong phú các
kết cấu thủ tục và định kiểu dữ liệu. Ngôn ngữ này đợc hỗ trợ cho khái niệm cấu trúc khối, cấp phát bộ nhớ động, đệ
qui và những đặc trng khác có ảnh hởng mạnh lên các ngôn ngữ hiện đại theo sau.
BASIC là ngôn ngữ ban đầu đợc thiết kế để dạy lập trình. Ngôn ngữ này đã lạc hậu vào đầu những năm 1970,
nhng rồi lại tái sinh mạnh mẽ với sự kiện các hệ thống máy tính cá nhân.

3.Ngôn ngữ thế hệ ba (Ngôn ngữ lập trình có cấu trúc)
Ngôn ngữ thế hệ ba đợc đặc trng bởi khả năng cấu trúc dữ liệu và thủ tục mạnh. Các ngôn
ngữ lớp này có thể đợc chia thành ba phạm trù lớn: ngôn ngữ cấp cao vạn năng, ngôn ngữ cấp cao
hớng đối tợng và ngôn ngữ chuyên dụng.
+ Ngôn ngữ cấp cao vạn năng: bao gồm PL/1,PASCAL,MODULA-2,C
Ngôn ngữ cấp cao vạn năng đầu tiên ALGOL (cũng là ngôn ngữ nền tảng) đã phục vụ nh một mô hình cho các
ngôn ngữ khác trong phạm trù này. Hậu thế của nó, PL/1, PSACAL, Modula-2, C và Ada đã đợc chấp nhận nh những
ngôn ngữ có tiềm năng cho các ứng dụng phổ rộng (nh để dùng trong kĩ nghệ/khoa học, các sản phẩm nhúng, các miến
ứng dụng thơng mại hoặc hệ thống).
PL/1 là ngôn ngữ phổ rộng đúng nghĩa đầu tiên, đợc xây dựng với một phạm vi rộng các tính năng
làm cho nó đợc dùng trong nhiều lĩnh vực ứng dụng khác nhau. PL/1 cung cấp sự hỗ trợ cho các ứng dụng kĩ
nghệ/khoa học qui ớc và kinh doanh trong khi đồng thời cho phép đặc tả các cấu trúc dữ liệu phức tạp, đa nhiệm, vào/ra
phức tạp, xử lí danh sách và nhiều tính năng khác. Ngời ta đã xây dựng tập con của ngôn ngữ này để dạy lập trình
(PL/C), để dùng trong các ứng dụng bộ vi xử lí (PL/M), và để lập trình hệ thống (PL/S).
PASCAL là ngôn ngữ lập trình hiện đại đã đợc phát triển vào đầu những năm 1970 nh một ngôn
ngữ để dạy kĩ thuật hiện đại (nh lập trình có cấu trúc) trong phát triển phần mềm. PASCAL đợc dùng một cách rộng
rãi cho các ứng dụng kĩ nghệ/khoa học và lập trình hệ thống. PASCAL là một con cháu trực tiếp của ALGOL và chứa
nhiều tính năng cũ: cấu trúc khối, định kiểu dữ liệu mạnh, hỗ trợ trực tiếp cho đệ qui và các tính năng phụ khác. Nó đã
đợc cài đặt trên máy tính đủ các cỡ.
Modula-2 là một sự trởng thành cách mạng của PASCAL và là một phơng án có thể cho ngôn ngữ
lập trình Ada. Modula-2 nối trực tiếp việc cài đặt các tính năng thiết kế nh che dấu thông tin , trừu tợng và kiểm tra
kiểu mạnh với các cấu trúc điều khiển để hỗ trợ cho đệ qui và tơng tranh. Hiện tại, việc dùng Modula-2 cho các ứng
dụng công nghiệp đã bị hạn chế.
Ngôn ngữ lập trình C ban đầu đợc phát triển nh một ngôn ngữ cho ngời cài đặt hệ điều hành. Hệ

điều hành UNIX đợc cài đặt trong C. Tuy nhiên ngày nay một lợng rất lớn các sản phẩm phần mềm, các ứng dụng
nhúng và phần mềm hệ thống đã đợc xây dựng trong ngôn ngữ C. C đã đợc phát triển cho kĩ nghệ phần mềm phức tạp
và chứa các tính năng mạnh làm cho nó mềm dẻo đáng kể. Giống nh các ngôn ngữ khác trong phạm trù này, C hỗ trợ
cho các cấu trúc dữ liệu phức tạp và có các đặc trng định kiểu hợp lí, cho phép dùng nhiều con trỏ và có một tập phong
phú các toán tử để tính toán và thao tác dữ liệu.
+ Các ngôn ngữ hớng đối tợng: Các ngôn ngữ hớng đối tợng làm cho ngời kĩ s phần
mềm cài đặt đợc các mô hình phân tích và thiết kế đợc tạo ra bằng cách dùng OOA và OOD. Mặc
dầu hàng chục ngôn ngữ hớng đối tợng đã đợc đa ra trong thập kỉ qua nhng chỉ có vài ngôn
ngữ có đợc chỗ đứng có ý nghĩa trên thị trờng nh: dị bản của C (nh C++, Objective-C),

Chơng IV -
Nguyễn Quốc Toản- Nguyên văn Vỵ - Vu Đức Thi Lê Đình Phùng
97
Smalltalk và Eiffel.
Các dị bản hớng đối tợng của C thu đợc việc sử dụng rộng rãi qua cộng đồng UNIX và với nhiều
ngời phát triển các hệ thống hớng đối tợng lần đầu tiên. Xây dựng dựa trên sức mạnh của C, các dị bản hớng sự vật
tạo ra việc chuyển nhịp nhàng từ ngôn ngữ cấp cao, vạn năng đợc sử dụng rộng rãi này.
Smalltalk là một ngôn ngữ hớng đối tợng nền tảng, ban đầu đợc phát triển vào đầu những năm 1970
để thám hiểm các khái niệm hớng đối tợng. Ngày nay các bản Smalltalk đã có trên mọi máy tính, mặc dầu việc sử
dụng ngôn ngữ này cho việc phát triển các sản phẩm và hệ thống mang tính công nghiệp bị hạn chế.
Eiffel là một trong những ngôn ngữ hớng đối tợng mới đủ mạnh cho ứng dụng công nghiệp. Giống
nh các dị bản của C và Smalltalk, Eiffel cũng đa ra sự hỗ trợ trực tiếp cho các định nghĩa lớp, kế thừa, bao bọc và
truyền thông báo.
+Các ngôn ngữ chuyên dụng: Các ngôn ngữ chuyên dụng đợc đặc trng bởi các dạng
cú pháp bất thờng đã đợc đặc biệt thiết kế cho một ứng dụng riêng. Trong hàng trăm ngôn ngữ
chuyên dụng đang đợc dùng, có một số các ngôn ngữ phổ biến trong kĩ nghệ phần mềm là: LISP,
PROLOG, APL và FORTH.
LISP là một ngôn ngữ đặc biệt thích hợp cho thao tác kí hiệu và xử lý danh sách hay gặp trong các bài
toán tổ hợp. Đợc dùng gần nh riêng cho cộng đồng trí tuệ nhân tạo, ngôn ngữ này đặc biệt thích hợp cho việc chứng
minh định lí, tìm kiếm theo cây, và các hoạt động giải quyết vấn đề khác. Các chơng trình con đợc cài đặt nh các

hàm dùng đệ qui rất nhiều. Vì mỗi hàm LISP đều là một thực thể riêng biệt, nên có thể đạt tới việc dùng lại bằng cách
tạo ra th viện các hàm nguyên thuỷ. Trong những năm gần đây, LIST đã đợc dùng để phát triển một phạm vi rộng các
hệ chuyên gia và trình biên dịch hệ chuyên gia.
PROLOG là một ngôn ngữ lập trình khác đã tìm đợc sự sử dụng rộng rãi trong xây dựng hệ chuyên
gia. Giống nh LISP, PROLOG đa ra các tính năng hỗ trợ cho biểu diễn tri thức. Bên trong ngôn ngữ này, một cấu trúc
dữ liệu thống nhất gọi là term đợc dùng để xây dựng mọi dữ liệu và mọi chơng trình. Mỗi chơng trình bao gồm một
tập các mệnh đề biểu diễn cho sự kiện, qui tắc và suy diễn. Cả LIST và PROLOG đều đặc biệt tuân theo các vấn đề xử lý
đối tợng và mối quan hệ của chúng. Bởi lí do này, một số ngời coi LIST và PROLOG nh các ngôn ngữ hớng đối
tợng. Bên cạnh đó, bản chất hớng đối tợng của LIST và PROLOG làm cho mỗi ngôn ngữ đều có thể đợc áp dụng
bên trong hoàn cảnh của khuôn cảnh làm bản mẫu đối với kĩ nghệ phần mềm.
APL là một ngôn ngữ mạnh và cực kì chính xác để thao tác mảng và véc tơ. Ngôn ngữ này gần nh
không hỗ trợ cho các kết có cấu trúc hay định kiểu dữ liệu. APL đa ra một tập hợp phong phú các toán tử tính toán và
đã thu đợc một số nhỏ ngời khao khát giải quyết các bài toán toán học.
RORTH là một ngôn ngữ đợc thiết kế cho phát triển phần mềm bộ vi xử lí. Ngôn ngữ này hỗ trợ
cho định nghĩa các hàm do ngời dùng xác định đợc thực hiện theo cách thức hớng chồng (stack) để có hiệu quả về
tốc độ và bộ nhớ.

4.Ngôn ngữ thế hệ thứ t:
Trong toàn bộ lịch sử phát triển phần mềm, chúng ta đã có ý định phát sinh ra chơng
trình máy tính ở mức trừu tợng ngày càng cao. Các ngôn ngữ thế hệ thứ nhất làm việc ở mức tập
lệnh máy, mức trừu tợng thấp nhất có thể. Các ngôn ngữ lập trình thế hệ hai và ba đã nâng mức độ
biểu diễn chơng trình máy tính, nhng vẫn còn phải xác định thủ tục thuật toán chi tiết hoàn toàn
và phân biệt. Trong thập kỉ qua, ngôn ngữ thế hệ thứ t (4GL) đã nâng mức độ trừu tợng lên cao
hơn nữa.
Ngôn ngữ thế hệ thứ t, giống nh mọi ngôn ngữ nhân tạo khác, đều có chứa một cú
pháp phân biệt để biểu diễn điều khiển và cấu trúc dữ liệu. Một 4GL biểu thị những cấu trúc này ở
mức độ trừu tợng cao hơn bằng cách xoá bỏ yêu cầu xác định chi tiết thuật toán.
Các ngôn ngữ thế hệ bốn tổ hợp các đặc trng thủ tục và phi thủ tục. Tức là, ngôn ngữ có
khả năng cho phép ngời dùng xác định các điều kiện và hành động tơng ứng (thành phần thủ tục)
trong khi đồng thời cổ vũ ngời dùng chỉ ra kết quả mong muốn (thành phần phi thủ tục) và rồi áp

dụng tri thức chuyên lĩnh vực để điền các chi tiết thủ tục.

Martin giới thiệu những phạm trù đại thể của 4GL:
+Ngôn ngữ vấn đáp: Ngày nay, đại đa số các 4GL đều đã đợc phát triển để dùng kèm với các ứng dụng
CSDL. Những ngôn ngữ vấn đáp nh thế cho phép ngời dùng thao tác thông tin chứa trong CSDL có sẵn theo một cách
phức tạp. Một số ngôn ngữ vấn đáp yêu cầu một cú pháp phức tạp không đơn giản hơn (và trong một số trờng hợp còn
tồi hơn) ngôn ngữ thế hệ thứ ba.
+Bộ sinh chơng trình: Bộ sinh chơng trình biểu thị cho một lớp các 4GL khác, hơi phức tạp hơn. Thay vì

Chơng IV -
Nguyễn Quốc Toản- Nguyên văn Vỵ - Vu Đức Thi Lê Đình Phùng
98
dựa trên CSDL có sẵn nh một điểm tập trung, bộ sinh chơng trình cho phép ngời dùng tạo ra các chơng trình ngôn
ngữ thế hệ thứ ba hoàn chỉnh bằng cách dùng một vài câu lệnh cỡ lớn. Các ngôn ngữ lập trình mức rất cao này dùng rất
nhiều trừu tợng dữ liệu và thủ tục. Phần lớn các bộ sinh chơng trình ngày nay chỉ hoàn toàn tập trung vào các ứng
dụng hệ thông tin và sinh ra chơng trình trong COBOL.
+ Các 4GL khác: Mặc dầu ngôn ngữ vấn đáp và bộ sinh chơng trình là các 4GL thông dụng nhất song vẫn
tồn tại các phạm trù khác nh sau:
- Ngôn ngữ hỗ trợ quyết định: cho phép ngời không biết lập trìnhthực hiện nhiều cách phân tích cái gì
xảy ra nếu thay đổi từ mô hình trang tính hai chiều đơn giản cho tới các hệ thống mô hình thống kê phức tạp hay hệ
thống mô hình nghiên cứu tác nghiệp.
- Ngôn ngữ làm bản mẫu: đợc phát triển để trợ giúp cho việc tạo ra các bản mẫu bằng cách tạo điều kiện
thuận tiện cho việc tạo ra giao diện và đối thoại ngời dùng và đa ra một phơng tiện làm mô hình hoá dữ liệu.
- Các ngôn ngữ đặc tả hình thức : có thể đợc xem xét nh 4GL khi ngôn ngữ đó tạo ra phần mềm máy thực
hiện đợc .
- Các công cụ đợc dùng trong môi trờng máy tính cá nhân: cho phép ngời dùng lập trình ở mức trừu
tợng cao hơn những mức hiện có.


IV. 2.6 Các công cụ lập trình.

IV. 2.6.1 Công trình phần mềm có máy tính trợ giúp.
CASE là bốn chữ cái đầu của cụm từ tiếng Anh nghĩa là công trình phần mềm đợc trợ
giúp bởi máy tính. Hiện nay đã có rất nhiều công cụ CASE. Có hai cách để phân loại các công cụ
CASE:
i) Hớng hoạt động: dựa trên các hoạt động của quá trình nh: đặc tả yêu cầu, thiết kế,
thực hiện
ii) Hớng chức năng: dựa trên chức năng của các công cụ đó chứ không phải là dựa
trên các mục tiêu trợ giúp.

IV2.6.2 Môi trờng phát triển phần mềm.
A.Đại cơng
Một môi trờng phát triển phần mềm là một bộ các công cụ phần cứng và phần mềm
chúng đợc kết lại để trợ giúp cho việc sản sinh ra một hệ thống phần mềm trong một miền ứng
dụng chuyên biệt.
Có hai điểm quan trọng:
i) Môi trờng phát triển phần mềm có thể bao gồm các công cụ phần cứng.
ii) Môi trờng phát triển phần mềm thờng chuyên dụng hơn là khái quát.
Môi trờng phát triển phần mềm vận hành trên một hệ thống máy tính host (hoặc mạng) và
phần mềm đợc phát triển nhằm vào một máy tính mục tiêu. có vài lý do vì sao mô hình máy chủ
máy mục tiêu lại thích hợp nhất với môi trờng phát triển phần mềm:
i) Trong một số trờng hợp phần mềm ứng dụng đang đợc phát triển có thể là dành
cho một máy không có các tiện ích phát triển phần mềm.
ii) Máy mục tiêu có thể là hớng ứng dụng nó không thích hợp với các môi trờng phát
triển phần mềm.
iii) Máy mục tiêu có thể đợc dành cho việc vận hành một ứng dụng đặc biệt và nó phải
là có tính u tiên trên sự phát triển phần mềm (chẳng hạn nh hệ xử lý giao tác).
Ưu điểm của cách thức máy chủ - máy mục tiêu là các tiện ích và các thành phần cho ngời
phát triển dùng môi trờng đó không thể hợp tác với nhau trong hệ thống ứng dụng đợc phân phối.
Có thể phân loại các môi trờng phát triển phần mềm nh sau:
i)

Môi trờng lập trình: Trợ giúp cho lập trình, thử nghiệm, gỡ lỗi. Hạn chế việc xác
định yêu cầu, đặc tả, thiết kế phần mềm.
ii) Bàn thợ CASE : Đây là các môi trờng chủ yếu hớng về đặc tả phần mềm và thiết
kế. Nó thờng chỉ cung cấp một sự trợ giúp lập trình thô sơ (chẳng hạn các ngôn ngữ
lập trình thế hệ thứ t ). Nó thờng thích hợp với các máy tính cá nhân và kết hợp với

Chơng IV -
Nguyễn Quốc Toản- Nguyên văn Vỵ - Vu Đức Thi Lê Đình Phùng
99
các môi trờng lập trình.
iii) Môi trờng công trình phần mềm: Nó trợ giúp sản sinh ra các hệ thống lớn, thọ mà
chi phí cho việc bảo trì còn vợt quá chi phí phát triển và đợc sản sinh ra bởi một
đội chứ không phải là một ngời lập trình riêng rẽ. Nó trợ giúp cho tất cả mọi hoạt
động phát triển và bảo trì.
Thực tế biên giới giữa các loại đó không rõ ràng.

B.Các môi trờng lập trình.
Các môi trờng lập trình có thể đợc nhóm lại thành các lớp sau:
i) Các môi trờngmục đích khái quát.
ii) Các môi trờng hớng ngôn ngữ.
Môi trờng lập trình có thể có các công cụ sau:
i) Phần mềm giao tiếp máy chủ máy mục tiêu.
ii) Phần mềm bắt chớc máy mục tiêu.
iii) Các bộ biên dịch chéo.
iv) Các công cụ thử nghiệm và gỡ lỗi.
v) Các công cụ quản lý cấu hình.
vi) Các công cụ giao tiếp.

C.Bàn thợ CASE
Các thành phần điển hình của bàn thợ CASE là:

i) Hệ soạn thảo biểu đồ.
ii) Các tiện ích phân tích thiết kế và kiểm tra.
iii) Các tiện ích ngôn ngữ hỏi.
iv) Các tiện ích từ điển dữ liệu.
v) Các tiện ích sinh ra báo cáo.
vi) Các công cụ tạo dạng cho phép việc định dạng màn hình và t liệu là đợc đặc tả.
vii) Các tiện ích xuất nhập khẩu.
viii) Trợ giúp các bộ sinh mã cốt tự động từ thiết kế có trong kho trung tâm.
Các hệ bàn thợ CASE thờng chủ yếu dùng để phát triển các hệ thống xử lý dữ liệu. Có ngời
đã minh định một số các khiếm khuyết của bàn thợ CASE nh sau:
i) Nó không tích hợp đợc với các công cụ chuẩn bị t liệu khác. Tiện ích xuất nhập
thờng là gắn với văn bản ASCII.
ii) Thiếu chuẩn hoá, trao đổi thông tin giữa các bàn thợ khác nhau là khó khăn hoặc
không thể.
iii) Thiếu tiện ích cho phép một phơng pháp kết nối vào một ứng dụng hoặc một lớp
ứng dụng.
iv) Tiện ích để tạo ra tài liệu chất lợng cao thiếu phổ quát.
v) Tiện ích lập biểu đồ là chậm chạp.

IV.3.Phong cách lập trình

Phong cách lập trình bao hàm một triết lí về lập trình nhấn mạnh tới tính đơn giản và rõ ràng.
Các yếu tố của phong cách bao gồm: tài liệu (mức chơng trình gốc) bên trong, phơng pháp khai
báo dữ liệu, cách tiếp cận tới việc xây dựng câu lệnh và các kĩ thuật vào/ra.

IV.3.1.Tài liệu chơng trình
Tài liệu bên trong của chơng trình gốc bắt đầu với việc chọn lựa các tên gọi định danh (biến và
nhãn), tiếp tục với vị trí và thành phần của việc chú thích, và kết luận với cách tổ chức trực quan của

Chơng IV -

Nguyễn Quốc Toản- Nguyên văn Vỵ - Vu Đức Thi Lê Đình Phùng
100
chơng trình.
Việc lựa chọn các tên gọi định danh có nghĩa chính là điều chủ chốt cho việc hiểu chơng trình.
Những ngôn ngữ giới hạn tên biến hay nhãn chỉ trong vài kí tự tự nó đã mang nghĩa mơ hồ. Cho dù
một chơng trình nhỏ thì một tên gọi có nghĩa cũng làm tăng tính dễ hiểu. Theo ngôn từ của mô
hình cú pháp/ngữ nghĩa tên có ý nghĩa làm đơn giản hoá việc chuyển đổi từ cú pháp chơng trình
sang cấu trúc ngữ nghĩa bên trong.
Một điều rõ ràng là: phần mềm phải chứa tài liệu bên trong. Lời chú thích cung cấp cho ngời
phát triển một ý nghĩa truyền thông với các độc giả khác về chơng trình gốc. Lời chú thích có thể
cung cấp một hớng dẫn rõ rệt để hiểu trong pha cuối cùng của kĩ nghệ phần mềm-bảo trì.
Có nhiều hớng dẫn đã đợc đề nghị cho việc viết lời chú thích. Các chú thích mở đầu và chú
thích chức năng là hai phạm trù đòi hỏi cách tiếp cận có hơi khác.
+Lời chú thích mở đầu nên xuất hiện ở ngay đầu của mọi modul. Định dạng cho lời chú thích
nh thế là:
1. Một phát biểu về mục đích chỉ rõ chức năng mô đun.
2. Mô tả giao diện bao gồm:
a) Một mẫu dãy lời gọi.
b) Mô tả về mọi đối tợng.
c) Danh sách tất cả các mô đun thuộc cấp.
3. Thảo luận về dữ liệu thích hợp (nh các biến quan trọng và những hạn chế, giới hạn về cách
dùng chúng) và các thông tin quan trọng khác.
4. Lịch sử phát triển bao gồm:
a) Tên ngời thiết kế modul (tác giả).
b) Tên ngời xét duyệt (kiểm toán) và ngày tháng.
c) Ngày tháng sửa đổi và mô tả sửa đổi.
+Các chú thích chức năng đợc nhúng vào bên trong thân của chơng trình gốc và đợc dùng
để mô tả cho các hàm xử lý. Bên cạnh đó, lời chú thích mô tả nên :
Mô tả các khối chơng trình thay vì chú thích cho từng dòng.
Dùng dòng trống hay tụt lề để cho lời chú thích có thể đợc phân biệt với chơng trình.

Phải đúng đắn: một lời chú thích không đúng hay gây ra hiểu sai thì còn tồi tệ hơn là
không có chú thích nào cả.
Với những tên gọi tợng tr
ng đúng đắn và việc chú thích tốt, việc làm tài liệu bên trong
thích hợp sẽ đợc bảo đảm.
Khi một thiết kế thủ tục chi tiết đợc biểu diễn bằng cách dùng một ngôn ngữ thiết kế
chơng trình thì tài liệu thiết kế có thể đợc nhúng trực tiếp vào trong văn bản chơng trình gốc nh
những câu chú thích. Kĩ thuật này đặc biệt có ích khi việc làm tài liệu đợc thực hiện trong hợp ngữ
và giúp đảm bảo rằng cả chơng trình và thiết kế sẽ đợc bảo trì khi những thay đổi đợc thực hiện
cho cả hai.
Dạng chơng trình gốc nh nó xuất hiện trong bản in là một đóng góp quan trọng cho
tính dễ đọc. Việc tụt lề chơng trình gốc chỉ ra kết cấu và khối logic của chơng trình sao cho những
thuộc tính này là thấy đợc so với lề bên trái. Giống nh việc chú thích, cách tiếp cận tốt nhất tới
việc tụt lề là nên để mở cho tranh luận. Việc tụt lề thủ công có thể trở nên phức tạp khi có sự sửa đổi
chơng trình và kinh nghiệm chỉ ra rằng khi đã tích luỹ đủ hiểu biết thì sẽ tăng cờng đợc việc để
lề cho khớp. Có lẽ cách tiếp cận tốt nhất là dùng bộ định dạng chơng trình tự động (nh công cụ
CASE) sẽ đặt đúng việc tụt lề cho chơng trình gốc. Bằng cách xoá bỏ đi gánh nặng của việc làm tụt
lề cho ngời lập trình, có thể cải thiện khuôn dạng chơng trình với tơng đối ít công sức.

IV.3.2.Khai báo dữ liệu
Độ phức tạp và việc tổ chức cấu trúc dữ liệu đợc xác định trong bớc thiết kế. Phong cách
khai báo dữ liệu đợc thiết lập khi chơng trình đợc sinh ra. Một số hớng dẫn tơng đối đơn giản

Chơng IV -
Nguyễn Quốc Toản- Nguyên văn Vỵ - Vu Đức Thi Lê Đình Phùng
101
có thể đợc lập ra để làm cho dữ liệu đợc dễ hiểu hơn và đơn giản hơn khi bảo trì.
Thứ tự khai báo dữ liệu nên đợc chuẩn hoá cho dù ngôn ngữ lập trình không có yêu cầu bắt
buộc nào về điều đó. Chẳng hạn,thứ tự khai báo cho một mô đun FOTRAN có thể là:
1. Mọi khai báo tờng minh (để có chất lợng cao, mọi biến đều nên khai báo):

INTEGER,REAL,DOUBLE PRECISION,
2. Mọi khối dữ liệu toàn cục: COMMON/tên khối/
3. Mọi mảng cục bộ: DIMENSION tên mảng và chiều
4. Mọi khai báo tệp: DEFINE FILE,OPEN,CLOSE
Thứ tự tạo ra các thuộc tính để dễ tìm, cho phép xúc tiến kiểm thử ,gỡ lỗi và bảo trì.
Khi có nhiều tên biến đợc khai báo trong một câu lệnh thì việc sắp xếp theo trật tự chữ cái
cho các tên gọi đó cũng có giá trị. Tơng tự, dữ liệu toàn cục có nhãn (nh khối chung trong
FOTRAN) cũng nên đợc lập thứ tự theo bảng chữ.
Nếu thiết kế có mô tả trớc cấu trúc dữ liệu phức tạp thì nên dùng việc chú thích những điểm
đặc thù cố hữu trong việc cài đặt ngôn ngữ lập trình. Chẳng hạn, cấu trúc dữ liệu danh sách móc nối
trong C hay kiểu dữ liệu ngời dùng xác định trong PASCAL có thể yêu cầu tài liệu bổ sung có chứa
trong lời chú thích của nó.

IV.3.3.Xây dựng câu lệnh
Việc xây dựng luồng logic phần mềm đợc thiết lập trong khi thiết kế. Việc xây dựng từng
câu lệnh tuy nhiên lại là một phần của bớc lập trình. Việc xây dựng câu lệnh nên tuân theo một qui
tắc quan trọng hơn cả: mỗi câu lệnh nên đơn giản và trực tiếp; chơng trình không nên bị xoắn xít
để đạt tính hiệu quả.
Nhiều ngôn ngữ lập trình cho phép nhiều câu lệnh trên một dòng.Khía cạnh tiết kiệm không
gian của tình năng này khó mà biện minh bởi tính khó đọc nảy sinh.
Cấu trúc chu trình và các phép toán điều kiện đợc chứa trong đoạn trên đều bị che lấp bởi
cách xây dựng nhiều câu lệnh trên một dòng.
Cách xây dựng câu lệnh đơn và việc tụt lề minh hoạ cho các đặc trng logic và chức năng
của đoạn này. Các câu lệnh chơng trình gốc riêng lẻ có thể đợc đơn giản hoá bởi:
Việc tránh dùng các phép kiểm tra điều kiện phức tạp
Khử bỏ các phép kiểm tra điều kiện phủ định
Tránh lồng nhau nhiều giữa các điều kiện hay chu trình
Dùng dấu ngoặc để làm sáng tỏ các biểu thức logic hay số học
Dùng dấu cách và/ hoặc các kí hiệu dễ đọc để làm sáng tỏ nội dung câu lệnh
Chỉ dùng các tính năng chuẩn ANSI

Suy nghĩ: Liệu ta có thể hiểu đợc điều này nếu ta không là ngời lập trình cho nó không ?
Từng h
ớng dẫn trên đều cố gắng giữ cho đơn giản

IV.3.4.Vào/ra
Phong cách vào và ra đợc thiết lập trong khi phân tích thiết kế yêu cầu phần mềm, không
phải khi lập trình. Tuy nhiên, cách thức mà vào/ ra đợc cài đặt có thể là đặc trng xác định việc
cộng đồng ngời sử dụng chấp nhận hệ thống. Phong cách vào và ra sẽ thay đổi theo mức độ tơng
tác con ngời. Với vào/ra theo lô thì cách tổ chức cái vào lôgic, kiểm tra lỗi vào/ra có nghĩa, phục
hồi lỗi vào/ra tốt và định dạng báo cáo ra hợp lý là những đặc trng mong muốn.Với vào/ra tơng
tác, một sơ đồ đa vào có hớng dẫn, đơn giản, việc kiểm tra lỗi kỹ lỡng và phục hồi, cái ra cho
con ngời và sự nhất quán của định dạng vào ra trở thành mối quan tâm chủ yếu.
Bất kể tới bản chất theo lô hay tơng tác của phần mềm, một số hớng dẫn phong cách vào
/ra nên đợc xét tới trongthiết kế và lập trình:
Làm hợp lệ mọi cái vào
Kiểm tra sự tin cậy của các tổ hợp khoản mục vào quan trọng.

Chơng IV -
Nguyễn Quốc Toản- Nguyên văn Vỵ - Vu Đức Thi Lê Đình Phùng
102
Giữ cho định dạng cái vào đơn giản.
Dùng các chỉ báo cuối dữ liệu thay vì yêu cầu ngời dùng xác định số các khoản mục.
Đặt nhãn cho yêu cầu cái vào tơng tác, xác định chọn lựa có sẵn hay gắn các giá trị
Giữ cho định dạng cái vào thống nhất khi một ngôn ngữ lập trình có các yêu cầu định dạng
nghiêm ngặt.
Phong cách của vào/ra bị ảnh hởng bởi nhiều đặc trng khác nh thiết bị vào/ra (nh kiểu
thiết bị cuối hay trạm làm việc, thiết bị đồ hoạ máy tính, chuột v.v ), độ phức tạp của ngời dùng,
và môi trờng truyền thống.

IV.4.Tính hiệu quả


Trong hệ thống kĩ nghệ tốt, có một khuynh hớng tự nhiên để dùng các tài nguyên chủ chốt
một cách hiệu quả. Các chu trình bộ xử lí và vị trí bộ nhớ thờng đợc coi nh các tài nguyên chủ
chốt. Thứ nhất, tính hiệu quả là một yêu cầu hoàn thiện và do đó nên đợc thiết lập trong phân tích
yêu cầu phần mềm. Thứ hai là tính hiệu quả đợc cải thiện với thiết kế tốt. Thứ ba là tính hiệu quả
của chơng trình và tính đơn giản của chơng trình đi đôi với nhau. Nói chung, không nên gạt bỏ
tính rõ ràng, dễ đọc hay tính đúng đắn chỉ để có đợc sự cải thiện nho nhỏ về tính hiệu quả.

IV.4.1.Kỹ thuật lập trình hớng hiệu quả
Lập trình là một nghề thủ công. Nó phụ thuộc vào kĩ xảo cá nhân, sự chú ý đến các chi
tiết và kiến thức về việc làm nh thế nào để sử dụng các công cụ sẵn có theo cách thức tốt nhất.
Trong phần này chỉ tập trung vào một vài kĩ thuật chuyên biệt đợc dùng nhằm đạt đợc một hệ
thống tin cậy đợc, chuyển đợc và dùng lại đợc các thành phần.
Nhu cầu các hệ thống đáng tin là đang tăng lên hiển nhiên là vì các hệ thống máy tính đã
lan khắp nơi. Hiện thời có hai kĩ thuật để viết các chơng trình đáng tin: tránh lỗi và thứ lỗi.

A) Tránh lỗi:
Tất cả các kĩ s phần mềm hẳn đều muốn làm ra các phần mềm không có lỗi. Một
quá trình phát triển chỉ dựa vào việc phát hiện lỗi và khử lỗi chứ không để ý đến tránh lỗi là một qúa
trình cha thật tốt.
Phần mềm không có lỗi nói ở đây là phần mềm tuân theo đúng đặc tả. Nói chung, nó có
thể có lỗi trong đặc tả hoặc có thể không phản ánh đúng các nhu cầu của ngời sử dụng. Vậy là
phần mềm không có lỗi không nhất thiết là các phần mềm luôn luôn hành xử nh ngời dùng dự
đoán.

Chi phí






Số lỗi còn lại.
Hình 13: Chi phí tính theo số lỗi còn lại.

Việc phát triển phần mềm không có lỗi đòi hỏi chi phí nhiều. Khi mà một số lỗi đã đợc
tháo khỏi chơng trình thì giá cả cho việc tìm và tháo các lỗi còn lại có xu hớng tăng theo hàm số
mũ. Do đó một tổ chức có thể quyết định chấp nhận một vài lỗi còn lu lại. Tính về mặt giá cả thì
thà rằng chịu tiền chi trả cho các phí tổn của hệ thống do các lỗi đó gây ra còn hơn là đi phát hiện và
tháo gỡ các lỗi đó trớc khi phân phối.

Chơng IV -
Nguyễn Quốc Toản- Nguyên văn Vỵ - Vu Đức Thi Lê Đình Phùng
103
Tránh lỗi và phát triển phần mềm vô lỗi dựa trên:
i) Sản phẩm của một đặc tả hệ thống chính xác.
ii) Chấp nhận một cách tiếp cận thiết kế phần mềm dựa trên việc che dấu thông tin và
bao gói thông tin.
iii) Tăng cờng duyệt lại trong quá trình phát triển và thẩm định hệ thống phần mềm.
iv) Chấp nhận triết lý chất lợng tổ chức: chất lợng là bánh lái của quá trình phần mềm.
v) Việc lập kế hoạch cẩn thận cho việc thử nghiệm hệ thống để trng ra các lỗi mà các
lỗi này cha đợc phát hiện trong quá trình duyệt lại và để định lợng độ tin cậy của
hệ thống.

Có hai quan tâm lớn hỗ trợ tránh lỗi, đó là:


Lập trình có cấu trúc
Thuật ngữ này đợc đặt ra từ cuối những năm 60 và có nghĩa là lập trình mà không
dùng goto, lập trình chỉ dùng các vòng lặp while và các phát biểu if để xây dựng điều khiển và trong
thiết kế thì dùng cách tiếp cận trên- xuống. Việc thừa nhận lập trình có cấu trúc là quan trọng bởi vì

nó là bớc đầu tiên bớc từ cách tiếp cận không khuôn phép tới phát triển phần mềm.
Lập trình có cấu trúc buộc ngời lập trình phải nghĩ cẩn thận về chơng trình của họ,
và vì vậy nó ít tạo ra sai lầm trong khi phát triển. Lập trình có cấu trúc làm cho chơng trình có thể
đợc đọc một cách tuần tự và do đó dễ hiểu và dễ thanh tra. Tuy nhiên nó chỉ là bớc đầu tiên trong
việc lập trình nhằm đạt độ tin cậy tốt. Năm 1968 Dijjkstra đã nhận thấy rằng phát biểu goto là một
cấu trúc lập trình hay sai. Có một vài cấu trúc khác cũng thế, chúng hay dẫn tới các lỗi trong hệ
thống:
i) Các số thực dấu chấm động.
ii) Các con trỏ.
iii) Song song.
iv) Đệ quy.
v) Các ngắt.
Các cấu trúc này có ích, nhng ngời lập trình nên dùng chúng một cách cẩn thận.

Phân quyền truy cập dữ liệu:
Nguyên lý an ninh đợc thừa nhận bởi các tổ chức vũ trang là nguyên lý nhu cầu để
biết. Chỉ có các cá nhân có nhu cầu biết một mẩu thông tin nào đó mới đợc tiến hành các nhiệm vụ
cho các thông tin đó. Các thông tin không trực tiếp liên quan đến công việc của họ thì phải bị khớc
từ.
Khi lập trình ngời ta cũng tuân theo một nguyên lý tơng tự cho việc truy cập dữ liệu hệ
thống. Mỗi thành phần chơng trình chỉ đợc phép truy cập đến dữ liệu nào cần thiết để thực hiện
chức năng của nó.
Ưu điểm của việc che dấu thông tin là các thông tin bị che dấu không thể bị sập đổ bởi
các thành phần chơng trình mà đợc xem rằng không dùng thông tin đó. Biểu diễn dữ liệu có thể
đợc thay đổi mà không phải thay đổi các thành phần khác có sử dụng thông tin đó.

B) Thứ lỗi
Ngay với một hệ vô lỗi thì vẫn cần một tiện ích thứ lỗi: đó là vì có thể có các lỗi đặc tả. Một
tiện ích thứ lỗi là cần thiết cho một hệ thống đáng tin.
Có bốn hoạt động cần phải tiến hành nếu hệ thống là thứ lỗi:

i)
Phát hiện lỗi.
ii) Định ra mức độ thiệt hại.
iii) Hồi phục sau khi gặp lỗi. Hệ thống phải hồi phục về trạng thái mà nó biết là an toàn.

Chơng IV -
Nguyễn Quốc Toản- Nguyên văn Vỵ - Vu Đức Thi Lê Đình Phùng
104
Cũng có thể là chỉnh lý trạng thái bị huỷ hoại (hồi phục tiến), cũng có thể là lui về một trạng thái
trớc mà an toàn (hồi phục lùi).
iv) Chữa lỗi: Cải tiến hệ thống để cho lỗi đó không xuất hiện nữa. trong nhiều trờng
hợp sự thất bại của phần mềm là tàng hình và gây ra bởi một tổ hợp của thông tin vào.

C) Xử lý bất thờng
Một sai lầm nào đó hoặc một sự cố bất ngờ xuất hiện đợc gọi là một bất thờng. Các bất
thờng có thể do phần cứng cũng có thể do phần mềm. Khi mà một bất thờng không đợc dự đoán
thì bộ điều khiển sẽ chuyển cho cơ chế xử lý hệ thống bất thờng. Nếu một bất thờng đã đợc dự
đoán thì mã phải baogồm cả việc phát hiện và xử lý bất thờng đó.
Hầu hết các ngôn ngữ lập trình là không có các tiện ích để phát hiện và xử lý bất thờng.
Các bất thờng có thể đợc ghi lại bằng cách dùng một biến Bool nhằm chỉ ra rằng có một bất
thờng đã xuất hiện.

D) Lập trình phòng thủ
Lập trình phòng thủ là cách phát triển chơng trình mà ngời lập trình giả định rằng các
mâu thuẫn hoặc các lỗi cha đợc phát hiện có thể tồn tại trong chơng trình. Phải có phần mềm
kiểm tra trạng thái hệ thống sau khi biến đổi và phải đảm bảo rằng sự biến đổi trạng thái là kiên
định. Nếu phát hiện một mâu thuẫn thì việc biến đổi trạng thái là phải rút lại và trạng thái phải trở về
trạng thái đúng đắn trớc đó.
Lập trình phòng thủ là một cách thứ lỗi, mà đợc tiến hành không cần bộ điều khiển thứ
lỗi. Về cơ bản quá trình vẫn là: phát hiện lỗi, đánh giá lỗi và phục hồi sau lỗi.

Nói chung một lỗi gây ra một sự sụp đổ trạng thái: các biến trạng thái đợc gán các trị
không hợp luật. Ngôn ngữ lập trình nh Ada cho phép phát hiện ra các lỗi đó ngay trong thời gian
biên dịch. Tuy nhiên việc kiểm tra biên dịch chỉ hạn chế cho các giá trị tĩnh và một vài phép kiểm
tra thời gian thực là không thể tránh đợc. Một cách để phát hiện lỗi trong chơng trình Ada là dùng
cơ chế xử lý bất thờng kết hợp với đặc tả miền trị.
Hồi phục lỗi là một quá trình cải biên không gian trạng thái của hệ thống sao cho hiệu
ứng của lỗi là nhỏ nhất và hệ thống có thể tiếp tục vận hành, có lẽ là trong một mức suy giảm. Hồi
phục tiến liên quan đến việc cố gắng chỉnh lại trạng thái hệ thống. Hồi phục lùi liên quan đến việc
lu trạng thái của hệ thống ở một trạng thái đúng đã biết.
Hồi phục tiến thờng là một chuyên biệt ứng dụng. Có hai tình thế chung mà khi đó hồi
phục tiến có thể thành công:
1) Khi dữ liệu mã bị sụp. Việc sử dụng kỹ thuật mã hoá thích hợp bằng cách thêm các
dữ liệu d thừa vào dữ liệu cho phép sửa sai khi phát hiện lỗi.
2) Khi cấu trúc nối bị sụp. Nếu các con trỏ tiến và lùi đã có trong cấu trúc dữ liệu thì
cấu trúc đó có thể tái tạo nếu nh còn đủ các con trỏ cha bị sụp. Kỹ thuật này thờng đợc dùng
cho việc sửa chữa hệ thống tệp và cơ sở dữ liệu.
Hồi phục lùi là một kỹ thuật đơn giản liên quan đến việc duy trì các chi tiết của trạng thái
an toàn và cất giữ trạng thái đó khi mà sai lầm đã bị phát hiện. Hầu hết các hệ quản trị cơ sở dữ liệu
đều có bộ hồi phục lỗi. CSDL chỉ cập nhật dữ liệu một khi giao dịch đã hoàn tất và không phát hiện
đợc vấn đề gì. Nếu giao dịch thất bại thì CSDL không đợc cập nhật.
Một kỹ thuật khác là thiết lập các điểm kiểm tra thờng kỳ mà chúng là các bản sao của
trạng thái hệ thống. Khi mà một lỗi đợc phát hiện thì trạng thái an toàn đó đợc tái lu kho từ điểm
kiểm tra gần nhất.
Trờng hợp hệ thống dính líu tới nhiều quá trình hợp tác thì dãy các giao tiếp có thể là
các điểm kiểm tra của các quá trình đó không đồng bộ và để hồi phục thì mỗi quá trình phải trở lại
trạng thái ban đầu của nó.


Chơng IV -
Nguyễn Quốc Toản- Nguyên văn Vỵ - Vu Đức Thi Lê Đình Phùng

105
E) Sử dụng lại
Một đặc trng của công trình học là sử dụng cách tiếp cận thiết kế hệ thống mà nó sử
dụng tối đa các thành phần đã tồn tại. Ngời kỹ s thiết kế không đặc tả một thiết kế mà trong đó
mỗi thành phần đã đợc chế tạo nhng dựa vào thiết kế các thành phần đã đợc nghiên cứu hoặc thử
nghiệm trong các hệ thống khác.
Cha có một cơ sở chung nào về việc dùng lại các thành phần phần mềm với t liệu đợc
phổ biến rộng rãi đợc dùng để thiết kế phần mềm. Tuy vậy, chúng ta cần quan tâm đến những vấn
đề sau đây:
Phân loại thành phần dùng lại đợc
i) Các hệ ứng dụng.
ii) Các hệ con. Thí dụ hệ đọ mẫu đợc phát triển nh là một phần của hệ xử lý văn bản
có thể đợc dùng lại trong một hệ quản trị cơ sở dữ liệu.
iii) Các mô đun hoặc các đối tợng.
iv) Các hàm.

Phát triển phần mềm để dùng lại đợc
Việc sử dụng lại một cách hệ thống đòi hỏi một cơ sở t liệu đợc xếp theo danh mục của
các thành phần dùng lại đợc. Quan niệm sai lầm là các thành phần này đã sẵn có trong các hệ đang
tồn tại và một th viện các thành phần có thể đợc tạo ra một cách kinh tế bằng cách trích chúng ra
và viết t liệu cho chúng.
Sự thật các thành phần đợc tạo ra nh là một phần của một ứng dụng là không chắc sẽ dùng
lại đợc. Các thành phần này hớng về phục vụ các yêu cầu của hệ thống mà thành phần ấy thuộc
về. Để dùng lại đợc một cách có hiệu quả, nó phải đợc sinh ra để thoả mãn một phổ rộng các yêu
cầu.
Việc phát triển các thành phần khái quát là đắt hơn việc phát triển các thành phần cho một
mục đích chuyên biệt và do đó nó làm tăng chi phí dự án.
Để phát triển các thành phần dùng lại đợc cần phải có một quyết định chính sách có tổ chức
là tăng chi phí ngắn hạn giúp cho các mục tiêu lâu dài. Chính tổ chức chứ không phải cá nhân các
nhà quản lý phải ra quyết định nh vậy. Các nhà quản lý cấp trên th

ờng miễn cỡng ủng hộ chi phí
để dùng laị vì các khó khăn trong định lợng các u điểm trong tơng lai của một th viện các thành
phần dùng lại đợc.
Để đánh giá độ dùng lại đợc cần phải đặt ra hai câu hỏi sau đây:
i) Thành phần này biểu diễn một sự khái quát lĩnh vực ứng dụng tốt nh thế nào?.
ii) Thành phần đã đợc viết ra có là khái quát và thích nghi đợc hay không ?.

Phát triển phần mềm có thành phần dùng lại đợc
Phát triển phần mềm có thành phần tái sử dụng là giảm đợc chi phí và ngoài ra còn có 5
u điểm nữa:
i) Độ tin cậy của hệ thống đợc tăng lên.
ii) Các rủi ro là giảm đi.
iii) Sử dụng hiệu quả các chuyên gia ứng dụng.
iv) Các chuẩn tổ chức có thể đợc bao gồm trong các thành phần dùng lại đợc .
v) Thời gian phát triển phần mềm có thể đợc rút gọn.

IV.4.2.Độ tin cậy của phần mềm
A) Khái niệm về độ tin cậy:
Độ tin cậy của một hệ phần mềm là độ đo về mức độ tốt của các dịch vụ mà hệ cung
cấp cho máy tính.
Ngời dùng không xem rằng các dịch vụ là quan trọng nh nhau: chẳng hạn một hệ điều khiển

Chơng IV -
Nguyễn Quốc Toản- Nguyên văn Vỵ - Vu Đức Thi Lê Đình Phùng
106
máy bay có thể rất, rất hiếm thất bại. Nhng nếu chúng có thất bại gây ra tai nạn máy bay thì những
ngời bị nạn và các thân nhân ngời bị nạn không thể xem hệ đó là đáng tin.
Độ tin cậy là một đặc trng động của hệ thống, nó là một hàm của số các thất bại phần mềm.
Một thất bại phần mềm là một sự kiện thi hành mà khi đó phần mềm x
ử lý không nh ngời ta mong đợi. Chú ý rằng một thất bại phần mềm (failure) khác một h

hỏng (fault) phần mềm. H hỏng phần mềm là một đặc trng tĩnh, và nó sẽ gây ra thất bại phần
mềm khi mà mã lỗi đợc thi hành với một tập hợp đặc biệt các thông tin vào. Các h hỏng không
phải luôn luôn xuất đầu lộ diện, bởi vậy độ tin cậy phụ thuộc vào việc sử dụng hệ thống nh thế nào.
Không thể đa ra một phát biểu đơn giản và khái quát về độ tin cậy phần mềm.
Các h hỏng phần mềm không phải là các khuyết tật (defect) của chơng trình. Một hành xử bất
ngờ có thể xảy ra khi mà phần mềm phù hợp với các yêu cầu của nó, nhng mà chính các yêu cầu
đó lại không đầy đủ. Các sai sót trong các t liệu phần mềm cũng có thể dẫn đến các hành vi bất ngờ
mặc dầu rằng phần mềm không có khiếm khuyết.
Có công trình nghiên cứu đã chỉ ra rằng có thể rút bỏ 60% các khiếm khuyết mà chỉ cải thiện
đợc có 3% độ tin cậy. Cũng có ngời đã chú ý rằng nhiều khiếm khuyết trong sản phẩm chỉ là kết
quả của hàng trăm hoặc hàng nghìn tháng sử dụng.

B) Đo độ tin cậy:
Có một vài cách đo độ tin cậy nh sau:
1) Xác suất thất bại tính theo đòi hỏi.
2) Tỷ lệ xuất hiện thất bại.
3) Thời gian trung bình giữa hai thất bại kế tiếp nhau.
4) Độ đo mức sẵn sàng hoạt động của hệ.

C) Đặc tả độ tin cậy phần mềm.
Các bớc đặc tả độ tin cậy phần mềm là:
1) Phân tích hệ quả của các thất bại.
2) Chia các thất bại thành các nhóm khác nhau.
3) Thiết lập các yêu cầu về độ tin cậy bằng cách sử dụng các độ đo thích hợp cho từng loại.

D) Thử nghiệm tĩnh.
Mục tiêu chủ yếu của phần mềm tĩnh là xác định độ tin cậy của phần mềm chứ không phải
là xác định các h
hỏng phần mềm. Quá trình thử nghiệm tĩnh liên quan đến 4 bớc sau:
i) Xác định trắc đồ thao tác của phần mềm. Trắc đồ thao tác là một mẫu sử dụng phần

mềm và xác định mẫu đó liên quan đến việc phát hiện các lớp thông tin vào của
chơng trình và ớc tính xác suất của chúng.
ii) Chọn hoặc sinh ra một tập các dữ liệu thử tơng ứng với trắc đồ đó.
iii) áp dụng các trờng hợp thử chơng trình, ghi lại độ dài thời gian thi hành giữa mỗi cặp
thất bại quan sát đợc, thích hợp hơn là dùng thời gian thô, với đơn vị thời gian thích
hợp cho độ đo mức tin cậy.
iv) Tính toán độ đo mức tin cậy sau một số đáng kể (về mặt thông kê) các thất bại đã quan
sát đợc.

E) An toàn hệ thống.
Có những hệ thống mà thất bại của nó có thể gây ra một mối đe doạ tính mạng con
ngời. Ví dụ về hệ thống an toàn sinh mệnh nh vậy là hệ thống điều khiển máy bay. Có hai lớp
phần mềm an toàn sinh mệnh:
i) Các phần mềm an toàn sinh mệnh sơ cấp: là các phần mềm lồng nhúng trong một hệ
phần cứng dùng để điều khiển quá trình khác mà sự làm việc sai sót của nó có thể trực tiếp gây ra

Chơng IV -
Nguyễn Quốc Toản- Nguyên văn Vỵ - Vu Đức Thi Lê Đình Phùng
107
thơng vong hoặc phá huỷ môi trờng sống của con ngời.
ii) Các phần mềm an toàn sinh mệnh thứ cấp: là các phần mềm có thể gián tiếp gây ra
thơng vong. Ví dụ hệ thống phần mềm trợ giúp thiết kế kỹ thuật, hệ thống CSDL y tế liên quan đến
các chất độc bảng A.

F) Thử nghiệm khiếm khuyết.
Thử nghiệm chơng trình có hai mục đích: thứ nhất là chỉ ra rằng hệ thống là phù
hợp với các đặc tả của nó. Thứ hai là thực hành hệ thống theo một cách sao cho các khuyết tật đợc
phơi ra. Các thử nghiệm với mục đích thứ nhất chính là các thẩm định, nó là các thử nghiệm để chấp
nhận. Các thử nghiệm cho mục đích thứ hai lại khác hẳn: thử nghiệm thành công nhất là thử nghiệm
phơi ra đợc nhiều khuyết tật nhất. Các thử nghiệm có thể đợc phát triển song song với việc thiết

kế và thực hiện bởi những ngời không dính dáng tới việc thiết kế.

IV.4.3.Tính di chuyển đợc của hệ ứng dụng
Tốc độ thay đổi công nghệ phần cứng nhanh đến mức mà máy tính là bị lỗi thời trớc cá
chơng trình thi hành trên cái máy tính đó. Vậy là các hệ thống ứng dụng phải di chuyển đợc sang
các máy tính khác, trên môi trờng khác. Độ di chuyển đợc của một ứng dụng là tỷ lệ với khối
lợng công việc cần phải tiến hành để ứng dụng đó thi hành đợc trong một môi trờng mới. Tính di
chuyển đợc có hai khía cạnh:
-Tính vận chuyển: sự hoạt động của mã chơng trình và dữ liệu kết hợp đợc chuyển từ một
môi trờng này sang một môi trờng khác.
-Tính thích nghi; những thay đổi chơng trình cần thiết để chơng trình hoạt động trong một
môi trờng mới.

IV.4.4.Một vài hớng dẫn lập trình hớng hiệu quả

1.Tính hiệu quả chơng trình.
Tính hiệu quả của chơng trình gốc có liên hệ trực tiếp với tính hiệu quả của thuật toán
đợc xác định trong thiết kế chi tiết. Tuy nhiên, phong cách lập trình có thể có một tác động đến tốc
độ thực hiện và yêu cầu bộ nhớ. Tập hợp các hớng dẫn sau đây bao giờ cũng có thể áp dụng đợc
khi thiết kế chi tiết đ
ợc dịch thành chơng trình:
Đơn giản hoá các biểu thức số học và lôgic trớc khi đi vào lập trình.
Tính cẩn thận từng chu kì lồng nhau để xác định liệu các câu lệnh hay biểu thức có thể đợc
chuyển ra ngoài hay không.
Khi có thể, hãy tránh dùng mảng nhiều chiều
Khi có thể hãy tránh việc dùng con trỏ và danh sách phức tạp.
Dùng các phép toán số học nhanh.
Không trộn lẫn các kiểu dữ liệu, cho dù ngôn ngữ có cho phép điều đó.
Dùng các biểu thức số học và logic bất kì khi nào có thể đợc.


Nhiều trình biên dịch có tính năng tối u tự động sinh ra chơng trình hiệu quả bằng cách
dồn nén các biểu thức lặp,thực hiện tính chu trình,dùng số học nhanh và áp dụng các thuật toán có
hiệu quả liên quan khác. Với những ứng dụng trong đó tính hiệu quả có ý nghĩa quan trọng, những
trình biên dịch nh thế là công cụ lập trình không thể thiếu đợc.

2.Hiệu quả bộ nhớ
Tính hiệu quả bộ nhớ phải đợc tính vào đặc trng phân trang của hệ điều hành.Nói
chung, tính cục bộ của chơng trình hay việc bảo trì lĩnh vực chức năng qua các kết cấu có cấu trúc
là một phơng pháp tuyệt vời làm giảm việc phân trang và do đó làm tăng tính hiệu quả.

Chơng IV -
Nguyễn Quốc Toản- Nguyên văn Vỵ - Vu Đức Thi Lê Đình Phùng
108
Hạn chế bộ nhớ trong thế giới bộ vi xử lí nhúng là mối quan tâm rất thực tế,mặc dầu bộ
nhớ giá thấp, mật độ cao vẫn đang tiến hoá nhanh chóng. Nếu yêu cầu hệ thống cần tới bộ nhớ tối
thiểu (nh sản phẩm giá thấp, khối lợng lớn) thì trình biên dịch ngôn ngữ cấp cao phải đợc trù
tính cẩn thận với tính năng nén bộ nhớ, hay nh một phơng kế cuối cùng, có thể phải dùng tới hợp
ngữ.
Không giống nh nhiều đặc trng hệ thống khác phải trả giá lẫn nhau, các kĩ thuật cho
hiệu quả về thời gian thực hiện đôi khi có thể dẫn tới hiệu quả bộ nhớ. Chẳng hạn, giới hạn việc
dùng các mảng ba hay bốn chiều làm nảy sinh thuật toán thâm nhập phần tử đơn, thuật toán nhanh
và ngắn nhất. Lần nữa, chìa khoá cho tính hiệu quả bộ nhớ là giữ cho đơn giản.

3.Hiệu quả vào / ra.
Cái vào do ngời dùng cung cấp và cái ra đợc tạo ra cho ngời dùng là hiệu quả khi
thông tin có thể đợc cung cấp hay đợc hiêủ với một mức độ tiết kiệm nỗ lực trí tuệ.
Một số hớng dẫn đơn giản để tăng cờng hiệu quả vào/ra:
Số các yêu cầu vào/ra nên giữ mức tối thiểu
Mọi việc vào /ra nên qua bộ đệm để làm giảm phí tổn liên lạc.
Với bộ nhớ phụ (nh đĩa) nên lựa chọn và dùng phơng pháp thâm nhập đơn giản nhất chấp

nhận đợc.
Nên xếp khối vào/ra với các thiết bị bộ nhớ phụ.
Việc vào/ ra với thiết bị cuối hay máy in nên nhận diện các tính năng của thiết bị có thể cải
tiến chất lợng hay tốc độ.
Hãy nhớ rằng siêu hiệu quả của vào/ra là vô nghĩa nếu nó không đợc hiểu rõ.
Thiết kế vào/ra lập nên phong cách và cuối cùng chi phối tính hiệu quả. Những hớng
dẫn trình bày trên đây là áp dụng đợc cho cả các bớc thiết kế và lập trình cho tiến trình kĩ nghệ
phần mềm.

IV.5.Thẩm định và xác minh

IV.5.1 Đại cơng về việc thẩm định và xác minh
Xác minh và thẩm định một hệ phần mềm là quá trình liên tục xuyên suốt mọi giai đoạn
của quá trình phần mềm. Xác minh và thẩm định mang tính quá trình nhằm đảm bảo phần mềm thoả
mãn các yêu cầu của khách hàng.
Xác minh và thẩm định là một quá trình kéo dài suốt vòng đời. Nó bắt đầu khi duyệt xét
yêu cầu. Xác minh và thẩm định có hai mục tiêu:
i) Phát hiện các khuyết tật trong hệ thống.
ii) Đánh giá xem hệ thống có dùng đợc hay không ?.
Sự khác nhau giữa xác minh và thẩm định là:
i) Thẩm định: xét xem cái đợc xây dựng có là sản phẩm đúng không ?
ii) Xác minh: Xét xem cái đợc xây dựng có đúng là sản phẩm không ?
Nh vậy xác minh là kiểm tra xem chơng trình có phù hợp với đặc tả hay không. Còn thẩm
định là kiểm tra xem chơng trình có đợc nh mong đợi của ngời dùng hay không .
Có hai loại phép thử:

i) Phép thử thống kê: để phản ánh tần suất các input của ngời dùng thực và sau khi vận
hành máy có thể cho ra một đánh giá độ tin cậy thao tác của hệ thống.
ii) Phép thử khuyết tật: để bộc lộ các khuyết tật trong hệ thống.


IV.5.2 Sơ lợc về tiến trình thử nghiệm
*Quá trình thử nghiệm:
Trừ các hệ nhỏ, nói chung không nên thử hệ thống nguyên cả khối. Quá trình thử có thể chia

Chơng IV -
Nguyễn Quốc Toản- Nguyên văn Vỵ - Vu Đức Thi Lê Đình Phùng
109
làm 5 giai đoạn:
1) Thử đơn vị.
2) Thử modul ( chức năng ).
3) Thử hệ con.
4) Thử hệ thống.
5) Thử sau lng (alpha) và thử điều tra (beta).
*Kế hoạch thử nghiệm.
Thử hệ thống là rất đắt, đối với một vài hệ thời gian thực có các ràng buộc thời gian phức tạp
thì việc thử có thể ngốn hết khoảng nửa tổng chi phí phát triển. Vì thế mà phải lập kế hoạch thử và
khống chế chi phí thử.
Việc thử liên quan nhiều đến việc thiết lập ra các mẫu cho quá trình thử nhiều hơn là mô tả
các phép thử.
*Chiến lợc thử nghiệm.
Có các chiến lợc thử nh sau:
1) Thử từ - trên - xuống: nên dùng cho các phát triển từ - trên - xuống.
2) Thử từ dới lên: việc thử từ dới lên luôn luôn là cần thiết cho các thành phần hệ thống
mức thấp.
3) Thử luồn sợi: dùng cho các hệ thời gian thực.
4) Thử gay cấn (áp lực): cho những hệ thống có giới hạn tải, và phép thử tăng dần tải cho
tới khi hệ thống sập đổ để xác định độ chịu tải thực sự.

Tóm tắt


Bớc lập trình của kĩ nghệ phần mềm là một tiến trình dịch/chuyển hoá. Thiết kế chi tiết
đợc dịch sang một ngôn ngữ lập trình mà cuối cùng đợc biến đổi thành các lệnh mã máy thực hiện
đợc. Các đặc trng tâm lí và kĩ thuật của ngôn ngữ lập trình có ảnh hởng lớn đến quá trình dịch và
kiểm thử cũng nh bảo trì phần mềm. Các đặc trng này có thể đợc áp dụng vào ngôn ngữ lập trình
thuộc một trong 4 thế hệ ngôn ngữ.
Phong cách là một đặc tính quan trọng của chơng trình gốc và có thể xác định ra tính dễ
đọc của chơng trình.Các yếu tố của phong cách bao gồm việc làm tài liệu bên trong, phơng pháp
khai báo dữ liệu, thủ tục xây dựng câu lệnh, và kĩ thuật lập trình vào/ra.Trong mọi trờng hợp, tính
đơn giản và rõ ràng là các đặc trng chính. Một nhân tố của phong cách lập trình là thời gian thực
hiện và/hoặc tính hiệu quả bộ nhớ cần đạt tới. Mặc dầu tính hiệu quả có thể là yêu cầu cực kì quan
trọng, chúng ta nên nhớ rằng một chơng trình hiệu quả mà lại không dễ đọc thì cũng mang một
giá trị đáng hoài nghi.
Lập trình là cốt lõi của tiến trình phần mềm. Các bớc quan trọng chủ chốt phải hoàn
tất rớc lập trình nh phân tích, xác định yêu cầu và đặc tả thiết kế chi tiết.









? Củng cố


Chơng IV -
Nguyễn Quốc Toản- Nguyên văn Vỵ - Vu Đức Thi Lê Đình Phùng
110
1. Tóm lợc các đặc trng của ngôn ngữ lập trình?

2. Nền tảng của ngôn ngữ lập trình? (định kiểu dữ liệu , cơ chế chơng trình con, cấu trúc điều
khiển và cách tiếp cận hớng đối tợng)
3. Sơ lợc về các yếu tố trong phong cách lập trình?
4. Sơ lợc về kỹ thuật lập trình hớng hiệu quả?
5. Sơ lợc về những nội dung quan trọng về độ tin cậy phần mềm ?
6. Nêu ra một vài hớng dẫn lập trình hớng hiệu quả?
7. Mục tiêu, ý nghĩa, vai trò và nội dung của việc thẩm định và xác minh?
8. Sơ lợc về tiến trình thử nghiệm ?(quá trình, kế hoạch, chiến lợc)



×