Kod maszynowy pod frameworkiem...

Na początku, zanim przejdziemy do tematu tego posta chciałbym przeprosić za zaniedbanie tego bloga. Jednak jak wiecie, niedźwiadki na zimę zasypiają :) Okej.. przejdźmy do tematu.

Pewnego wieczoru ze znajomym na komunikatorze rozpoczęliśmy wojnę argumentów Java vs .NET - chodziło główne o wydajność. Wydajności nie będziemy analizować... chodzi o inną sprawę. Mianowicie owy znajomy mówił że .NET to też maszyna wirtualna, która wykonuje swoje tak jakby "skrypty". Stanowczo mu przerwałem i zaprzeczyłem. Nawet na samym MSDN jest napisane, że aplikacje .NET są kompilowane do kodu pośredniego, a podczas uruchamiania do kodu maszynowego. Jednak jak jest naprawdę ?

Odpalamy C++ i robimy Windows.Forms application. Tworzymy proste okienko, w którym zrobimy przycisk i labelkę. Po kliknięciu w przycisk odpalimy sobie jakąś taką pętlę. Zobaczymy potem w disasmblerze, co nam pokaże.

for (int x = 0; x < 255555; x++)
{
     zmienna++;
}
label1->Text = sys1.ToString();

Labelka przyda nam się do poznania wartości zmiennej, dzięki czemu będziemy mogli ustalić adres wykonywanego kodu.



Na obrazku widzimy że nasza pętla została skompilowana do kodu maszynowego. Najbardziej widocznym dowodem jest warunek pętli. 255555 decymalne to 3E643 hexadecymalne :). Wniosek: .NET to nie maszyna wirtualna - kompilacja ostateczna do kodu bezpośredniego (ASM).

Kolejnym argumentem, który przytacza wiele źródeł, jest to, że .NET kompiluje aplikację do kodu maszynowego na starcie. Otóż NIE. Kompilacja zachodzi przed użyciem określonej funkcji po raz pierwszy. To znaczy, jeżeli mamy funkcję A, na której tworzone jest kilka wątków, to zostanie ona skompilowana tylko podczas uruchamiania pierwszego wątku.

To tyle na dziś, pozdrawiam

Komentarze

  1. Jasne, lecz podczas analizy akurat tego konkretnego przypadku kompilacja zaszła tylko 1 raz.

    OdpowiedzUsuń
  2. To ciekawe, w Windows Midori mieli użyć .NET do napisania całego systemu, w jądrze miała następować rola frameworka, a reszta to czysty siszarp.

    ---
    http://gipl.tk

    OdpowiedzUsuń
  3. czesc,

    jakiego programu uzyles zeby zobaczyc kod assemblera ? bo uzywanie windbg jest troche nieporeczne:(

    OdpowiedzUsuń
  4. Cheat Engine 6.1, jeden z moich ulubionych do debugowania :D

    OdpowiedzUsuń
  5. Ten wpis jest bardzo ciekawy

    OdpowiedzUsuń

Prześlij komentarz