Tổng quan về ngôn ngữ lập trình và chương trình dịch

articlewriting1

Tổng quan về ngôn ngữ lập trình và chương trình dịch

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 (188.99 KB, 10 trang )

chương trình nguồn (ngôn ngữ bậc cao)
chương trình dịch
chương trình đích (ngôn ngữ máy)
Lỗi
Hình 1.1: Sơ đồ một chương trình dịch
Tổng quan về ngôn ngữ lập trình và chương trình dịch
1. Ngôn ngữ lập trình và chương trình dịch.
Con người muốn máy tính thực hiện công việc thì con người phải viết yêu
cầu đưa cho máy tính bằng ngôn ngữ máy hiểu được. Việc viết yêu cầu gọi
là lập trình. Ngôn ngữ dùng để lập trình gọi là ngôn ngữ lập trình. Có nhiều
ngôn ngữ lập trình khác nhau. Dựa trên cơ sở của tính không phụ thuộc
vào máy tính ngày càng cao người ta phân cấp các ngôn ngữ lập trình như
sau:
– Ngôn ngữ máy (machine languge)
– Hợp ngữ (acsembly langguge)
– Ngôn ngữ cấp cao (high level langguage)
Ngôn ngữ máy chỉ gồm các số 0 và 1, khó hiểu đối với người sử dụng. Mà
ngôn ngữ tự nhiên của con người lại dài dòng nhiều chi tiết mập mờ, không rõ
ràng đối với máy. Để con người giao tiếp được với máy dễ dàng cần một ngôn
ngữ trung gian gần với ngôn ngữ tự nhiên. Vì vậy ta cần có một chương trình để
dịch các chương trình trên ngôn ngữ này sang mã máy để có thể chạy được.
Những chương trình làm nhiệm vụ như vậy gọi là các chương trình dịch. Ngoài
ra, một chương trình dịch còn chuyển một chương trình từ ngôn ngữ nay sang
ngôn ngữ khác tương đương. Thông thường ngôn ngưc nguồn là ngôn ngữ bậc
cao và ngôn ngữ đích là ngôn ngữ bậc thấp, ví dụ như ngôn ngữ Pascal hay
ngôn ngữ C sang ngôn ngữ Acsembly.
* Định nghĩa chương trình dịch:
Chương trình dịch là một chương trình thực hiện việc chuyển đổi một
chương trình hay đoạn chương trình từ ngôn ngữ này (gọi là ngôn ngữ nguồn)
sang ngôn ngữ khác (gọi là ngôn ngữ đích) tương đương.
Để xây dựng được chương trình dịch cho một ngôn ngữ nào đó, ta cần biết

về đặc tả của ngôn ngữ lập trình, cú pháp và ngữ nghĩa của ngôn ngữ lập trình
đó… Để đặc tả ngôn ngữ lập trình, ta cần định nghĩa:
– Tập các kí hiệu cần dùng trong các chương trình hợp lệ.
– Tập các chương trình hợp lệ.
– Nghĩa của từng chương trình hợp lệ.
Việc định nghĩa tập các kí hiệu cần dùng của ngôn ngữ là dế dàng, ta chỉ
cần liệt kê là đủ. Việc xác định các chương trình hợp lệ thì khó khăn hơn.
Thông thường ta dùng các luật của văn phạm để đặc tả. Việc thứ 3, định nghĩa ý
nghĩa của chương trình hợp lệ là khó khăn nhất. Có 3 phương pháp để xác định
nghĩa của chương trình hợp lệ.
Chương trình nguồn Compiler CT ở NN trung gian Interpreter
Kết quả
Hình 1.2 Hệ thống thông dịch
+ Phương pháp 1: định nghã bằng phép ánh xạ. ánh xạ mỗi chương trình
vào một câu trong ngôn ngữ mà ta có thể hiểu được.
+ Phương pháp 2: Xác định ý nghĩa của chương trình bằng một máy lý
tưởng. Ý nghĩa của chương rình được đăc tả trong ngôn từ của máy lý tưởng.
Máy lý tưởng là bộ thông dịch của ngôn ngữ.
+ Phương pháp 3: ý nghĩa cảu chương trình nguồn là sản phẩm xuất ra của
trình biên dịch, khi nó dịch chương trình nguồn.
2. Phân loại chương trình dịch.
Có thể phân thành nhiều loại tuỳ theo các tiêu chí khác nhau.
– Theo số lần duyệt: Duyệt đơn, duyệt nhiều lần.
– Theo mục đích: Tải và chạy, gỡ rối, tối ưu, chuyển đổi ngôn ngữ, chuyển
đôỉ định dạng…
– Theo độ phức tạp của chương trình nguồn và đích:
+ Asembler (chương trình hợp dịch): Dịch từ ngôn ngữ asembly ra ngôn
ngữ máy.
+ Preproccessor: (tiền xử lý) : Dịch từ ngôn ngữ cấp cao sang ngôn ngữ
cấp cao khác (thực chất là dịch một số cấu trúc mới sang cấu trúc cũ).

+ Compiler: (biên dịch) dịch từ ngôn ngữ cấp cao sang ngôn ngữ cấp thấp.
– Theo phương pháp dịch chạy:
+ Thông dịch: (diễn giải – interpreter) chương trình thông dịch đọc chương
trình nguồn theo từng lệnh và phân tích rồi thực hiện nó. (Ví dụ hệ điều hành
thực hiện các câu lệnh DOS, hay hệ quản trị cơ sở dữ liệu Foxpro). Hoặc ngôn
ngữ nguồn không được chuyển sang ngôn ngữ máy mà chuyển sang một ngôn
ngữ trung gian. Một chương trình sẽ có nhiệm vụ đọc chương trình ở ngôn ngữ
trung gian này và thực hiện từng câu lệnh. Ngôn ngữ trung gian được gọi là
ngôn ngữ của một máy ảo, chương trình thông dịch thực hiện ngôn ngữ này gọi
là máy ảo.
Ví dụ hệ thông dịch Java. Mã nguồn Java được dịch ra dạng Bytecode. File đích
này được một trình thông dịch gọi là máy ảo Java thực hiện. Chính vì vậy mà người ta
nói Java có thể chạy trên mọi hệ điều hành có cài máy ảo Java.
+ Biên dịch: toàn bộ chương trình nguồn được trình biên dịch chuyển sang
chương trình đích ở dạng mã máy. Chương trình đích này có thể chạy độc lập
trên máy mà không cần hệ thống biên dịch nữa.
– Theo lớp văn phạm: LL (1) (LL – Left to right, leftmost) LR(1) (LR – letf
to right, right most)
1.3. Cấu trúc của chương trình dịch.
1.3.1. cấu trúc tĩnh (cấu trúc logic)
1) Phân tích từ vựng: đọc luồng kí tự tạo thành chương trình nguồn từ trái sang
phải, tách ra thành các từ tố (token).
– Từ vựng: Cũng như ngôn ngữ tự nhiên, ngôn ngữ lập trình cũng được
xây dựng dựa trên bộ từ vựng. Từ vựng trong ngôn ngữ lập trình thường được
xây dựng dựa trên bộ chữ gồm có:
+ chữ cái: A .. Z, a. . z
+ chữ số: 0..9
+ các ký hiệu toán học: +, -, *, /, (, ), =, , !, %, /
+ các ký hiệu khác: [, ],. ..
Các từ vựng được ngôn ngữ hiểu bao gồm các từ khóa, các tên hàm, tên hằng,

Xem thêm: Comment là gì

tên biến, các phép toán,. . .
Các từ vựng có những qui định nhất định ví dụ: tên viết bởi chữ cái đầu tiên sau
đó là không hoặc nhiều chữ cái hoặc chữ số, phép gán trong C là =, trong
Pascal là :=,v.. .
Để xây dựng một chương trình dịch, hệ thống phải tìm hiểu tập từ vựng
của ngôn ngữ nguồn và phân tích để biết được từng loại từ vựng và các thuộc
tính của nó,
Ví dụ:
Câu lệnh trong chương trình nguồn
viết bằng ngôn ngữ pascal:
“a := b + c * 60”
Chương trình phân tích từ vựng sẽ trả về:
a là tên (tên (định danh ))
:= là toán tử gán
b là tên (định danh)
+ là toán tử cộng
c là định danh
* là toán tử nhân
60 là một số
Kết quả phân tích từ vựng sẽ là: (tên,
a), phép gán, (tên, b) phép cộng (tên, c)
phép nhân, (số, 60)
2). Phân tích cú pháp: Phân tích cấu trúc
ngữ pháp của chương trình. Các từ tố được
nhóm lại theo cấu trúc phân cấp.
– Cú pháp: Cú pháp là thành phần
quan trọng nhất trong một ngôn ngữ. Như
chúng ta đã biết trong ngôn ngữ hình thức thì ngôn ngữ là tập các câu thỏa mãn
văn phạm của ngôn ngữ đó. Ví dụ như
câu = chủ ngữ + vị ngữ

vị ngữ = động từ + bổ ngữ
v.v.. .
Trong ngôn ngữ lập trình, cú pháp của nó được thể hiện bởi một bộ luật cú
pháp. Bộ luật này dùng để mô tả cấu trúc của chương trình, các câu lệnh. Chúng
ta quan tâm đến các cấu trúc này bao gồm:
1) các khai báo
2) biểu thức số học, biểu thức logic
3) các lệnh: lệnh gán, lệnh gọi hàm, lệnh vào ra,. . .
4) câu lệnh điều kiện if
5) câu lệnh lặp: for, while
6) chương trình con (hàm và thủ tục)
Nhiệm vụ trước tiên là phải biết được bộ luật cú pháp của ngôn ngữ mà mình
định xây dựng chương trình cho nó.
Với một chuỗi từ tố và tập luật cú pháp của ngôn ngữ, bộ phân tích cú
pháp tự động đưa ra cây cú pháp cho chuỗi nhập. Khi cây cú pháp xây dựng
xong thì quá trình phân tích cú pháp của chuỗi nhập kết thúc thành công. Ngược
lại nếu bộ phân tích cú pháp áp dụng tất cả các luật hiện có nhưng không thể
xây dựng được cây cú pháp của chuỗi nhập thì thông báo rằng chuỗi nhập
không viết đúng cú pháp.
Chương trình phải phân tích chương trình nguồn thành các cấu trúc cú
pháp của ngôn ngữ, từ đó để kiểm tra tính đúng đắn về mặt ngữ pháp của
chương trình nguồn.
3). Phân tích ngữ nghĩa: Phân tích các đặc tính khác của chương trình mà không
phải đặc tính cú pháp. Kiểm tra chương trình nguồn để tìm lỗi cú pháp và sự hợp kiểu.
Dựa trên cây cú pháp bộ phân tích ngữ nghĩa xử lý từng phép toán. Mỗi phép toán
nó kiểm tra các toán hạng và loại dữ liệu của chúng có phù hợp với phép toán không.
VD: tên (biến) được khai báo kiểu real, 60 là số kiểu interge vì vậy trình
biên dịch đổi thành số thực 60.0.
– Ngữ nghĩa: của một ngôn ngữ lập trình liên quan đến:
+ Kiểu, phạm vi của hằng và biến

+ Phân biệt và sử dụng đúng tên hằng, tên biến, tên hàm
Chương trình dịch phải kiểm tra được tính đúng đắn trong sử dụng các đại
lượng này. Ví dụ kiểm tra không cho gán giá trị cho hằng, kiểm tra tính đúng
đắn trong gán kiểu, kiểm tra phạm vi, kiểm tra sử dụng tên như tên không được
khai báo trùng, dùng cho gọi hàm phải là tên có thuộc tính hàm,. ..
về đặc tả của ngôn từ lập trình, cú pháp và ngữ nghĩa của ngôn từ lập trìnhđó … Để đặc tả ngôn từ lập trình, ta cần định nghĩa : – Tập những kí hiệu cần dùng trong những chương trình hợp lệ. – Tập những chương trình hợp lệ. – Nghĩa của từng chương trình hợp lệ. Việc định nghĩa tập những kí hiệu cần dùng của ngôn từ là dế dàng, ta chỉcần liệt kê là đủ. Việc xác lập những chương trình hợp lệ thì khó khăn vất vả hơn. Thông thường ta dùng những luật của văn phạm để đặc tả. Việc thứ 3, định nghĩa ýnghĩa của chương trình hợp lệ là khó khăn vất vả nhất. Có 3 chiêu thức để xác địnhnghĩa của chương trình hợp lệ. Chương trình nguồn Compiler CT ở NN trung gian InterpreterKết quảHình 1.2 Hệ thống thông dịch + Phương pháp 1 : định nghã bằng phép ánh xạ. ánh xạ mỗi chương trìnhvào một câu trong ngôn từ mà ta hoàn toàn có thể hiểu được. + Phương pháp 2 : Xác định ý nghĩa của chương trình bằng một máy lýtưởng. Ý nghĩa của chương rình được đăc tả trong ngôn từ của máy lý tưởng. Máy lý tưởng là bộ thông dịch của ngôn từ. + Phương pháp 3 : ý nghĩa cảu chương trình nguồn là mẫu sản phẩm xuất ra củatrình biên dịch, khi nó dịch chương trình nguồn. 2. Phân loại chương trình dịch. Có thể phân thành nhiều loại tuỳ theo những tiêu chuẩn khác nhau. – Theo số lần duyệt : Duyệt đơn, duyệt nhiều lần. – Theo mục tiêu : Tải và chạy, tháo gỡ, tối ưu, quy đổi ngôn từ, chuyểnđôỉ định dạng … – Theo độ phức tạp của chương trình nguồn và đích : + Asembler ( chương trình hợp dịch ) : Dịch từ ngôn từ asembly ra ngônngữ máy. + Preproccessor : ( tiền giải quyết và xử lý ) : Dịch từ ngôn từ cấp cao sang ngôn ngữcấp cao khác ( thực ra là dịch 1 số ít cấu trúc mới sang cấu trúc cũ ). + Compiler : ( biên dịch ) dịch từ ngôn từ cấp cao sang ngôn từ cấp thấp. – Theo chiêu thức dịch chạy : + Thông dịch : ( diễn giải – interpreter ) chương trình thông dịch đọc chươngtrình nguồn theo từng lệnh và nghiên cứu và phân tích rồi triển khai nó. ( Ví dụ hệ điều hànhthực hiện những câu lệnh DOS, hay hệ quản trị cơ sở tài liệu Foxpro ). Hoặc ngônngữ nguồn không được chuyển sang ngôn ngữ máy mà chuyển sang một ngônngữ trung gian. Một chương trình sẽ có trách nhiệm đọc chương trình ở ngôn ngữtrung gian này và thực thi từng câu lệnh. Ngôn ngữ trung gian được gọi làngôn ngữ của một máy ảo, chương trình thông dịch thực thi ngôn từ này gọilà máy ảo. Ví dụ hệ thông dịch Java. Mã nguồn Java được dịch ra dạng Bytecode. File đíchnày được một trình thông dịch gọi là máy ảo Java triển khai. Chính thế cho nên mà người tanói Java hoàn toàn có thể chạy trên mọi hệ quản lý và điều hành có cài máy ảo Java. + Biên dịch : hàng loạt chương trình nguồn được trình biên dịch chuyển sangchương trình đích ở dạng mã máy. Chương trình đích này hoàn toàn có thể chạy độc lậptrên máy mà không cần mạng lưới hệ thống biên dịch nữa. – Theo lớp văn phạm : LL ( 1 ) ( LL – Left to right, leftmost ) LR ( 1 ) ( LR – letfto right, right most ) 1.3. Cấu trúc của chương trình dịch. 1.3.1. cấu trúc tĩnh ( cấu trúc logic ) 1 ) Phân tích từ vựng : đọc luồng kí tự tạo thành chương trình nguồn từ trái sangphải, tách ra thành những từ tố ( token ). – Từ vựng : Cũng như ngôn từ tự nhiên, ngôn từ lập trình cũng đượcxây dựng dựa trên bộ từ vựng. Từ vựng trong ngôn từ lập trình thường đượcxây dựng dựa trên bộ chữ gồm có : + vần âm : A .. Z, a. . z + chữ số : 0 .. 9 + những ký hiệu toán học : +, -, *, /, (, ), =, , !, %, / + những ký hiệu khác : [, ] ,. .. Các từ vựng được ngôn từ hiểu gồm có những từ khóa, những tên hàm, tên hằng, tên biến, những phép toán ,. .. Các từ vựng có những qui định nhất định ví dụ : tên viết bởi vần âm tiên phong sauđó là không hoặc nhiều vần âm hoặc chữ số, phép gán trong C là =, trongPascal là : =, v. .. Để kiến thiết xây dựng một chương trình dịch, mạng lưới hệ thống phải khám phá tập từ vựngcủa ngôn từ nguồn và nghiên cứu và phân tích để biết được từng loại từ vựng và những thuộctính của nó, Ví dụ : Câu lệnh trong chương trình nguồnviết bằng ngôn từ pascal : “ a : = b + c * 60 ” Chương trình nghiên cứu và phân tích từ vựng sẽ trả về : a là tên ( tên ( định danh ) ) : = là toán tử gánb là tên ( định danh ) + là toán tử cộngc là định danh * là toán tử nhân60 là một sốKết quả nghiên cứu và phân tích từ vựng sẽ là : ( tên, a ), phép gán, ( tên, b ) phép cộng ( tên, c ) phép nhân, ( số, 60 ) 2 ). Phân tích cú pháp : Phân tích cấu trúcngữ pháp của chương trình. Các từ tố đượcnhóm lại theo cấu trúc phân cấp. – Cú pháp : Cú pháp là thành phầnquan trọng nhất trong một ngôn từ. Nhưchúng ta đã biết trong ngôn từ hình thức thì ngôn từ là tập những câu thỏa mãnvăn phạm của ngôn từ đó. Ví dụ nhưcâu = chủ ngữ + vị ngữvị ngữ = động từ + bổ ngữv. v. .. Trong ngôn từ lập trình, cú pháp của nó được biểu lộ bởi một bộ luật cúpháp. Bộ luật này dùng để diễn đạt cấu trúc của chương trình, những câu lệnh. Chúngta chăm sóc đến những cấu trúc này gồm có : 1 ) những khai báo2 ) biểu thức số học, biểu thức logic3 ) những lệnh : lệnh gán, lệnh gọi hàm, lệnh vào ra ,. .. 4 ) câu lệnh điều kiện kèm theo if5 ) câu lệnh lặp : for, while6 ) chương trình con ( hàm và thủ tục ) Nhiệm vụ thứ nhất là phải biết được bộ luật cú pháp của ngôn từ mà mìnhđịnh kiến thiết xây dựng chương trình cho nó. Với một chuỗi từ tố và tập luật cú pháp của ngôn từ, bộ nghiên cứu và phân tích cúpháp tự động hóa đưa ra cây cú pháp cho chuỗi nhập. Khi cây cú pháp xây dựngxong thì quy trình nghiên cứu và phân tích cú pháp của chuỗi nhập kết thúc thành công xuất sắc. Ngượclại nếu bộ nghiên cứu và phân tích cú pháp vận dụng toàn bộ những luật hiện có nhưng không thểxây dựng được cây cú pháp của chuỗi nhập thì thông tin rằng chuỗi nhậpkhông viết đúng cú pháp. Chương trình phải nghiên cứu và phân tích chương trình nguồn thành những cấu trúc cúpháp của ngôn từ, từ đó để kiểm tra tính đúng đắn về mặt ngữ pháp củachương trình nguồn. 3 ). Phân tích ngữ nghĩa : Phân tích những đặc tính khác của chương trình mà khôngphải đặc tính cú pháp. Kiểm tra chương trình nguồn để tìm lỗi cú pháp và sự hợp kiểu. Dựa trên cây cú pháp bộ nghiên cứu và phân tích ngữ nghĩa giải quyết và xử lý từng phép toán. Mỗi phép toánnó kiểm tra những toán hạng và loại tài liệu của chúng có tương thích với phép toán không. VD : tên ( biến ) được khai báo kiểu real, 60 là số kiểu interge thế cho nên trìnhbiên dịch đổi thành số thực 60.0. – Ngữ nghĩa : của một ngôn từ lập trình tương quan đến : + Kiểu, khoanh vùng phạm vi của hằng và biến + Phân biệt và sử dụng đúng tên hằng, tên biến, tên hàmChương trình dịch phải kiểm tra được tính đúng đắn trong sử dụng những đạilượng này. Ví dụ kiểm tra không cho gán giá trị cho hằng, kiểm tra tính đúngđắn trong gán kiểu, kiểm tra khoanh vùng phạm vi, kiểm tra sử dụng tên như tên không đượckhai báo trùng, dùng cho gọi hàm phải là tên có thuộc tính hàm ,. . .

0912.44.1586