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. :)