Skriptování v .NETu 6 (JScript .NET, CodeDomProvider)

Tento díl bude menším opakováním. První díl popisoval skriptování pomocí knihovny DotScript, která používá abstraktní třídu CodeDomProvider ke kompilaci do assembly, kterou bychom mohli dále využívat pomocí reflexe.

Knihovna DotScript, která CodeDomProvider zaobaluje, ale umí pouze jazyky C# a VB. Je to škoda, protože existuje implementace CodeDomProvier-u pro jazyk JScript .NET. Stejný postup, který popíše tento článek, můžeme aplikovat i pro jazyky Boo a F#, protože pro ně existuje implementace CodeDomProvider-u také.

JScript .NET

Jazyk JScript .NET, za jehož vývojem stojí firma Microsoft, bych označil jako dialekt jazyka Java Script. Jak už název napovídá, lze s ním přistupovat ke všem prvkům platformy .NET a výsledek přeložit do CLI.
Jako úvod do tohoto jazyka bych doporučil článek Introducing JScript .NET na MSDN.

CodeDomProvider

Jedná se o abstraktní třídu a způsob, jak zkompilovat kód pro různé jazyky platformy .NET. Prakticky si ukážeme pouze JScript .NET, ale stačí pouze změnit jméno typu provideru, a tím kompilovat skripty v C#, VB, F#, Boo a určitě budou existovat další.

Jednoduchý kód, který vytvoří instanci třídy TestClass (k dalšímu použití třídy můžeme přestupovat přes reflexi a nebo interface, pokud jej máme k dispozici):

using System.CodeDom.Compiler;
...
// vytvorit provider
CodeDomProvider provider = (CodeDomProvider)Activator.CreateInstance("Microsoft.JScript", "Microsoft.JScript.JScriptCodeProvider").Unwrap();
// Parametry kompilace
CompilerParameters cp = new CompilerParameters();
cp.GenerateInMemory = true;
cp.IncludeDebugInformation = false;
cp.GenerateExecutable = false;
// Vlastni kompilace
CompilerResults cr = provider.CompileAssemblyFromFile(cp, "script.js");
// Z cr.Errors muzeme cist seznam syntaktickych chyb a varovani
Assembly assembly = cr.CompiledAssembly;
// Vytvorime objekt
object o = Activator.CreateInstance(assembly.GetType("TestClass"));

Syntaxe

var found = false;
var abc = [7, 2, 4, 5, 6];
for (i=0; i<5; i++)
{
    if (abc[ i ]>5)
        found = true;
}

Testování

Na závěr jenom rutinní testování tohoto řešení, které slibuje velkou rychlost z důvodu překladu do CLI před použitím.

Parsování / kompilace

první 100 – 150 ms
další okolo 80 ms

Float test 2310 ms
Faktorial test 4669 ms
Zápis hodnoty do skriptu 641 ms
Čtení hodnoty ze skriptu 554 ms
Vytvoření instance 3075 ms

Parsování / kompilace – doba, kterou potřebuje skriptovací engine k inicializaci (parsování nebo kompilaci zdrojových kódů).

Float test – doba potřebná k vypočítání jednoho milionu rovnic sin(30)*sin(30)+cos(30)*cos(30).

Faktorial test – doba potřebná k výpočtu faktoriálu čísla 12 (12!) rekurzivně. Prověřuje rychlost interního volání funkce, vyhodnocování podmínek a počítání s celými čísly. Test je volán milionkrát.

Zápis hodnoty do skriptu – milionkrát zapíše hodnotu z hlavního programu do skriptu.

Čtení hodnoty ze skriptu – milionkrát přečte hodnotu ze skriptu.

Vytvoření instance – vytvoří milion instancí objektu ze skriptu.

Závěr

Jako poslední skriptovací jazyk jsem vybral PowerShell, který je známý nejenom v programátorských kruzích. Ale o tom až v dalším dílu. :)

Zveřejněno 02 October 09 08:15 by topas
Vedeno pod: ,

Upozornění na nové komentáře

Pokud chčeš dostávat upozornění emailem na změny u toho příspěvku,tak se zaregistruj zde.zde

Odebírat komentáře k tomuto příspěvku pomocí RSS

Komentář

# Honza77 said on October 6, 2009 3:05 AM:

Můžete doporučit nějaký skriptovací jazyk pro .NET, který funguje i Medium Trust levelu zabezpečení (typicky používaný na web hostingách s .NETem)? Tam je reflexe z bezp. důvodu omezena.

# topas said on October 6, 2009 8:42 AM:

Tuto vlastnost by měli splňovat jazyky, které jsou napsané nad DLR (Dynamic Language Runtime). Nějaký jejich výčet můžete najít ve třetím díle seriálu (http://blog.vyvojar.cz/topas/archive/2009/09/30/skriptov-aacute-n-iacute-v-netu-3-ironruby.aspx)

Osobně bych doporučil IronPython, který má přijatelnou syntaxi a rozumnou rychlost operací. Bohužel jsem našel na internetu případy, kdy IronPython pod partial trust zlobil, ale nevím, jestli to bude váš případ - chce to vyzkoušet.

Vytvoření nového komentáře

(povinný) 
(nepovinný)
(povinný) 
Opiš čísla, která vidíš na obrázku: