Trình biên dịch C # được viết bằng ngôn ngữ nào?


148

Tôi đã xem mã nguồn tại http://referencesource.microsoft.com/ và nó xuất hiện tất cả các mã nguồn có trong C #.

Tôi cũng đã xem mã nguồn cho nền tảng trình biên dịch C # mới ( Roslyn ) và nó cũng nằm trong C #. Làm thế nào là có thể? Là trình biên dịch ngôn ngữ C # được viết bằng C #? Hay tôi đang thiếu một cái gì đó rõ ràng? Nếu trình biên dịch C # được viết bằng C # thì nó hoạt động như thế nào?


12
Nhiều trình biên dịch được viết bằng ngôn ngữ họ biên dịch - Google bootstrapping để tìm hiểu thêm.
Paul Roub 16/12/14

19
Tôi nghĩ rằng trình biên dịch gốc đã được viết bằng C ++.
PoweredByOrange

44
Vâng, một cái búa có thể được rèn bằng cách sử dụng một cái búa khác. Phiên bản trước của nó ...
Eugene Sh.

10
Liên kết bạn đã đăng là liên kết đến mã nguồn của thư viện Framework, không phải trình biên dịch.
Steve

Câu trả lời:


229

Trình biên dịch C # ban đầu không được viết bằng C #, nó là C và C ++. Trình biên dịch Roslyn mới được viết bằng C #, nhưng ban đầu được biên dịch với trình biên dịch cũ. Khi trình biên dịch mới được thực hiện, nó có thể biên dịch mã nguồn của chính nó: đây được gọi là bootstrapping .


2
Vì vậy, khi một thay đổi phải được thực hiện cho "trình biên dịch gốc", điều đó có phải được biên dịch với trình biên dịch cũ (được viết bằng C, C ++) không?
CriketerOnSO 16/12/14

10
Sẽ không cần phải thay đổi "trình biên dịch gốc", các phiên bản mới hơn sẽ được sửa đổi
Bút danh

1
@CriketerOnSO, trình biên dịch mới sẽ thay thế cái cũ, vì vậy sẽ không cần phải sửa đổi cái cũ. Nhưng nếu MS muốn làm điều đó, họ sẽ biên dịch lại trình biên dịch cũ bằng trình biên dịch C ++, như họ đã làm trước đây.
Thomas Levesque

3
@ThomasLevesque Tự lưu trữ là kết quả cuối cùng của quá trình khởi động.
arx

2
@SriramSakth khóa, mã của trình biên dịch không thể sử dụng các từ khóa mới, ít nhất là cho đến khi có một trình biên dịch hiểu chúng. Bạn luôn sử dụng phiên bản cũ hơn của trình biên dịch để xây dựng cái mới.
Thomas Levesque

32

Trình biên dịch là các chương trình tiện ích - chúng biến văn bản ngôn ngữ lập trình thành mã máy. Nếu ngôn ngữ lập trình mô tả phần mềm chỉ là trình biên dịch .....

Trình biên dịch cũng có thể tạo mã máy cho các kiến ​​trúc khác. Ví dụ: Apple biên dịch iOS bằng cách sử dụng các máy chủ dựa trên Intel. Trình biên dịch không phải chạy mã ARM mà nó tạo ra, chỉ cần ghi nó vào đĩa.

Trình biên dịch 2.0 phải được viết bằng trình biên dịch ngôn ngữ 1.0 có thể xử lý, nhưng chắc chắn nó có thể tạo trình biên dịch 2.0 với các tính năng mới hơn như tối ưu hóa. Sau đó, bạn có thể biên dịch lại mã nguồn bằng trình biên dịch 2.0 và tạo phiên bản tốt hơn của chính nó. Một lần nữa, trình biên dịch không biết nó tạo ra một phiên bản khác của chính nó.

Nếu chúng ta đi đủ xa vào thời gian trôi qua thì chúng ta sẽ đạt đến điểm mà chúng ta không có trình biên dịch - lần lặp đầu tiên của ngôn ngữ cấp cao. Sau đó, chúng tôi phải lấy ra bút chì và sách opcode và viết cái đầu tiên trong hội đồng. Làm thế nào chúng ta viết trình biên dịch đầu tiên? Nhập mã máy trực tiếp, có thể trên băng giấy đục lỗ hoặc lật công tắc trên bảng mặt trước.


9
Và băng giấy chỉ là lật công tắc thông qua các lỗ trên giấy. :-)
Zan Lynx

2
Băng giấy như một công nghệ lưu trữ sẽ không bao giờ cất cánh. Nó quá phức tạp và dễ bị lỗi, cộng với nó dễ bị cháy nếu có một mạch ngắn trong đầu đọc và điều đó sẽ phá hủy hoàn toàn chương trình của bạn.
CVn

16

Một trình biên dịch chỉ là một chương trình như bất kỳ chương trình khác. Không có gì kỳ diệu hay đặc biệt về nó. Nó có một số đầu vào và tạo ra một số đầu ra. Trong trường hợp cụ thể này, đầu vào chỉ là C # và đầu ra chỉ là CIL, nhưng điều đó không khác gì đầu vào là một loạt các tờ khai thuế và đầu ra là một báo cáo.


10
Nó là khác nhau - nó dễ dàng hơn nhiều, -).
Peter - Phục hồi lại

3
@PeterSchneider: Mọi người thích chọn trình biên dịch như những sinh vật ma thuật huyền thoại, nhưng cuối cùng, họ chỉ là những chương trình chuyển đổi đầu vào thành đầu ra. Khá nhiều chương trình trên hành tinh phân tích một số đầu vào, cố gắng hiểu ý nghĩa của nó và biến nó thành một số đầu ra. Ở một khía cạnh nào đó, mỗi đầu vào là một chương trình được viết bằng một ngôn ngữ nào đó, mỗi chương trình là một trình biên dịch.
Jörg W Mittag

3
Tôi không thể đồng ý nhiều hơn. Tất cả những gì tôi muốn nói là luật thuế là một mớ hỗn độn khủng khiếp. Ngược lại, các ngôn ngữ chính thức thường được xác định rõ theo cách phù hợp với tự động hóa. Điều này làm cho một trình biên dịch đơn giản dễ viết hơn là một chương trình xử lý thuế. Mặc dù Eric Lippert có thể cầu xin không đồng ý trình biên dịch C #, hãy xem blog.msdn.com/b/ericlippert/archive/2010/02/04/ . Đã đi đường dài từ trình biên dịch C một lượt.
Peter - Phục hồi lại

1
@PeterSchneider: Ah, xin lỗi, tôi đã hiểu sai ý kiến ​​của bạn bởi 180 ° :-D
Jörg W Mittag

Tôi thích câu trả lời này nhất vì nó giải quyết trực tiếp suy nghĩ của OP. Nó xóa sương mù bao quanh trình biên dịch "tất cả hùng mạnh".
Assaf Levy
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.