คอมไพเลอร์ C # เขียนด้วยภาษาใด?


148

ฉันดูซอร์สโค้ดที่http://referencesource.microsoft.com/และปรากฏว่าซอร์สโค้ดทั้งหมดอยู่ใน C #

ฉันยังดูซอร์สโค้ดสำหรับแพลตฟอร์มคอมไพเลอร์ C # ใหม่ ( Roslyn ) และยังอยู่ใน C # เป็นไปได้อย่างไร? คอมไพเลอร์ภาษา C # เขียนเป็น C # หรือไม่ หรือฉันขาดอะไรบางอย่างที่ชัดเจน? ถ้าคอมไพเลอร์ C # เขียนใน C # แล้วมันทำงานอย่างไร


12
คอมไพเลอร์จำนวนมากเขียนด้วยภาษาที่คอมไพล์ - Google bootstrappingเพื่อเรียนรู้เพิ่มเติม
พอล Roub

19
ฉันคิดว่าคอมไพเลอร์ดั้งเดิมเขียนด้วยภาษา C ++
PoweredByOrange

44
ค้อนสามารถปลอมแปลงได้ด้วยการใช้ค้อนอีกอัน รุ่นก่อนหน้า ...
Eugene Sh

10
ลิงค์ที่คุณโพสต์คือลิงค์ไปยังซอร์สโค้ดของไลบรารี Framework ไม่ใช่ไปยังคอมไพเลอร์
Steve

8
อาจเกี่ยวข้องกับ: การใช้คอมไพเลอร์ใน "ตัวเอง"และการบูตภาษา
Habib

คำตอบ:


229

คอมไพเลอร์ C # ดั้งเดิมไม่ได้เขียนด้วยภาษา C # แต่เป็นภาษา C และ C ++ คอมไพเลอร์ Roslyn ใหม่ถูกเขียนใน C # แต่แรกเริ่มถูกคอมไพล์ด้วยคอมไพเลอร์เก่า เมื่อคอมไพเลอร์ใหม่ได้ทำมันก็สามารถที่จะรวบรวมรหัสแหล่งที่มาของตัวเองนี้เรียกว่าความร่วมมือ


2
ดังนั้นเมื่อมีการเปลี่ยนแปลงต้องทำกับ "ต้นฉบับคอมไพเลอร์" นั้นจะต้องมีการรวบรวมด้วยคอมไพเลอร์เก่า(เขียนใน C, C ++) ?
CriketerOnSO

10
ไม่จำเป็นต้องเปลี่ยน "คอมไพเลอร์ดั้งเดิม" เวอร์ชันที่ใหม่กว่าจะได้รับการแก้ไข
นามแฝง

1
@CriketerOnSO คอมไพเลอร์ใหม่จะแทนที่อันเก่าดังนั้นไม่จำเป็นต้องแก้ไขอันเก่า แต่ถ้า MS ต้องการทำเช่นนั้นพวกเขาจะคอมไพเลอร์คอมไพล์เก่าด้วยคอมไพเลอร์ C ++ ใหม่เหมือนที่เคยทำมาก่อน
Thomas Levesque

3
@ThomasLevesque การโฮสต์ด้วยตนเองเป็นผลสุดท้ายของการบูตสายรัด
arx

2
@SiriramSakthivel โค้ดของคอมไพเลอร์ไม่สามารถใช้คำหลักใหม่อย่างน้อยก็จนกว่าจะมีคอมไพเลอร์ที่เข้าใจพวกเขา คุณใช้คอมไพเลอร์เวอร์ชั่นที่เก่ากว่าเพื่อสร้างใหม่
Thomas Levesque

32

คอมไพเลอร์เป็นโปรแกรมยูทิลิตี้ - พวกเขาเปลี่ยนข้อความภาษาการเขียนโปรแกรมลงในรหัสเครื่อง หากภาษาการเขียนโปรแกรมอธิบายซอฟต์แวร์ที่เพิ่งเกิดขึ้นเป็นคอมไพเลอร์ .....

คอมไพเลอร์ยังสามารถสร้างรหัสเครื่องสำหรับสถาปัตยกรรมอื่น ๆ ตัวอย่างเช่น Apple รวบรวม iOS โดยใช้ชั้นวางของเซิร์ฟเวอร์ที่ใช้ Intel คอมไพเลอร์ไม่จำเป็นต้องเรียกใช้รหัส ARM ที่สร้างขึ้นเพียงแค่เขียนลงดิสก์

คอมไพเลอร์ 2.0 จะต้องเขียนในภาษาคอมไพเลอร์ 1.0 สามารถดำเนินการได้ แต่แน่นอนว่ามันสามารถสร้างคอมไพเลอร์ 2.0 ด้วยคุณสมบัติใหม่เช่นการปรับให้เหมาะสม จากนั้นคุณสามารถคอมไพล์ซอร์สโค้ดใหม่โดยใช้คอมไพเลอร์ 2.0 และสร้างเวอร์ชั่นที่ดีขึ้นของตัวเอง อีกครั้งคอมไพเลอร์ไม่ทราบว่ามันสร้างเวอร์ชั่นใหม่ขึ้นมาเอง

ถ้าเราย้อนกลับไปในหมอกแห่งกาลเวลามากพอแล้วเราก็ไปถึงจุดที่เราไม่มีผู้แปล - การทำซ้ำครั้งแรกของภาษาระดับสูง จากนั้นเราต้องออกดินสอและหนังสือ opcode และเขียนหนังสือเล่มแรกในการชุมนุม เราเขียนชุดประกอบชุดแรกได้อย่างไร ป้อนรหัสเครื่องโดยตรงอาจใช้เทปเจาะกระดาษหรือสวิตช์พลิกที่แผงด้านหน้า


9
และเทปกระดาษก็แค่เปิดสวิตช์ผ่านรูในกระดาษ :-)
Zan Lynx

2
เทปกระดาษในฐานะที่เป็นเทคโนโลยีการจัดเก็บข้อมูลจะไม่ถอด มันซับซ้อนเกินไปและมีแนวโน้มที่จะเกิดข้อผิดพลาดรวมทั้งมันจะเผาไหม้ได้ง่ายหากมีการลัดวงจรในเครื่องอ่านและมันจะทำลายโปรแกรมของคุณโดยสิ้นเชิง
CVn

16

คอมไพเลอร์เป็นเพียงโปรแกรมเช่นโปรแกรมอื่น ๆ ไม่มีอะไรที่วิเศษหรือพิเศษเกี่ยวกับมัน ใช้อินพุตและสร้างเอาต์พุตบางส่วน ในกรณีนี้อินพุตจะเกิดขึ้นเป็น C # และเอาต์พุตเพิ่งจะเป็น CIL แต่นั่นไม่ต่างจากอินพุตที่เป็นชุดของการคืนภาษีและเอาต์พุตเป็นรายงาน


10
มันแตกต่าง - ง่ายกว่า -)
Peter - Reinstate Monica

3
@ PeterSchneider: ผู้คนชอบคอมไพเลอร์ในฐานะสัตว์วิเศษในตำนาน แต่ท้ายที่สุดพวกเขาเป็นเพียงโปรแกรมที่แปลงอินพุตเป็นเอาต์พุต ค่อนข้างทุกโปรแกรมบนโลกแยกวิเคราะห์อินพุตพยายามทำให้เข้าใจแล้วแปลงมันเป็นเอาต์พุต ในบางแง่ทุกอินพุตเป็นโปรแกรมที่เขียนในบางภาษาทุกโปรแกรมเป็นคอมไพเลอร์
Jörg W Mittag

3
ฉันไม่เห็นด้วยเพิ่มเติม ทั้งหมดที่ฉันอยากจะพูดคือกฎหมายภาษีเป็นระเบียบที่แย่มาก ในทางตรงกันข้ามภาษาแบบเป็นทางการนั้นถูกนิยามไว้อย่างดีในวิธีที่เหมาะสำหรับการทำให้เป็นอัตโนมัติ ซึ่งทำให้คอมไพเลอร์เรียบง่ายเนื้อหาที่เขียนง่ายกว่าโปรแกรมที่เกี่ยวข้องกับภาษี แม้ว่า Eric Lippert อาจขอร้องที่จะไม่เห็นด้วยกับคอมไพเลอร์ C #, cf blogs.msdn.com/b/ericlippert/archive/2010/02/04/... มาไกลจากคอมไพเลอร์ C แบบ one-pass
Peter - Reinstate Monica

1
@PeterSchneider: อ่าขอโทษฉันตีความความคิดเห็นของคุณผิด 180 ° :-D
Jörg W Mittag

ฉันชอบคำตอบนี้ดีที่สุดเพราะมันตอบสนองความคิดของ OP โดยตรงที่สุด มันจะล้างหมอกที่ล้อมรอบคอมไพเลอร์ "all mighty"
Assaf Levy
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.