Bảng so sánh giữa biên dịch và thông dịch

Xem chủ đề cũ hơn Xem chủ đề mới hơn Go down

Bảng so sánh giữa biên dịch và thông dịch

Bài gửi  nguyenvanhieu (k17) on 28/11/2014, 22:44


Trình biên dịch (Compiler):

Sẽ chuyển đổi toàn bộ chương trình sang mã máy, rồi chứa kết quả vào đĩa để có thể thi hành về sau. Chương trình ngôn ngữ cấp cao được chuyển đổi được gọi là chương trình nguồn (source program) và chương trình ngôn ngữ máy được tạo ra được gọi là chương trình đối tượng (object program) hoặc mã đối tượng (object code). Khi người dùng muốn chạy chương trình, chương trình đối tượng sẽ được nạp lên bộ nhớ chính của CPU và các chỉ thị của chương trình sẽ được thi hành. Khi được hướng dẫn bởi các chỉ thị của chương trình, CPU sẽ truy xuất dữ liệu và tạo ra các kết quả. Trình biên dịch sẽ kiểm tra cú pháp chương trình, thực hiện các phép kiểm tra logic và đảm bảo các dữ liệu sắp được sử dụng trong các phép so sánh, tính toán đã được định nghĩa một cách hợp lý ở một nơi nào đó trong chương trình. Một chức năng quan trọng của trình biên dịch là nó sẽ tạo ra một danh sách lỗi của tất cả mệnh đề trong chương trình vi phạm cú pháp của ngôn ngữ. Danh sách này giúp lập trình viên dễ dàng sửa đổi chương trình.

Do ngôn ngữ máy phụ thuộc vào bộ vi xử lý nên các máy tính khác nhau sẽ cần có các trình biên dịch khác nhau đối với cùng một ngôn ngữ cấp cao. Ví dụ, một máy mainframe, máy mini và máy tính cá nhân cần có các trình biên dịch khác nhau để biên dịch cùng một chương trình nguồn sang mã máy của từng loại máy này.

Trình thông dịch(Interpreter) :

Thay vì chuyển đổi toàn bộ chương trình nguồn như trình biên dịch, trình thông dịch chỉ chuyển đổi một mệnh đề của chương trình và thực hiện đoạn mã kết quả ngay, sau đó nó tiếp tục chuyển đổi mệnh đề thứ 2 rồi thi hành đoạn mã kết quả thứ 2 và cứ thế. Khi sử dụng trình thông dịch, mỗi lần chạy chương trình là mỗi lần chương trình nguồn được thông dịch sang ngôn ngữ máy. Không có chương trình đối tượng nào được tạo ra.

Các trình thông dịch thường được dùng trên các máy tính cá nhân không có đủ bộ nhớ hoặc sức mạnh tính toán cần thiết để dùng trình biên dịch. Lợi điểm của trình thông dịch là lập trình viên vẫn có thể chạy một chương trình vẫn còn lỗi cú pháp. Chỉ đến lúc thông dịch đến câu lệnh có lỗi cú pháp, quá trình thi hành chương trình mới bị ngừng lại và trình thông dịch sẽ thông báo lỗi. Ðiểm bất lợi là các chương trình thông dịch chạy không nhanh bằng các chương trình được biên dịch vì quá trình chuyển đổi sang ngôn ngữ máy được thực hiện cùng với quá trình thi hành chương trình. Vì lý do này, ngày nay, đa số các ngôn ngữ cấp cao đều dùng trình biên dịch.

Ta có kết quả so sánh tóm tắt như sau (Mình sẽ nói chung, các bạn tự rút ra ưu điểm và nhược điểm):

Biên dịch (Compiler):
-Tốc độ thực thi nhanh
-Có tính bảo mật tốt (do không thể sửa đổi hay xâm phạm mã nguồn để thay đổi chương trình)
- Khi biên dịch sẽ Được tối ưu bởi HĐH đang sử dụng
- Chỉ cần chương trình nguồn một lần cho lần biên dịch đầu tiên, sau đó chạy chương trình mà không cần đến mã nguồn (source code)
-Trong ngôn ngữ có sư ràng buộc chặt chẽ về kiểu
-Chỉ chạy chương trình xác định trên một HĐH, là HĐH mà chương trình được biên dịch ra ngôn ngữ máy ( ví dụ: viết chương trình bằng C++ -> biên dịch ra tập tin *.exe thì chạy trên win, C++ -> biên dịch thành tập tin *.O chạy trên Unix/ Linux….)
- Dễ bị lợi dụng để chứa mã độc, virus.. để tấn công các máy tính khi tải và cài đặt chương trình chứa tập tin .exe vì mã nguồn bị che dấu không thể phát hiện

Thông dịch (Interpreter):
- Tốc đô thực thi chậm hơn biên dịch
- Tính bảo mật không cao vì có thể sửa mã làm thay đổi chương trình
- Luôn cần chương trình nguồn mỗi khi thông dịch
- Có thể sửa mã nguồn bất kỳ lúc nào
- Có tính uyển chuyển , không chặt chẽ trong ràng buộc kiểu
- Phát triển nhanh chóng
- Chạy được trên nhiều HĐH, chi cần có trình thông dịch tương ứng
( Do đây không phải là ngôn ngữ máy mà chỉ như là file văn bản)

Ví dụ trên lớp của thầy về thông dịch và biên dịch của một cuộc nói chuyện rất hay và dễ hiểu, mình không nhắc lại. Và thầy cũng nói các ngôn ngữ lập trình cấp cao có hỗ trợ cả biên dịch và thông dịch.
Các bạn có thể thấy rõ điều này qua ngôn ngữ C++ hay C#:
Khi các bạn viết chương trình xong và run ( F5 với C++ và F6 với C#) thì máy sẽ đọc hết lượt rồi bult thành chương trinh, đây chính là biên dịch. Nhưng khi các bạn chọn debug (Tức là Break point từng câu lệnh, có vòng tròn đỏ phía ngoài) thì lúc này các bạn đang thông dịch. Chương trình sẽ đọc hết từng câu lệnh và thực thi câu lệnh đó ( Thường sử dụng để biết hoạt động của câu lệnh và sửa lỗi).

Có thể các bạn thắc mắc Java cũng là chương trình biên dich nhưng chạy được trên nhiều HĐH? Vì một chương trình Java khi thực thi không biên dich ra ngôn ngữ máy để chạy trên HĐH đó mà biên dịch ra bytecode, bytecode cần được chạy trên JVM (Java vitual Machine) là một máy ảo, trong đó có HĐH ảo (Java)

nguyenvanhieu (k17)

Tổng số bài gửi : 5
Join date : 08/11/2014
Age : 19
Đến từ : Nam Định

Xem lý lịch thành viên

Về Đầu Trang Go down

Xem chủ đề cũ hơn Xem chủ đề mới hơn Về Đầu Trang


 
Permissions in this forum:
Bạn không có quyền trả lời bài viết