Có sự khác biệt thực sự giữa trình biên dịch và trình biên dịch không?


14

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?


1
Một lắp ráp một trình biên dịch mà thực hiện một tập hợp cụ thể của nhiệm vụ. Các thuật ngữ đã phần nào chuyển hướng trong thực tế, nhưng định nghĩa cơ bản của "trình biên dịch" (dịch giữa các ngôn ngữ) được áp dụng.
Raphael

Tất cả các trình biên dịch là trình biên dịch (đơn giản), vì chúng biến đổi ngôn ngữ này sang ngôn ngữ khác. Không phải tất cả các trình biên dịch là trình biên dịch.
dùng253751

Câu trả lời:


16

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.


1
Tại sao bản dịch có thể được thực hiện chỉ bằng một cách? Điều đó có nghĩa là mã asm ban đầu không thể được tạo cho một mã máy nhất định (và kiến ​​trúc đích)? Điều đó nghe có vẻ trực quan với tôi. Bởi vì nếu một lệnh mã máy đã cho có thể ánh xạ tới nhiều lệnh asm, thì máy quyết định lệnh nào sẽ thực hiện? Tui bỏ lỡ điều gì vậy?
Utku

2
MộtT(Một)Một

Cảm ơn, tôi cũng thấy rằng trong cuốn sách của Ullman, một trình biên dịch có phần đầu và phần phụ trợ. Nếu tôi đúng, phần phụ trợ thực hiện tối ưu hóa bằng ngôn ngữ trung gian, tạo mã máy và tối ưu hóa mã máy và mỗi trong ba tác vụ có thể được thực hiện theo nhiều cách. phần "phụ trợ" là một trình biên dịch? Là ngôn ngữ trung gian là ngôn ngữ lắp ráp? Tôi đoán là có, nhưng câu trả lời của bạn đề cập rằng một trình biên dịch thực hiện công việc của nó chỉ bằng một cách.
StackExchange cho tất cả các


Ngôn ngữ trung gian thường đề cập đến một ngôn ngữ độc lập với máy móc.
Yuval Filmus

11

Đ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ớ.


0

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:

  1. Một dòng mã nguồn có liên quan trực tiếp đến một opcode CPU (A) hay không (C)
  2. Phụ thuộc nhiều vào CPU thực tế (A) hoặc độc lập máy (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:

  • thêm a, b (cho một CPU cụ thể)
  • thêm R5, R6 (cho CPU khác)
  • thêm (A5), D2 (cho CPU khác)

Trong một ngôn ngữ cấp cao, bạn có thể viết:

  • x = y + z;

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:

  1. Giai đoạn đầu tiên đọc mã nguồn thực tế và tạo một biểu diễn bên trong. Giai đoạn này biết ngôn ngữ nguồn thực tế.
  2. Giai đoạn thứ hai xem xét các đại diện nội bộ và thực hiện một số tối ưu hóa. Ngày nay, trình biên dịch thường sẽ tìm cách làm cho chương trình nhanh hơn và không quan tâm nếu nó lớn hơn. Việc tối ưu hóa được thực hiện trên các đại diện nội bộ. Thật thú vị, các phần của điều này có thể là chung cho một số ngôn ngữ khác nhau.
  3. Giai đoạn thứ ba lấy biểu diễn bên trong và tạo mã thực tế cho CPU đã chọn. Có thể có một số phiên bản khác nhau của giai đoạn này, nhắm mục tiêu các CPU khác nhau. Trong thực tế, bạn có thể viết mã nguồn một lần và sau đó biên dịch mã cho các CPUS khác nhau.
  4. Chuẩn bị cuối cùng cho "đóng gói" chương trình (giai đoạn này có thể là một trình liên kết).

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).

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.