it-swarm-id.com

Microsoft Roslyn vs. CodeDom

Dari siaran pers kemarin di InfoWorld tentang yang baru Microsoft Roslyn :

Keuntungan paling jelas dari kompiler "dekonstruksi" ini adalah memungkinkan kompilasi-eksekusi seluruh proses dijalankan dari dalam aplikasi .Net. Hejlsberg mendemonstrasikan program C # yang meneruskan beberapa cuplikan kode ke kompiler C # sebagai string; kompiler mengembalikan kode Majelis IL yang dihasilkan sebagai objek, yang kemudian diteruskan ke Common Language Runtime (CLR) untuk dieksekusi. Voa! Dengan Roslyn, C # memperoleh kemampuan bahasa dinamis untuk menghasilkan dan menjalankan kode saat runtime.

Saya sudah bisa melakukan ini sejak rilis .NET 4 dengan CSharpCodeProvider.CompileAssemblyFromSource yang sebenarnya saya gunakan dalam proyek ASP.Net yang ditulis beberapa waktu lalu yang melakukan hal itu - memungkinkan pengguna untuk mengetikkan kode ke dalam kotak teks, memilih rakitan/ruang nama untuk referensi, dan kemudian menjalankan dan menampilkan output dari kode tersebut on-the-fly untuk pengujian kode lingkungan langsung pada Windows Azure.

Apakah CodeDom bagian dari/pendahulu Roslyn? Apa manfaat khusus dari Roslyn lebih dari CodeDom?

106
mellamokb

Penafian: Saya bekerja untuk Microsoft di tim Roslyn.

CodeDom adalah prekursor untuk Roslyn, tetapi hanya sedikit terkait. Pada dasarnya, CodeDom adalah cara agnostik yang sederhana dan (agak) singkat untuk menghasilkan kode yang ditambahkan dalam. NET 1.0 untuk mendukung desainer (ala WinForms). Karena CodeDom adalah upaya menyediakan model terpadu yang dapat menghasilkan kode dalam C #, VB, dan bahasa lainnya, ia tidak memiliki kesetiaan yang tinggi dengan salah satu bahasa yang didukungnya (itulah sebabnya Anda tidak dapat membuat pernyataan beralih dengan CodeDom). CSharpCodeProvider.CompileAssemblyFromSource hanyalah sebuah pembungkus untuk mengeksekusi csc.exe.

Roslyn adalah binatang yang sama sekali berbeda. Ini adalah penulisan ulang kompiler C # dan VB dari bawah ke atas menggunakan kode terkelola - C # dalam C # dan VB dalam VB (versi csc.exe dan vbc.exe yang dikirimkan hari ini ditulis dalam kode asli). Keuntungan membangunnya dalam kode terkelola adalah bahwa pengguna dapat merujuk kompiler nyata sebagai pustaka dari aplikasi .NET (tanpa pembungkus) dibutuhkan).

Saat membangun setiap komponen pipa kompiler, kami telah mengekspos API publik di atas:

  • Parser -> Syntax Tree API
  • Tabel Simbol/Impor Metadata -> Simbol API
  • Binder -> Binding and API Analisis Aliran
  • IL Emitter -> Emit API

Roslyn dapat digunakan sebagai C # dan VB generator kode sumber yang canggih, tetapi di situlah kesamaan dengan CodeDom berakhir. API Komplyn Roslyn dapat digunakan untuk mengurai kode, melakukan analisis semantik, menyusun dan mengevaluasi kode secara dinamis, dll.

Selain kompiler, tim Roslyn juga membangun kembali Visual Studio C # dan VB IDE fitur di atas dari kompiler publik API. Jadi, kompiler API cukup kaya untuk membangun alat waktu desain Visual Studio, seperti IntelliSense dan Refactoring Metode Ekstrak. Juga, pada lapisan di atas kompiler, Roslyn menawarkan layanan untuk analisis tingkat tinggi atau transformasi data. Misalnya, ada layanan untuk memformat kode menggunakan aturan pemformatan C # dan VB, atau menemukan semua referensi ke simbol tertentu dalam suatu solusi.

Sungguh, tidak hanya ada satu manfaat khusus dari Roslyn daripada CodeDom. Di mana CodeDom memenuhi kebutuhan pembuatan kode yang sangat spesifik, Roslyn menangani seluruh ruang perkakas bahasa dengan menyediakan kerangka kerja yang memungkinkan Anda membangun hampir semua jenis C # atau VB alat bahasa yang dapat Anda pikirkan .

230
Dustin Campbell

CodeDom memungkinkan Anda untuk mengkompilasi - tetapi itu tidak memberi Anda kemampuan untuk benar-benar mendapatkan informasi tentang kode itu sendiri (selain kesalahan kompiler). Pada dasarnya, ini adalah kotak hitam di mana Anda mengatakan "kompilasi ini" dan ia mengatakan "Saya berhasil" atau "Saya gagal, ini ada beberapa kesalahan".

Roslyn memungkinkan Anda untuk sepenuhnya memeriksa dan membangun kode dengan cepat. Ini termasuk hal-hal seperti bisa melihat/memeriksa komentar dalam sepotong kode sumber, informasi terperinci tentang struktur penuh, dll. Anda dapat melewati dan mendapatkan seluruh pohon sintaks dari sumber yang Anda masukkan ke Roslyn, dan melakukan analisis terperinci atau transformasi di atasnya.

Dengan informasi sintaks yang lengkap dan kaya, Anda memiliki sejumlah besar kontrol dan fleksibilitas ekstra. Ini adalah bagaimana, misalnya, sampel bekerja yang menyalin blok kode C # dan menempelkannya sebagai kode VB.NET. Dengan Roslyn, Anda dapat melakukan lebih dari kompilasi - Anda juga dapat memanipulasi kode itu sendiri dengan bersih. Ini seharusnya membuat banyak perkakas jauh lebih mudah untuk dihasilkan, karena hal-hal seperti refactoring dapat dilakukan dengan sangat sederhana karena perkakas memahami sintaksis lengkap, termasuk informasi meta (seperti komentar), dan dapat langsung bekerja dengannya secara langsung.

41
Reed Copsey

Satu perbedaan besar yang saya lihat: dengan CodeDom, setiap kali Anda mengkompilasi beberapa C # atau VB.NET, itu terjadi di luar proses. CSC.exe atau VBC.exe adalah pekerja nyata di belakang layar.

Jika Anda ingin membangun layanan, dalam hal arsitektur, skalabilitas, isolasi, dll. (Anda menyebut Azure), ini tidak terlalu baik.

Dengan Roslyn sedang dalam proses.

Saya kira ini adalah salah satu alasan mereka menyebutnya "Kompiler sebagai layanan".

Selain itu, CodeDom adalah API yang relatif buruk, melewatkan banyak fitur, dan tidak benar-benar mutakhir, karena sebagian besar dirancang untuk mendukung perancang kode otomatis Visual Studio UI. Saya pikir Roslyn akan jauh lebih baik karena ditulis oleh orang-orang yang menulis kompiler. Saya harap itu akan membuat perbedaan.

PS: Satu perbedaan penting dari CSC.exe dan VBC.exe: Roslyn tampaknya murni .NET (dan menggunakan CCI ).

10
Simon Mourier

Roslyn memungkinkan kontrol yang jauh lebih baik dari seluruh proses - misalnya Anda dapat menganalisis string dan bahkan menghasilkan kode tambahan (on-the-fly dalam proses kompilasi berdasarkan analisis), dll.

CodeDom adalah "hanya menggunakan kompiler" sementara Roslyn adalah "kompiler sebagai layanan dengan akses penuh ke (sub-) bagian" ... dengan Roslyn Anda "di dalam kompiler" dan dapat melihat seperti apa kode dari perspektif kompiler memungkinkan Anda untuk mengubah berbagai hal dengan cara yang saat ini tidak memungkinkan.

Misalnya, Anda dapat menggunakan Roslyn untuk memperluas C # - sesuatu yang sangat berguna dan jauh lebih baik daripada kondisi implementasi AOP saat ini.

Untuk gambaran umum dari keadaan Roslyn saat ini dan berbagai tingkat akses dan kontrol yang diberikannya, lihat http://msdn.Microsoft.com/en-us/hh500769

[~ # ~] pembaruan [~ # ~]

Microsoft baru saja menyediakan CTP baru dengan fitur tambahan dan banyak perubahan/penambahan API. Untuk detail lihat di sini .

7
Yahia