Diskuze: C#, F#, J#, .NET a alternativy a .NET Native

C# .NET .NET (C# a Visual Basic) C#, F#, J#, .NET a alternativy a .NET Native American English version English version

Avatar
Petr 0máčka:

Rád bych se dozvěděl nějaké základní technické informace o C#, F#, J# a ještě nějaké detaily k .NETu.

Pakliže je kód C# kompilován jednou za chodu programu z IL (CIL, MSIL) do binárních instrukcí a pak je již použitelný, dokud program neskončí, platí to stejné i pro F# a J#?

Zjednodušeně, používají F# a J# CLR (Common Language Runtime) a JIT (Just-in-Time) kompilaci stejně jako C#?

Bez ohledu na to, zda tak činí, činí tak jiné jazyky z rodiny MS .NET? Tipuji, že Visual Basic .NET, ASP.NET, JScript .NET jsou vhodnými kandidáty.

Existuje nějaká konkurence k .NETu? Tím míním, jestli nějaký nedotnetí jazyk kompiluje do IL a pak za chodu kompiluje do bin. instrukcí pouze potřebné části kódu.

Vím, že prostředí, které implementuje CLI (Common Language Infrastructure) založené na CLS (Common Language Specification), by mělo být schopné provozovat program ze C#. Byla již někdy spuštěna aplikace v C# v jiném prostředí než MS .NET? Jinými slovy existuje jiné prostředí, které implementuje CLR (Common Language Runtime) a JIT než .NET?

Také jsem nalezl nějaké informace (https://msdn.microsoft.com/cs-cz/vstudi ... ative.aspx), o tom že .NET Native je výkonnější než .NET. To mě poměrně mate. Měl jsem za to, že JIT a CLR je výkonové optimální(např. má nižší počet stránek paměti).

Děkuji za případně sdílené know-how.

 
Odpovědět  +1 22. května 10:02
Avatar
patrik.valkovic
Šéfredaktor
Avatar
Odpovídá na Petr 0máčka
patrik.valkovic:

Co se týče C#, F# a J#, jsou to všechny .NET jazyky, takže se kompilují do mezikódu. Rozdíl je v syntaxi. C# je klasický C# jak ho znáš, F# je funkcionální jazyk - funkcinální jazyky jsou dobré pro manipulaci s daty, takže jeho největší uplatnění je v DataMinigu a podobných věcech. J# ja Microsoftí implementace Javy - má (pokud vím) stejnou syntaxi, ale taktéž se kompiluje do CIL a funguje na .NETu. Princiú je tedy naprosto totožný se C#.

VB.NET i JScript.NET jsou samostatné jazyky, zatímco ASP.NET je technologie (nebo knihovna chceš-li) vyučívající .NET.

Samozřejmě další jazyk, který využívá JIT ja Java. O to, jestli je lepší Java nebo C# (nebo jiný .NET jazyk) se nebudu rozepisovat - je toho napsaného dost a stejně ke kloudnému výsledku nedojdem). Faktem je, že C# by měl být rychlejší než Java.

.NET jazyky fungují (již z názvu) v .NET prostředí. Takže není možné je spustit bez toho, aniž bys měl k dispozici .NET. Nicméně nově Microsoft vyvinul .NETCore (https://dotnet.github.io/), který je multiplatformní a jde tedy rozjet všude. Neobsahuje plnou výbavu .NETu, ale třeba ASP.NET MVC na něm funguje. Sám jsem jej zkoušel na Linuxech a fungovalo to. Jen výkonostně je to samozřejmě horší, než na WIndows platformě. Poslední variantou ja Xamarin, který je taktéž multiplatformní a můžeš na něm spouštět .NET programy.

.NET Native funguje na principu, že se program zkompiluje přímo (tedy nepřekládá se jenom do mezikódu ale rovnou do strojového). Na cílovém stroji se potom program JIT nepřekládá, ale rovnou se spouští z biárního kodu.

Nahoru Odpovědět 22. května 11:47
Nikdy neumíme dost na to, abychom se nemohli něco nového naučit.
Avatar
Petr 0máčka:

Do teď jsem žil v dojmu, že JVM je pouze virtuální stroj. Díky.

Vím, co je .NET Native. Spíše mě zajímalo, proč je lepší než JIT, když JIT má být právě výkonově lepší.

Pokud jde o .NETí jazyky, nic jiného jsem nečekal. Nechtělo se mi to zjišťovat z kusých informací tak, že také díky.

Beru to tak, že obecně na .NETu je to teda JIT.

Ještě by mě zajímalo jaký typ JIT používá Java – viz https://cs.wikipedia.org/wiki/JIT.

 
Nahoru Odpovědět 22. května 13:04
Avatar
Odpovídá na Petr 0máčka
Petr 0máčka:

Hmm... Už jsem to zjistil. Java používá ekonomický JIT stejně jako .NET.

Editováno 22. května 13:35
 
Nahoru Odpovědět 22. května 13:35
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na Petr 0máčka
Jan Vargovský:

Vím, co je .NET Native. Spíše mě zajímalo, proč je lepší než JIT, když JIT má být právě výkonově lepší.

Žádný jazyk, který se překládá do nějakého mezikódu, a teprve pak až se interpretuje a překládá za běhu, nebude rychlejší než nativní překlad. Je to ta režie navíc, která ti dává ale lehčí přenositelnost na ostatní platformy.

 
Nahoru Odpovědět  ±0 22. května 15:09
Avatar
Odpovídá na Jan Vargovský
Petr 0máčka:

Je mi jasné, že není přímo rychlejší, ale vzhledem k možnosti optimalizace strojového kódu pro danou platformu během JIT a ušetření množiny paměťových stránek (celá aplikace není v paměti), by měl být údajně výkonnější, podle určitých informací, které mám.

Proto mě udivilo, že najednou má být zase nativní kód ten lepší.

Možná to platí spíše pro velké aplikace (aplikace je velká, ale používá se jen omezené množství kódu během jednoho spuštění) než ty malé aplikace a také pro ty, kde JIT dosáhne velké optimalizace.

 
Nahoru Odpovědět 23. května 8:21
Avatar
Petr 0máčka:

V otázce jsem uvedl poměrně nepřesně část o výkonu .NETu a .NETu Native.

Odstavec měl být formulován takto:

Také jsem nalezl nějaké informace (https://msdn.microsoft.com/cs-cz/vstudi ... ative.aspx), o tom že .NET Native má paměťové nižší nároky než .NET. To mě poměrně mate. Měl jsem za to, že JIT a CLR je paměťově optimální.

 
Nahoru Odpovědět 23. května 8:44
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na Petr 0máčka
Jan Vargovský:

Fakt, že se stránky načítají do paměti až v době, kdy jsou potřeba, je hezké, ale tohle za tebe dělá OS a ne .NET. Na optimalizace při použití JIT není zas tolik času.

Říkat o tom, jestli je to nebo to lepší, to záleží na dost věcech...

 
Nahoru Odpovědět 23. května 8:59
Avatar
 
Nahoru Odpovědět 23. května 9:50
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na Petr 0máčka
Jan Vargovský:

Očividně nevíš... Resp. víš, ale dáváš to jako + někomu, přitom se to dělá všude.

Editováno 23. května 14:51
 
Nahoru Odpovědět 23. května 14:50
Avatar
Odpovídá na Jan Vargovský
Petr 0máčka:

Nerozumím, ale nechci to řešit.

 
Nahoru Odpovědět 26. května 16:39
Avatar
Odpovídá na Jan Vargovský
Luboš Běhounek (Satik):

Žádný jazyk, který se překládá do nějakého mezikódu, a teprve pak až se interpretuje a překládá za běhu, nebude rychlejší než nativní překlad. Je to ta režie navíc, která ti dává ale lehčí přenositelnost na ostatní platformy.

Kód vygenerovaný JIT kompilací klidně může být rychlejší než nativní kód, protože ho kompilátor může optimalizovat pro danou platformu, na které zrovna běží.
JIT kompilace proběhne jen jednou, často už při spuštění programu, takže při běhu tě už pak obvykle nezdrží.

Nahoru Odpovědět 26. května 17:29
:)
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na Luboš Běhounek (Satik)
Jan Vargovský:

To je zase jen upravování podmínek co-kdyby. Btw, nějak se mi nezdá, že by se kompiloval už při spuštění, vždyť to popírá princip JIT.

 
Nahoru Odpovědět 26. května 17:43
Avatar
Odpovídá na Jan Vargovský
Luboš Běhounek (Satik):

Nepopírá, princip JIT neurčuje, kdy přesně se kód kompiluje, jestli až když tu danou část (třeba funkci) spouštíš nebo když spouštíš celý program.

Navíc se pak ty zkompilované části kešují, takže pokud se něco nezmění, už není potřeba provádět kompilaci znova nebo můžeš mít celý program předkompilovaný, viz třeba NGEN.

Editováno 26. května 17:56
Nahoru Odpovědět 26. května 17:54
:)
Avatar
Odpovídá na Luboš Běhounek (Satik)
Petr 0máčka:

Souhlasím s Lukášem – viz https://msdn.microsoft.com/…ary/ht8ecch6(v=vs.100).aspx.

Také poměrně jednoduchý článek je na odkaze http://www.telerik.com/…-compilation, i když jsem si nedokázal vysvětlit jednu souvislost, která je tam uvedena.

Dle AJ Wiki JIT provádí například tyto optimalizace: profile-guided optimizations, pseudo-constant propagation, indirect/virtual function inlining, které nativní nebo AOT kompilace nemůže poskytnout.

Ono existují různé JIT kompilátory. Například PyPy pro python (http://stackoverflow.com/…used-by-pypy, http://morepypy.blogspot.nl/…ing-jit.html), který provede kompilaci pouze u těch částí, které jsou využívány často. Ne tedy při prvním použití, každém použití nebo před spuštěním aplikace. Kromě toho před kompilací provede ještě nějaké optimalizace na základě nějakého trasování nebo co tak, že ten výkonový poměr AOT/JIT asi také závisí na jazyku a typu JIT kompilátoru.

Strávil jsem poměrně dost času hledáním informací, jestli je lepší JIT nebo AOT u .NETu, ale většinou jsem našel, že AOT, ale nebyly to oficiální články, ani nebyly nijak konkrétněji podloženy.

Obvyklý argument je, že AOT je nativní, nezabírá tolik paměti a může provést optimalizace, které jsou pro JIT příliš nákladné.

Mám informace, že JIT naopak zabírá paměti méně, protože není celý program v paměti, a tak těmto článkům nepřikládám příliš velkou váhu.

 
Nahoru Odpovědět 27. května 8:10
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 15 zpráv z 15.