Portál AbcLinuxu, 10. května 2025 01:12

Dotaz: C# - kompilace?

30.8.2012 02:38 li737 | skóre: 6
C# - kompilace?
Přečteno: 346×
Odpovědět | Admin
Zdravím! Mohl by mi někdo prosim vysvětlit jak funguje utilita mkbundle? Tváří se to ve vysledku jako že to aplikaci v C# přeloží do C a výsledek zkompiluje, ale není mi jasné jak to dokáže zkompilovat věc která používá garbage colector, potažmo libovolný systém coby runtime. Leda že by výsledný kód volal nějaká systémová volání v tomto smyslu ale to se mi nezdá. Děkuji
Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

30.8.2012 08:46 Radek Miček | skóre: 23 | blog: radekm_blog
Rozbalit Rozbalit vše Re: C# - kompilace?
Odpovědět | | Sbalit | Link | Blokovat | Admin
mkbundle umí k aplikaci přibalit vybrané assembly nebo celé běhové prostředí Mono. Podrobnosti viz Running Mono Applications.

Žádná kompilace do C se neprovádí. Existuje však projekt CrossNet, který překládá IL kód do C++. Jako GC tam funguje klasický mark & sweep.
Leda že by výsledný kód volal nějaká systémová volání v tomto smyslu ale to se mi nezdá.
Nerozumím, co tím myslíte. GC musí hlavně vědět, co jsou ukazatele, aby neuklízel objekty, které jsou přístupné.
30.8.2012 15:57 li737 | skóre: 6
Rozbalit Rozbalit vše Re: C# - kompilace?
díky za odpověď. Domníval jsem se že tam dochází k nějaké kompilaci vzhledem k výstupu mkbundle, konec vypadá podobně jako výstup gcc.
[libor@fedora-notebook Debug]$ mkbundle ./pracovni_kalendar_aplikace.exe
OS is: Linux
Sources: 1 Auto-dependencies: False
   embedding: /home/libor/Projects/pracovni_kalendar/pracovni_kalendar_aplikace/bin/Debug/pracovni_kalendar_aplikace.exe
Compiling:
as -o temp.o temp.s 
cc -ggdb -o a.out -Wall temp.c `pkg-config --cflags --libs mono-2`  temp.o
Done
voláním jsem měl na mysli zda není v systému popř. přímo v jádře nějaká rutina podobná GC kterou by výsledný program pokud by byl v c volal.
30.8.2012 21:07 Radek Miček | skóre: 23 | blog: radekm_blog
Rozbalit Rozbalit vše Re: C# - kompilace?
Funguje to tak, že mkbundle vytvoří dva soubory temp.s a temp.c, ty pak přeloží a slinkuje. Soubor temp.s obsahuje assembly – jejich data (pokud jste mkbundle volal s volbou -z, data každé assembly se napřed zkomprimují a teprve poté uloží do souboru temp.s).

Soubor temp.c obsahuje funkci main, informace o jednotlivých assembly a externí pole s daty jednotlivých assembly. main se postará o inicializaci běhového prostředí a načte assembly. Data jednotlivých assembly se nedávají přímo do souboru temp.c, protože některé verze GCC mají problémy s velkými poli. Soubory temp.c i temp.s si můžete prohlédnout, když mkbundle spustíte s volbou --keeptemp.

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.