1. Main Idea
ุฅุญูุง ุนูุฏูุง ุชูุฑูุจูุง ููุณ ุงูููู ูู ุงููุงุญูุชูู:
ูู C# / .NET
ูู ุง ุชูุชุจ ููุฏ C#:
- ุจุชูุชุจ
C# source code - ุงูู
C# compilerุจูุญููู ูู Intermediate Language (IL) + ุดููุฉmetadataูุจูุญุทูู ููassembly
(ู ูู.dllุฃู.exe) - ููุช ุงูุชุดุบููุ ุงูู CLR (Common Language Runtime) ุจูุงุฎุฏ ุงูู
ILูุจูุญููู ุจู JIT Compiler ููnative machine codeุงููู ุงูู ุนุงูุฌ ูููู ู.
ูู Java
- ุจุชูุชุจ
Java source code - ุงูู
javacุจูุญููู ููbytecodeูู ู ูู.class - ููุช ุงูุชุดุบููุ ุงูู JVM (Java Virtual Machine) ูุง ุฅู
ุง:
- ุชูุณุฑ ุงูู
bytecodeู ุจุงุดุฑุฉุ ุฃู - ุชุณุชุฎุฏู
JIT compilerูุชุญููู ููnative machine code.
- ุชูุณุฑ ุงูู
ุฅุฐู ู ู ุงูุขุฎุฑ:
- ุงูู
ILูู .NET - ุงูู
bytecodeูู Java
ุงูุงุชููู ุนุจุงุฑุฉ ุนู ูุบุฉ ูุณูุทุฉ ู ุด ู ุฑุชุจุทุฉ ู ุจุงุดุฑุฉ ุจุงูู CPU.
2. Main Difference
ูู Java:
- ุงูู platform ู
ุนู
ูู ุฃุณุงุณูุง ุญูุงููู ูุบุฉ ูุงุญุฏุฉ:
Java - ูุนูู ุชูุฑูุจูุง ูู ุงูู toolchain ู ุชุฎูู ุฅูู ุจุชูุชุจ Java (ูู ูุบุงุช ุชุงููุฉ ููู JVM ุจุณ ุฏู ู ุด ุชุตู ูู ูุง ุงูุฃุตูู).
ูู .NET:
- ุนูุฏู CLI (Common Language Infrastructure)
- ูุนูุฏู CTS (Common Type System) ู CLS (Common Language Specification)
- ุงูููุฑุฉ ุฅู ุฃู ูุบุฉ ุชูุชุฒู ุจุงูููุงุนุฏ ุฏู ุชูุฏุฑ ุชุดุชุบู ุนูู ููุณ ุงูู runtime.
ูุนูู:
- ุชูุฏุฑ ุชูุชุจ
C# - ุฃู
VB.NET - ุฃู
F# - ุฃู ุฃู ูุบุฉ ุชุงููุฉ targeting .NET
ููู ุงูุขุฎุฑ ููู ุจูุทูุน IL ููุชุดุบู ุนูู ููุณ ุงูู CLR.
ูู ุงููุฑู:
- ุงูู Java bytecode ู ุนู ูู ุฃุณุงุณูุง ุนุดุงู Java.
- ุงูู .NET IL ู ุนู ูู ู ู ุงูุฃูู ุนุดุงู ูููู target ู ุดุชุฑู ูุฃูุชุฑ ู ู ูุบุฉ.
3. Example
ูุงุฎุฏ ุฏุงูุฉ ุจุณูุทุฉ ุจุชุฌู ุน ุนุฏุฏูู.
C# code
public class Calculator
{
public int Add(int a, int b)
{
return a + b;
}
}ูู
ุง ุชููู
ุจุงูู ุงูููุฏ ุฏูุ ุงูู C# compiler ููุทูุน IL (ููุชุจูู ุดูู ู
ุจุณุทุ ู
ุด ูุงุฒู
ูุจูู 100% ู
ุทุงุจู ูุฅุฎุฑุงุฌ ุงูููู
ุจุงููุฑ):
.class public Calculator extends [System.Runtime]System.Object
{
.method public hidebysig instance int32 Add(int32 a, int32 b) cil managed
{
.maxstack 2
.locals init (
[0] int32 result
)
ldarg.1 // load a
ldarg.2 // load b
add // a + b
stloc.0 // store in result
ldloc.0 // load result
ret // return result
}
}ุงููู ู ูู ููุง ุฅู:
- ุงูู
.methodุจุชุนุฑู ุงูู ูุซูุฏ - ุงูู
ldarg.1ูldarg.2ุจูุญู ูููุง ุงูุจุฑุงู ูุชุฑุฒ - ุงูู
addุจูุฌู ุนูู - ุงูู
retุจูุฑุฌุน ุงูููู ุฉ
ุฏู ููู ุจูุชูุฑู ุนู ุทุฑูู ุงูู CLR ุจุนุฏูู ููุชุญููู ูู native code.
Java code
ููุณ ุงูููุฑุฉ ูู Java:
public class Calculator {
public int add(int a, int b) {
return a + b;
}
}ูู
ุง ุชูู
ุจุงูู ุจู javac, ููุทูุน Calculator.class ููู bytecode. ุชูุฏุฑ ุชุดููู ุจุฃู
ุฑ ุฒู javap -c Calculator. ุดูู ู
ุจุณุท ู
ู ุงูู bytecode ูููู ุฒู:
public int add(int a, int b);
Code:
0: iload_1 // load a
1: iload_2 // load b
2: iadd // a + b
3: ireturn // return resultุจุฑุถู ููุง:
- ุงูู
iload_1ูiload_2ุจูุญู ููุง ุงูุจุฑุงู ูุชุฑุฒ - ุงูู
iaddุจูุฌู ุน - ุงูู
ireturnุจูุฑุฌุน
ุงูู JVM ุจุชูุฑุฃ ุงูู bytecode ุฏูุ ูุชูุณูุฑู ุฃู ุชุญููู ูู native code.
4. Summary
ููุฎุตูุง ูุฏู:
- ุงูุงุชููู intermediate representation:
- ู ุด machine code ู ุจุงุดุฑ
- ู ุด ุงูููุฏ ุงููู ุงูุช ูุชุจุชู
- ุงูุงุชููู cross-platform:
- ุงูู IL ุจูุดุชุบู ุนูู ุฃู platform ููู
CLR - ุงูู Bytecode ุจูุดุชุบู ุนูู ุฃู platform ููู
JVM
- ุงูู IL ุจูุดุชุบู ุนูู ุฃู platform ููู
- ุงููุฑู ุงูู
ูู
ูู ุงูุชุตู
ูู
:
- ุงูู Java bytecode: ู ุนู ููุฉ ุฃุณุงุณูุง ููุบุฉ Java
- ุงูู .NET IL: ู ุนู ููุฉ ู ู ุงูุจุฏุงูุฉ ุนุดุงู ุชููู common target ููุบุงุช ู ุฎุชููุฉ ุนูู ููุณ ุงูู runtime
- ุงูุงุชููู ุจูุนุฏูุง ุนูู ู
ุฑุญูุฉ
JIT compilationูู runtime ุนุดุงู ูุจููุง native machine code.