NOVINKA: Získej 40 hodin praktických dovedností s AI – ZDARMA ke každému akreditovanému kurzu!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze – Lekce 1 - Úvod do C# a .NET Frameworku

Zpět

Upozorňujeme, že diskuze pod našimi online kurzy jsou nemoderované a primárně slouží k získávání zpětné vazby pro budoucí vylepšení kurzů. Pro studenty našich rekvalifikačních kurzů nabízíme možnost přímého kontaktu s lektory a studijním referentem pro osobní konzultace a podporu v rámci jejich studia. Toto je exkluzivní služba, která zajišťuje kvalitní a cílenou pomoc v případě jakýchkoli dotazů nebo projektů.

Komentáře
Avatar
David Hartinger
Vlastník
Avatar
Odpovídá na Petr Laštovička
David Hartinger:16.4.2013 10:31

Tak samozřejmě, že CIL musí být před spuštěním zkompilován do strojového kódu, jak bychom ho jinak spustili? Mám pocit, že nejsi úplně obeznámen s principem interpreteru, který samozřejmě kód kompiluje, jen ne najednou, ale "on the fly".

Odpovědět
16.4.2013 10:31
New kid back on the block with a R.I.P
Avatar
Odpovídá na David Hartinger
Petr Laštovička:19.4.2013 20:20

Právě proto, že jsem naprogramoval už tři interprety, mám trochu jinou představu o tom, jak funguje interpret. V článku je interpret popisován tak, jako by to bylo synonymum pro just-in-time kompilátor, což je matoucí. Mladší programátoři už možná považují JIT kompilaci za samozřejmost, ale stále existuje spousta programovacích jazyků, které jsou interpretované. Skriptovací jazyky lze spustit několika způsoby: 1) just-in-time kompilace, 2) interpretace mezikódu, 3) interpretace zdrojového kódu. Například javascript se v moderních prohlížečích spouští pomocí JIT, ale zastaralé prohlížeče (Internet Explorer 8 ) javascript překompilují do mezikódu, který pak pomalu interpretují. Žádný interpret nefunguje tak, že by generoval instrukce strojového kódu a po vykonání je zahazoval. Při interpretaci žádný strojový kód nevzniká. Na ilustračním obrázku u interpretovaných jazyků by měl být jen Zdrojový kód - Interpret - Procesor. Když je na obrázku navíc strojový kód, vypadá to, jako by interpret vytvářel strojový kód, který by závisel na vstupním zdrojovém kódu. Ve skutečnosti procesor vykonává stále dokola stejný neměnný kód interpretu.
Programovací jazyky kompilované do mezikódu/bytekódu lze také spustit několika způsoby: 1) kompilace po instalaci, 2) just-in-time kompilace, 3) interpretace mezikódu. Interpret má výhodu v tom, že je nezávislý na procesoru, zatímco JIT kompilátory pro .NET musejí být čtyři (x86, x64, IA64, ARM). Druhou výhodou interpretu je menší spotřeba paměti, proto se používá v .NET Micro Frameworku. V případě JIT kompilace je v paměti zároveň CIL a strojový kód. Interpret je také výhodné použít pro funkce, které se volají jen jednou nebo málo často. Takovou optimalizaci .NET nedělá, ale Java ano. Na ilustračním obrázku u jazyků s virtuálním strojem by bylo dobré znázornit obě možnosti. Mezi Mezikódem a Procesorem může být buď Interpret, a nebo tam může být JIT kompilátor a Strojový kód.

Editováno 19.4.2013 20:22
 
Odpovědět
19.4.2013 20:20
Avatar
David Hartinger
Vlastník
Avatar
Odpovídá na Petr Laštovička
David Hartinger:19.4.2013 21:11

Výsledné EXE aplikace v C# obsahuje assembly s CILem, zkompilované není. Při spuštění se zkompilují sdílené knihovny, proto spuštění tak dlouho trvá. Další funkčnosti jsou zkompilovány v tu chvíli, kdy jsou potřeba (JIT). Toto je pro mně stále interpretace. Kompilaci vnímám jako úplné převedení zdrojáku na stroják. Máš pravdu, že s tím zahazováním výsledků je to špatně, zahodí se až po vypnutí aplikace. Nepochopil jsem rozdíl mezi interpretací mezikódu a JIT, jak jsi to myslel?

Odpovědět
19.4.2013 21:11
New kid back on the block with a R.I.P
Avatar
Odpovídá na David Hartinger
Luboš Běhounek Satik:19.4.2013 22:00

JIT kompilace je pořád kompilace. Interpretace je když se nekompiluje vůbec.

Odpovědět
19.4.2013 22:00
https://www.facebook.com/peasantsandcastles/
Avatar
David Hartinger
Vlastník
Avatar
Odpovídá na Luboš Běhounek Satik
David Hartinger:20.4.2013 7:55

Jo takhle, už chápu. :) Nějak to tu upřesním.

Editováno 20.4.2013 8:15
Odpovědět
20.4.2013 7:55
New kid back on the block with a R.I.P
Avatar
Kit
Tvůrce
Avatar
Odpovídá na David Hartinger
Kit:20.4.2013 9:17

V podstatě se takto zpracovávají všechny EXE, akorát u těch z C/C++ je to mnohem jednodušší, protože v EXE jsou bloky kódu, které se naskládají do RAM. Přímo spustitelné programy už téměř vymizely.

Odpovědět
20.4.2013 9:17
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Petr Laštovička:20.4.2013 12:01

Většina programovacích jazyků používá nějaký mezikód. U kompilovaných jazyků je možné kompilovat zdrojový kód přímo do strojového kódu, ale zpravidla to funguje tak, že jedna část kompilátoru zkompiluje zdrojový kód do mezikódu a druhá část zkompiluje mezikód do strojového kódu. Mezikód by klidně mohl vypadat úplně jako CIL, ale protože se neukládá na disk a nikdo ho nevidí, může kompilátor použít pro něj nejvýhodnější formát.
U interpretovaných jazyků je možné interpretovat přímo zdrojový kód, ale je to brutálně pomalé. V dávných dobách tak fungovaly interprety BASICu. Většinu času zabralo neustálé vyhledávání identifikátorů proměnných. Dnes se obvykle interpretované jazyky nejdříve zkompilují do mezikódu a potom se mezikód interpretuje. Protože se mezikód neukládá na disk a nikdo ho nevidí, může to být jakýkoli nedokumentovaný binární formát. Z pohledu uživatele to vypadá, jaky by interpret vykonával zdrojový kód.
Nejlépe to člověk pochopí, když se podívá do nějakého open source kompilátoru nebo interpretu. Například ve hře Enemy Territory používám GameMonkey skript. Ten se skládá z kompilátoru (využívá GNU Bison) a z virtuálního stroje (garbage collector, multi-threading). V hlavičkovém souboru jsou instrukční kódy deklarovány jako enum. Protože hlavičkový soubor je společný pro kompilátor i virtuální stroj, není důležité, jaké jsou číselné kódy instrukcí bytekódu. To je rozdíl oproti .NET, kde CIL musí být přesně specifikován. Také se můžete podívat na můj open source program Karel. U něj je zajímavé, že mezikód kromě běžných instrukcí (CALL, RET, JUMP, POP, ADD, CMP, ...) obsahuje také instrukce pro pohyb robota (KROK, VLEVO_VBOK, ...).

 
Odpovědět
20.4.2013 12:01
Avatar
David Hartinger
Vlastník
Avatar
Odpovídá na Petr Laštovička
David Hartinger:20.4.2013 13:44

Wow, koukám, že tomu opravdu rozumíš. Čili třeba PHPčko se kompiluje do mezikódu, který se interpretuje?

U toho VM to funguje přesně jak, když tedy kompiluje a neinterpretuje? Předpokládám, že při kompilace se vytvoří nějaký kontext, který si VM dále uchovává a podle kterého se dále řídí běh zkompilovaného programu, je to tak?

Jinak Karel mi tu běhá :D

Odpovědět
20.4.2013 13:44
New kid back on the block with a R.I.P
Avatar
Odpovídá na David Hartinger
Petr Laštovička:22.4.2013 21:42

PHP skripty se také kompilují do mezikódu. Na vytížených serverech je vhodné mít nainstalováno cachování mezikódu, aby se kompilace neprováděla při každém načtení stránky.
Při kompilaci se kromě instrukcí vytvářejí ještě metadata, ale to závisí na konkrétním jazyce.

 
Odpovědět
22.4.2013 21:42
Avatar
Kit
Tvůrce
Avatar
Odpovídá na Petr Laštovička
Kit:23.4.2013 9:16

To cachování mezikódu PHP umí například APM. Když jsem to přidal na produkčním serveru, výrazně se zvýšila propustnost aplikace. Utáhlo to mnohem víc klientů současně.

Odpovědět
23.4.2013 9:16
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 10 zpráv z 144.