"Θα ήθελα feedback και πιο πολύ για το framework (OMEGA - DLL)!"
Καταρχήν, όταν ζητάς feedback είναι θέμα στοιχειώδους ευγένειας να αποδέχεσαι την κριτική χωρίς να γίνεσαι εριστικός. Στο κάτω-κάτω αυτός που σου απαντά αφιέρωσε χρόνο από τη ζωή του για να κοιτάξει τον κώδικά σου. Σχόλια του τύπου "Επίσης για όλους εσάς που λέτε ότι είστε και MVP...." δεν τιμούν ούτε εσένα, ούτε εμάς.
Από εκεί και πέρα ως προς το θέμα interpreter vs JIT compiler το θέμα έχει ως εξής:
Στο JIT compilation, το compilation γίνεται σε δύο φάσεις. Στην πρώτη φάση ο εκάστοτε language compiler παράγει MSIL ωστόσο ο κώδικας περνάει από διάφορα optimizations. Κλασική περίπτωση:
int[] nums= { 1, 2, 3, 4 };
for (Int32 i = 0; i <= nums.Length-1; i++)
{
Console.WriteLine(nums[ i ].ToString());
}
Αν δεις τον MSIL κώδικα, θα παρατηρήσεις ότι ο C# compiler (και ο VB compiler αν ο κώδικας ήταν σε VB) έχει πάρει την πρωτοβουλία να υπολογίσει το nums.Length-1 και να το κάνει assign σε μια μεταβλητή ώστε να μην το κάνει σε κάθε iteration του loop. Και αυτό είναι ένα από τα πολλά optimizations. To σημαντικό εδώ είναι ότι γίνεται compile ο κώδικας συνολικά.
O MSIL κώδικας που παράγεται είναι έτοιμος τέλος πάντων μετά από αυτό το στάδιο και γίνεται δεύτερη φορά compile σε native κώδικα ώστε να παραχθεί optimized κώδικας ανάλογα με το "περιβάλλον" του MSIL κώδικα. Ο JIT compiler ενεργοποιείται σε διάφορες περιπτώσεις. Βασικά ενεργοποιείται την πρώτη φορά που τρέχει το assembly αλλά όχι μόνο. Υπάρχουν περιπτώσεις που ξανατρέχει, όπως για παράδειγμα όταν:
- Αλλάξει η έκδοση του .NET Framework
- Αλλάξει η CPU (μιλάμε για αρχιτεκτονική)
- Αλλάξει η έκδοση του ΛΣ
- Αλλάξουν οι εκδόσεις των assemblies που χρησιμοποιεί το assembly
- Αλλάξουν τα security demands του κώδικα
Ο JIT compiler δεν κάνει συνολικό compilation σε native κώδικα αλλά σταδιακά, ωστόσο αυτό δεν συναπάγεται ότι κάνει JIT compile γραμμή-γραμμή αλλά ανά method call. Αυτό έχει ως συνέπεια να μην σπαταλιέται χρόνος και CPU σε methods που δεν θα κληθούν. Από εκεί και πέρα εφόσον υπάρχει o JIT compiled κώδικας μια φορά και εφόσον δεν έχει συμβεί κάτι από τα προηγούμενα που ανέφερα, δεν ξανασυμβαίνει JIT compilation.
Όπως αντιλαμβάνεσαι αυτό που λες εσύ "διαδικασία interpretation και final compilation" ότι δεν έχει καμία σχέση με το τι πραγματικά γίνεται και σίγουρα καμία μα καμία σχέση με το τι γίνεται στην PHP.
Τώρα, ως προς το δεύτερο κομμάτι:
Λες ότι προτιμάς αυτό:
static string Test1(string a, string b)
{
return a + b;
}
από αυτό:
static string Test2(string a, string b)
{
return string.Format("{0}{1}", a, b);
}
Γιατί στον IL κώδικα "θα έχω data σε μορφή string και όχι κλήσεις σε classes/functions της .NET"
Αν δεις με το Ildasm τον παραγόμενο κώδικα, θα παρατηρήσεις ότι και στις δύο περιπτώσεις θα έχεις κλήση στα methods της κλάσης String:
L_0000: ldarg.0
L_0001: ldarg.1
L_0002: call string [mscorlib]System.String::Concat(string, string)
L_0007: ret
και
L_0000: ldstr "{0}{1}"
L_0005: ldarg.0
L_0006: ldarg.1
L_0007: call string [mscorlib]System.String::Format(string, object, object)
L_000c: ret
αντίστοιχα. Οπότε καταλαβαίνεις ότι αυτό που υποστηρίζεις, έστω και στο πιο απλό επίπεδο του string concatenation είναι τελείως ανεδαφικό.
Ίσως είναι καιρός να αναθεωρήσεις την φιλοσοφία που γράφεις .ΝΕΤ κώδικα.
Vir prudens non contra ventum mingit