Microsoft Roslyn ve CodeDom


111

Dün InfoWorld'de yeni Microsoft Roslyn ile ilgili bir basın açıklamasından :

Bu tür "yapısökümlü" derleyicinin en bariz avantajı, tüm derleme-yürütme sürecinin .Net uygulamaları içinden çağrılmasına izin vermesidir. Hejlsberg, C # derleyicisine dizeler olarak birkaç kod parçacığı geçiren bir C # programı gösterdi; derleyici, sonuçta elde edilen IL derleme kodunu bir nesne olarak döndürdü ve bu kod daha sonra yürütme için Ortak Dil Çalışma Zamanı'na (CLR) iletildi. Voila Roslyn ile C #, dinamik bir dilin çalışma zamanında kod oluşturma ve çalıştırma becerisini kazanır.

Bunu CSharpCodeProvider.CompileAssemblyFromSource, bir süre önce yazılmış bir ASP.Net projesinde kullandığım ve tam olarak bunu yapan .NET 4'ün yayımlanmasından bu yana yapabiliyorum - kullanıcının bir metin kutusuna kod yazmasına, derlemeleri / ad alanlarını seçmesine izin veriyor referans vermek ve ardından Windows Azure'da canlı ortam kodu testi için bu koddan çıktıyı anında yürütmek ve görüntülemek.

CodeDomait / Roslyn bir öncülü parçası? Roslyn'in özel faydası nedir CodeDom?

Yanıtlar:


241

Sorumluluk reddi : Roslyn ekibinde Microsoft için çalışıyorum.

CodeDom, Roslyn'in öncüsüdür, ancak yalnızca marjinal olarak ilişkilidir. Esasen, CodeDom, tasarımcıları desteklemek için .NET 1.0'da eklenen kod oluşturmanın basit ve (bir şekilde) dilden bağımsız bir yoludur (bir la WinForms). CodeDom, C #, VB ve diğer dillerde kod üretebilen birleşik bir model sağlama girişimi olduğundan, desteklediği dillerden herhangi birinde yüksek doğruluktan yoksundur (bu nedenle CodeDom ile bir anahtar ifadesi oluşturamazsınız). CSharpCodeProvider.CompileAssemblyFromSource, csc.exe'yi yürütmek için kullanılan bir sarmalayıcıdır.

Roslyn tamamen farklı bir hayvandır. Yönetilen kod kullanılarak C # ve VB derleyicilerinin sıfırdan yeniden yazılmasıdır - C #'da C # ve VB'de VB (bugün gönderilen csc.exe ve vbc.exe sürümleri yerel kodda yazılmıştır). Bunları yönetilen kodda oluşturmanın avantajı, kullanıcıların gerçek derleyicilere .NET uygulamalarından kitaplıklar olarak başvurabilmeleridir (sarmalayıcılara gerek yoktur).

Derleyici ardışık düzeninin her bir bileşenini oluştururken, genel API'leri en üstte gösterdik:

  • Ayrıştırıcı -> Sözdizimi Ağacı API'si
  • Sembol Tablosu / Meta Verileri İçe Aktarma -> Symbol API
  • Bağlayıcı -> Bağlama ve Akış Analizi API'leri
  • IL Verici -> Emit API

Roslyn, karmaşık bir C # ve VB kaynak kodu oluşturucu olarak kullanılabilir, ancak CodeDom ile olan benzerliğin bittiği yer burasıdır. Roslyn Derleyici API'leri, kodu ayrıştırmak, anlam analizi yapmak, kodu dinamik olarak derlemek ve değerlendirmek vb. İçin kullanılabilir.

Derleyici ek olarak, Roslyn ekibi ayrıca Visual Studio C # yeniden inşa ediyor ve VB IDE özellikleri üstünde kamu derleyici bir API. Bu nedenle, derleyici API'leri IntelliSense ve Çıkarma Yöntemi yeniden düzenleme gibi Visual Studio tasarım zamanı araçlarını oluşturmak için yeterince zengindir. Ayrıca, derleyicinin üzerindeki katmanlarda Roslyn, üst düzey analiz veya veri dönüşümü için hizmetler sunar. Örneğin, C # ve VB biçimlendirme kurallarını kullanarak kodu biçimlendirmek veya bir çözüm içindeki belirli bir sembole yönelik tüm başvuruları bulmak için hizmetler vardır.

Gerçekten, sadece orada değil bir CodeDOM üzerinde Roslyn özel yarar. CodeDom'un çok özel bir kod oluşturma ihtiyacını karşıladığı yerlerde Roslyn, aklınıza gelebilecek hemen hemen her tür C # veya VB dil aracı oluşturmanıza olanak tanıyan bir çerçeve sağlayarak tüm dil araç oluşturma alanını ele alıyor.


2
@Dustin: Roslyn diğer dilleri destekleyecek mi? Örneğin JavaScript (.NET)?
Diego Barros

@Dustin: Bu, kuruluşumda kod kalitesini uygulayabilecek eksiksiz bir IDE deneyimi oluşturmak için mükemmel, ancak manuel kod incelemesinin tamamen değiştirildiğini görmüyorum, ancak kalitede önemli bir artış görüyorum. Yakında!
Jerric Lyns John

Birisi CodeDom'u kullanan kodu Roslyn's SyntaxFactory'yi kullanan bir koda dönüştürmek için Roslyn tabanlı bir araç oluşturmuş olsaydı harika olurdu ... )
Emyr

43

CodeDom derlemenize izin verir - ancak size kodun kendisi hakkında gerçekten bilgi alma yeteneği vermez (derleyici hataları dışında). Temel olarak, "bunu derle" dediğiniz ve "başardım" veya "başarısız oldum, işte bazı hatalar" yazan bir kara kutu.

Roslyn, kodu anında tamamen incelemenizi ve oluşturmanızı sağlar. Bu, bir kaynak kod parçası içindeki yorumları görebilmek / inceleyebilmek, tüm yapı hakkında ayrıntılı bilgiler vb. Gibi şeyleri içerir. Roslyn'e ilettiğiniz kaynağın tüm söz dizimi ağacını inceleyebilir ve ayrıntılı analiz yapabilirsiniz. veya üzerindeki dönüşümler.

Eksiksiz, zengin sözdizimi bilgileri göz önüne alındığında, çok büyük miktarda ekstra kontrol ve esnekliğe sahipsiniz. Örneğin, örnek C # kodunun bir bloğunu kopyalayıp VB.NET kodu olarak yapıştıran şekilde çalışır. Roslyn ile derlemekten fazlasını yapabilirsiniz - ayrıca kodun kendisini temiz bir şekilde değiştirebilirsiniz. Bu, yeniden düzenleme gibi şeyler, meta bilgiler (yorumlar gibi) dahil olmak üzere tüm sözdizimini anladığından ve doğrudan onunla çalışabildiğinden, yeniden düzenleme gibi şeyler çok basit bir şekilde yapılabilir ve sadece onunla doğrudan çalışabilir.


12

Gördüğüm büyük bir fark: CodeDom ile, her C # veya VB.NET derlediğinizde, işlem dışı oluyor. CSC.exe veya VBC.exe, sahnenin arkasındaki gerçek işçilerdir.

Mimari, ölçeklenebilirlik, izolasyon vb. Açısından bir servis oluşturmak istiyorsanız (Azure'dan bahsediyorsunuz) bu pek iyi değil.

Roslyn ile süreç devam ediyor.

Sanırım buna "Hizmet olarak derleyici" deme nedenlerinden biri budur.

Ayrıca, CodeDom nispeten zayıf bir API'dir, birçok özelliği kaçırır ve çoğunlukla Visual Studio UI tasarımcılarının otomatik kod üretimini desteklemek için tasarlandığı için gerçekten güncel değildir. Derleyicileri yazan kişiler tarafından yazıldığı için Roslyn'in çok daha iyi olacağını düşünüyorum. Umarım bu fark yaratır.

Not: CSC.exe ve VBC.exe'den önemli bir fark: Roslyn saf .NET gibi görünüyor (ve CCI kullanıyor ).


8

Roslyn, tüm sürecin çok daha hassas bir şekilde kontrol edilmesine izin verir - örneğin dizeyi analiz edebilir ve hatta ek kod (analize dayalı derleme sürecinde anında) vb. Oluşturabilirsiniz.

CodeDom "sadece derleyiciyi kullanıyor" iken, Roslyn "(alt-) parçalara tam erişimi olan bir hizmet olarak derleyici" ... Roslyn ile "derleyicinin içindesiniz" ve kodun bir derleyici perspektifinden nasıl göründüğünü görebilirsiniz. şu anda mümkün olmayan şekillerde bir şeyleri değiştirmenize izin veriyor.

Örneğin, Roslyn'i C # 'ı genişletmek için kullanabilirsiniz - çok kullanışlı ve AOP uygulamasının mevcut durumundan çok daha iyi bir şey.

Mevcut Roslyn durumuna ve sağladığı farklı erişim ve kontrol düzeylerine genel bir bakış için bkz. Http://msdn.microsoft.com/en-us/hh500769

GÜNCELLEME

Microsoft, ek özellikler ve birçok API değişikliği / eklemesi içeren yeni bir CTP'yi kullanıma sundu. Ayrıntılar için buraya bakın .


1
Aslında, Roslyn'i ek anahtar kelimelerle C # 'ı genişletmek için kullanabileceğiniz doğru değildir.
Dustin Campbell

teşekkürler ... düzeltildi ... ilk sürümde olmasa da bunun mümkün olacağı konusunda güzelim ...
Yahia

2
@DustinCampbell, Sözde anahtar kelimenin kod oluşturmanın neden olduğu herhangi bir derleyici hatasını işlediyseniz ne olur?
Rodrick Chapman

3
Derleyiciye aktarmadan önce yeniden yazmanız gerekir. İlk olarak, kodu özel anahtar kelimelerinizle ayrıştırın. Kod ayrıştırılacak ve ayrıştırıcı onun başını ya da sonuna gelmediği sürece, geçersiz anahtar sözcükler ortaya çıkan ağaçta SkippedTokenTrivia olarak görünecektir. Ardından, atlanan anahtar kelimeleri tespit edin ve ağacı geçerli kodla yeniden yazın (örn. AOP dokuma). Son olarak, yeni ağacı derleyiciye aktarın. Bu kesinlikle bir hack'tir ve Roslyn'in gelecekteki sürümleriyle çalışması garanti edilmez. Örneğin ayrıştırıcı, gelecekteki sürümlerde bozuk kod için aynı ağacı üretmeyebilir.
Dustin Campbell

@DustinCampbell: Peki Roslyn finalinde AOP dokumasına izin veren BİR ŞEY olacak mı? Mono.Cecil INPC dokumam olduğu gibi iyi çalışıyor, ancak yazabilirsem public notifying string Name {get;set;}daha da harika olurdu
TDaver
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.