Microsoft Roslyn vs. CodeDom

111

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

Keuntungan yang paling jelas dari jenis kompilator "didekonstruksi" ini adalah memungkinkan seluruh proses kompilasi-eksekusi dipanggil dari dalam aplikasi .Net. Hejlsberg mendemonstrasikan program C # yang meneruskan beberapa potongan kode ke kompilator C # sebagai string; kompilator mengembalikan kode assembly IL yang dihasilkan sebagai objek, yang kemudian diteruskan ke Common Language Runtime (CLR) untuk dieksekusi. Voilà! Dengan Roslyn, C # mendapatkan kemampuan bahasa dinamis untuk menghasilkan dan memanggil kode pada saat runtime.

Saya telah dapat melakukan ini sejak rilis .NET 4 CSharpCodeProvider.CompileAssemblyFromSourceyang 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, pilih assemblies / namespaces untuk referensi, lalu jalankan dan tampilkan output dari kode itu dengan cepat untuk pengujian kode lingkungan langsung di Windows Azure.

Apakah CodeDombagian dari / a pendahulu Roslyn? Apa kelebihan khusus Roslyn?CodeDom ?

mellamokb.dll
sumber

Jawaban:

241

Penafian : Saya bekerja untuk Microsoft di tim Roslyn.

CodeDom adalah pendahulu Roslyn, tetapi hanya sedikit terkait. Pada dasarnya, CodeDom adalah cara sederhana dan (agak) bahasa agnostik untuk menghasilkan kode yang ditambahkan di .NET 1.0 untuk mendukung desainer (a la WinForms). Karena CodeDom adalah upaya untuk menyediakan model terpadu yang dapat menghasilkan kode dalam C #, VB, dan bahasa lain, ia tidak memiliki ketepatan yang tinggi dengan salah satu bahasa yang didukungnya (itulah mengapa Anda tidak dapat membuat pernyataan switch dengan CodeDom). CSharpCodeProvider.CompileAssemblyFromSource hanyalah pembungkus untuk mengeksekusi csc.exe.

Roslyn adalah hewan yang sama sekali berbeda. Ini adalah penulisan ulang dari kedua kompiler C # dan VB dari bawah ke atas menggunakan kode yang dikelola - C # di C # dan VB di VB (versi csc.exe dan vbc.exe yang dikirimkan hari ini ditulis dalam kode asli). Keuntungan membangunnya dalam kode terkelola adalah pengguna dapat mereferensikan compiler sebenarnya sebagai pustaka dari aplikasi .NET (tidak diperlukan pembungkus).

Saat membangun setiap komponen pipeline compiler, kami telah mengekspos API publik di atas:

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

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

Selain kompiler, tim Roslyn juga membangun kembali fitur Visual Studio C # dan VB IDE di atas API kompilator publik. Jadi, API kompilator cukup kaya untuk membangun alat waktu desain Visual Studio, seperti IntelliSense dan pemfaktoran ulang Metode Ekstrak. Selain itu, 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 mencari semua referensi ke simbol tertentu dalam suatu solusi.

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

Dustin Campbell
sumber
2
@Dustin: Akankah Roslyn mendukung bahasa lain? JavaScript (.NET), misalnya?
Diego Barros
@Dustin: Ini sangat cocok untuk membangun pengalaman IDE lengkap yang dapat menerapkan kualitas kode di organisasi saya, meskipun saya tidak melihat penggantian lengkap tinjauan kode manual tetapi saya melihat peningkatan kualitas yang cukup besar. Segera!
Jerric Lyns John
Akan sangat bagus jika seseorang telah membuat alat berbasis Roslyn untuk mengubah kode yang menggunakan CodeDom menjadi kode yang menggunakan SyntaxFactory Roslyn ... (Sebagian karena .Net Core memiliki Roslyn tetapi tidak ada CodeDom dan saya menggunakan lib yang dibangun di sekitar CodeDom )
Emyr
43

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 dikatakan "Saya berhasil" atau "Saya gagal, berikut beberapa kesalahan".

Roslyn memungkinkan Anda untuk benar-benar memeriksa dan membuat kode dengan cepat. Ini mencakup hal-hal seperti dapat melihat / memeriksa komentar dalam sebuah kode sumber, informasi rinci tentang struktur lengkap, dll. Anda dapat menelusuri dan mendapatkan seluruh pohon sintaks dari sumber yang Anda berikan ke Roslyn, dan melakukan analisis rinci atau transformasi di atasnya.

Dengan informasi sintaks yang lengkap dan kaya, Anda memiliki kontrol dan fleksibilitas ekstra dalam jumlah besar. Ini adalah bagaimana, misalnya, contoh bekerja yang menyalin blok kode C # dan menempelkannya sebagai kode VB.NET. Dengan Roslyn, Anda dapat melakukan lebih dari sekadar kompilasi - Anda juga dapat memanipulasi kode itu sendiri dengan rapi. Ini seharusnya membuat banyak perkakas jauh lebih sederhana untuk dibuat, karena hal-hal seperti pemfaktoran ulang dapat dilakukan dengan sangat sederhana karena perkakas memahami sintaks lengkap, termasuk informasi meta (seperti komentar), dan dapat langsung bekerja dengannya.

Reed Copsey
sumber
12

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 menyebutkan Azure), ini tidak terlalu bagus.

Dengan Roslyn, itu sedang dalam proses.

Saya kira ini adalah salah satu alasan mereka menyebutnya "Compiler as a service".

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

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

Simon Mourier
sumber
8

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

CodeDom "hanya menggunakan kompiler" sedangkan Roslyn adalah "kompilator sebagai layanan dengan akses penuh ke (sub-) bagian" ... dengan Roslyn Anda "di dalam kompilator" dan dapat melihat seperti apa kodenya dari perspektif kompilator 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 tentang status Roslyn saat ini dan berbagai tingkat akses dan kontrol yang disediakannya, lihat http://msdn.microsoft.com/en-us/hh500769

MEMPERBARUI

Microsoft baru saja membuat CTP baru tersedia dengan fitur tambahan dan banyak perubahan / penambahan API. Untuk detailnya lihat di sini .

Yahia
sumber
1
Sebenarnya, tidak benar bahwa Anda dapat menggunakan Roslyn untuk memperluas C # dengan kata kunci tambahan.
Dustin Campbell
terima kasih ... dikoreksi ... meskipun tidak di rilis pertama saya cantik bahwa ini akan mungkin ...
Yahia
2
@DustinCampbell, Bagaimana jika Anda menangani kesalahan compiler apa pun yang disebabkan oleh kata kunci palsu saat menghasilkan kode?
Rodrick Chapman
3
Anda perlu menulis ulang sebelum meneruskannya ke kompiler. Pertama, parsing kode dengan kata kunci khusus Anda. Kode akan mem-parsing dan, kecuali pengurai tidak dapat membuat head atau tails darinya, kata kunci yang tidak valid akan muncul sebagai SkippedTokenTrivia di pohon yang dihasilkan. Kemudian, deteksi kata kunci yang dilewati dan tulis ulang pohon dengan kode yang valid (mis. Tenun AOP). Terakhir, teruskan pohon baru ke kompiler. Ini jelas merupakan peretasan, dan tidak dijamin akan berfungsi dengan versi Roslyn yang akan datang. Misalnya, pengurai mungkin menghasilkan pohon yang tidak sama untuk kode yang rusak di rilis mendatang.
Dustin Campbell
@DustinCampbell: tetapi apakah akan ada SESUATU yang mengizinkan AOP menenun di final Roslyn? Tenun INPC Mono.Cecil saya berfungsi dengan baik apa adanya, tetapi jika saya bisa menulis public notifying string Name {get;set;}itu akan menjadi lebih mengagumkan
TDaver