SlideShare uma empresa Scribd logo
1 de 6
Baixar para ler offline
MODULE 9. NGÔN NGỮ LẬP TRÌNH VÀ CHƯƠNG TRÌNH
DỊCH
9.1. Các mức khác nhau của ngôn ngữ lập trình
        Trong mục 7, ta đã xem xét một số phương pháp diễn đạt thuật toán. Để cho máy
tính có thể thực hiện được thuật toán, cần phải viết thuật toán dưới dạng các dòng "lệnh"
theo các quy ước nào đó mà máy tính có thể thực hiện được một cách trực tiếp hoặc viết
dưới dạng nào đó để có thể sinh tự động dạng mà máy tính có thể thực hiện trực tiếp. Tập
các kí hiệu và các quy tắc viết các lệnh để thể hiện thuật toán được gọi là một ngôn ngữ
lập trình (programming language). Các quy tắc để viết chương trình được gọi là cú pháp
(syntax) của ngôn ngữ lập trình. Mỗi chương trình sẽ mang một ý nghĩa nhất định mà ta
gọi là ngữ nghĩa (semantic) của chương trình.
       Có nhiều lớp ngôn ngữ lập trình khác nhau. Theo mức độ hình thức hoá, người ta
chia các ngôn ngữ lập trình thành các lớp sau:
        Ngôn ngữ máy. Chương trình trong ngôn ngữ máy là dãy các lệnh máy mà CPU
có thể thực hiện trực tiếp. Đó là ngôn ngữ lập trình duy nhất mà máy tính "hiểu được".
Trong thang bậc các ngôn ngữ giao tiếp với máy tính, đây là mức thấp nhất nhưng hiệu
quả của chương trình sẽ là cao nhất vì ta có thể khai thác triệt để khả năng của máy. Tuỳ
theo thiết kế về phần cứng, mỗi loại máy tính có một ngôn ngữ máy khác nhau. Các lệnh
viết bằng ngôn ngữ máy nói chung ở dạng nhị phân hoặc biến thể của chúng trong hệ
đếm 16.
       Ví dụ sau đây là một đoạn chương trình viết bằng ngôn ngữ máy của một máy
tính dùng bộ vi xử lý Intel 8086.
                                  Bảng 9.1. Ngôn ngữ máy
      Mã trên hệ nhị phân         Mã hệ 16                        Ý nghĩa
1001 0001 0110 0100 0001 0000    A1 64 10    Nạp số 2 byte từ 1064 lên AX
0000 0011 0110 0110 0001 0000    03 65 10    Cộng AX với số 2 byte ở 1066 kết quả để trên AX
1010 0011 0000 0000 0010 1011    A3 00 2B    Chuyển kết quả từ AX về hai byte bắt đầu từ 2B00
       Đoạn chương trình này cộng hai số nguyên hai byte ở trong các địa chỉ 1064 và
1066. Kết quả để ở hai byte bắt đầu từ địa chỉ 2B00. Cột đầu là dòng lệnh trong hệ 16,
cột giữa là dòng lệnh tương đương trong hệ nhị phân (chính là hình ảnh thực sự của
chương trình trong bộ nhớ) và cột bên phải là giải thích. AX là tên một thanh ghi 16 bít
trong bộ vi xử lý 8086 .
        Qua ví dụ trên, ta thấy ngôn ngữ máy không thật thích hợp cho số đông người sử
dụng máy tính vì để viết hoặc hiểu chương trình, người ta phải nhớ rất máy móc các mã
số của lệnh mà các dòng số này không có hàm ý rõ ràng. Mặt khác do tập lệnh của các bộ
xử lý có thể khác nhau nên không thể dùng chương trình viết trên bộ xử lý này chạy trên
máy tính dùng bộ xử lý khác loại.
       Hợp ngữ (Assembly). Để khắc phục nhược điểm trên của ngôn ngữ máy, người ta
đề xuất một ngôn ngữ giao tiếp với máy ở mức độ hình thức hơn gọi là hợp ngữ. Về cơ
bản, hợp ngữ có các cấu trúc rất giống với ngôn ngữ máy. Điều khác là trong hợp ngữ có
thể viết lệnh dưới dạng mã chữ. Mã chữ thể hiện mã lệnh hoặc các đối tượng trong lệnh
(trong ngôn ngữ máy nó là mã lệnh và địa chỉ của đối tượng). Mã lệnh ở dạng chữ thường
chính là những từ trong tiếng Anh có ý nghĩa rõ ràng, còn đối tượng do ta tự đặt tên phù
hợp với ý niệm về đối tượng đó. Ví dụ nếu đoạn chương trình trên dùng để cộng chiều
dài và chiều rộng của hình chữ nhật để tính nửa chu vi thì trong hợp ngữ ASM ta chỉ cần
viết


                       Bảng 9.2. Chương trình viết trên Assembly
                             MOV AX CHIEU_DAI
                             ADD AX CHIEU_RONG
                             MOV NUA_CHU_VI AX

        Từ MOV có gốc từ từ MOVE trong tiếng Anh, có nghĩa là chuyển, còn từ ADD
có nghĩa là cộng. Lệnh thứ nhất có nghĩa là nạp số liệu mà ta đặt tên là CHIEU_DAI lên
thanh ghi AX, lệnh thứ hai có nghĩa là cộng số trong thanh ghi AX với số liệu mà ta đặt
tên là CHIEU_RONG. Ta thấy mặc dù còn cồng kềnh và còn phụ thuộc vào một loại máy
tính cụ thể, hợp ngữ dễ dùng hơn rất nhiều so với ngôn ngữ máy.
        Để một chương trình viết bằng hợp ngữ chạy được trên máy tính, nó cần phải
được dịch ra ngôn ngữ máy. Rõ ràng là, mỗi hợp ngữ dùng cho một loại máy nào đó đều
cần có trình dịch phù hợp. Khi dịch, hai đối tượng CHIEU_DAI và CHIEU_RONG nói
trên sẽ được tự động thay bằng hai địa chỉ cụ thể nào đó không nhất thiết là 1064 và 1066
như ở ví dụ trên. Vì vậy ta cũng không cần phải quan tâm đến sắp xếp địa chỉ cụ thể sau
khi dịch xong và chạy chương trình. Chương trình dịch đối với hợp ngữ được gọi là hợp
dịch (assembler).
        Ngôn ngữ thuật toán (còn gọi là ngôn ngữ thuật toán) . Ta đã thấy ngôn ngữ máy
và cả hợp ngữ đều phụ thuộc vào hệ thống lệnh của một loại máy cụ thể. Chúng chưa thật
thích hợp cho đông đảo người sử dụng máy tính. Người ta muốn thể hiện thuật toán bằng
những lệnh với ý nghĩa thực tế và độc lập với bất cứ loại máy cụ thể nào. Chẳng hạn
trong ví dụ trên chỉ cần viết NUA_CHU_VI = CHIEU_DAI + CHIEU_RONG là đủ. Từ
đầu những năm 50, người ta đã xây dựng những ngôn ngữ lập trình vạn năng có các lệnh
gần với ngôn ngữ tự nhiên và ngôn ngữ toán học. Các ngôn ngữ lập trình này được gọi là
các ngôn ngữ lập trình bậc cao (high level programming language). Vì chúng chỉ nhằm
vào thể hiện thuật toán độc lập với các máy tính cụ thể nên người ta còn gọi nó là các
ngôn ngữ thuật toán (algorithmic language). Cũng như đối với hợp ngữ, mỗi ngôn ngữ
lập trình bậc cao trên một loại máy cụ thể đều cần có chương trình dịch để dịch các
chương trình sang sang ngôn ngữ máy của máy đó mới có thể thực hiện được.
       Chú ý rằng mỗi lệnh của hợp ngữ nói chung được dịch thành một lệnh trong ngôn
ngữ máy còn mỗi lệnh của ngôn ngữ bậc cao thường tương đương với nhiều lệnh máy. Ví
dụ lệnh NUA_CHU_VI = CHIEU_DAI + CHIEU_RONG sẽ dịch thành 3 lệnh máy.
       Có hai kiểu dịch: thông dịch (Interpeter) là kiểu dịch từng lệnh để hiểu công việc
phải làm và thực hiện luôn nhưng không nhất thiết phải tạo ra những đoạn mã tương ứng
trong ngôn ngữ máy. Nếu một lệnh cần thực hiện nhiều lần thì cũng phải dịch nhiều lần.
Ngôn ngữ BASIC thịnh hành vào những năm 80 thường đi theo chế độ thông dịch. Còn
các trình biên dịch (compiler) sẽ dịch toàn bộ chương trình ban đầu (gọi là chương trình
nguồn) thành một chương trình tương ứng trong ngôn ngữ máy (gọi là chương trình
đích), sau đó nạp chương trình đích vào máy tính để thực hiện. Sở dĩ trong tiếng Việt
chúng ta gọi hai kiểu dịch này là "thông dịch' và "biên dịch" vì tính chất dịch có phần nào
giống với dịch tiếng nước ngoài. Thông dịch giống như công việc của người phiên dịch
(thông ngôn), nói tới đâu dịch tới đó. Còn biên dịch là công việc của người biên dịch, căn
cứ trên tài liệu đầy đủ, ta viết ra một lần bản dịch đầy đủ.
        Ngôn ngữ bậc cao đầu tiên được xây dựng vào năm 1957 là ngôn ngữ FORTRAN
(FORmula TRANslator - Bộ dịch các công thức). Ngày nay có rất nhiều các ngôn ngữ lập
trình bậc cao như PASCAL hay C. Sau đây là một đoạn chương trình giải phương trình
bậc 2 viết trên PASCAL và FORTRAN. Bạn đọc dù chưa có một chút ý niệm gì về các
ngôn ngữ này cũng có thể hiểu được các đoạn chương trình sau nói gì

                         Bảng 9.3. Chương trình viết trên Pascal
               (*Đoạn chương trình trên PASCAL*)
               DELTA := B*B - 4*A*C;
               IF DELTA > 0 THEN
                       BEGIN
                             X1 := (- B + SQRT(DELTA))/(2*A);
                             X2 := (- B - SQRT(DELTA))/(2*A);
                              WRITE (X1,X2);
                       END
               ELSE
                       WRITE('Vo nghiem');
               .....
       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 9.4. Chương trình viết trên FORTRAN IV
1          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            ...........................................

        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.

9.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ụ
mà chúng ta thảo luận trong mục 7. 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 9.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
Soạn thảo               Dịch               Liên kết           Thực hiện


Phần mềm         Chương trình                 Chương            Dữ liệu
soạn thảo           dịch                   trình liên kết




                                                               Kết quả
 Chương trình       Các mô đun             Chương trình         xử lý
   nguồn             đối tượng              chạy được




                     Lỗi cú             Lỗi liên kết            Lỗi thi
                      pháp                                       hành




  Hình 9.1. Sơ đồ thực thực hiện một công việc với ngôn ngữ bậc cao

Mais conteúdo relacionado

Mais procurados

Lớp 8: Bài 2 làm quen với chương trình và NNLT
Lớp 8: Bài 2 làm quen với chương trình và NNLTLớp 8: Bài 2 làm quen với chương trình và NNLT
Lớp 8: Bài 2 làm quen với chương trình và NNLT
Heo_Con049
 
Hsbd taint
Hsbd taintHsbd taint
Hsbd taint
vb2tin09
 
L08.ngon ngu-lap-trinh
L08.ngon ngu-lap-trinhL08.ngon ngu-lap-trinh
L08.ngon ngu-lap-trinh
Linh Phạm
 
Bài giảng ngôn ngữ lập trình c c++ phạm hồng thái[bookbooming.com]
Bài giảng ngôn ngữ lập trình c c++   phạm hồng thái[bookbooming.com]Bài giảng ngôn ngữ lập trình c c++   phạm hồng thái[bookbooming.com]
Bài giảng ngôn ngữ lập trình c c++ phạm hồng thái[bookbooming.com]
bookbooming1
 
[C] giao trinh c dhbk - viet nhat
[C] giao trinh c   dhbk - viet nhat[C] giao trinh c   dhbk - viet nhat
[C] giao trinh c dhbk - viet nhat
Hoang Nguyen
 

Mais procurados (12)

Lớp 8: Bài 2 làm quen với chương trình và NNLT
Lớp 8: Bài 2 làm quen với chương trình và NNLTLớp 8: Bài 2 làm quen với chương trình và NNLT
Lớp 8: Bài 2 làm quen với chương trình và NNLT
 
Hsbd taint
Hsbd taintHsbd taint
Hsbd taint
 
L08.ngon ngu-lap-trinh
L08.ngon ngu-lap-trinhL08.ngon ngu-lap-trinh
L08.ngon ngu-lap-trinh
 
Bài giảng ngôn ngữ lập trình c c++ phạm hồng thái[bookbooming.com]
Bài giảng ngôn ngữ lập trình c c++   phạm hồng thái[bookbooming.com]Bài giảng ngôn ngữ lập trình c c++   phạm hồng thái[bookbooming.com]
Bài giảng ngôn ngữ lập trình c c++ phạm hồng thái[bookbooming.com]
 
C++
C++C++
C++
 
Lap trinh c_tu_co_ban_den_nang_cao
Lap trinh c_tu_co_ban_den_nang_caoLap trinh c_tu_co_ban_den_nang_cao
Lap trinh c_tu_co_ban_den_nang_cao
 
[C] giao trinh c dhbk - viet nhat
[C] giao trinh c   dhbk - viet nhat[C] giao trinh c   dhbk - viet nhat
[C] giao trinh c dhbk - viet nhat
 
Bài 1: Khái niệm lập trình và ngôn ngữ lập trình bậc cao
Bài 1: Khái niệm lập trình và ngôn ngữ lập trình bậc caoBài 1: Khái niệm lập trình và ngôn ngữ lập trình bậc cao
Bài 1: Khái niệm lập trình và ngôn ngữ lập trình bậc cao
 
Bài giảng Lập trình cơ bản - truongkinhtethucpham.com
Bài giảng Lập trình cơ bản - truongkinhtethucpham.comBài giảng Lập trình cơ bản - truongkinhtethucpham.com
Bài giảng Lập trình cơ bản - truongkinhtethucpham.com
 
Những thuật ngữ thường gặp trong Reverse Engineering .NET
Những thuật ngữ thường gặp trong Reverse Engineering .NETNhững thuật ngữ thường gặp trong Reverse Engineering .NET
Những thuật ngữ thường gặp trong Reverse Engineering .NET
 
Hsbd taint
Hsbd taintHsbd taint
Hsbd taint
 
Phong cach lap trinh c++
Phong cach lap trinh c++Phong cach lap trinh c++
Phong cach lap trinh c++
 

Semelhante a 9 ngon ngu_lap_trinh (20)

Ngôn ngữ lập trình turbo pascal full
Ngôn ngữ lập trình turbo pascal fullNgôn ngữ lập trình turbo pascal full
Ngôn ngữ lập trình turbo pascal full
 
Ch assembly
Ch assemblyCh assembly
Ch assembly
 
Bai1 tin11_HuynhThiThuyLinh
Bai1 tin11_HuynhThiThuyLinhBai1 tin11_HuynhThiThuyLinh
Bai1 tin11_HuynhThiThuyLinh
 
Session 01
Session 01Session 01
Session 01
 
Session 01
Session 01Session 01
Session 01
 
Session 01 C
Session 01 CSession 01 C
Session 01 C
 
Bgđt
BgđtBgđt
Bgđt
 
Lap trinh c_tu_co_ban_den_nang_cao
Lap trinh c_tu_co_ban_den_nang_caoLap trinh c_tu_co_ban_den_nang_cao
Lap trinh c_tu_co_ban_den_nang_cao
 
Tin 8
Tin 8Tin 8
Tin 8
 
Chuong1234pascal 2493
Chuong1234pascal 2493Chuong1234pascal 2493
Chuong1234pascal 2493
 
Lập trình c căn bản
Lập trình c căn bảnLập trình c căn bản
Lập trình c căn bản
 
1 -nhapmon
1  -nhapmon1  -nhapmon
1 -nhapmon
 
Phan 2 chuong 1-2
Phan 2   chuong 1-2Phan 2   chuong 1-2
Phan 2 chuong 1-2
 
thu ha
thu hathu ha
thu ha
 
Chuong 01
Chuong 01Chuong 01
Chuong 01
 
Chuong 01 mo dau
Chuong 01 mo dauChuong 01 mo dau
Chuong 01 mo dau
 
Bai 8
Bai 8Bai 8
Bai 8
 
Bai 5 ngon ngu lap trinh
Bai 5 ngon ngu lap trinhBai 5 ngon ngu lap trinh
Bai 5 ngon ngu lap trinh
 
lap trinh assembly cho VXL
lap trinh  assembly cho VXLlap trinh  assembly cho VXL
lap trinh assembly cho VXL
 
Lớp 8: Bài 1 T1+ 2 may tinh va chuong trinh may tinh
Lớp 8: Bài 1 T1+ 2 may tinh va chuong trinh  may tinhLớp 8: Bài 1 T1+ 2 may tinh va chuong trinh  may tinh
Lớp 8: Bài 1 T1+ 2 may tinh va chuong trinh may tinh
 

Mais de Giang Nguyễn

Php can ban_bai1_laptrinhwebphp.com
Php can ban_bai1_laptrinhwebphp.comPhp can ban_bai1_laptrinhwebphp.com
Php can ban_bai1_laptrinhwebphp.com
Giang Nguyễn
 
Lap trinh web dong voi php my sql
Lap trinh web dong voi php my sqlLap trinh web dong voi php my sql
Lap trinh web dong voi php my sql
Giang Nguyễn
 
Kentcources 110109221507-phpapp01
Kentcources 110109221507-phpapp01Kentcources 110109221507-phpapp01
Kentcources 110109221507-phpapp01
Giang Nguyễn
 
Hay php architect eav modeling
Hay php architect   eav modelingHay php architect   eav modeling
Hay php architect eav modeling
Giang Nguyễn
 
Haiphongit.com.tai lieu-php.my sql-thiet-ke-web-dong
Haiphongit.com.tai lieu-php.my sql-thiet-ke-web-dongHaiphongit.com.tai lieu-php.my sql-thiet-ke-web-dong
Haiphongit.com.tai lieu-php.my sql-thiet-ke-web-dong
Giang Nguyễn
 
Haiphongit.com.tai lieu-laptrinh ph-pvamysql
Haiphongit.com.tai lieu-laptrinh ph-pvamysqlHaiphongit.com.tai lieu-laptrinh ph-pvamysql
Haiphongit.com.tai lieu-laptrinh ph-pvamysql
Giang Nguyễn
 
Haiphongit.com.tai lieu-learning-php-my sql
Haiphongit.com.tai lieu-learning-php-my sqlHaiphongit.com.tai lieu-learning-php-my sql
Haiphongit.com.tai lieu-learning-php-my sql
Giang Nguyễn
 
Joomla administratormanual vi_20060206
Joomla administratormanual vi_20060206Joomla administratormanual vi_20060206
Joomla administratormanual vi_20060206
Giang Nguyễn
 
Canbanvethietkevalaptrinhgame
CanbanvethietkevalaptrinhgameCanbanvethietkevalaptrinhgame
Canbanvethietkevalaptrinhgame
Giang Nguyễn
 
Building websites-with-joomla-1-5-sample-chapter-chapter-7-the-menus-menu
Building websites-with-joomla-1-5-sample-chapter-chapter-7-the-menus-menuBuilding websites-with-joomla-1-5-sample-chapter-chapter-7-the-menus-menu
Building websites-with-joomla-1-5-sample-chapter-chapter-7-the-menus-menu
Giang Nguyễn
 
Eclipse pdt indigo release review
Eclipse pdt   indigo release reviewEclipse pdt   indigo release review
Eclipse pdt indigo release review
Giang Nguyễn
 
Bai tap lap trinh web voi joomla csau
Bai tap   lap trinh web voi joomla csauBai tap   lap trinh web voi joomla csau
Bai tap lap trinh web voi joomla csau
Giang Nguyễn
 

Mais de Giang Nguyễn (20)

Php can ban_bai1_laptrinhwebphp.com
Php can ban_bai1_laptrinhwebphp.comPhp can ban_bai1_laptrinhwebphp.com
Php can ban_bai1_laptrinhwebphp.com
 
Os xmldomphp
Os xmldomphpOs xmldomphp
Os xmldomphp
 
Os php-7oohabits
Os php-7oohabitsOs php-7oohabits
Os php-7oohabits
 
Os php-5.3new1
Os php-5.3new1Os php-5.3new1
Os php-5.3new1
 
Lap trinh web dong voi php my sql
Lap trinh web dong voi php my sqlLap trinh web dong voi php my sql
Lap trinh web dong voi php my sql
 
Kentcources 110109221507-phpapp01
Kentcources 110109221507-phpapp01Kentcources 110109221507-phpapp01
Kentcources 110109221507-phpapp01
 
Php day4
Php day4Php day4
Php day4
 
Hay php architect eav modeling
Hay php architect   eav modelingHay php architect   eav modeling
Hay php architect eav modeling
 
Haiphongit.com.tai lieu-php.my sql-thiet-ke-web-dong
Haiphongit.com.tai lieu-php.my sql-thiet-ke-web-dongHaiphongit.com.tai lieu-php.my sql-thiet-ke-web-dong
Haiphongit.com.tai lieu-php.my sql-thiet-ke-web-dong
 
Haiphongit.com.tai lieu-laptrinh ph-pvamysql
Haiphongit.com.tai lieu-laptrinh ph-pvamysqlHaiphongit.com.tai lieu-laptrinh ph-pvamysql
Haiphongit.com.tai lieu-laptrinh ph-pvamysql
 
Chuong07 php
Chuong07 phpChuong07 php
Chuong07 php
 
Bai th08 php voi csdl
Bai th08 php voi csdlBai th08 php voi csdl
Bai th08 php voi csdl
 
Haiphongit.com.tai lieu-learning-php-my sql
Haiphongit.com.tai lieu-learning-php-my sqlHaiphongit.com.tai lieu-learning-php-my sql
Haiphongit.com.tai lieu-learning-php-my sql
 
Hd lap pttkht2008
Hd lap pttkht2008Hd lap pttkht2008
Hd lap pttkht2008
 
Joomla administratormanual vi_20060206
Joomla administratormanual vi_20060206Joomla administratormanual vi_20060206
Joomla administratormanual vi_20060206
 
Canbanvethietkevalaptrinhgame
CanbanvethietkevalaptrinhgameCanbanvethietkevalaptrinhgame
Canbanvethietkevalaptrinhgame
 
C1
C1C1
C1
 
Building websites-with-joomla-1-5-sample-chapter-chapter-7-the-menus-menu
Building websites-with-joomla-1-5-sample-chapter-chapter-7-the-menus-menuBuilding websites-with-joomla-1-5-sample-chapter-chapter-7-the-menus-menu
Building websites-with-joomla-1-5-sample-chapter-chapter-7-the-menus-menu
 
Eclipse pdt indigo release review
Eclipse pdt   indigo release reviewEclipse pdt   indigo release review
Eclipse pdt indigo release review
 
Bai tap lap trinh web voi joomla csau
Bai tap   lap trinh web voi joomla csauBai tap   lap trinh web voi joomla csau
Bai tap lap trinh web voi joomla csau
 

9 ngon ngu_lap_trinh

  • 1. MODULE 9. NGÔN NGỮ LẬP TRÌNH VÀ CHƯƠNG TRÌNH DỊCH 9.1. Các mức khác nhau của ngôn ngữ lập trình Trong mục 7, ta đã xem xét một số phương pháp diễn đạt thuật toán. Để cho máy tính có thể thực hiện được thuật toán, cần phải viết thuật toán dưới dạng các dòng "lệnh" theo các quy ước nào đó mà máy tính có thể thực hiện được một cách trực tiếp hoặc viết dưới dạng nào đó để có thể sinh tự động dạng mà máy tính có thể thực hiện trực tiếp. Tập các kí hiệu và các quy tắc viết các lệnh để thể hiện thuật toán được gọi là một ngôn ngữ lập trình (programming language). Các quy tắc để viết chương trình được gọi là cú pháp (syntax) của ngôn ngữ lập trình. Mỗi chương trình sẽ mang một ý nghĩa nhất định mà ta gọi là ngữ nghĩa (semantic) của chương trình. Có nhiều lớp ngôn ngữ lập trình khác nhau. Theo mức độ hình thức hoá, người ta chia các ngôn ngữ lập trình thành các lớp sau: Ngôn ngữ máy. Chương trình trong ngôn ngữ máy là dãy các lệnh máy mà CPU có thể thực hiện trực tiếp. Đó là ngôn ngữ lập trình duy nhất mà máy tính "hiểu được". Trong thang bậc các ngôn ngữ giao tiếp với máy tính, đây là mức thấp nhất nhưng hiệu quả của chương trình sẽ là cao nhất vì ta có thể khai thác triệt để khả năng của máy. Tuỳ theo thiết kế về phần cứng, mỗi loại máy tính có một ngôn ngữ máy khác nhau. Các lệnh viết bằng ngôn ngữ máy nói chung ở dạng nhị phân hoặc biến thể của chúng trong hệ đếm 16. Ví dụ sau đây là một đoạn chương trình viết bằng ngôn ngữ máy của một máy tính dùng bộ vi xử lý Intel 8086. Bảng 9.1. Ngôn ngữ máy Mã trên hệ nhị phân Mã hệ 16 Ý nghĩa 1001 0001 0110 0100 0001 0000 A1 64 10 Nạp số 2 byte từ 1064 lên AX 0000 0011 0110 0110 0001 0000 03 65 10 Cộng AX với số 2 byte ở 1066 kết quả để trên AX 1010 0011 0000 0000 0010 1011 A3 00 2B Chuyển kết quả từ AX về hai byte bắt đầu từ 2B00 Đoạn chương trình này cộng hai số nguyên hai byte ở trong các địa chỉ 1064 và 1066. Kết quả để ở hai byte bắt đầu từ địa chỉ 2B00. Cột đầu là dòng lệnh trong hệ 16, cột giữa là dòng lệnh tương đương trong hệ nhị phân (chính là hình ảnh thực sự của chương trình trong bộ nhớ) và cột bên phải là giải thích. AX là tên một thanh ghi 16 bít trong bộ vi xử lý 8086 . Qua ví dụ trên, ta thấy ngôn ngữ máy không thật thích hợp cho số đông người sử dụng máy tính vì để viết hoặc hiểu chương trình, người ta phải nhớ rất máy móc các mã số của lệnh mà các dòng số này không có hàm ý rõ ràng. Mặt khác do tập lệnh của các bộ xử lý có thể khác nhau nên không thể dùng chương trình viết trên bộ xử lý này chạy trên máy tính dùng bộ xử lý khác loại. Hợp ngữ (Assembly). Để khắc phục nhược điểm trên của ngôn ngữ máy, người ta đề xuất một ngôn ngữ giao tiếp với máy ở mức độ hình thức hơn gọi là hợp ngữ. Về cơ bản, hợp ngữ có các cấu trúc rất giống với ngôn ngữ máy. Điều khác là trong hợp ngữ có
  • 2. thể viết lệnh dưới dạng mã chữ. Mã chữ thể hiện mã lệnh hoặc các đối tượng trong lệnh (trong ngôn ngữ máy nó là mã lệnh và địa chỉ của đối tượng). Mã lệnh ở dạng chữ thường chính là những từ trong tiếng Anh có ý nghĩa rõ ràng, còn đối tượng do ta tự đặt tên phù hợp với ý niệm về đối tượng đó. Ví dụ nếu đoạn chương trình trên dùng để cộng chiều dài và chiều rộng của hình chữ nhật để tính nửa chu vi thì trong hợp ngữ ASM ta chỉ cần viết Bảng 9.2. Chương trình viết trên Assembly MOV AX CHIEU_DAI ADD AX CHIEU_RONG MOV NUA_CHU_VI AX Từ MOV có gốc từ từ MOVE trong tiếng Anh, có nghĩa là chuyển, còn từ ADD có nghĩa là cộng. Lệnh thứ nhất có nghĩa là nạp số liệu mà ta đặt tên là CHIEU_DAI lên thanh ghi AX, lệnh thứ hai có nghĩa là cộng số trong thanh ghi AX với số liệu mà ta đặt tên là CHIEU_RONG. Ta thấy mặc dù còn cồng kềnh và còn phụ thuộc vào một loại máy tính cụ thể, hợp ngữ dễ dùng hơn rất nhiều so với ngôn ngữ máy. Để một chương trình viết bằng hợp ngữ chạy được trên máy tính, nó cần phải được dịch ra ngôn ngữ máy. Rõ ràng là, mỗi hợp ngữ dùng cho một loại máy nào đó đều cần có trình dịch phù hợp. Khi dịch, hai đối tượng CHIEU_DAI và CHIEU_RONG nói trên sẽ được tự động thay bằng hai địa chỉ cụ thể nào đó không nhất thiết là 1064 và 1066 như ở ví dụ trên. Vì vậy ta cũng không cần phải quan tâm đến sắp xếp địa chỉ cụ thể sau khi dịch xong và chạy chương trình. Chương trình dịch đối với hợp ngữ được gọi là hợp dịch (assembler). Ngôn ngữ thuật toán (còn gọi là ngôn ngữ thuật toán) . Ta đã thấy ngôn ngữ máy và cả hợp ngữ đều phụ thuộc vào hệ thống lệnh của một loại máy cụ thể. Chúng chưa thật thích hợp cho đông đảo người sử dụng máy tính. Người ta muốn thể hiện thuật toán bằng những lệnh với ý nghĩa thực tế và độc lập với bất cứ loại máy cụ thể nào. Chẳng hạn trong ví dụ trên chỉ cần viết NUA_CHU_VI = CHIEU_DAI + CHIEU_RONG là đủ. Từ đầu những năm 50, người ta đã xây dựng những ngôn ngữ lập trình vạn năng có các lệnh gần với ngôn ngữ tự nhiên và ngôn ngữ toán học. Các ngôn ngữ lập trình này được gọi là các ngôn ngữ lập trình bậc cao (high level programming language). Vì chúng chỉ nhằm vào thể hiện thuật toán độc lập với các máy tính cụ thể nên người ta còn gọi nó là các ngôn ngữ thuật toán (algorithmic language). Cũng như đối với hợp ngữ, mỗi ngôn ngữ lập trình bậc cao trên một loại máy cụ thể đều cần có chương trình dịch để dịch các chương trình sang sang ngôn ngữ máy của máy đó mới có thể thực hiện được. Chú ý rằng mỗi lệnh của hợp ngữ nói chung được dịch thành một lệnh trong ngôn ngữ máy còn mỗi lệnh của ngôn ngữ bậc cao thường tương đương với nhiều lệnh máy. Ví dụ lệnh NUA_CHU_VI = CHIEU_DAI + CHIEU_RONG sẽ dịch thành 3 lệnh máy. Có hai kiểu dịch: thông dịch (Interpeter) là kiểu dịch từng lệnh để hiểu công việc phải làm và thực hiện luôn nhưng không nhất thiết phải tạo ra những đoạn mã tương ứng trong ngôn ngữ máy. Nếu một lệnh cần thực hiện nhiều lần thì cũng phải dịch nhiều lần.
  • 3. Ngôn ngữ BASIC thịnh hành vào những năm 80 thường đi theo chế độ thông dịch. Còn các trình biên dịch (compiler) sẽ dịch toàn bộ chương trình ban đầu (gọi là chương trình nguồn) thành một chương trình tương ứng trong ngôn ngữ máy (gọi là chương trình đích), sau đó nạp chương trình đích vào máy tính để thực hiện. Sở dĩ trong tiếng Việt chúng ta gọi hai kiểu dịch này là "thông dịch' và "biên dịch" vì tính chất dịch có phần nào giống với dịch tiếng nước ngoài. Thông dịch giống như công việc của người phiên dịch (thông ngôn), nói tới đâu dịch tới đó. Còn biên dịch là công việc của người biên dịch, căn cứ trên tài liệu đầy đủ, ta viết ra một lần bản dịch đầy đủ. Ngôn ngữ bậc cao đầu tiên được xây dựng vào năm 1957 là ngôn ngữ FORTRAN (FORmula TRANslator - Bộ dịch các công thức). Ngày nay có rất nhiều các ngôn ngữ lập trình bậc cao như PASCAL hay C. Sau đây là một đoạn chương trình giải phương trình bậc 2 viết trên PASCAL và FORTRAN. Bạn đọc dù chưa có một chút ý niệm gì về các ngôn ngữ này cũng có thể hiểu được các đoạn chương trình sau nói gì Bảng 9.3. Chương trình viết trên Pascal (*Đoạn chương trình trên PASCAL*) DELTA := B*B - 4*A*C; IF DELTA > 0 THEN BEGIN X1 := (- B + SQRT(DELTA))/(2*A); X2 := (- B - SQRT(DELTA))/(2*A); WRITE (X1,X2); END ELSE WRITE('Vo nghiem'); ..... 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 9.4. Chương trình viết trên FORTRAN IV 1 6 7 72 73 80 DELTA = B*B - 4* A*C IF DELTA < 0 GOTO 10 X1 = (- B + SQRT(DELTA))/(2*A)
  • 4. 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 ........................................... 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. 9.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ụ mà chúng ta thảo luận trong mục 7. 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
  • 5. 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 9.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
  • 6. Soạn thảo Dịch Liên kết Thực hiện Phần mềm Chương trình Chương Dữ liệu soạn thảo dịch trình liên kết Kết quả Chương trình Các mô đun Chương trình xử lý nguồn đối tượng chạy được Lỗi cú Lỗi liên kết Lỗi thi pháp hành Hình 9.1. Sơ đồ thực thực hiện một công việc với ngôn ngữ bậc cao