2011-05-01 14 views
5

Wiem .NET i Mono są zgodne binarnie, ale biorąc pod uwagę zestaw kodu źródłowego, czy csc i mcs wytworzą dokładnie ten sam, w 100% identyczny plik wykonywalny CLI binarny? Czy można stwierdzić, czy plik wykonywalny został skompilowany przy użyciu csc czy mcs?Kompatybilność .NET csc i Mono mcs

Odpowiedz

4

Wiele rzeczy nie jest w pełni określonych w specyfikacji lub są to rozszerzenia specyficzne dla danej implementacji.

Przykłady nie w pełni określony:

  • semantyki synchronizacji zdarzeń terenowych podobne; jest to jawnie otwarty na wdrożenia w ecma spec; jest stricty zdefiniowane w specyfikacji MS, ale stosuje się inną wersję C# 4.0, które ma jeszcze pojawiają się formalnym spec IIRC
  • Expression konstrukcja (z lambda); jest po prostu "zdefiniowane gdzie indziej" (faktycznie, nie jest)

Przykłady rozszerzeń realizacji:

  • P/Invoke
  • interfejs COM magazynowe (czyli jak można nazwać new na interfejsie)

Tak nie: nie ma gwarancji, że ta sama IL, między csc lub [g] mcs - ale nawet między różnymi wersjami csc.

Jeszcze więcej: w zależności od ustawień debugowania, włączonych optymalizacji lub nie, oraz niektórych stałych kompilacji (takich jak DEBUG lub TRACE), ten sam kompilator wygeneruje inny kod.

1

Jestem pewien, że nie produkują one tego samego IL z tego samego kodu źródłowego. Nawet różne wersje kompilatora MS C# nie.

Optymalizator działa inaczej i tworzy nieco inny kod.

spodziewam się większych różnic w realizacji złożonych funkcji, takich jak iteratorów, zmiennej lokalnej przechwyconego przez lamdas ...

Następnie są arbitralne kompilatora generowane nazwy, na przykład dla anonimowych typów. Nie ma powodu, dla którego powinni używać tego samego schematu nazewnictwa.

Nie zdziwiłbym się, gdyby istniały jakieś metadane zespołu zawierające nazwę i wersję kompilatora.

+0

Optymalizator żyje w jitterze, a nie w kompilatorze. –

+0

@Hans: kompilator wykonuje pewne optymalizacje: 'string x =" a "+ s0 + s1;' => 'string x = string.Concat (" a ", s0, s1);' przypuszcza na myśl. Wątpię jednak, by różniły się one w tym jednym przykładzie. –

+0

AFAIK zarówno jitter, jak i kompilator mają kilka optymalizatorów. Ale masz rację, że optymalizator jit wykonuje większość mikro optymalizacji. – CodesInChaos