ELSE
Sau đây là đoạn chương trình viết trên ngôn ngữ FORTRAN. Theo quy ước, chương trình FORTRAN được viết trên giấy mẫu có 80 cột. Từ cột 1 đến cột 5 dành cho nhãn các toán tử, từ cột 7 đến 72 dành cho toán tử.
Các lệnh in phải đi kèm với thông tin về cách in (ví dụ kênh 3 để nối máy in và nhãn của một toán tử FORMAT giải thích cách in, ví dụ F8.3 là in một số thực ở 8 vị trí trong đó dành cho phần lẻ sau dấu phảy 3 vị trí).
Bảng B.4. Chương trình viết trên FORTRAN IV
6 | 7 72 | 73 80 | |
DELTA = B*B - 4* A*C | |||
IF DELTA < 0 GOTO 10 | |||
X1 = (- B + SQRT(DELTA))/(2*A) | |||
X2 = (- B - SQRT(DELTA))/(2*A) | |||
WRITE (3,20) X1, X2 | |||
20 | FORMAT ('NGHIEM 1= ', F8.3, NGHIEM 2 = ', F8.3) | ||
GOTO 30 | |||
10 | WRITE(3,40) | ||
40 | FORMAT('VO NGHIEM') | ||
30 | ........................................... |
Có thể bạn quan tâm!
- Đoạn Mã Cấp Phát Theo Cơ Chế Stack
- Chuỗi Mã Đích Cho Phép Gán Chỉ Mục
- Trình biên dịch - 22
- Trình biên dịch - 24
Xem toàn bộ 200 trang tài liệu này.
Qua các ví dụ trên ta thấy ngôn ngữ thuật toán dễ sử dụng hơn nhiều so với hợp ngữ và ngôn ngữ máy. Ngày nay rất ít người phải sử dụng hợp ngữ và ngôn ngữ máy để phát triển phần mềm.
B.2. Quá trình thực hiện một chương trình với ngôn ngữ bậc cao
Cần nhắc lại rằng MTĐT chỉ làm việc trực tiếp với ngôn ngữ máy. Việc dịch một chương trình viết bằng ngôn ngữ bậc cao sang ngôn ngữ máy do một chương trình dịch (compiler) thực hiện. Chương trình dịch chính là một loại phần mềm thuộc lớp công cụ. Quá trình tạo ra một chương trình thực hiện được bao gồm những bước sau:
Soạn thảo chương trình nguồn. Có thể dùng các phần mềm soạn thảo văn bản để tạo ra văn bản chương trình nguồn.
Phân tích từ vựng (Lexical Analysis) và phân tích cú pháp (Syntax Analysis). Phân tích từ vựng để xây dựng danh sách các đối tượng của chương trình. Phân tích cú pháp có mục đích duyệt chương trình nguồn để phát hiện và thông báo các lỗi không đúng với quy ước của ngôn ngữ. Các lỗi này làm cho nghĩa của chương trình không rò và do đó không thể dịch đúng được. Ví dụ trong ngôn ngũ PASCAL ta viết dòng lệnh d := (a+ b)/e-f)+g. Khi đọc đến dấu ngoặc đóng thứ 2 sau f, ta sẽ không hiểu được nguời viết muốn tính gì và đương nhiên cũng không thể dịch được. Lý do làm cho dòng lệnh không rò nghĩa ở đây là thiếu một dấu ngoặc "(" ở phía trước, có thể là trước chữ e, cũng có thể trước chữ a. Những lỗi sai với quy ước của ngôn ngữ gọi là lỗi cú pháp. Quá trình phân tích cú pháp cũng tạo ra các thông tin cần thiết về cấu trúc của chương trình và các đối tượng sẽ dùng trong công việc dịch được mô ta tiếp theo đây. Trong quá trình phân tích cú pháp, danh mục các đối tượng cũng được xây dựng để còn sinh mã chương trình trong giai đoạn tiếp theo. Công việc này gọi là phân tích từ vựng.
Dịch (Compile). Nếu chương trình nguồn không có lỗi cú pháp thì việc dịch ra lệnh máy mới có thể tiến hành được. Thông thường việc phân tích cú pháp và dịch thường tiến hành xen kẽ. Kết quả sau giai đoạn dịch là những đoạn chương trình gọi là mô đun đối tượng (object module). Nói chung các mô đun đối tượng chưa đủ hoàn chỉnh để có thể thi hành được. Sau khi dịch có thể tối ưu mã. Một đoạn chương trình sau khi dịch có thể chuyển tải được các ý đồ của thuật giải nhưng chưa được đối ưu. Công đoạn tối ưu hoá có thể giúp tạo ra các mã hiệu quả hơn.
Liên kết (Link). Trên thực tế, một chương trình có thể có nhiều phần được dịch một cách độc lập. Ngoài ra rất nhiều công việc thường dùng đã được lập trình sẵn và được lưu trong các thư viện dưới dạng các mô đun đối tượng. Người lập trình chỉ cần viết yêu cầu sử dụng. Ví dụ trong PASCAL khi viết y := 3 + sin(x) thì chính đoạn chương trình tính sin được lập sẵn từ trước dưới dạng một mô đun đối tượng sẽ được ghép vào chương trình đích. Như vậy sau khi dịch để có một chương trình hoàn chỉnh cần phải liên kết các các mô đun đối tượng lại với nhau. Quá trình ghép nối các đoạn
chương trình của người sử dụng và các đoạn chương trình khác được lập từ trước gọi là
hợp nhất hoặc liên kết (link). Quá trình này cũng có thể gặp lỗi ví dụ không tìm thấy các đoạn chương trình được yêu cầu nối vào hoặc cấu trúc kết nối không phù hợp, ví dụ mô đun A thông báo chuyển cho mô đun B dữ liệu là một ký tự trong khi trong mô đun B lại yêu cầu nhận mọt số.
Thực hiện (run). Sau khi liên kết, ta được một chương trình có thể sẵn sàng thi hành trên máy. Trong quá trình thi hành trên máy vẫn có thể có lỗi gọi là lỗi thi hành (runtime error). Lỗi thi hành có thể có nguyên nhân từ thuật toán , cũng có thể có nguyên nhân do ta không thể hiện chính xác ý nghĩa hoặc không kiểm soát được đúng quá trình sinh ra hoặc biến đổi của các đối tượng. Các lỗi này gọi là lỗi ngữ nghĩa (semantic). Ví dụ dòng lệnh trong ngôn ngữ PASCAL a: = x/y nghĩa là a tính bằng thương của x và y thì không sai cú pháp nhưng khi thực hiện nếu y là 0 thì sẽ gây lỗi ngữ nghĩa. Lỗi thi hành còn có nguyên nhân là tình trạng xử lý cụ thể của máy. Ví dụ chương trình đòi in nhưng máy in không bật điện hoặc ghi đĩa nhưng đĩa bị hỏng.
Sơ đồ thực hiện một công việc sử dụng hợp ngữ hoặc ngôn ngữ bậc cao được minh hoạ trong hình B.1.Ta thấy rằng các bộ dịch hay chương trình liên kết chính là một loại phần mềm phát triển
Hình B.1. Sơ đồ thực hiện một công việc sử dụng hợp ngữ hoặc ngôn ngữ bậc cao
PHỤ LỤC C
THUẬT NGỮ TIẾNG ANH VÀ CHỮ VIẾT TẮT | |||
Abstract machine | máy tính trừu tượng | ||
Activation record | bảng ghi hoạt động | ||
Activation tree | cây hoạt động | ||
Actual parameter | thông số thực | ||
Adjacency | phương pháp truyền hàm | ||
Annotated parse tree | cây phân tích chú thích | ||
Array | mảng | ||
Assembler | hợp ngữ | ||
Assembly code | mã hợp ngữ | ||
Assembly language | hợp ngữ | ||
Attribute propagation | truyền thuộc tính | ||
Augment grammar | văn phạm | ||
Back end | thời kỳ sau | ||
Balanced construct | cấu trúc cân bằng | ||
Basic block | khối cơ bản | ||
Binary search | tìm kiếm nhị phân | ||
Blank | ký tự rỗng | ||
BNF(Backus-Naur Form) | ký pháp BNF |
từ dưới lên | |
Buffer pair | cặp bộ đệm |
Coercion | áp đặt toán tử |
Compiler time | thời gian dịch |
Compiler | trình biên dịch |
CFG | văn phạm phi ngữ cảnh |
Dag | đồ thị có hướng không lặp vòng |
Depth – first order | thứ tự đánh giá |
Depth – first traversals | chu trình theo chiều sâu |
Desciptor | bộ đặc tả |
DFA | Automat hữu hạn tất định |
Display | bảng tầm vực |
dynamic link | đường liên kết động |
edge | cạnh |
embedded | được nhúng |
false | sai |
flow graph | lưu đồ |
formal parameter | thông số hình thức |
frame | khung |
front end | thời kỳ trước |
Bottom –up
hàm | |
grouping of phases | nhóm các giai đoạn |
hash coding | mã hóa băm |
hashing symbol table | bảng danh biểu băm |
hashing function | hàm băm |
higher – level language | ngôn ngữ cấp cao |
LALR(LookAhead LR) | phương pháp LR nhìn trước ký tự nhập |
Lexeme beginning pointer | con trỏ chỉ ký tự đầu của trị từ vựng |
Lexical analysis | phân tích từ vựng |
Lexical unit | đơn vị từ vựng |
Loop | vòng lặp |
Machine language | ngôn ngữ máy |
Macro processing | xử lý macro |
NFA | Automat hữu hạn không tất định |
Other | khác |
Parse- tree method | phương pháp cây phân tích |
Parsing tree | cây phân tích |
Pattern | mẫu |
PNC | văn phạm phi ngữ cảnh |
Pointer | con trỏ |
function
toán tử sau 2 toán hạng | |
Postfix notation | ký hiệu hậu tố |
Program segment | đoạn chương trình |
Programming | lập trình |
Record | bản ghi |
Scope | tầm vực |
Source language | ngôn ngữ nguồn |
Stack | kiểu chồng |
State | trạng thái |
Symbol table | bảng danh biểu |
Syntactic tree | cây cú pháp |
Syntax-directed | trực tiếp cú pháp |
Target machine | máy đích |
Terminal symbol | ký hiệu kết thúc |
Topdown | từ trên xuống |
Translation | sự biên dịch |
Yacc | bộ sinh bộ phân tích cú pháp |
ident_token | tên (bắt đầu bằng chữ cái hoặc dấu gạch dưới, theo sau là chữ cái, chữ số hoặc dấu gạch dưới) |
Postfix expression
số nguyên | |
comment_token | chú thích (chú thích kiểu C – trong cặp /* comment */) |
begin_token | từ khóa begin |
end_token | từ khóa end |
int_token | từ khóa kiểu int |
var_token | từ khóa var (khai báo biến) |
procedure_token | từ khóa procedure (khai báo thủ tục) |
call_token | từ khóa call (gọi thủ tục) |
read_token | từ khóa read (đọc từ bàn phím) |
write_token | từ khóa write (viết ra màn hình) |
if_token | từ khóa if |
then_token | từ khóa then |
else_token | từ khóa else |
fi_token | từ khóa fi (kết thúc if) |
while_token | từ khóa while |
do_token | từ khóa do |
od_token | từ khóa od (kết thúc do) |
negate_token | toán tử neg |
absolute_token | toán tử abs |
num_token
dấu mở ngoặc | |
close_token | dấu đóng ngoặc |
list_token | dấu phẩy |
period_token | dấu chấm |
separator_token | dấu chấm phẩy |
becomes_token | dấu gán (=) |
plus_token | dấu cộng (+) |
minus_token | dấu trừ (-) |
times_token | dấu nhân (*) |
over_token | dấu chia (/) |
modulo_token | dấu lấy phần dư (%) |
equal_token | dấu bằng (==) |
not_equal_token | dấu khác (!=) |
less_than_token | dấu nhỏ hơn (<) |
less_or_equal_token | dấu nhỏ hơn hoặc bằng (<=) |
greater_than_token | dấu lớn hơn (>) |
greater_or_equal_token | dấu lớn hơn hoặc bằng (>=) |