Dalam bahasa apa kompiler C # ditulis?


148

Saya melihat kode sumber di http://referencesource.microsoft.com/ , dan tampaknya semua kode sumber ada di C #.

Saya juga melihat kode sumber untuk platform C # compiler baru ( Roslyn ), dan juga dalam C #. Bagaimana mungkin? Apakah kompiler bahasa C # ditulis dalam bahasa C #? Atau apakah saya melewatkan sesuatu yang jelas? Jika C # compiler ditulis dalam C # lalu bagaimana cara kerjanya?


12
Banyak kompiler ditulis dalam bahasa yang dikompilasi - Google bootstrap untuk mempelajari lebih lanjut.
Paul Roub

19
Saya pikir kompiler asli ditulis dalam C ++.
PoweredByOrange

44
Nah, palu bisa ditempa dengan menggunakan palu lain. Versi sebelumnya ...
Eugene Sh.

10
Tautan yang Anda poskan adalah tautan ke kode sumber pustaka Framework, bukan ke kompiler.
Steve

Jawaban:


229

Compiler C # asli tidak ditulis dalam C #, itu dalam C dan C ++. Kompiler Roslyn baru ditulis dalam C #, tetapi pada awalnya dikompilasi dengan kompiler lama. Setelah kompiler baru selesai, ia dapat mengkompilasi kode sumbernya sendiri: ini disebut bootstrap .


2
Jadi ketika perubahan harus dilakukan ke "kompiler asli", apakah itu harus dikompilasi dengan kompiler lama (ditulis dalam C, C ++) ?
CriketerOnSO

10
Tidak perlu mengubah "kompiler asli" versi yang lebih baru akan dimodifikasi
Nama samaran

1
@CriketerOnSO, kompiler baru akan menggantikan yang lama, jadi tidak perlu memodifikasi yang lama. Tetapi jika MS ingin melakukan itu, mereka akan mengkompilasi ulang kompiler lama dengan kompiler C ++, seperti yang mereka lakukan sebelumnya.
Thomas Levesque

3
@ThomasLevesque Self-hosting adalah hasil akhir dari boot-strapping.
arx

2
@SriramSakthivel, kode kompiler tidak dapat menggunakan kata kunci baru, setidaknya tidak sampai ada kompiler yang memahaminya. Anda selalu menggunakan versi kompiler yang lebih lama untuk membangun yang baru.
Thomas Levesque

32

Compiler adalah program utilitas - mereka mengubah teks bahasa pemrograman menjadi kode mesin. Jika bahasa pemrograman menjelaskan perangkat lunak yang kebetulan menjadi kompiler .....

Compiler juga dapat menghasilkan kode mesin untuk arsitektur lain. Misalnya, Apple mengkompilasi iOS menggunakan rak server berbasis Intel. Kompiler tidak harus menjalankan kode ARM yang dihasilkannya, cukup tulis ke disk.

Compiler 2.0 harus ditulis dalam bahasa yang dapat diproses oleh kompiler 1.0, tetapi ia dapat membuat compiler 2.0 dengan fitur yang lebih baru seperti optimisasi. Anda kemudian dapat mengkompilasi ulang kode sumber menggunakan kompiler 2.0 dan membuat versi yang lebih baik dari dirinya sendiri. Sekali lagi, kompiler tidak tahu itu membuat versi lain dari dirinya sendiri.

Jika kita pergi cukup jauh kembali ke kabut waktu maka kita mencapai titik di mana kita tidak memiliki kompiler - iterasi pertama dari bahasa tingkat tinggi. Kemudian kita harus mengeluarkan pensil dan buku opcode dan menulis yang pertama dalam pertemuan. Bagaimana kami menulis assembler pertama? Entri kode mesin langsung, mungkin pada pita kertas yang dilubangi, atau membalik saklar di panel depan.


9
Dan pita kertas itu hanya membalik saklar melalui lubang di kertas. :-)
Zan Lynx

2
Pita kertas sebagai teknologi penyimpanan tidak akan pernah lepas landas. Itu terlalu kompleks dan rawan kesalahan, ditambah lagi mudah terbakar jika ada hubungan pendek pada pembaca dan itu akan menghancurkan program Anda.
CVn

16

Kompiler hanyalah sebuah program seperti program lainnya. Tidak ada yang magis atau istimewa tentang hal itu. Dibutuhkan beberapa input dan menghasilkan beberapa output. Dalam kasus khusus ini, input kebetulan C # dan output kebetulan CIL, tapi itu tidak berbeda dari input menjadi serangkaian pengembalian pajak dan output menjadi laporan.


10
Ini berbeda - jauh lebih mudah, -).
Peter - Reinstate Monica

3
@PeterSchneider: Orang-orang suka menggunakan kompiler sebagai makhluk ajaib mitos, tetapi pada akhirnya, mereka hanyalah program yang mengubah input menjadi output. Hampir setiap program di planet ini mem-parsing beberapa input, mencoba memahaminya, dan mengubahnya menjadi beberapa output. Dalam beberapa hal, setiap input adalah program yang ditulis dalam beberapa bahasa, setiap program adalah kompiler.
Jörg W Mittag

3
Saya sangat setuju. Yang ingin saya katakan adalah bahwa undang-undang perpajakan sangat kacau. Sebaliknya, bahasa formal biasanya didefinisikan dengan baik dengan cara yang cocok untuk otomatisasi. Yang membuat kompiler sederhana bisa dibilang lebih mudah untuk menulis daripada sebuah program yang berurusan dengan pajak. Meskipun Eric Lippert mungkin memohon untuk tidak setuju dengan kompiler C #, lih. blogs.msdn.com/b/ericlippert/archive/2010/02/04/… . Datang jauh dari kompiler one-pass C.
Peter - Reinstate Monica

1
@PeterSchneider: Ah, maaf, saya salah mengartikan komentar Anda dengan 180 ° :-D
Jörg W Mittag

Saya paling suka jawaban ini karena menjawab langsung pemikiran OP. Ini membersihkan kabut yang mengelilingi kompiler "semua perkasa".
Assaf Levy
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.