Contenu connexe Similaire à .NET Fest 2018. Николай Балакин. .NET Internals: управление памятью в стеке (20) .NET Fest 2018. Николай Балакин. .NET Internals: управление памятью в стеке2. Compilation flow
var hello = "Hello";
var world = "World";
Console.WriteLine(hello + world);
ldstr "Hello"
ldstr "World"
call System.String::Concat
call System.Console::WriteLine
movabs rdi, 0x196af5078
mov rdi, qword ptr [rdi]
movabs rsi, 0x196af5080
mov rsi, qword ptr [rsi]
call 0x10d5ad380
mov rdi, rax
call 0x10dbb1d40
6. 2 + 3 * 4
Stack machine
10. Stack machine
var phone = GetPhoneNumber();
SendMessage(phone);
MakeCall(phone);
C#
call Contact GetPhoneNumber()
dup
call void SendMessage(Contact)
call void MakeCall(Contact)
CIL
11. Stack machine
var phone = GetPhoneNumber();
SendMessage(phone);
MakeCall(phone);
call Contact GetPhoneNumber()
dup
call void SendMessage(Contact)
call void MakeCall(Contact)
C# CIL
Stack phone
top
12. Stack machine
var phone = GetPhoneNumber();
SendMessage(phone);
MakeCall(phone);
call Contact GetPhoneNumber()
dup
call void SendMessage(Contact)
call void MakeCall(Contact)
C# CIL
Stack phone
phone
top
13. Stack machine
var phone = GetPhoneNumber();
SendMessage(phone);
MakeCall(phone);
call Contact GetPhoneNumber()
dup
call void SendMessage(Contact)
call void MakeCall(Contact)
C# CIL
Stack phone
phone
top
14. Stack machine
var phone = GetPhoneNumber();
SendMessage(phone);
MakeCall(phone);
call Contact GetPhoneNumber()
dup
call void SendMessage(Contact)
call void MakeCall(Contact)
C# CIL
Stack phone
top
15. Stack machine
var phone = GetPhoneNumber();
SendMessage(phone);
MakeCall(phone);
call Contact GetPhoneNumber()
dup
call void SendMessage(Contact)
call void MakeCall(Contact)
C# CIL
Stack
top
16. Stack machine
var mode = Mode.Default
var phone = GetPhoneNumber();
SendMessage(phone);
MakeCall(phone, mode);
C#
ldc.i4.1
stloc.0
call Contact GetPhoneNumber()
stloc.1
ldloc.1
call void SendMessage(Contact)
ldloc.1
ldloc.0
call void MakeCall(Contact, valuetype Mode)
CIL
17. Stack machine
var mode = Mode.Default
var phone = GetPhoneNumber();
SendMessage(phone);
MakeCall(phone, mode);
ldc.i4.1
stloc.0
call Contact GetPhoneNumber()
stloc.1
ldloc.1
call void SendMessage(Contact)
ldloc.1
ldloc.0
call void MakeCall(Contact, valuetype Mode)
C# CIL
Stack 1
top
18. Stack machine
var mode = Mode.Default
var phone = GetPhoneNumber();
SendMessage(phone);
MakeCall(phone, mode);
ldc.i4.1
stloc.0
call Contact GetPhoneNumber()
stloc.1
ldloc.1
call void SendMessage(Contact)
ldloc.1
ldloc.0
call void MakeCall(Contact, valuetype Mode)
C# CIL
Stack 1
Locals mode
top
19. Stack machine
var mode = Mode.Default
var phone = GetPhoneNumber();
SendMessage(phone);
MakeCall(phone, mode);
ldc.i4.1
stloc.0
call Contact GetPhoneNumber()
stloc.1
ldloc.1
call void SendMessage(Contact)
ldloc.1
ldloc.0
call void MakeCall(Contact, valuetype Mode)
C# CIL
Stack phone
Locals mode
top
20. Stack machine
var mode = Mode.Default
var phone = GetPhoneNumber();
SendMessage(phone);
MakeCall(phone, mode);
ldc.i4.1
stloc.0
call Contact GetPhoneNumber()
stloc.1
ldloc.1
call void SendMessage(Contact)
ldloc.1
ldloc.0
call void MakeCall(Contact, valuetype Mode)
C# CIL
Stack phone
Locals mode
phone
top
21. Stack machine
var mode = Mode.Default
var phone = GetPhoneNumber();
SendMessage(phone);
MakeCall(phone, mode);
ldc.i4.1
stloc.0
call Contact GetPhoneNumber()
stloc.1
ldloc.1
call void SendMessage(Contact)
ldloc.1
ldloc.0
call void MakeCall(Contact, valuetype Mode)
C# CIL
Stack phone
Locals mode
phone
top
22. Stack machine
var mode = Mode.Default
var phone = GetPhoneNumber();
SendMessage(phone);
MakeCall(phone, mode);
ldc.i4.1
stloc.0
call Contact GetPhoneNumber()
stloc.1
ldloc.1
call void SendMessage(Contact)
ldloc.1
ldloc.0
call void MakeCall(Contact, valuetype Mode)
C# CIL
Stack phone
Locals mode
phone
top
23. Stack machine
var mode = Mode.Default
var phone = GetPhoneNumber();
SendMessage(phone);
MakeCall(phone, mode);
ldc.i4.1
stloc.0
call Contact GetPhoneNumber()
stloc.1
ldloc.1
call void SendMessage(Contact)
ldloc.1
ldloc.0
call void MakeCall(Contact, valuetype Mode)
C# CIL
Stack phone
Locals mode
phone
top
24. Stack machine
var mode = Mode.Default
var phone = GetPhoneNumber();
SendMessage(phone);
MakeCall(phone, mode);
ldc.i4.1
stloc.0
call Contact GetPhoneNumber()
stloc.1
ldloc.1
call void SendMessage(Contact)
ldloc.1
ldloc.0
call void MakeCall(Contact, valuetype Mode)
C# CIL
Stack phone
mode
Locals mode
phone
top
25. Stack machine
var mode = Mode.Default
var phone = GetPhoneNumber();
SendMessage(phone);
MakeCall(phone, mode);
ldc.i4.1
stloc.0
call Contact GetPhoneNumber()
stloc.1
ldloc.1
call void SendMessage(Contact)
ldloc.1
ldloc.0
call void MakeCall(Contact, valuetype Mode)
C# CIL
Stack phone
mode
Locals mode
phone
top
26. Stack machine
var mode = Mode.Default
var phone = GetPhoneNumber();
SendMessage(phone);
MakeCall(phone, mode);
ldc.i4.1
stloc.0
call Contact GetPhoneNumber()
stloc.1
ldloc.1
call void SendMessage(Contact)
ldloc.1
ldloc.0
call void MakeCall(Contact, valuetype Mode)
C# CIL
Stack Locals mode
phone
top
29. JIT compiler
LdVar Sorting
& Tree
Ordering
Loop
Optimizations
Range Check
Elimination
Rationalization
Importer Inliner Morph
Flowgraph
Analysis
EmitterLowering LSRA CodeGen
Rationalized
LIR
Native
Code
GenTrees IR with reference counts
& evaluation order
Instr
Descs
Real
registers
Reg
Reqts
GenTrees
(IR)
IL
(bytecode)
Copy
Propagation
CSE
Assertion
Propagation
Loop
Optimizations
Range Check
Elimination
Copy
Propagation
CSE
Assertion
Propagation
30. JIT optimizations
• Not saving variables
• Method call inlining
• Range check elimination
• Jump instead of call
• …