Wpis z mikrobloga

#programowanie #java #csharp

Gdzie można zobaczyć wszystkie etapy kompilowania i działania programu? W przypadku C# z tego co czytałem (nie wiem czy poprawnie zrozumiałem) mamy:

kod który napisaliśmy my -> CIL -> bytecode -> maszyna wirtualna -> ???

Chciałbym zobaczyć jakiś przykładowy kod który przechodzi przez wszystkie te etapy i na każdym etapie go podejrzeć, najlepiej aż do samego asemblera na procesorze. Niestety nie za bardzo udało mi się coś takiego znaleźć.
  • 13
  • Odpowiedz
  • Otrzymuj powiadomienia
    o nowych komentarzach

@Khaine: javap ?
A potem co sie faktycznie wykonuje na procesorze to niebardzo, chociazby z faktu, ze w JVM czesc kodu jest kompilowana, czesc interpretowana i zmienia sie to dynamicznie w cholere.
Ale zawsze mozna wymusic calosciowa kompilacje i odpalac program pare godzin...
  • Odpowiedz
@Khaine: Pomieszałeś trochę :P

C# kompiluje się do IL (zwany też CIL albo MSIL) który maszyna wirtualna przekłada na kod assemblerowy.

IL możesz sobie obejrzeć różnymi dekompilatorami, pewnie jakoś da się podejrzeć jaki z tego powstał kod assemblerowy ale nie wnikałem nigdy w to.
  • Odpowiedz
@Myrten: No dobra, ale czy ten kod nie jest aby zarządzany? W sensie, maszyna wirtualna przebolcowywuje to na ASM i ten ASM posiada w sobie wbudowane kontrolki do GC (dodatkowy dopisany kod na potrzeby czyszczenia syfu), czy program chodzi w piaskownicy a nad nim stoi Big Brother z kamerami, który obserwuje każdy ruch aby odpalać GC? Bodaj tak w Javie to chyba działa?
  • Odpowiedz
@Khaine: Głowy uciąć nie dam ale chyba to mniej więcej tak działa że przy kompilowaniu na kod assemblerowy do kompilatu są dorzucane odpowiednie elementy odpowiadające za to żeby ten kod był zarządzany.

Na wiki jest taki opis procesu:

The execution process looks like this:
Source code is converted to CIL i.e. Common Intermediate Language, which is the CLI's equivalent to assembly language for
  • Odpowiedz
@Myrten: A to nie da się zrobić frameworka do C++ który by też dodawał extra fragmenty kodu dla zmiennych wskaźnikowych właśnie na potrzeby wywalania ich jak wygasają referencje? Smart pointery są jakby jedną z metod na zrobienie tego, ale są upierdliwe w użyciu.
  • Odpowiedz
@Khaine:
Nie wiem czy cię to zadowoli ale z tego co pamiętam(mam nadzieję że nic nie namieszałem) schemat wylgąda tak:
1) Piszesz sobie program w jakimś języku a możesz nawet w kilku jednocześnie.
2 ) Kompilator danego języka c#, c++, VB czy F# kompiluje program albo poszczególne fragmenty do CIL
3) Kod CIL jest w teorii niezależny od plaformy- możesz go sobie przenosić gdzie chcesz wystarczy że masz działające CLR
4) CIL możesz
  • Odpowiedz
@Khaine: @M4ks:
Trochę tagami mi mieszasz, nie wiem jak w C#, ale w javie jak to w javie, wszystko można, kompilujesz, oglądasz sobie bytecode, odpalasz z -XX:+PrintAssembly i paroma innymi i masz assemblera, printowanego przy chyba każdej zmianie przez JIT-a czyli powinieneś zobaczyć niektóre etapy optymalizacji:

Losowy link z google bo nie mam nic w zakładkach:
http://mechanical-sympathy.blogspot.com/2013/06/printing-generated-assembly-code-from.html
  • Odpowiedz
A to nie da się zrobić frameworka do C++ który by też dodawał extra fragmenty kodu dla zmiennych wskaźnikowych właśnie na potrzeby wywalania ich jak wygasają referencje?


@Khaine: Jest coś takiego jak Managed C++
  • Odpowiedz