Để file .c mà chúng ta viết có thể được dịch thành file .bin, .hex để nạp được xuống một MCU bất kỳ thì chúng ta cần Compiler. Vậy bạn có biết Compiler là gì hay không? Hãy cùng tham khảo một số thông tin tổng hợp sau đây để hiểu rõ hơn về Compiler cũng như những đặc điểm của Compiler.
Mục Lục
Compiler là gì?
Compiler là gì? là nghi vấn của không ít người. Thực tế nó được gọi là trình biên dịch. Đây là một chương trình máy tính giúp bạn chuyển đổi mã nguồn được viết bằng ngôn ngữ cấp cao thành ngôn ngữ máy cấp thấp.
Compiler dịch mã được viết bằng một ngôn ngữ lập trình sang một số ngôn ngữ khác mà không làm thay đổi ý nghĩa của mã. Trình biên dịch cũng làm cho mã kết thúc hiệu quả được tối ưu hóa cho thời gian thực thi và không gian bộ nhớ.
Quá trình biên dịch bao gồm các cơ chế dịch cơ bản và phát hiện lỗi. Quá trình biên dịch trải qua phân tích từ vựng, cú pháp và ngữ nghĩa ở frontend, đồng thời tạo mã và tối ưu hóa ở backend.
Compiler là gì?
Các loại Compilers là gì?
Trình biên dịch hiện nay được chia thành 3 loại cụ thể như sau:
Single Pass Compilers (trình biên dịch 1 lần)
Trình biên dịch 1 lần này chỉ tiến hành phân tích cú pháp, phân tích từ vựng và tạo mã duy nhất một lần. Nói cách khác, nó cho phép mã nguồn đi qua mỗi đơn vị biên dịch một lần duy nhất. Trình biên dịch này sẽ ngay lập tức dịch từng phần mã code thành mã máy cuối cùng của nó.
Các giai đoạn chính của trình biên dịch một lần là phân tích từ vựng, phân tích cú pháp và tạo mã. Đầu tiên, phân tích từ vựng quét mã nguồn rồi tiến hành chia nó thành các mã thông báo. Mọi ngôn ngữ lập trình đều có ngữ pháp. Nó đại diện cho cú pháp và các tuyên bố pháp lý của ngôn ngữ. Sau đó, phân tích cú pháp xác định cấu trúc ngôn ngữ được ngữ pháp mô tả. Cuối cùng, trình tạo mã tạo ra mã đích. Nhìn chung, Single Pass Compiler không tối ưu hóa mã. Hơn nữa, không có sự tạo mã trung gian.
Trình biên dịch 1 lần
Two Pass Compilers (trình biên dịch 2 lần)
Trình biên dịch 2 lần được chia thành 2 phần đó là:
- Frontend: trình biên dịch ánh xạ mã thành Intermediate Representation (IR).
- Backend: trình biên dịch tieps tục ánh xạ IR vào máy đích.
Phương thức biên dịch hai lần cũng đơn giản hóa quá trình nhắm mục tiêu. Nó cũng cho phép nhiều frontend.
Multipass Compilers (trình biên dịch nhiều lần)
Trình biên dịch multipass làm cho mã nguồn trải qua quá trình phân tích cú pháp, phân tích từ vựng, tạo mã,… nhiều lần trong khi tiến hành tạo mã trung gian sau mỗi lần. Nó chuyển đổi chương trình thành một hoặc nhiều IR trong các bước giữa mã nguồn và mã máy. Multipass Compilers xử lý lại toàn bộ đơn vị biên dịch trong mỗi lần truyền tuần tự.
Mỗi lần dịch sau lấy kết quả của lần dịch trước làm đầu vào và tạo ra một đầu ra trung gian. Tương tự như vậy, trong mỗi lần dịch qua, mã được cải thiện cho đến khi lần chuyển cuối cùng tạo ra mã cuối cùng. Một trình biên dịch multipass thực hiện các tác vụ bổ sung như tạo mã trung gian, tối ưu mã phụ thuộc vào máy và tối ưu mã độc lập với máy.
Bạn đọc tham khảo thêm: Parse server là gì? Ưu điểm – nhược điểm của Parse Server
Nhiệm vụ của Compiler là gì?
Sau khi đã biết Compiler là gì? thì chúng ta hãy thử xem nhiệm vụ của trình biên dịch là gì nhé.
- Compiler chia nhỏ chương trình nguồn thành nhiều phần và áp đặt cấu trúc ngữ pháp lên chúng.
- Compiler cho phép bạn xây dựng chương trình mục tiêu mong muốn từ IR và cũng tạo bảng ký hiệu.
- Biên dịch mã nguồn và phát hiện các lỗi trong mã nguồn.
- Quản lý lưu trữ tất cả các mã và biến.
- Hỗ trợ biên dịch riêng biệt.
- Đọc, phân tích toàn bộ chương trình và dịch sang tương đương về mặt ngữ nghĩa.
- Dịch mã nguồn trở thành mã đối tượng tùy vào loại máy.
Tại sao phải sử dụng Compiler?
Sở dĩ chúng cần phải sử dụng trình biên dịch vì nó mang nhiều ưu điểm cũng như hỗ trợ tốt các lập trình viên trong nhiều công việc như sau:
- Trình biên dịch giúp xác minh toàn bộ chương trình. Vì vậy không có lỗi cú pháp hoặc ngữ nghĩa.
- Tệp thực thi sẽ được tối ưu hóa bởi trình biên dịch. Vì vậy tệp thực thi cho tốc độ nhanh hơn.
- Compiler cho phép bạn tạo cấu trúc bên trong trong bộ nhớ.
- Sử dụng Compiler khiến bạn không cần phải thực thi chương trình trên cùng một máy mà nó đã được xây dựng.
- Dễ dàng dịch toàn bộ chương trình sang ngôn ngữ khác.
- Liên kết các tệp thành một định dạng thực thi.
- Trình biên dịch kiểm tra lỗi cú pháp cũng như kiểu dữ liệu.
- Giúp bạn nâng cao hiểu biết của mình về ngữ nghĩa ngôn ngữ.
- Các kỹ thuật được sử dụng để xây dựng một trình biên dịch cũng có thể hữu ích cho các mục đích khác.
- Thiết kế trình biên dịch giúp triển khai đầy đủ các Ngôn ngữ lập trình cấp cao.
- Hỗ trợ tối ưu hóa cho kiến trúc máy tính song song.
- Thiết kế phân cấp bộ nhớ mới của máy móc.
- Được sử dụng rộng rãi để dịch các chương trình.
- Có thể sử dụng cùng với các Software Productivity Tools khác.
Compiler nằm ở đâu trong hệ thống xử lý ngôn ngữ?
Hệ thống xử lý ngôn ngữ
Hệ thống xử lý ngôn ngữ hay chính là Language processing systems. Nó gồm một loạt các công cụ tương đương Compiler để cùng xử lý ngôn ngữ. Vậy Compiler nằm ở đâu trong hệ thống này.
- Preprocessor: hay còn được gọi là bộ tiền xử lý. Nó được coi như một phần của trình biên dịch, là một công cụ tạo đầu vào cho Compiler. Preprocessor xử lý macro, nâng cấp, mở rộng ngôn ngữ,…
- Interpret: hay là trình thông dịch. Nó thường bị nhầm với trình biên dịch khi cả hai cùng dịch ngôn ngữ cấp cao sang ngôn ngữ máy cấp thấp. Sự khác biệt chính giữa cả hai là trình thông dịch đọc và chuyển đổi từng dòng mã. Compiler đọc toàn bộ mã cùng một lúc và tạo mã máy.
- Assembler: Nó dịch mã hợp ngữ sang ngôn ngữ máy có thể hiểu được. Kết quả đầu ra của trình hợp dịch được biết đến như một tệp đối tượng là sự kết hợp của lệnh máy cũng như dữ liệu cần thiết để lưu các lệnh này trong bộ nhớ.
- Linker: Trình liên kết giúp bạn liên kết và hợp nhất các tệp đối tượng khác nhau để tạo một tệp thực thi. Tất cả các tệp này có thể đã được biên dịch bằng các Assembler riêng biệt. Nhiệm vụ chính của trình liên kết là tìm kiếm các mô-đun được gọi trong một chương trình và tìm ra vị trí bộ nhớ nơi lưu trữ tất cả các mô-đun.
- Loader: Bộ tải là một phần của OS, thực hiện nhiệm vụ tải các tệp thực thi vào bộ nhớ và chạy chúng. Nó cũng tính toán kích thước của một chương trình tạo ra không gian bộ nhớ bổ sung.
- Cross-compiler: Trình biên dịch chéo trong thiết kế trình biên dịch là một nền tảng giúp bạn tạo mã thực thi.
- Source-to-source Compiler: Trình biên dịch nguồn sang nguồn là một thuật ngữ được sử dụng khi mã nguồn của một ngôn ngữ lập trình được dịch sang nguồn của ngôn ngữ khác.
Bạn đọc tham khảo thêm: CI CD là gì? Những lợi ích của CI CD mang lại
Sự khác nhau giữa Compiler và Interpret
Sự khác nhau giữa trình biên dịch và trình thông dịch
Có không ít người khi chưa am hiểu về trình biên dịch và trình thông dịch thường hay nhầm lẫn về hai chương trình này. Chúng cùng dịch những ngôn ngữ cao cấp sang ngôn ngữ máy cấp thấp. Tuy nhiên, giữa hai chương trình này có không ít điểm khác biệt như sau:
Compiler (Trình biên dịch) | Interpret (Trình thông dịch) |
Trình biên dịch là một chương trình bao gồm toàn bộ mã nguồn của một ngôn ngữ lập trình thành mã máy thực thi cho CPU. | Trình thông dịch lấy một chương trình nguồn và chạy nó từng dòng, dịch từng dòng khi kết thúc. |
Trình biên dịch mất nhiều thời gian để phân tích toàn bộ mã nguồn. Nhưng thời gian thực thi tổng thể của chương trình tương đối nhanh. | Để phân tích mã nguồn, trình thông dịch mất ít thời gian hơn. Nhưng thời gian thực thi tổng thể của chương trình lại chậm hơn. |
Trình biên dịch chỉ tạo ra thông báo lỗi sau khi quét toàn bộ chương trình. Vì vậy việc gỡ lỗi tương đối khó vì lỗi có thể xuất hiện ở bất kỳ vị trí nào trong chương trình. | Gỡ lỗi của nó dễ dàng hơn vì nó tiếp tục dịch chương trình cho đến khi gặp lỗi. |
Tạo mã đối tượng trung gian. | Không có mã đối tượng trung gian nào được tạo. |
Trên đây là một số thông tin tổng hợp nhất về Compiler là gì. Hy vọng những chia sẻ ngay trên đây sẽ hữu ích đối với bạn.