$30 off During Our Annual Pro Sale. View Details »

.NETプログラム (のランタイムを実装する) 入門なのです

Mayuki Sawatari
September 16, 2015

.NETプログラム (のランタイムを実装する) 入門なのです

Mayuki Sawatari

September 16, 2015
Tweet

More Decks by Mayuki Sawatari

Other Decks in Technology

Transcript

  1. View Slide

  2. http://github.com/mayuki

    View Slide

  3. View Slide

  4. MSIL
    Java
    MSIL
    https://github.com/ojanacek/MsilInterpreter
    https://github.com/kazuk/SimpleILer

    View Slide

  5. CLR

    View Slide

  6. View Slide

  7. http://github.com/mayuki/Inazuma
    FizzBuzz

    View Slide

  8. View Slide

  9. CLR “Lightning”

    View Slide

  10. View Slide

  11. CoreCLR
    MSIL

    View Slide

  12. View Slide

  13. .NET

    View Slide

  14. MSIL
    MethodInfo
    Mono.Cecil
    http://github.com/dotnet/corefx

    View Slide

  15. Reference Definition

    Reference Resolve Definition

    View Slide

  16. View Slide

  17. View Slide

  18. EEClass
    MethodTable
    MethodDesc, FieldDesc

    View Slide

  19. MethodTable
    MethodTable
    NumVirtuals
    EEClass EEClass
    ParentMethodTable
    Interfaces
    MethodSlots
    StaticFields
    MethodSlots
    Slot MethodDesc
    0 MethodA(0x1)
    1 MethodB(0x2)
    2 MethodA(0x1)
    3 MethodB(0x2)
    4 MethodC(0x2)

    View Slide

  20. System.Object
    Slot MethodDesc
    0 ToString (virtual)
    1 Equals (virtual)
    2 GetHashCode
    (virtual)
    A
    Slot MethodDesc
    0 A.ToString (override)
    1 Equals
    2 GetHashCode
    3 VirtualMethod (virtual)
    B
    Slot MethodDesc
    0 A.ToString
    1 Equals
    2 GetHashCode
    3 B.VirtualMethod (override)
    4 B.VirtualMethod2

    View Slide

  21. CLR ?
    0:006> !name2ee *!ConsoleApplication3.B
    Module: 73281000
    Assembly: mscorlib.dll
    --------------------------------------
    Module: 02dd3fbc
    Assembly: ConsoleApplication3.exe
    Token: 02000004
    MethodTable: 02dd4dcc
    EEClass: 02dd1858
    Name: ConsoleApplication3.B
    0:006> !dumpmt -md 02dd4dcc
    EEClass: 02dd1858
    Module: 02dd3fbc
    Name: ConsoleApplication3.B
    mdToken: 02000004
    File: C:\Users\Tomoyo\Documents\visual studio
    2015\Projects\ConsoleApplication3\ConsoleApplication3\bin\Debug\ConsoleApplication3.exe
    BaseSize: 0xc
    ComponentSize: 0x0
    Slots in VTable: 7
    Number of IFaces in IFaceMap: 0
    --------------------------------------
    MethodDesc Table
    Entry MethodDe JIT Name
    02e20055 02dd4d44 NONE ConsoleApplication3.A.ToString()
    735f5600 7328835c PreJIT System.Object.Equals(System.Object)
    735c19b0 7328837c PreJIT System.Object.GetHashCode()
    735c16e8 73288390 PreJIT System.Object.Finalize()
    02e20075 02dd4db4 NONE ConsoleApplication3.B.VirtualMethod()
    02e20079 02dd4dbc NONE ConsoleApplication3.B.VirtualMethod2()
    02e204a8 02dd4dc4 JIT ConsoleApplication3.B..ctor()
    0:006> !name2ee *!ConsoleApplication3.A
    Module: 73281000
    Assembly: mscorlib.dll
    --------------------------------------
    Module: 02dd3fbc
    Assembly: ConsoleApplication3.exe
    Token: 02000003
    MethodTable: 02dd4d5c
    EEClass: 02dd1804
    Name: ConsoleApplication3.A
    0:006> !dumpmt -md 02dd4d5c
    EEClass: 02dd1804
    Module: 02dd3fbc
    Name: ConsoleApplication3.A
    mdToken: 02000003
    File: C:\Users\Tomoyo\Documents\visual studio
    2015\Projects\ConsoleApplication3\ConsoleApplication3\bin\Debug\ConsoleApplication3.exe
    BaseSize: 0xc
    ComponentSize: 0x0
    Slots in VTable: 6
    Number of IFaces in IFaceMap: 0
    --------------------------------------
    MethodDesc Table
    Entry MethodDe JIT Name
    02e20055 02dd4d44 NONE ConsoleApplication3.A.ToString()
    735f5600 7328835c PreJIT System.Object.Equals(System.Object)
    735c19b0 7328837c PreJIT System.Object.GetHashCode()
    735c16e8 73288390 PreJIT System.Object.Finalize()
    02e20059 02dd4d4c NONE ConsoleApplication3.A.VirtualMethod()
    02e204e0 02dd4d54 JIT ConsoleApplication3.A..ctor()

    View Slide

  22. Inazuma MethodTable

    View Slide

  23. MethodTable
    MethodTable
    Slot MethodDesc
    0 MethodA(0x1)
    1 MethodB(0x2)
    2 MethodA(0x1)
    3 MethodB(0x2)
    4 MethodC(0x2)
    interface IA { void MethodA(); void MethodB(); }
    interface IB { void MethodA(); void MethodB(); }
    class C : IA, IB
    {
    public void MethodA() { }
    public void MethodB() { }
    public void MethodC() { }
    }
    InterfaceVTableMap
    Interface MTSlot
    IA 0
    IB 2

    View Slide

  24. View Slide

  25. IL opcode
    MSIL
    https://msdn.microsoft.com/ja-jp/library/System.Reflection.Emit.OpCodes.aspx

    View Slide

  26. MethodDefinition
    IL
    ( )

    View Slide

  27. View Slide

  28. View Slide

  29. mscorlib
    CoreCLR mscorlib mscorlib
    /nostdlib

    View Slide

  30. View Slide

  31. opcode
    MethodTable

    View Slide

  32. Garbage Collection

    View Slide

  33. View Slide

  34. View Slide

  35. Book of the Runtime ( BotR)
    https://github.com/dotnet/coreclr/tree/master/Documentation#book-of-the-runtime
    SOS & WinDbg & ildasm
    The Root of .NET Framework
    OpCodes
    https://msdn.microsoft.com/ja-jp/library/System.Reflection.Emit.OpCodes.aspx

    View Slide

  36. C# .NET
    JIT and Run: .NET Framework : CLR
    https://msdn.microsoft.com/ja-jp/magazine/ee216336.aspx

    View Slide

  37. View Slide

  38. IL
    CLR
    feature

    View Slide

  39. CoreCLR
    https://github.com/dotnet/coreclr/blob/master/Documentation/building/windows-instructions.md
    git clone coreclr
    Install Visual Studio 2015
    Install CMake

    View Slide

  40. Developer Command Prompt for VS2015
    bin\Product\Windows_NT.x64.Debug CoreCLR

    View Slide

  41. Interpreter
    CMakeLists.txt
    Coreclr/bin ( )
    Build

    View Slide

  42. bin\tests\obj\Windows_NT.x64.Debug\CoreCLR.sln
    VS
    Cee_wks
    Warning treats as error fprintf warning
    CoreCLR
    CoreRun

    View Slide

  43. CoreRun.exe MyProgram.exe
    ( )

    View Slide

  44. mscorlib.dll
    mscorlib.dll coreclr.dll

    View Slide

  45. Visual Studio CoreRun
    Interpreter

    View Slide

  46. CoreCLR CoreRun CoreConsole
    CoreRun
    CoreConsole

    View Slide

  47. View Slide

  48. CoreCLR .NET CLR

    View Slide