Chương trình dịch là một kiến thức trong môn học Tin học lớp 11. Vậy chương trình là gì? Tại sao cần phải có chương trình dịch? Nhằm giúp các bạn học sinh phổ thông nắm vững lý thuyết kiến thức bài học này, bài viết dưới đây là những nội dung cơ bản về chương trình dịch.
Mục lục bài viết
1. Chương trình dịch là gì?
Chương trình dịch hay còn được gọi với cái tên là trình biên dịch, có chức năng là chuyển đổi một chuỗi các câu lệnh được viết bằng một ngôn ngữ lập trình cao hơn (cụ thể là ngôn ngữ nguồn hoặc mã nguồn) thành một chương trình đích nhưng được thể hiện ở dưới dạng ngôn ngữ máy tính (ngôn ngữ đích) và có thể thực thi được trên máy tính.
Thông thường, ngôn ngữ đích là loại ngôn ngữ ở cấp thấp hơn được sử dụng để máy tính có thể hiểu được các câu hướng dẫn bằng văn bản. Chương trình dịch tạo ra một chương trình mới còn được gọi là mã đối tượng.
Bên cạnh đó, ngôn ngữ bậc cao gần với ngôn ngữ tự nhiên, có tính độc lập cao, khả năng phụ thuộc vào loại máy ít và chương trình phải dịch sang ngôn ngữ máy mới thực hiện được.
Quy trình của một chương trình dịch: Chương trình dịch -> Chương trình nguồn -> Chương trình đích.
Trong đó:
– Chương trình nguồn: chương trình được viết trên ngôn ngữ lập trình bậc cao
– Chương trình đích: chương trình nguồn được chuyển đổi sang ngôn ngữ máy tính nhờ chương trình dịch.
2. Các giai đoạn chương trình dịch:
Một chương trình dịch hoạt động được thì chương trình dịch phải trải qua hai giai đoạn đó là: giai đoạn phân tích và giai đoạn tổng hợp.
Giai đoạn phân tích được diễn ra nhằm phân tích chương trình nguồn về từ vựng và cú pháp để có kế hoạch thực hiện giai đoạn tiếp theo. Quá trình phân tích sẽ bắt đầu từ việc phân tích từ vựng, tiếp đến là phân tích cú pháp và cuối cùng là phân tích ngữ nghĩa. Quá trình phân tích càng chi tiết thì sẽ giúp cho giai đoạn tạo mã tiếp theo thực hiện dễ dàng và chính xác hơn.
Giai đoạn tổng hợp nhằm mục đích tạo ra chương trình đích bao gồm ba bước, đó là:
+ Sinh mã trung gian: có nghĩa là từ chuyển chương trình nguồn sẽ chuyển về chương trình trung gian.
+ Tối ưu mã: có nghĩa là tối ưu, chỉnh sửa chương trình trung gian.
+ Sinh mã: có nghĩa là từ chương trình trung gian đã tối ưu sẽ tạo ra chương trình đích.
Các loại chương trình dịch thường có các bước như: Thông dịch và biên dịch.
– Thông dịch: Chương trình này sẽ thực hiện lặp đi lặp lại dãy các bước sau:
+ Kiểm tra tính đúng đắn của câu lệnh kế tiếp trong chương trình nguồn.
+ Chuyển đổi các câu lệnh vừa kiểm tra đó thành các câu lệnh tương ứng trong ngôn ngữ máy tính.
+ Thực hiện các câu lệnh vừa mới chuyển đổi.
Loại chương trình dịch này đặc biệt phù hợp trong môi trường đối thoại giữa hệ thống và người dùng, chẳng hạn như các ngôn ngữ khai thác hệ quản trị cơ sở dữ liệu, hệ điều hành với đối thoại…
– Biên dịch: Chương trình này thực hiện qua hai bước sau:
+ Đầu tiên là duyệt, tiếp đến là kiểm tra, phát hiện lỗi, xác định chương trình nguồn có dịch được hay không.
+ Chuyển đổi chương trình nguồn này thành một chương trình đích có thể thực hiện trên máy và lưu trữ lại để về sau sử dụng.
Loại chương trình dịch này khá là thuận tiện cho các chương trình ổn định và cần phải thực hiện nhiều lần.
Bên cạnh chương trình dịch, người dùng còn được cung cấp các dịch vụ có liên quan chẳng hạn như biên soạn, lưu trữ… từ đó tạo thành một môi trường làm việc trên một ngôn ngữ lập trình.
Ví dụ: Free Pascal 1.2, Visual Pascal 2.1, Turbo Pascal 7.0, ..
3. Phân loại chương trình dịch:
Chương trình dịch được phân thành hai loại chính đó là: Trình biên dịch và trình thông dịch.
– Trình biên dịch (compiler): Nhận toàn bộ dữ liệu nguồn rồi dịch sang kết quả trong một lượt. Trình biên dịch (compiler) được hoạt động giống như một dịch giả.
– Trình thông dịch (interpreter): tiếp nhận mã nguồn từng phần, khi nhận được phần nào tiến hành dịch luôn phần đấy. Trình thông dịch (interpreter) thường hoạt động giống người phiên dịch trong các cuộc giao tiếp.
Hiện nay, ranh giới giữa trình biên dịch và trình thông dịch ngày càng thu hẹp. Trong đó, trình biên dịch cũng được chia thành 2 loại là: tĩnh (statically) và động (dynamically).
+ Tĩnh (statically): mã sinh ra chạy trực tiếp ngay.
+ Động (dynamically): mã sinh ra cần phải thao tác tái định vị rồi mới tiến hành chạy được.
Một số loại ngôn ngữ lập trình kết hợp cả trình biên dịch và trình thông dịch đó chính là java. Mã java có thể được biên dịch thành mã bytecode, sau đó máy ảo chạy mã bytecode ở dạng thông dịch.
Một số sử dụng compiler và just-in-time compiler. Mã C# được biên dịch thành mã IL và mã IL được biên dịch thành mã máy ở trong lần đầu chạy.
4. Đặc điểm chương trình dịch:
Một chương trình dịch hoàn thiện cần phải có đầy đủ các đặc điểm như sau:
Thứ nhất, Tính toàn vẹn: dữ liệu đầu vào viết ở ngôn ngữ nguồn phải hoàn toàn tương đương với kết quả ở ngôn ngữ đích.
Thứ hai, Tính hiệu quả: chương trình dịch không cần phải sử dụng quá nhiều công suất tính toán và sử dụng bộ nhớ mà vẫn đảm bảo được kết quả ngôn ngữ đích là đủ tốt.
Thứ ba, Tính trong suốt: Sau từ bước thực hiện đòi hỏi chương trình dịch cần phải rõ ràng về kết quả để người dùng có thể sửa lỗi và điều chỉnh lại trong trường hợp có lỗi xảy ra sau khi thực hiện.
Thứ tư, Tính chịu lỗi tốt: chương trình dịch có thể cho phép một số lỗi của đầu vào và đưa ra các gợi ý để xử lý sao cho phù hợp. Chương trình dừng ngay ở lỗi đầu tiên đó là một chương trình không tốt.
5. Vai trò của chương trình dịch:
Chương trình dịch được ứng dụng thực tế và giải quyết các bài toán cụ thể như:
– Chuyển đổi một chuỗi các câu lệnh được viết bằng một ngôn ngữ lập trình cao hơn thành một chương trình đích nhưng được thể hiện dưới dạng ngôn ngữ máy tính.
– Chuyển đổi một ngôn ngữ lập trình bậc cao thành một ngôn ngữ lập trình ở dạng bậc thấp hơn.
– Chuyển đổi các đoạn mã giữa các ngôn ngữ lập trình với nhau. Kiểm tra ngữ pháp, phân tích từ vựng, chính tả, phân tích ngữ nghĩa của các đoạn văn.
– Chuyển đổi từ hình ảnh thành văn bản.
Chương trình dịch có vai trò vô cùng quan trọng và cần thiết trong lập trình vì nó có khả năng chuyển đổi các chương trình được viết bằng ngôn ngữ bậc cao thành các chương trình đích được thể hiện dưới dạng ngôn ngữ máy tính và có thể chạy trên các máy cụ thể.
Chương trình dịch nhận đầu vào là chương trình nguồn được viết bằng ngôn ngữ lập trình bậc cao (dữ liệu đầu vào) và sau đó chuyển đổi chúng thành chương trình đích bằng ngôn ngữ máy tính (đầu ra). Bên cạnh đó, chương trình dịch còn giúp cho người lập trình có thể lập trình bằng một ngôn ngữ và chuyển ngôn ngữ đó thành một ngôn ngữ khác để máy tính có thể đáp ứng được nhu cầu của người lập trình mong muốn.
6. Một số câu hỏi có liên quan:
Câu 1: Trong chế độ biên dịch, một chương trình đã được dịch thông suốt và trên hệ thống không báo lỗi. Như vậy, ta đã có một chương trình không còn chứa lỗi cú pháp đúng hay chưa? Giải thích tại sao?
Hướng dẫn giải:
Trong chế độ biên dịch, một chương trình dịch đã được dịch thông suốt và trên hệ thống không báo lỗi, ta không thể khẳng định rằng chương trình này là đúng. Bởi vì chương trình này vẫn có thể còn chứa lỗi về ngữ nghĩa.
Câu 2: Trong chế độ thông dịch, nếu có hai phần ba số câu lệnh trong chương trình đã được thực hiện. Như vậy ta có thể khẳng định rằng chương trình này không còn chứa lỗi cú pháp nữa đúng hay không? Hãy giải thích tại sao?
Hướng dẫn giải:
Trong chế độ thông dịch, nếu có hai phần ba số câu lệnh trong chương trình đã được thực hiện, ta không thể khẳng định rằng chương trình không còn chứa lỗi cú pháp. Bởi vì, vẫn có thể cú pháp của các câu lệnh chưa thực hiện chưa được kiểm tra.
Câu 3: Phân biệt hai loại chương trình biên dịch và thông dịch?
Hướng dẫn giải:
– Ở biên dịch sẽ đọc và dịch toàn bộ mã nguồn trong vòng một lần. Còn đối với thông dịch thì sẽ đọc và dịch từng câu lệnh trong mã nguồn.
– Biên dịch sẽ thực thi chương trình vừa thực hiện được, còn thông dịch thực thi câu lệnh sau khi câu lệnh đó được dịch xong.
– Chương trình biên dịch có thể được lưu mã để về sau dùng, còn chương trình thông dịch không được lưu mã để về sau dùng.
Câu 4: Khi một chương trình dịch đã được dịch thông suốt, không còn lỗi cú pháp nào nữa, thì có cần phải tiếp tục hiệu chỉnh, tìm và sửa lỗi trong chương trình nguồn nữa hay không?
Hướng dẫn giải:
Khi một chương trình dịch đã được dịch thông suốt, không còn lỗi cú pháp nào nữa, thì ta vẫn cần phải kiểm tra ngữ nghĩa trong chương trình nguồn.