Có sự khác biệt nào giữa hai người không? Theo sách của Ullman , trình biên dịch chuyển đổi một ngôn ngữ sang ngôn ngữ khác (thường là cấp độ thấp) và trình biên dịch cũng vậy. Hai người khác nhau như thế nào?
Có sự khác biệt nào giữa hai người không? Theo sách của Ullman , trình biên dịch chuyển đổi một ngôn ngữ sang ngôn ngữ khác (thường là cấp độ thấp) và trình biên dịch cũng vậy. Hai người khác nhau như thế nào?
Câu trả lời:
Một trình biên dịch dịch mã lắp ráp thành mã máy. Bản dịch là cơ học, và có thể được thực hiện chỉ bằng một cách. Ngược lại, một trình biên dịch có nhiều tự do hơn khi nó biên dịch ngôn ngữ lập trình có liên quan - ví dụ, nó có thể tối ưu hóa và thậm chí các trình biên dịch không tối ưu hóa tạo ra các mã khác nhau. Ngoài ra, trình biên dịch có thể được viết theo cách phân tách "front-end" (tương ứng với ngôn ngữ lập trình) và "back-end" (tương ứng với kiến trúc máy tính), trong khi với trình biên dịch, cả hai luôn giống nhau.
Điểm mấu chốt là nó vui hơn viết một trình biên dịch một trình biên dịch. Các ngôn ngữ hội thường được thiết kế gần như không đáng kể để phân tích cú pháp và kiểm tra kiểu và có xu hướng liên quan đến rất nhiều trình tạo hướng bảng ("opcode cho add là 01110", "đối với các lệnh tải, thanh ghi toán hạng đích được chỉ định bởi các bit 17 đến 21 "). Thông thường phần thú vị nhất của trình biên dịch chương trình là phần giải quyết các nhãn biểu tượng thành số.
Tuy nhiên , hầu hết các nhà lắp ráp có thể thực hiện một số lượng nhỏ số học (ví dụ thêm các nhãn biểu tượng với các hằng số nhỏ) và hầu hết các nhà lắp ráp đều có hoặc được tích hợp với một cơ sở xử lý macro. (Trên hầu hết các hệ thống Unix, tính năng macro thực sự được cung cấp bằng cách chạy bộ xử lý trước C qua bộ lắp ráp trước khi chuyển nó cho bộ lắp ráp thích hợp.)
Trình biên dịch MIPS đã phải đi một bước xa hơn và đưa ra một số quyết định tạo mã thú vị và thực hiện một số lượng tối ưu hóa nhỏ. Ví dụ, ngôn ngữ máy MIPS yêu cầu các chuỗi mã khác nhau để tải các hằng số khác nhau, và do đó, trình biên dịch phải chọn chuỗi mã sau khi xây dựng hằng số . Hơn nữa, mã máy MIPS có khái niệm về các khe trễ , nhưng trách nhiệm của trình biên dịch là phải trừu tượng hóa chúng và trình bày một ngôn ngữ lắp ráp trừu tượng "bình thường" hơn cho trình biên dịch. Vì vậy, trình biên dịch MIPS cần thực hiện một số lịch trình hướng dẫn cục bộ.
Sự khác biệt càng bị làm mờ đi bởi một số tác phẩm của Norman Ramsey , đặc biệt là ngôn ngữ lắp ráp cầm tay C-- của ông . (Bài viết có liên quan là Ramsey và Peyton Jones, "Một ngôn ngữ trung gian duy nhất hỗ trợ nhiều trường hợp ngoại lệ", Prog. Lang. Impl. Và Dsgn. , (PLDI-21): 285 điều298, 2000. ) Và cuối cùng, ở đó cũng là một ngôn ngữ hội được đánh máy từ David Walker và Greg Morrisett với một trình biên dịch có thể đảm bảo an toàn cho bộ nhớ.
Một chút câu trả lời đơn giản ở đây, thực tế phức tạp hơn. Tôi hy vọng sự khác biệt giữa Trình biên dịch (A) và Trình biên dịch (C) là một trong những điều khác:
Chúng tôi có xu hướng gọi ngôn ngữ lắp ráp là "mức thấp" và ngôn ngữ nguồn mà trình biên dịch hiểu là "mức cao" (đây là sự đơn giản hóa thô, nhưng vẫn còn).
Trong ngôn ngữ lắp ráp, ví dụ bạn có thể thực hiện thao tác thêm bằng cách nói:
Trong một ngôn ngữ cấp cao, bạn có thể viết:
Và điều này có thể dẫn đến một lệnh hoặc hàng trăm hướng dẫn tùy thuộc vào một số trường hợp, một là CPU mà trình biên dịch tạo ra hướng dẫn.
Như bạn có thể thấy ngôn ngữ nguồn lắp ráp thường xuyên nhất: (A) một dòng mã nguồn cung cấp cho một dòng mã opc CPU và nó phụ thuộc rất nhiều vào CPU mà bạn đang nhắm mục tiêu. Trình biên dịch ngôn ngữ cấp cao (C) xử lý tất cả các chi tiết này cho bạn - một dòng mã nguồn có thể trở thành số không, một hoặc nhiều mã nguồn CPU và trình biên dịch xử lý các chi tiết về những gì CPU có thể làm.
Một trình biên dịch ngày nay thường bao gồm một số giai đoạn khác nhau. Chúng có thể được đặt tên là frontend / backend hoặc beeing được gọi là những thứ khác. Tôi thường xem chúng là bốn giai đoạn:
Viết trình biên dịch tốt là một nghề có tay nghề cao - làm cho trình biên dịch ngôn ngữ đồ chơi có thể được thực hiện vào một buổi chiều bởi một người nghiệp dư (hoặc tốt, hơi lâu hơn).