рдирдорд╕реНрдХрд╛рд░, рд╣реЗрдмреНрд░! рдореИрдВ рдЖрдкрдХреЛ рд▓реЗрдЦ " рдЕрдВрдбрд░рд╕реНрдЯреИрдВрдбрд┐рдВрдЧ рд╣рд╛рдЙ рдЧреНрд░реЗрд╡рд▓ рд╡рд░реНрдХреНрд╕ - рдЬрд╛рд╡рд╛ рдЬреЗрдЖрдИрдЯреА рдХрдореНрдкрд╛рдЗрд▓рд░ рдЬрд╛рд╡рд╛ рдореЗрдВ рд▓рд┐рдЦрд╛ " рдХрд╛ рдЕрдиреБрд╡рд╛рдж рдкреНрд░рд╕реНрддреБрдд рдХрд░рддрд╛ рд╣реВрдВред
рдкрд░рд┐рдЪрдп
рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рд╢реЛрдзрдХрд░реНрддрд╛ рдмрдирдиреЗ рдХреЗ рдХрд╛рд░рдгреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдпрд╣ рд╣реИ рдХрд┐ рдХрдВрдкреНрдпреВрдЯрд░ рдкреНрд░реМрджреНрдпреЛрдЧрд┐рдХреА рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд▓реЛрдЧреЛрдВ рдХреЗ рдПрдХ рдмрдбрд╝реЗ рд╕рдореБрджрд╛рдп рдореЗрдВ, рд▓рдЧрднрдЧ рд╕рднреА рд▓реЛрдЧ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдХрдИ рд▓реЛрдЧ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ рдХрд┐ рд╡реЗ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред рдЬрдм рдореИрдВ рдкрд╣рд▓реА рдмрд╛рд░ рдПрдХ рдмрдЪреНрдЪреЗ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдореЗрдВ рдЖрдпрд╛ рдерд╛ рдФрд░ рдПрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реЛ рдЧрдпрд╛ рдерд╛, рддреЛ рдкрд╣рд▓реА рдЪреАрдЬ рдЬрд┐рд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдореИрдВ рдЬрд╛рдирдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдФрд░ рд╕рдмрд╕реЗ рдкрд╣рд▓реА рдмрд╛рдд рдЬреЛ рдореИрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ рд╡рд╣ рд╣реИ рдЕрдкрдиреА рднрд╛рд╖рд╛ рдмрдирд╛рдирд╛ред
рдЗрд╕ рдкреНрд░рд╕реНрддреБрддрд┐ рдореЗрдВ, рдореИрдВ рдЖрдкрдХреЛ рдЙрд╕ рднрд╛рд╖рд╛ рдХреЗ рдХреБрдЫ рдХрд╛рд░реНрдпрд╢реАрд▓ рддрдВрддреНрд░ рджрд┐рдЦрд╛рдКрдВрдЧрд╛ рдЬрд┐рд╕рдХрд╛ рдЖрдк рд╕рднреА рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ - рдЬрд╛рд╡рд╛ред рдЦрд╝рд╛рд╕рд┐рдпрдд рдпрд╣ рд╣реИ рдХрд┐ рдореИрдВ рдЧреНрд░реЗрдЧрд▓ рдирд╛рдордХ рдПрдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реВрдВрдЧрд╛, рдЬреЛ рдЬрд╛рд╡рд╛ рдореЗрдВ рдЬрд╛рд╡рд╛ рдХреА рдЕрд╡рдзрд╛рд░рдгрд╛ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИред
рдЬрд╛рд╡рд╛ рдХреЗ рдХрд╛рдо рдореЗрдВ рдЧреНрд░реЗрдЧрд▓ рдХреЗрд╡рд▓ рдПрдХ рдШрдЯрдХ рд╣реИ - рдпрд╣ рдПрдХ рд╕рдордпрдмрджреНрдз рд╕рдВрдХрд▓рдХ рд╣реИред рдпрд╣ JVM рдХрд╛ рдПрдХ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИ рдЬреЛ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рджреМрд░рд╛рди рдЬрд╛рд╡рд╛ рдмрд╛рдЗрдЯрдХреЛрдб рдХреЛ рдорд╢реАрди рдХреЛрдб рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдЙрдЪреНрдЪ рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо рдкреНрд░рджрд░реНрд╢рди рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХрд╛рд░рдХреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИред рдпрд╣ рдореБрдЭреЗ рднреА рд▓рдЧрддрд╛ рд╣реИ, рдЬреНрдпрд╛рджрд╛рддрд░ рд▓реЛрдЧ рдЬреЗрд╡реАрдПрдо рдХреЗ рд╕рдмрд╕реЗ рдЬрдЯрд┐рд▓ рдФрд░ рдЕрд╕реНрдкрд╖реНрдЯ рд╣рд┐рд╕реНрд╕реЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдорд╛рдирддреЗ рд╣реИрдВ, рдЬреЛ рдЙрдирдХреА рд╕рдордЭ рд╕реЗ рдкрд░реЗ рд╣реИред рдЗрд╕ рд░рд╛рдп рдХреЛ рдмрджрд▓рдирд╛ рдЗрд╕ рднрд╛рд╖рдг рдХрд╛ рдЙрджреНрджреЗрд╢реНрдп рд╣реИред
рдпрджрд┐ рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдПрдХ рдЬреЗрд╡реАрдПрдо рдХреНрдпрд╛ рд╣реИ; рдЖрдо рддреМрд░ рдкрд░ рд╕рдордЭрддреЗ рд╣реИрдВ рдХрд┐ рд╢рдмреНрджреЛрдВ рдХреЗ рдмрд╛рдЗрдЯрдХреЛрдб рдФрд░ рдорд╢реАрди рдХреЛрдб рдХрд╛ рдХреНрдпрд╛ рдорддрд▓рдм рд╣реИ; рдФрд░ рдЬрд╛рд╡рд╛ рдореЗрдВ рд▓рд┐рдЦрд╛ рдХреЛрдб рдкрдврд╝рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реИ, рддреЛ рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдкреНрд░рд╕реНрддреБрдд рд╕рд╛рдордЧреНрд░реА рдХреЛ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рдкрд░реНрдпрд╛рдкреНрдд рд╣реЛрдЧрд╛ред
рдореИрдВ рдЗрд╕ рдмрд╛рдд рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░реВрдВрдЧрд╛ рдХрд┐ рд╣рдо рдЬрд╛рд╡рд╛ рдореЗрдВ рд▓рд┐рдЦреЗ рдЬреЗрд╡реАрдПрдо рдХреЗ рд▓рд┐рдП рдПрдХ рдирдпрд╛ рдЬреЗрдЖрдИрдЯреА рдХрдВрдкрд╛рдЗрд▓рд░ рдХреНрдпреЛрдВ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдФрд░ рдЙрд╕рдХреЗ рдмрд╛рдж рдореИрдВ рджрд┐рдЦрд╛рдКрдВрдЧрд╛ рдХрд┐ рдЗрд╕рдореЗрдВ рдХреБрдЫ рд╡рд┐рд╢реЗрд╖ рдирд╣реАрдВ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рд╕реЛрдЪ рд╕рдХрддреЗ рд╣реИрдВ, рдЗрд╕ рдХрд╛рд░реНрдп рдХреЛ рдХрдВрдкрд╛рдЗрд▓рд░ рдЕрд╕реЗрдВрдмрд▓реА рдореЗрдВ рдиреАрдЪреЗ рддреЛрдбрд╝рдХрд░, рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ, рдФрд░ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реЗрдВ рдЗрд╕рдХрд╛ рдХреЛрдб рдХрд┐рд╕реА рднреА рдЕрдиреНрдп рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреА рддрд░рд╣ рд╣реА рд╣реИред
рдореИрдВ рд╕рд┐рджреНрдзрд╛рдВрдд рдкрд░ рдмрд╣реБрдд рдереЛрдбрд╝рд╛ рд╕реНрдкрд░реНрд╢ рдХрд░реВрдВрдЧрд╛, рдФрд░ рдлрд┐рд░ рдореИрдВ рдпрд╣ рджрд┐рдЦрд╛рдКрдВрдЧрд╛ рдХрд┐ рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рдВрдХрд▓рд┐рдд рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рджреМрд░рд╛рди рдмрд╛рдИрдЯреЗрдХреЛрдб рд╕реЗ рдорд╢реАрди рдХреЛрдб рддрдХ рдХреИрд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдореИрдВ рдХреБрдЫ рд╡рд┐рд╡рд░рдг рднреА рджрд┐рдЦрд╛рдКрдВрдЧрд╛, рдФрд░ рдЕрдВрдд рдореЗрдВ рд╣рдо рдЬрд╛рд╡рд╛ рдореЗрдВ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рд▓рд┐рдП рдЬрд╛рд╡рд╛ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд╛рднреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░реЗрдВрдЧреЗред
рдореИрдВ рд▓рд╛рдЗрд╡ рдХреЛрдбрд┐рдВрдЧ рдХреА рдЕрдкрд░рд┐рд╣рд╛рд░реНрдп рд╕рдорд╕реНрдпрд╛рдУрдВ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП, рдкреНрд░рд╕реНрддреБрддрд┐ рдХреЗ рджреМрд░рд╛рди рдЙрдиреНрд╣реЗрдВ рд▓реЙрдиреНрдЪ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп, рдЧреНрд░рд╣рдг рдореЗрдВ рдХреЛрдб рдХреЗ рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реВрдВрдЧрд╛ред
рдЬреЗрдЖрдИрдЯреА рдХрдВрдкрд╛рдЗрд▓рд░ рдХреНрдпрд╛ рд╣реИ?
рдореБрдЭреЗ рдпрдХреАрди рд╣реИ рдХрд┐ рдЖрдк рдореЗрдВ рд╕реЗ рдмрд╣реБрдд рд╕реЗ рд▓реЛрдЧ рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдПрдХ рдЬреЗрдЖрдИрдЯреА рдХрдВрдкрд╛рдЗрд▓рд░ рдХреНрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдлрд┐рд░ рднреА рдореИрдВ рдореВрд▓ рдмрд╛рддреЛрдВ рдкрд░ рд╕реНрдкрд░реНрд╢ рдХрд░реВрдВрдЧрд╛ рддрд╛рдХрд┐ рдХреЛрдИ рднреА рдЗрд╕ рдореБрдЦреНрдп рдкреНрд░рд╢реНрди рдХреЛ рдкреВрдЫрдиреЗ рд╕реЗ рдбрд░рдХрд░ рдпрд╣рд╛рдВ рди рдмреИрдареЗред
рдЬрдм рдЖрдк IDE рдореЗрдВ javac
рдпрд╛ compile-on-save рдХрдорд╛рдВрдб рдЪрд▓рд╛рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХрд╛ Java рдкреНрд░реЛрдЧреНрд░рд╛рдо рдЬрд╛рд╡рд╛ рдХреЛрдб рд╕реЗ JVM рдмрд╛рдпрдЯреЗрдХреЛрдб рдкрд░ рд╕рдВрдХрд▓рд┐рдд рд╣реЛрддрд╛ рд╣реИ, рдЬреЛ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХрд╛ рдмрд╛рдЗрдирд░реА рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рд╣реИред рдпрд╣ рдЬрд╛рд╡рд╛ рд╕реНрд░реЛрдд рдХреЛрдб рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рдХреЙрдореНрдкреИрдХреНрдЯ рдФрд░ рд╕рд░рд▓ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЖрдкрдХреЗ рд▓реИрдкрдЯреЙрдк рдпрд╛ рд╕рд░реНрд╡рд░ рдХрд╛ рдирд┐рдпрдорд┐рдд рдкреНрд░реЛрд╕реЗрд╕рд░ рд╕рд┐рд░реНрдл JVM рдмрд╛рдпрдЯреЗрдХреЛрдб рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИред
рдЖрдкрдХреЗ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдХреЗ рд▓рд┐рдП, JVM рдЗрд╕ рдмрд╛рдЗрдЯрдХреЛрдб рдХреА рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХрд░рддрд╛ рд╣реИред рдкреНрд░реЛрд╕реЗрд╕рд░ рдкрд░ рдЪрд▓ рд░рд╣реЗ рдорд╢реАрди рдХреЛрдб рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЗрдВрдЯрд░рдкреНрд░реЗрдирд░реНрд╕ рдЖрдорддреМрд░ рдкрд░ рдмрд╣реБрдд рдзреАрдореЗ рд╣реЛрддреЗ рд╣реИрдВред рдЗрд╕ рдХрд╛рд░рдг рд╕реЗ, рдЬреЗрд╡реАрдПрдо, рдЬрдмрдХрд┐ рдХрд╛рд░реНрдпрдХреНрд░рдо рдЪрд▓ рд░рд╣рд╛ рд╣реИ, рдПрдХ рдФрд░ рд╕рдВрдХрд▓рдХ рд▓реЙрдиреНрдЪ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рдЖрдкрдХреЗ рдмрд╛рдпреЛрдЯреЗрдХ рдХреЛ рдорд╢реАрди рдХреЛрдб рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рдкреНрд░реЛрд╕реЗрд╕рд░ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реИред
рдпрд╣ рд╕рдВрдХрд▓рдХ, рдЖрдорддреМрд░ рдкрд░ javac
рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рдкрд░рд┐рд╖реНрдХреГрдд рд╣реЛрддрд╛ рд╣реИ, рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдЙрдЪреНрдЪ рдЧреБрдгрд╡рддреНрддрд╛ рд╡рд╛рд▓реЗ рдорд╢реАрди рдХреЛрдб рдХрд╛ рдЙрддреНрдкрд╛рджрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрдЯрд┐рд▓ рдЕрдиреБрдХреВрд▓рди рдХрд░рддрд╛ рд╣реИред
рдЬрд╛рд╡рд╛ рдореЗрдВ JIT рдХрдВрдкрд╛рдЗрд▓рд░ рдХреНрдпреЛрдВ рд▓рд┐рдЦреЗрдВ?
рддрд┐рдерд┐ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдУрдкрди рдЬреЗрдбреАрдХреЗ рдирд╛рдордХ рдПрдХ рдЬреЗрд╡реАрдПрдо рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рджреЛ рдореБрдЦреНрдп рдЬреЗрдЖрдИрдЯреА рд╕рдВрдХрд▓рдХ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред рдХреНрд▓рд╛рдЗрдВрдЯ рдХрдВрдкрд╛рдЗрд▓рд░, рдЬрд┐рд╕реЗ C1 рдХреЗ рд░реВрдк рдореЗрдВ рдЬрд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ, рдХреЛ рддреЗрдЬ рд╕рдВрдЪрд╛рд▓рди рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рдХрдо рдЕрдиреБрдХреВрд▓рд┐рдд рдХреЛрдб рдХрд╛ рдЙрддреНрдкрд╛рджрди рдХрд░рддрд╛ рд╣реИред рд╕рд░реНрд╡рд░ рдХрдВрдкрд╛рдЗрд▓рд░, рдЬрд┐рд╕реЗ рдСрдкреНрдЯреЛ рдпрд╛ рд╕реА 2 рдХреЗ рд░реВрдк рдореЗрдВ рдЬрд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ, рдХреЛ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдереЛрдбрд╝рд╛ рдЕрдзрд┐рдХ рд╕рдордп рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдзрд┐рдХ рдЕрдиреБрдХреВрд▓рд┐рдд рдХреЛрдб рдХрд╛ рдЙрддреНрдкрд╛рджрди рдХрд░рддрд╛ рд╣реИред
рдпрд╣ рд╡рд┐рдЪрд╛рд░ рдерд╛ рдХрд┐ рдХреНрд▓рд╛рдЗрдВрдЯ рдХрдВрдкрд╛рдЗрд▓рд░ рдбреЗрд╕реНрдХрдЯреЙрдк рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдмреЗрд╣рддрд░ рдЕрдиреБрдХреВрд▓ рдерд╛, рдЬрд╣рд╛рдВ рдЬреЗрдЖрдИрдЯреА рдХрдВрдкрд╛рдЗрд▓рд░ рдореЗрдВ рд▓рдВрдмреЗ рд╕рдордп рддрдХ рд░реБрдХрдиреЗ рдХреА рд╕реБрд╡рд┐рдзрд╛ рдирд╣реАрдВ рдереА, рдФрд░ рд╕рд░реНрд╡рд░ рдХрдВрдкрд╛рдЗрд▓рд░ рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдЪрд▓рдиреЗ рд╡рд╛рд▓реЗ рд╕рд░реНрд╡рд░ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП, рдЬреЛ рдЕрдзрд┐рдХ рд╕рдордп рд╕рдВрдХрд▓рди рдореЗрдВ рдЦрд░реНрдЪ рдХрд░ рд╕рдХрддреЗ рдереЗред
рдЖрдЬ рдЙрдиреНрд╣реЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рддрд╛рдХрд┐ рдХреЛрдб рдХреЛ рдкрд╣рд▓реЗ C1 рджреНрд╡рд╛рд░рд╛ рд╕рдВрдХрд▓рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдП, рдФрд░ рдлрд┐рд░, рдЕрдЧрд░ рдЗрд╕реЗ рдЧрд╣рди рд░реВрдк рд╕реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдпрд╣ рдЕрддрд┐рд░рд┐рдХреНрдд рд╕рдордп рдмрд┐рддрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ, - C2ред рдЗрд╕реЗ tiered рд╕рдВрдХрд▓рди рдХрд╣рддреЗ рд╣реИрдВред
рдЪрд▓реЛ C2 рдкрд░ рд╕реНрдерд┐рдд рд╣реИ, рд╕рд░реНрд╡рд░ рдХрдВрдкрд╛рдЗрд▓рд░ рдЬреЛ рдЕрдзрд┐рдХ рдЕрдиреБрдХреВрд▓рди рдХрд░рддрд╛ рд╣реИред
рд╣рдо OpenJDK рдХреЛ GitHub рдкрд░ рджрд░реНрдкрдг рд╕реЗ рдХреНрд▓реЛрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╛ рд╕рд╛рдЗрдЯ рдкрд░ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдЯреНрд░реА рдЦреЛрд▓ рд╕рдХрддреЗ рд╣реИрдВред
$ git clone https://github.com/dmlloyd/openjdk.git
C2 рдХреЛрдб Openjdk / hotspot / src / share / vm / opto рдореЗрдВ рд╣реИ ред

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдпрд╣ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ C2 C ++ рдореЗрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИ ред рдмреЗрд╢рдХ, рдпрд╣ рдХреБрдЫ рдмреБрд░рд╛ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдХреБрдЫ рдиреБрдХрд╕рд╛рди рднреА рд╣реИрдВред C ++ рдПрдХ рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рднрд╛рд╖рд╛ рд╣реИред рдЗрд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ C ++ рдореЗрдВ рддреНрд░реБрдЯрд┐рдпрд╛рдВ VM рдХреЛ рдХреНрд░реИрд╢ рдХрд░ рд╕рдХрддреА рд╣реИрдВред рдЗрд╕рдХрд╛ рдХрд╛рд░рдг рд╢рд╛рдпрдж рдХреЛрдб рдХреА рдЙрдореНрд░ рд╣реИ, рд▓реЗрдХрд┐рди C2 C ++ рдХреЛрдб рдХреЛ рдмрдирд╛рдП рд░рдЦрдирд╛ рдФрд░ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдирд╛ рдмрд╣реБрдд рдореБрд╢реНрдХрд┐рд▓ рд╣реЛ рдЧрдпрд╛ рд╣реИред
C2 рд╕рдВрдХрд▓рдХ рдХреЗ рдкреАрдЫреЗ рдХреЗ рдкреНрд░рдореБрдЦ рдЖрдВрдХрдбрд╝реЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ, Cliff Click рдиреЗ рдХрд╣рд╛ рдХрд┐ рд╡рд╣ C ++ рдореЗрдВ рдлрд┐рд░ рд╕реЗ рдХрднреА рднреА VM рдирд╣реАрдВ рд▓рд┐рдЦреЗрдЧрд╛, рдФрд░ рд╣рдордиреЗ рдЯреНрд╡рд┐рдЯрд░ JVM рдЯреАрдо рдХреЛ рдпрд╣ рдХрд╣рддреЗ рд╕реБрдирд╛ рдХрд┐ C2 рд╕реНрдерд┐рд░ рд╣реИ рдФрд░ рдЗрд╕реЗ рдПрдХ рдХрд╛рд░рдг рдХреЗ рд▓рд┐рдП рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЖрдЧреЗ рдХреЗ рд╡рд┐рдХрд╛рд╕ рдХреА рдХрдард┐рдирд╛рдЗрдпреЛрдВред


https://www.youtube.com/watch?v=Hqw57GJSrac
рддреЛ, рдЗрд╕ рд╕рд╡рд╛рд▓ рдкрд░ рд╡рд╛рдкрд╕ рдЬрд╛рдПрдВ рдХрд┐ рдЬрд╛рд╡рд╛ рдореЗрдВ рдРрд╕рд╛ рдХреНрдпрд╛ рд╣реИ рдЬреЛ рдЗрди рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░ рд╕рдХрддрд╛ рд╣реИ? рд╡рд╣реА рдЬреЛ C ++ рдХреЗ рдмрдЬрд╛рдп рдЬрд╛рд╡рд╛ рдореЗрдВ рдкреНрд░реЛрдЧреНрд░рд╛рдо рд▓рд┐рдЦрдиреЗ рдХреА рд╕реБрд╡рд┐рдзрд╛ рджреЗрддрд╛ рд╣реИред рдпрд╣ рд╢рд╛рдпрдж рд╕реБрд░рдХреНрд╖рд╛ рд╣реИ (рджреБрд░реНрдШрдЯрдирд╛рдУрдВ рдХреЗ рдмрдЬрд╛рдп рдЕрдкрд╡рд╛рдж, рдХреЛрдИ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдореЗрдореЛрд░реА рд▓реАрдХ рдпрд╛ рд▓рдЯрдХрдиреЗ рд╡рд╛рд▓реЗ рдмрд┐рдВрджреБ), рдЕрдЪреНрдЫреЗ рдорджрджрдЧрд╛рд░ (рдбрд┐рдмрдЧрд░, рдкреНрд░реЛрдлрд╛рдЗрд▓рд░ рдФрд░ рд╡рд┐рдЬреБрдЕрд▓рд╡реАрдПрдо рдЬреИрд╕реЗ рдЙрдкрдХрд░рдг), рдЕрдЪреНрдЫрд╛ рдЖрдИрдбреАрдИ рд╕рдорд░реНрдерди, рдЖрджрд┐ред
рдЖрдк рд╕реЛрдЪ рд╕рдХрддреЗ рд╣реИрдВ : рдореИрдВ рдЬрд╛рд╡рд╛ рдЬреЗрдЖрдИрдЯреА рд╕рдВрдХрд▓рдХ рдЬреИрд╕рд╛ рдХреБрдЫ рдХреИрд╕реЗ рд▓рд┐рдЦ рд╕рдХрддрд╛ рд╣реВрдВ? , рдФрд░ рдпрд╣ рдХреЗрд╡рд▓ C ++ рдЬреИрд╕реА рдирд┐рдореНрди-рд╕реНрддрд░реАрдп рд╕рд┐рд╕реНрдЯрдо рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛ рдореЗрдВ рд╣реА рд╕рдВрднрд╡ рд╣реИред рдЗрд╕ рдкреНрд░рд╕реНрддреБрддрд┐ рдореЗрдВ, рдореИрдВ рдЖрдкрдХреЛ рд╡рд┐рд╢реНрд╡рд╛рд╕ рджрд┐рд▓рд╛рддрд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ рдмрд┐рд▓реНрдХреБрд▓ рднреА рдирд╣реАрдВ рд╣реИ! рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ, рдЬреЗрдЖрдИрдЯреА рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЛ рдЬреЗрд╡реАрдПрдо рдмрд╛рдпрдЯреЗрдХреЛрдб рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдорд╢реАрди рдХреЛрдб рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдП - рдЖрдк рдЗрд╕реЗ рдЗрдирдкреБрдЯ рдкрд░ byte[]
рджреЗрддреЗ рд╣реИрдВ, рдФрд░ рдЖрдк рднреА byte[]
рдкрд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рд╕рд╛рд░реЗ рдЬрдЯрд┐рд▓ рдХрд╛рдо рд▓рдЧрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рд╕рд┐рд╕реНрдЯрдо рд╕реНрддрд░ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдЗрд╕рд▓рд┐рдП рд╕рд┐рд╕реНрдЯрдо рднрд╛рд╖рд╛ рдЬреИрд╕реЗ рдХрд┐ C рдпрд╛ C ++ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИред
рдЧреНрд░реЗрдЧрд▓ рд╕реЗрдЯрдЕрдк
рдкрд╣рд▓реА рдЪреАрдЬ рдЬреЛ рд╣рдореЗрдВ рдЪрд╛рд╣рд┐рдП рд╡рд╣ рд╣реИ рдЬрд╛рд╡рд╛ 9. рдЬреЗрдЖрд░рдПрдорд╕реАрдЖрдИ рдирд╛рдордХ рдЧреНрд░реЗрд╡рд▓ рдЗрдВрдЯрд░рдлреЗрд╕, рдЬрд┐рд╕реЗ рдЬреЗрдИрдкреА 243 рдЬрд╛рд╡рд╛-рд▓реЗрд╡рд▓ рдЬреЗрд╡реАрдПрдо рдХрдВрдкрд╛рдЗрд▓рд░ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рд╣рд┐рд╕реНрд╕реЗ рдХреЗ рд░реВрдк рдореЗрдВ рдЬрд╛рд╡рд╛ рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рдерд╛ рдФрд░ рдкрд╣рд▓реЗ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рдпрд╣ рдЬрд╛рд╡рд╛ 9 рд╢рд╛рдорд┐рд▓ рд╣реИред рдореИрдВ 9 + 181 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВред рдХрд┐рд╕реА рд╡рд┐рд╢реЗрд╖ рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЬрд╛рд╡рд╛ 8 рдХреЗ рд▓рд┐рдП рдкреЛрд░реНрдЯ (рдмреИрдХрдкреЛрд░реНрдЯ) рд╣реИрдВред
$ export JAVA_HOME=`pwd`/jdk9 $ export PATH=$JAVA_HOME/bin:$PATH $ java -version java version "9" Java(TM) SE Runtime Environment (build 9+181) Java HotSpot(TM) 64-Bit Server VM (build 9+181, mixed mode)
рдЕрдЧрд▓реА рдЪреАрдЬрд╝ рдЬреЛ рд╣рдореЗрдВ рдЪрд╛рд╣рд┐рдП рд╡реЛ рд╣реИ рдПрдХ рдмрд┐рд▓реНрдб рд╕рд┐рд╕реНрдЯрдо рдЬрд┐рд╕реЗ mx
рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рдорд╛рд╡реЗрди рдпрд╛ рдЧреНрд░реИрдбрд▓ рдХреА рддрд░рд╣ рдПрдХ рд╕рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ рдХрд┐ рдЖрдк рдЗрд╕реЗ рдЕрдкрдиреЗ рдЖрд╡реЗрджрди рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рдЪреБрдиреЗрдВрдЧреЗред рдпрд╣ рдХреБрдЫ рдЬрдЯрд┐рд▓ рдЙрдкрдпреЛрдЧ рдорд╛рдорд▓реЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рд╢реНрдЪрд┐рдд рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдо рдЗрд╕реЗ рдХреЗрд╡рд▓ рд╕рд╛рдзрд╛рд░рдг рдЕрд╕реЗрдВрдмрд▓рд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред
рдЖрдк GitHub рдХреЗ рд╕рд╛рде mx
рдХреНрд▓реЛрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдореИрдВ #7353064
рдХрдорд┐рдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ #7353064
ред рдЕрдм рдХреЗрд╡рд▓ рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдХреЛ рдкрде рдореЗрдВ рдЬреЛрдбрд╝реЗрдВред
$ git clone https://github.com/graalvm/mx.git $ cd mx; git checkout 7353064 $ export PATH=`pwd`/mx:$PATH
рдЕрдм рд╣рдореЗрдВ рдЦреБрдж рдЧреНрд░реИрд▓ рдХреЛ рдХреНрд▓реЛрди рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдореИрдВ рдПрдХ рд╡рд┐рддрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдБ рдЬрд┐рд╕рдХрд╛ рдирд╛рдо рд╣реИ рдЧреНрд░реЗрд╡рд▓рдо рд╕рдВрд╕реНрдХрд░рдг реж.реи ..реи ред
$ git clone https://github.com/graalvm/graal.git --branch vm-enterprise-0.28.2
рдЗрд╕ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдореЗрдВ рдЕрдиреНрдп рдкрд░рд┐рдпреЛрдЬрдирд╛рдПрдВ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ, рдЬрд┐рдирдореЗрдВ рд╣рдореЗрдВ рдХреЛрдИ рджрд┐рд▓рдЪрд╕реНрдкреА рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рд╕рд┐рд░реНрдл рдХрдВрдкрд╛рдЗрд▓рд░ рд╕рдмрдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рдЬрд╛рддреЗ рд╣реИрдВ, рдЬреЛ рдХрд┐ рдЧреНрд░реЗрдЧрд▓ рдЬреЗрдЖрдИрдЯреА рдХрдВрдкрд╛рдЗрд▓рд░ рд╣реИ, рдФрд░ рдЗрд╕реЗ mx
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рдВрдХрд▓рд┐рдд рдХрд░рддреЗ рд╣реИрдВред
$ cd graal/compiler $ mx build
рдЧреНрд░реЗрдЧрд▓ рдХреЛрдб рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореИрдВ рдЧреНрд░рд╣рдг рдЖрдИрдбреАрдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реВрдВрдЧрд╛ред рдореИрдВ рдЧреНрд░рд╣рдг 4.7.1 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред mx
рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдЧреНрд░рд╣рдг рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдлрд╛рдЗрд▓ рддреИрдпрд╛рд░ рдХрд░ рд╕рдХрддрд╛ рд╣реИред
$ mx eclipseinit
рдХрд╛рд░реНрдпрдХреНрд╖реЗрддреНрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЧреНрд░реЗрд╡рд▓ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдХреЛ рдЦреЛрд▓рдиреЗ рдХреЗ рд▓рд┐рдП , рдЖрдкрдХреЛ рдлрд╝рд╛рдЗрд▓, рдЖрдпрд╛рдд ..., рд╕рд╛рдорд╛рдиреНрдп, рдореМрдЬреВрджрд╛ рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдФрд░ рдлрд┐рд░ рд╕реЗ рдЧреНрд░реЗрд╡рд▓ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдХрд╛ рдЪрдпрди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдпрджрд┐ рдЖрдкрдиреЗ рдЬрд╛рд╡рд╛ 9 рдкрд░ рдЧреНрд░рд╣рдг рдирд╣реАрдВ рдЪрд▓рд╛рдпрд╛ рд╣реИ, рддреЛ рдЖрдкрдХреЛ JDK рд╕реНрд░реЛрддреЛрдВ рдХреЛ рднреА рд╕рдВрд▓рдЧреНрди рдХрд░рдирд╛ рдкрдбрд╝ рд╕рдХрддрд╛ рд╣реИред

рд╕рдм рдареАрдХ рд╣реИред рдЕрдм рдЬрдм рд╕рдм рдХреБрдЫ рддреИрдпрд╛рд░ рд╣реИ, рддреЛ рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рд╣рдо рдЗрд╕ рдмрд╣реБрдд рд╣реА рд╕рд░рд▓ рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред
class Demo { public static void main(String[] args) { while (true) { workload(14, 2); } } private static int workload(int a, int b) { return a + b; } }
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо рдЗрд╕ javac
рдХреЛрдб рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдлрд┐рд░ JVM рдЪрд▓рд╛рддреЗ рд╣реИрдВред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдореИрдВ рдЖрдкрдХреЛ рджрд┐рдЦрд╛рддрд╛ рд╣реВрдБ рдХрд┐ рдорд╛рдирдХ C2 JIT рдХрдВрдкрд╛рдЗрд▓рд░ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдХрдИ рдЭрдВрдбреЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ -XX:+PrintCompilation
: -XX:+PrintCompilation
, рдЬреЛ JVM рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рдзрд┐ рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░рддреЗ рд╕рдордп рд▓реЙрдЧ рд▓рд┐рдЦрдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рдФрд░ -XX:CompileOnly=Demo::workload
, рддрд╛рдХрд┐ рдХреЗрд╡рд▓ рдпрд╣ рд╕рдВрдХрд▓рди рд╕рдВрдХрд▓рд┐рдд рд╣реЛред рдпрджрд┐ рд╣рдо рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рджрд░реНрд╢рд┐рдд рдХреА рдЬрд╛рдПрдЧреА, рдФрд░ рдЬреЗрд╡реАрдПрдо рд╣рдорд╛рд░реА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╕реЗ рдЕрдзрд┐рдХ рд╕реНрдорд╛рд░реНрдЯ рд╣реЛрдЧрд╛, рдФрд░ рдЙрд╕ рдХреЛрдб рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░реЗрдЧрд╛ рдЬрд┐рд╕реЗ рд╣рдо рджреЗрдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред
$ javac Demo.java $ java \ -XX:+PrintCompilation \ -XX:CompileOnly=Demo::workload \ Demo ... 113 1 3 Demo::workload (4 bytes) ...
рдореИрдВ рдЗрд╕реЗ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдирд╣реАрдВ рдмрддрд╛рдКрдВрдЧрд╛, рд▓реЗрдХрд┐рди рдореИрдВ рдХреЗрд╡рд▓ рдпрд╣ рдХрд╣реВрдВрдЧрд╛ рдХрд┐ рдпрд╣ рдПрдХ рд▓реЙрдЧ рдЖрдЙрдЯрдкреБрдЯ рд╣реИ рдЬреЛ рджрд┐рдЦрд╛рддрд╛ рд╣реИ рдХрд┐ workload
рд╡рд┐рдзрд┐ рд╕рдВрдХрд▓рд┐рдд рдХреА рдЧрдИ рд╣реИред
рдЕрдм, рд╣рдорд╛рд░реЗ рдЬрд╛рд╡рд╛ 9 рдЬреЗрд╡реАрдПрдо рдХреЗ рдЬреЗрдЖрдИрдЯреА рд╕рдВрдХрд▓рдХ рдХреЗ рд░реВрдк рдореЗрдВ, рд╣рдо рддрд╛рдЬрд╛ рд╕рдВрдХрд▓рд┐рдд рдЧреНрд░реЗрдЧрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдХреБрдЫ рдФрд░ рдЭрдВрдбреЗ рдЬреЛрдбрд╝реЗрдВред
--module-path=...
рдФрд░ - --upgrade-module-path=...
рдЬреЛрдбрд╝реЗрдВред рдЖрдкрдХреЛ рдпрд╛рдж рджрд┐рд▓рд╛рддрд╛ рд╣реВрдВ рдХрд┐ рдЬрд╛рд╡рд╛ рдореЙрдбреНрдпреВрд▓ рдЖрд░рд╛ рдореЙрдбреНрдпреВрд▓ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рд╣рд┐рд╕реНрд╕реЗ рдХреЗ рд░реВрдк рдореЗрдВ рдореЙрдбреНрдпреВрд▓ 9 рдореЗрдВ рджрд┐рдЦрд╛рдИ рджрд┐рдпрд╛ рдерд╛, рдФрд░ рд╣рдорд╛рд░реЗ рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рд╣рдо рдЗрд╕реЗ рдХреНрд▓рд╛рд╕рдкреИрде рдХреЗ рд╕рд╛рде рд╕рдорд╛рдирддрд╛ рд╕реЗ рд╡рд┐рдЪрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдЗрд╕ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рдЬреЗрд╡реАрдПрдорд╕реАрдЖрдИ (рдЧреНрд░реЗрдЧрд▓ рджреНрд╡рд╛рд░рд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛рдиреЗ рд╡рд╛рд▓рд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕) рдЗрд╕ рддрдереНрдп рдХреЗ рдХрд╛рд░рдг рд╣рдореЗрдВ -XX:+UnlockExperimentalVMOptions
рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рдзреНрд╡рдЬ -XX:+EnableJVMCI
рдХрд╣рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рд╣рдо JVMCI, рдФрд░ -XX:+UseJVMCICompiler
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ - рдПрдХ рдирдпрд╛ JIT рд╕рдВрдХрд▓рдХ рд╕рдХреНрд╖рдо рдФрд░ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред
рдЙрджрд╛рд╣рд░рдг рдХреЛ рдЬрдЯрд┐рд▓ рдирд╣реАрдВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдФрд░, J1MCI рдХреЗ рд╕рд╛рде рд╕рдВрдпреЛрдЬрди рдХреЗ рд░реВрдк рдореЗрдВ C1 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп, рдХреЗрд╡рд▓ JVMCI рд╕рдВрдХрд▓рдХ рд╣реИ, рдзреНрд╡рдЬ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░реЗрдВ -XX:-TieredCompilation
, рдЬреЛ -XX:-TieredCompilation
рд╕рдВрдХрд▓рди рдХреЛ рдЕрдХреНрд╖рдо рдХрд░ рджреЗрдЧрд╛ред
рдкрд╣рд▓реЗ рдХреА рддрд░рд╣, рд╣рдо рдЭрдВрдбреЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддреЗ рд╣реИрдВ -XX:+PrintCompilation
рдФрд░ -XX:CompileOnly=Demo::workload
ред
рдкрд┐рдЫрд▓реЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ, рд╣рдо рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рдПрдХ рд╡рд┐рдзрд┐ рд╕рдВрдХрд▓рд┐рдд рдХреА рдЧрдИ рдереАред рд▓реЗрдХрд┐рди, рдЗрд╕ рдмрд╛рд░, рд╕рдВрдХрд▓рди рдХреЗ рд▓рд┐рдП рд╣рдордиреЗ рдЧреНрд░реЗрдмрд▓ рдХреЛ рдЗрдХрдЯреНрдард╛ рдХрд┐рдпрд╛ред рдЕрднреА рдХреЗ рд▓рд┐рдП, рдмрд╕ рдЗрд╕рдХреЗ рд▓рд┐рдП рдореЗрд░рд╛ рд╢рдмреНрдж рд▓реЗрдВред
$ java \ --module-path=graal/sdk/mxbuild/modules/org.graalvm.graal_sdk.jar:graal/truffle/mxbuild/modules/com.oracle.truffle.truffle_api.jar \ --upgrade-module-path=graal/compiler/mxbuild/modules/jdk.internal.vm.compiler.jar \ -XX:+UnlockExperimentalVMOptions \ -XX:+EnableJVMCI \ -XX:+UseJVMCICompiler \ -XX:-TieredCompilation \ -XX:+PrintCompilation \ -XX:CompileOnly=Demo::workload \ Demo ... 583 25 Demo::workload (4 bytes) ...
рдЬреЗрд╡реАрдПрдо рдХрдВрдкрд╛рдЗрд▓рд░ рдЗрдВрдЯрд░рдлрд╝реЗрд╕
рдХреНрдпрд╛ рдЖрдкрдХреЛ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рд╣рдордиреЗ рдХреБрдЫ рдЕрд╕рд╛рдорд╛рдиреНрдп рдХрд┐рдпрд╛? рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рд╕реНрдерд╛рдкрд┐рдд рдЬреЗрд╡реАрдПрдо рд╣реИ, рдФрд░ рд╣рдордиреЗ рдЬреЗрд╡реАрдПрдо рдореЗрдВ рдХреБрдЫ рднреА рдмрджрд▓реЗ рдмрд┐рдирд╛ рд╕рд┐рд░реНрдл рдПрдХ рдирдП рд╕рдВрдХрд▓рд┐рдд рдХреЗ рд╕рд╛рде рдЬреЗрдЖрдИрдЯреА рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЛ рдмрджрд▓ рджрд┐рдпрд╛ред рдпрд╣ рд╕реБрд╡рд┐рдзрд╛ JVMCI рдирд╛рдордХ рдПрдХ рдирдП JVM рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд╛рди рдХреА рдЧрдИ рд╣реИ, JVM рд╕рдВрдХрд▓рдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ , рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдКрдкрд░ рдХрд╣рд╛ рдерд╛, JEP 243 рдерд╛ рдФрд░ рдЬрд╛рд╡рд╛ 9 рдореЗрдВ рдЖрдпрд╛ рдерд╛ред
рдпрд╣ рд╡рд┐рдЪрд╛рд░ рдХреБрдЫ рдЕрдиреНрдп рдореМрдЬреВрджрд╛ рдЬреЗрд╡реАрдПрдо рддрдХрдиреАрдХреЛрдВ рдХреЗ рд╕рдорд╛рди рд╣реИред
рд╢рд╛рдпрдж рдЖрдк рдЬрд╛рд╡рд╛ рдПрдиреЛрдЯреЗрд╢рди рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдПрдкреАрдЖрдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрднреА рднреА рдЕрддрд┐рд░рд┐рдХреНрдд рд╕реНрд░реЛрдд рдХреЛрдб рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдореЗрдВ javac
рдореЗрдВ рдЖрдП рд╣реИрдВред рдпрд╣ рддрдВрддреНрд░ рдПрдиреЛрдЯреЗрд╢рди рдФрд░ рд╕реНрд░реЛрдд рдХреЛрдб рдореЙрдбрд▓ рдХреА рдкрд╣рдЪрд╛рди рдХрд░рдирд╛ рд╕рдВрднрд╡ рдмрдирд╛рддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдЙрдирдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдирдИ рдлрд╛рдЗрд▓реЗрдВ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдПред
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЖрдкрдиреЗ рдЬрд╛рд╡рд╛ рдПрдЬреЗрдВрдЯреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЬреЗрд╡реАрдПрдо рдореЗрдВ рдЕрддрд┐рд░рд┐рдХреНрдд рдмрд╛рдпреЛрдЯреЗрдХ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рддрдВрддреНрд░ рдЖрдкрдХреЛ рдмреВрдЯ рдХреЗ рд╕рдордп рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯ рдХрд░рдХреЗ рдЬрд╛рд╡рд╛ рдмрд╛рдЗрдЯрдХреЛрдб рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред
рдЬреЗрд╡реАрдПрдорд╕реАрдЖрдИ рдХрд╛ рд╡рд┐рдЪрд╛рд░ рд╕рдорд╛рди рд╣реИред рдпрд╣ рдЖрдкрдХреЛ рдЬрд╛рд╡рд╛ рдореЗрдВ рд▓рд┐рдЦреЗ рдЧрдП рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдЬрд╛рд╡рд╛ JIT рд╕рдВрдХрд▓рдХ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред
рдЕрдм рдореИрдВ рдХреБрдЫ рд╢рдмреНрдж рдХрд╣рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдЗрд╕ рдкреНрд░рд╕реНрддреБрддрд┐ рдХреЗ рджреМрд░рд╛рди рдореИрдВ рдХреЛрдб рдХреИрд╕реЗ рджрд┐рдЦрд╛рдКрдВрдЧрд╛ред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╡рд┐рдЪрд╛рд░ рдХреЛ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВ рд╕реНрд▓рд╛рдЗрдб рдкрд░ рдкрд╛рда рдХреЗ рд░реВрдк рдореЗрдВ рдХреБрдЫ рд╕рд░рд▓реАрдХреГрдд рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдФрд░ рддрд░реНрдХ рджрд┐рдЦрд╛рдКрдВрдЧрд╛, рдФрд░ рдЙрд╕рдХреЗ рдмрд╛рдж рдореИрдВ рдЧреНрд░рд╣рдг рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ рдкрд░ рд╕реНрд╡рд┐рдЪ рдХрд░реВрдБрдЧрд╛ рдФрд░ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХреЛрдб рджрд┐рдЦрд╛рдКрдВрдЧрд╛, рдЬреЛ рдереЛрдбрд╝рд╛ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЦреНрдп рд╡рд┐рдЪрд╛рд░ рд╡рд╣реА рд░рд╣реЗрдЧрд╛ред рдЗрд╕ рдкреНрд░рд╕реНрддреБрддрд┐ рдХрд╛ рдореБрдЦреНрдп рднрд╛рдЧ рдпрд╣ рджрд┐рдЦрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИ рдХрд┐ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЛрдб рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рдВрднрд╡ рд╣реИ, рдФрд░ рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЗрд╕реЗ рдЫрд┐рдкрд╛рдирд╛ рдирд╣реАрдВ рдЪрд╛рд╣рддрд╛, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдХреБрдЫ рдЬрдЯрд┐рд▓ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред
рдЕрдм рд╕реЗ, рдореИрдВ рдЗрд╕ рд░рд╛рдп рдХреЛ рджреВрд░ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЬреЗрдЖрдИрдЯреА рдХрдВрдкрд╛рдЗрд▓рд░ рдмрд╣реБрдд рдЬрдЯрд┐рд▓ рд╣реЛред
рдЬреЗрдЖрдИрдЯреА рд╕рдВрдХрд▓рдХ рдЗрдирдкреБрдЯ рдХреЗ рд▓рд┐рдП рдХреНрдпрд╛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ? рдпрд╣ рд╕рдВрдХрд▓рд┐рдд рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рд╡рд┐рдзрд┐ рдХреЗ рдмрд╛рдпрдЯреЗрдХреЛрдб рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИред рдФрд░ рдмрд╛рдЗрдЯрдХреЛрдб, рдЬреИрд╕рд╛ рдХрд┐ рдирд╛рдо рд╕реЗ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ, рдХреЗрд╡рд▓ рдмрд╛рдЗрдЯреНрд╕ рдХреА рдПрдХ рд╕рд░рдгреА рд╣реИред
рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк JIT рдХрдВрдкрд╛рдЗрд▓рд░ рдХреНрдпрд╛ рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИ? рдпрд╣ рд╡рд┐рдзрд┐ рдХрд╛ рдорд╢реАрди рдХреЛрдб рджреЗрддрд╛ рд╣реИред рдорд╢реАрди рдХреЛрдб рднреА рдХреЗрд╡рд▓ рдмрд╛рдЗрдЯреНрд╕ рдХреА рдПрдХ рд╕рд░рдгреА рд╣реИред
рдирддреАрдЬрддрди, рдпрд╣ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдЬрд┐рд╕реЗ рдЬреЗрд╡реАрдПрдо рдореЗрдВ рдПрдореНрдмреЗрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдирдпрд╛ рдЬреЗрдЖрдИрдЯреА рдХрдВрдкрд╛рдЗрд▓рд░ рд▓рд┐рдЦрддреЗ рд╕рдордп рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛ред
interface JVMCICompiler { byte[] compileMethod(byte[] bytecode); }
рдЗрд╕рд▓рд┐рдП, рдпрджрд┐ рдЖрдк рдХрд▓реНрдкрдирд╛ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рдХрд┐ рдЬрд╛рд╡рд╛ рдорд╢реАрди рдХреЛрдб рдореЗрдВ рдЬреЗрдЖрдИрдЯреА рд╕рдВрдХрд▓рди рдХреЗ рд░реВрдк рдореЗрдВ рдирд┐рдореНрди-рд╕реНрддрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдХреБрдЫ рдХреИрд╕реЗ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рддреЛ рдЕрдм рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдЗрддрдирд╛ рдирд┐рдореНрди-рд╕реНрддрд░ рдХрд╛ рдХрд╛рдо рдирд╣реАрдВ рд╣реИред рд╕рдЪ? рдпрд╣ byte[]
рд╕реЗ рдХреЗрд╡рд▓ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд╣реИред
рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╕рдм рдХреБрдЫ рдХреБрдЫ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╣реИред рдмрд╕ рдмрд╛рдпреЛрдЯреЗрдХ рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реИ - рд╣рдореЗрдВ рдХреБрдЫ рдФрд░ рдЬрд╛рдирдХрд╛рд░реА рдХреА рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЬреИрд╕реЗ рдХрд┐ рд╕реНрдерд╛рдиреАрдп рдЪрд░ рдХреА рд╕рдВрдЦреНрдпрд╛, рдЖрд╡рд╢реНрдпрдХ рд╕реНрдЯреИрдХ рдЖрдХрд╛рд░, рдФрд░ рдЗрдВрдЯрд░рдкреНрд░рд┐рдЯрд░ рдкреНрд░реЛрдлрд╛рдЗрд▓рд░ рджреНрд╡рд╛рд░рд╛ рдПрдХрддреНрд░рд┐рдд рдЬрд╛рдирдХрд╛рд░реА рдХреЛ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдХреЛрдб рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреИрд╕реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реЛрддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, CompilationRequest
рдХреЗ рд░реВрдк рдореЗрдВ рдЗрдирдкреБрдЯ рдХреА рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ, рдЬреЛ рд╣рдореЗрдВ JavaMethod
рдмрд╛рд░реЗ рдореЗрдВ JavaMethod
рдЬрд┐рд╕реЗ рд╕рдВрдХрд▓рд┐рдд рдХрд░рдиреЗ рдФрд░ рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
interface JVMCICompiler { void compileMethod(CompilationRequest request); } interface CompilationRequest { JavaMethod getMethod(); } interface JavaMethod { byte[] getCode(); int getMaxLocals(); int getMaxStackSize(); ProfilingInfo getProfilingInfo(); ... }
рд╕рд╛рде рд╣реА, рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХреЛрдб рдХреА рд╡рд╛рдкрд╕реА рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдЗрд╕рдХреЗ рдмрдЬрд╛рдп, рдПрдХ рдФрд░ рдПрдкреАрдЖрдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдЬреЗрд╡реАрдПрдо рдореЗрдВ рдорд╢реАрди рдХреЛрдб рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
HotSpot.installCode(targetCode);
рдЕрдм, JVM рдХреЗ рд▓рд┐рдП рдПрдХ рдирдпрд╛ JIT рдХрдВрдкрд╛рдЗрд▓рд░ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдмрд╕ рдЗрд╕ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд╣рдореЗрдВ рдЙрд╕ рд╡рд┐рдзрд┐ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдорд┐рд▓рддреА рд╣реИ рдЬрд┐рд╕реЗ рд╕рдВрдХрд▓рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдФрд░ рд╣рдореЗрдВ рдЗрд╕реЗ рдорд╢реАрди рдХреЛрдб рдореЗрдВ рд╕рдВрдХрд▓рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ installCode
рдХреЙрд▓ рдХрд░рдирд╛ installCode
ред
class GraalCompiler implements JVMCICompiler { void compileMethod(CompilationRequest request) { HotSpot.installCode(...); } }
рдЖрдЗрдП рдЧреНрд░реЗрдЧрд▓ рдХреЗ рд╕рд╛рде рдЧреНрд░рд╣рдг рдЖрдИрдбреАрдИ рдкрд░ рдЬрд╛рдПрдВ рдФрд░ рдХреБрдЫ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЗрдВрдЯрд░рдлреЗрд╕ рдФрд░ рдХрдХреНрд╖рд╛рдУрдВ рдкрд░ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВред рдЬреИрд╕рд╛ рдХрд┐ рдкрд╣рд▓реЗ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд╡реЗ рдХреБрдЫ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╣реЛрдВрдЧреЗ, рд▓реЗрдХрд┐рди рдмрд╣реБрдд рдЕрдзрд┐рдХ рдирд╣реАрдВред



рдЕрдм рдореИрдВ рдпрд╣ рджрд┐рдЦрд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рд╣рдо рдЧреНрд░реЗрдЧрд▓ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рддреБрд░рдВрдд рдЬрд╛рд╡рд╛ 9 рдореЗрдВ рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдореИрдВ рдПрдХ рдирдпрд╛ рд▓реЙрдЧ рд╕рдВрджреЗрд╢ рдЬреЛрдбрд╝реВрдВрдЧрд╛ рдЬреЛ рдХрд┐ рдЧреНрд░реЗрдЧрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рд╡рд┐рдзрд┐ рдХрд╛ рд╕рдВрдХрд▓рди рдХрд░рддреЗ рд╕рдордп рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реЛрдЧрд╛ред рдЗрд╕реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╡рд┐рдзрд┐ рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ, рдЬрд┐рд╕реЗ рдЬреЗрд╡реАрдПрдорд╕реАрдЖрдИ рджреНрд╡рд╛рд░рд╛ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред
class HotSpotGraalCompiler implements JVMCICompiler { CompilationRequestResult compileMethod(CompilationRequest request) { System.err.println("Going to compile " + request.getMethod().getName()); ... } }

рдЕрднреА рдХреЗ рд▓рд┐рдП, рд╣реЙрдЯрд╕реНрдкреЙрдЯ рдореЗрдВ рд╕рдВрдХрд▓рди рд▓реЙрдЧрд┐рдВрдЧ рдХреЛ рдЕрдХреНрд╖рдо рдХрд░реЗрдВред рдЕрдм рд╣рдо рдЕрдкрдиреЗ рд╕рдВрджреЗрд╢ рдХреЛ рд╕рдВрдХрд▓рдХ рдХреЗ рд╕рдВрд╢реЛрдзрд┐рдд рд╕рдВрд╕реНрдХрд░рдг рд╕реЗ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВред
$ java \ --module-path=graal/sdk/mxbuild/modules/org.graalvm.graal_sdk.jar:graal/truffle/mxbuild/modules/com.oracle.truffle.truffle_api.jar \ --upgrade-module-path=graal/compiler/mxbuild/modules/jdk.internal.vm.compiler.jar \ -XX:+UnlockExperimentalVMOptions \ -XX:+EnableJVMCI \ -XX:+UseJVMCICompiler \ -XX:-TieredCompilation \ -XX:CompileOnly=Demo::workload \ Demo Going to compile workload
рдпрджрд┐ рдЖрдк рдЗрд╕реЗ рд╕реНрд╡рдпрдВ рджреЛрд╣рд░рд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рдЖрдкрдХреЛ рд╣рдорд╛рд░реА рдмрд┐рд▓реНрдб рд╕рд┐рд╕реНрдЯрдо - mx build
рдХреЛ рдЪрд▓рд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдкрд░реНрдпрд╛рдкреНрдд, рдЧреНрд░рд╣рдг рдХреЗ рд▓рд┐рдП рд╕рд╛рдорд╛рдиреНрдп, рдмрдЪрд╛рдиреЗ рдкрд░ рд╕рдВрдХрд▓рд┐рдд рдХрд░реЗрдВ ред рдФрд░ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рд╣рдореЗрдВ рд╕реНрд╡рдпрдВ рдЬреЗрд╡реАрдПрдо рдХреЗ рдкреБрдирд░реНрдирд┐рд░реНрдорд╛рдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рд╣рдо рдХреЗрд╡рд▓ рдореМрдЬреВрджрд╛ JVM рдореЗрдВ рд╕рдВрд╢реЛрдзрд┐рдд рд╕рдВрдХрд▓рдХ рдХреЛ рдПрдореНрдмреЗрдб рдХрд░рддреЗ рд╣реИрдВред
рдЧрд┐рдирддреА рдХреЗ рдЧрд╛рд▓
рд╡реИрд╕реЗ, рд╣рдо рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдЧреНрд░реЗрдЧрд▓ рдПрдХ byte[]
рдХреЛ рджреВрд╕рд░реЗ byte[]
рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рддрд╛ рд╣реИред рдЕрдм рдЖрдЗрдП рд╕рд┐рджреНрдзрд╛рдВрдд рдФрд░ рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рд╡рд╣ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рд╕рдВрдХрд▓рдХ рдХреЗ рд▓рд┐рдП рднреА рдереЛрдбрд╝реЗ рдЕрд╕рд╛рдорд╛рдиреНрдп рд╣реИрдВред
рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ, рдХрдВрдкрд╛рдЗрд▓рд░ рдЖрдкрдХреЗ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛ рд╣реИрдВрдбрд▓ рдХрд░рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рд▓рд┐рдП, рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛ рдХреБрдЫ рдкреНрд░рдХрд╛рд░ рдХреЗ рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдПрдХ рд╡рд┐рдХрд▓реНрдк рдмрд╛рдпрдЯреЗрдХреЛрдб рдФрд░ рд╕рдорд╛рди рдирд┐рд░реНрджреЗрд╢ рд╕реВрдЪрд┐рдпрд╛рдВ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╡реЗ рдмрд╣реБрдд рдЕрднрд┐рд╡реНрдпрдВрдЬрдХ рдирд╣реАрдВ рд╣реИрдВред
рдЗрд╕рдХреЗ рдмрдЬрд╛рдп, рдЧреНрд░реЗрдЧрд▓ рдЖрдкрдХреЗ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЧреНрд░рд╛рдл рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдпрджрд┐ рд╣рдо рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдЬреЛрдбрд╝ рдСрдкрд░реЗрдЯрд░ рд▓реЗрддреЗ рд╣реИрдВ рдЬреЛ рджреЛ рд╕реНрдерд╛рдиреАрдп рдЪрд░ рдХреЛ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рддреЛ рдЧреНрд░рд╛рдл рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдЪрд░ рдХреЛ рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдиреЛрдб, рдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдПрдХ рдиреЛрдб рдФрд░ рджреЛ рдХрд┐рдирд╛рд░реЛрдВ рдХреЛ рджрд┐рдЦрд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдЬреЛ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рд╕реНрдерд╛рдиреАрдп рдЪрд░ рдХреЛ рд▓реЛрдб рдХрд░рдиреЗ рдХрд╛ рдкрд░рд┐рдгрд╛рдо рдЕрддрд┐рд░рд┐рдХреНрдд рдСрдкрд░реЗрдЯрд░ рдкрд░ рдЗрдирдкреБрдЯ рд╣реИред
рдЗрд╕реЗ рдХрднреА-рдХрднреА рдкреНрд░реЛрдЧреНрд░рд╛рдо рдбрд┐рдкреЗрдВрдбреЗрдВрд╕реА рдЧреНрд░рд╛рдл рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред
рдкреНрд░рдкрддреНрд░ x + y
рдХреА рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╣реЛрдиреЗ рдкрд░ x + y
рд╣рдо рд╕реНрдерд╛рдиреАрдп рдЪрд░ x
рдФрд░ y
, рдФрд░ рдЙрдирдХреА рд░рд╛рд╢рд┐ рдХрд╛ рдПрдХ рдиреЛрдб рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВред

рдЗрд╕ рдЧреНрд░рд╛рдл рдореЗрдВ рдиреАрд▓реЗ рдХрд┐рдирд╛рд░реЗ рд╕реНрдерд╛рдиреАрдп рдЪрд░ рдХреЛ рдкрдврд╝рдиреЗ рд╕реЗ рд▓реЗрдХрд░ рд╕рд╛рд░рд╛рдВрд╢ рддрдХ рдбреЗрдЯрд╛ рдкреНрд░рд╡рд╛рд╣ рдХреА рджрд┐рд╢рд╛ рджрд┐рдЦрд╛рддреЗ рд╣реИрдВред
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╣рдо рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХреНрд░рдо рдХреЛ рдкреНрд░рддрд┐рдмрд┐рдВрдмрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдирд╛рд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрджрд┐, рд╕реНрдерд╛рдиреАрдп рдЪрд░ рдкрдврд╝рдиреЗ рдХреЗ рдмрдЬрд╛рдп, рд╣рдо рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдХреЙрд▓ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рдХреЙрд▓ рдХреЗ рдЖрджреЗрд╢ рдХреЛ рдпрд╛рдж рд░рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдФрд░ рд╣рдо рдЙрдиреНрд╣реЗрдВ рдкреБрдирд░реНрд╡реНрдпрд╡рд╕реНрдерд┐рдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ (рдмрд┐рдирд╛ рдХреЛрдб рдХреЗ рдЕрдВрджрд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдиреЗ)ред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЕрддрд┐рд░рд┐рдХреНрдд рдХрд┐рдирд╛рд░реЗ рд╣реИрдВ рдЬреЛ рдЗрд╕ рдЖрджреЗрд╢ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдЙрдиреНрд╣реЗрдВ рд▓рд╛рд▓ рд░рдВрдЧ рдореЗрдВ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред

рддреЛ, рдЧреНрд░реЗрдЧрд▓ рдЧреНрд░рд╛рдл, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рджреЛ рдЧреНрд░рд╛рдл рдПрдХ рдореЗрдВ рд╕рдВрдпреБрдХреНрдд рд╣реИред рдиреЛрдбреНрд╕ рд╕рдорд╛рди рд╣реИрдВ, рд▓реЗрдХрд┐рди рдХреБрдЫ рдХрд┐рдирд╛рд░реЗ рдбреЗрдЯрд╛ рд╕реНрдЯреНрд░реАрдо рдХреА рджрд┐рд╢рд╛ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдЬрдмрдХрд┐ рдЕрдиреНрдп рдЙрдирдХреЗ рдмреАрдЪ рдирд┐рдпрдВрддреНрд░рдг рдХреЗ рд╣рд╕реНрддрд╛рдВрддрд░рдг рдХреЛ рджрд░реНрд╢рд╛рддреЗ рд╣реИрдВред
рдЧреНрд░реЗрдЧрд▓ рдЧреНрд░рд╛рдл рдХреЛ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рдПрдХ рдЙрдкрдХрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд┐рд╕реЗ рдЖрдЗрдбрд┐рдпрд▓рдЧреНрд░рд╛рдл рд╡рд┐рдЬреБрдЕрд▓рд▓рд╛рдЗрдЬрд╝рд░ рдпрд╛ рдЖрдИрдЬреАрд╡реА рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред mx igv
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕реНрдЯрд╛рд░реНрдЯрдЕрдк рдХрд╛ рдкреНрд░рджрд░реНрд╢рди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдЙрд╕рдХреЗ рдмрд╛рдж, JVM рдХреЛ -Dgraal.Dump
рдлреНрд▓реИрдЧ рдХреЗ рд╕рд╛рде -Dgraal.Dump
ред
рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдбреЗрдЯрд╛ рд╕реНрдЯреНрд░реАрдо рдХреЛ рдПрдХ рд╕рд░рд▓ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд▓рд┐рдЦрдХрд░ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
int average(int a, int b) { return (a + b) / 2; }

рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдкреИрд░рд╛рдореАрдЯрд░ 0
( P(0
) рдФрд░ 1
( P(1)
) рдЗрд╕рдХреЗ рдЕрддрд┐рд░рд┐рдХреНрдд рдСрдкрд░реЗрд╢рди рдХреЗ рдЗрдирдкреБрдЯ рдкрд░ рдХреИрд╕реЗ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ, рдирд┐рд░рдВрддрд░ 2
( C(2)
) рдХреЗ рд╕рд╛рде рдбрд┐рд╡реАрдЬрди рдСрдкрд░реЗрд╢рди рдХреЗ рдЗрдирдкреБрдЯ рдкрд░ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рдмрд╛рдж рдпрд╣ рдорд╛рди рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рддрд╛ рд╣реИред
рдбреЗрдЯрд╛ рдФрд░ рдирд┐рдпрдВрддреНрд░рдг рдХреЗ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдкреНрд░рд╡рд╛рд╣ рдХреЛ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдПрдХ рдЪрдХреНрд░ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред
int average(int[] values) { int sum = 0; for (int n = 0; n < values.length; n++) { sum += values[n]; } return sum / values.length; }


рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд▓реВрдк рдХреА рд╢реБрд░реБрдЖрдд рдФрд░ рдЕрдВрдд рдХреЗ рдиреЛрдбреНрд╕ рд╣реИрдВ, рд╕рд░рдгреА рдХреЗ рддрддреНрд╡реЛрдВ рдХреЛ рдкрдврд╝рдирд╛, рдФрд░ рд╕рд░рдгреА рдХреА рд▓рдВрдмрд╛рдИ рдкрдврд╝рдирд╛ред рдкрд╣рд▓реЗ рдХреА рддрд░рд╣, рдиреАрд▓реА рд░реЗрдЦрд╛рдПрдВ рдбреЗрдЯрд╛ рд╕реНрдЯреНрд░реАрдо рдХреА рджрд┐рд╢рд╛ рджрд░реНрд╢рд╛рддреА рд╣реИрдВ, рдФрд░ рд▓рд╛рд▓ рд░реЗрдЦрд╛рдПрдВ рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рдХрд╛ рд╕рдВрдХреЗрдд рджреЗрддреА рд╣реИрдВред
рдЕрдм рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдХреНрдпреЛрдВ рдЗрд╕ рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛ рдХреЛ рдХрднреА-рдХрднреА рдиреЛрдбреНрд╕ рдХрд╛ рд╕рдореБрджреНрд░ рдпрд╛ рд╕реВрдк рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред
рдореИрдВ рдпрд╣ рдХрд╣рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ C2 рдПрдХ рд╕рдорд╛рди рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдФрд░, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрд╣ C2 рдерд╛ рдЬрд┐рд╕рдиреЗ рдиреЛрдбреНрд╕ рдХреЗ рдПрдХ рд╕рдореБрджреНрд░ рдХреЗ рд╕рдВрдХрд▓рдХ рдХреЗ рд╡рд┐рдЪрд╛рд░ рдХреЛ рд▓реЛрдХрдкреНрд░рд┐рдп рдмрдирд╛рдпрд╛, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдЧреНрд░реЗрдЧрд▓ рдХрд╛ рдПрдХ рдирд╡рд╛рдЪрд╛рд░ рдирд╣реАрдВ рд╣реИред
рдореИрдВ рдкреНрд░рд╕реНрддреБрддрд┐ рдХреЗ рдЕрдЧрд▓реЗ рднрд╛рдЧ рддрдХ рдЗрд╕ рдЧреНрд░рд╛рдл рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдирд╣реАрдВ рджрд┐рдЦрд╛рдКрдВрдЧрд╛, рд▓реЗрдХрд┐рди рдЬрдм рдЧреНрд░реЗрдЧрд▓ рдЗрд╕ рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдпрдХреНрд░рдо рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ, рддреЛ рдЕрдиреБрдХреВрд▓рди рдФрд░ рд╕рдВрдХрд▓рди рдЗрд╕ рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдХреЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдФрд░ рдпрд╣ рдПрдХ рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдЬрд╛рд╡рд╛ рдореЗрдВ рдЬреЗрдЖрдИрдЯреА рд╕рдВрдХрд▓рдХ рд▓рд┐рдЦрдиреЗ рд╕реЗ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИред рдЬрд╛рд╡рд╛ рдПрдХ рд╡рд╕реНрддреБ-рдЙрдиреНрдореБрдЦ рднрд╛рд╖рд╛ рд╣реИ, рдФрд░ рдПрдХ рдЧреНрд░рд╛рдл рд▓рд┐рдВрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд┐рдирд╛рд░реЛрдВ рд╕реЗ рдЬреБрдбрд╝реА рд╡рд╕реНрддреБрдУрдВ рдХрд╛ рдПрдХ рд╕рдВрдЧреНрд░рд╣ рд╣реИред
Bytecode рд╕реЗ рдорд╢реАрди рдХреЛрдб рддрдХ
рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рдпреЗ рд╡рд┐рдЪрд╛рд░ рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рдХреИрд╕реЗ рджрд┐рдЦрддреЗ рд╣реИрдВ, рдФрд░ рд╕рдВрдХрд▓рди рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рдХреБрдЫ рдЪрд░рдгреЛрдВ рдХрд╛ рдкрд╛рд▓рди рдХрд░реЗрдВред
рдмрд╛рдИрдЯреЗрдХреЛрдб рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛
рд╕рдВрдХрд▓рди рдмрд╛рдпрдЯреЗрдХреЛрдб рд╕реЗ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИред рдЖрдЗрдП рдЕрдкрдиреЗ рдЫреЛрдЯреЗ рд╕реЗ рд╕рд╛рд░рд╛рдВрд╢ рдЙрджрд╛рд╣рд░рдг рдкрд░ рд╡рд╛рдкрд╕ рдЖрддреЗ рд╣реИрдВред
int workload(int a, int b) { return a + b; }
рд╣рдо рд╕рдВрдХрд▓рди рд╢реБрд░реВ рд╣реЛрдиреЗ рд╕реЗ рдареАрдХ рдкрд╣рд▓реЗ рдЗрдирдкреБрдЯ рдкрд░ рдкреНрд░рд╛рдкреНрдд рдмрд╛рдЗрдЯрдХреЛрдб рдХреЛ рдЖрдЙрдЯрдкреБрдЯ рдХрд░реЗрдВрдЧреЗред
class HotSpotGraalCompiler implements JVMCICompiler { CompilationRequestResult compileMethod(CompilationRequest request) { System.err.println(request.getMethod().getName() + " bytecode: " + Arrays.toString(request.getMethod().getCode())); ... } }
workload bytecode: [26, 27, 96, -84]
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд╕рдВрдХрд▓рдХ рдХрд╛ рдЗрдирдкреБрдЯ рдмрд╛рдпрдЯреЗрдХреЛрдб рд╣реИред
рдмрд╛рдЗрдЯрдХреЛрдб рдкрд╛рд░реНрд╕рд░ рдФрд░ рдЧреНрд░рд╛рдл рдмрд┐рд▓реНрдбрд░
рдмрд┐рд▓реНрдбрд░ , рдЗрд╕ рдмрд╛рдЗрдЯ рд╕рд░рдгреА рдХреЛ рдЬреЗрд╡реАрдПрдо рдмрд╛рдЗрдЯрдХреЛрдб рдХреЗ рд░реВрдк рдореЗрдВ рдорд╛рдирддрд╛ рд╣реИ, рдЗрд╕реЗ рдЧреНрд░реЗрдЧрд▓ рдЧреНрд░рд╛рдл рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдПрдХ рддрд░рд╣ рдХреА рдЕрдореВрд░реНрдд рд╡реНрдпрд╛рдЦреНрдпрд╛ рд╣реИ - рдмрд┐рд▓реНрдбрд░ рдЬрд╛рд╡рд╛ рдмрд╛рдЗрдЯрдХреЛрдб рдХреА рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди, рдореВрд▓реНрдпреЛрдВ рдХреЛ рдкрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп, рдХрд┐рдирд╛рд░реЛрдВ рдХреЗ рдореБрдХреНрдд рдЫреЛрд░реЛрдВ рдореЗрдВ рд╣реЗрд░рдлреЗрд░ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдзреАрд░реЗ-рдзреАрд░реЗ рдЙрдиреНрд╣реЗрдВ рдПрдХ рджреВрд╕рд░реЗ рд╕реЗ рдЬреЛрдбрд╝рддрд╛ рд╣реИред
рдЖрдЗрдП рдЗрд╕ рддрдереНрдп рдХрд╛ рд▓рд╛рдн рдЙрдард╛рдПрдВ рдХрд┐ рдЧреНрд░реЗрдЕрд▓ рдЬрд╛рд╡рд╛ рдореЗрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рджреЗрдЦреЗрдВ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдЧреНрд░рд╣рдг рдиреЗрд╡рд┐рдЧреЗрд╢рди рдЙрдкрдХрд░рдгред рд╣рдо рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рд╣рдорд╛рд░реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рдиреЛрдб рд╣реИ, рддреЛ рдЖрдЗрдП рдЬрд╛рдиреЗрдВ рдХрд┐ рдпрд╣ рдХрд╣рд╛рдВ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред



рдпрд╣ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рд╡реЗ рдмрд╛рдЗрдЯрдХреЛрдб рдкрд╛рд░реНрд╕рд░ рджреНрд╡рд╛рд░рд╛ рдмрдирд╛рдП рдЧрдП рд╣реИрдВ, рдФрд░ рдЗрд╕рдиреЗ рд╣рдореЗрдВ IADD
рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ IADD
( 96
, рдЬрд┐рд╕реЗ рд╣рдордиреЗ рдореБрджреНрд░рд┐рдд рдЗрдирдкреБрдЯ рдРрд░реЗ рдореЗрдВ рджреЗрдЦрд╛ рдерд╛) рддрдХ рд▓реЗ рдЧрдПред
private void genArithmeticOp(JavaKind kind, int opcode) { ValueNode y = frameState.pop(kind); ValueNode x = frameState.pop(kind); ValueNode v; switch (opcode) { ... case LADD: v = genIntegerAdd(x, y); break; ... } frameState.push(kind, append(v)); }
рдореИрдВрдиреЗ рдКрдкрд░ рдХрд╣рд╛ рдХрд┐ рдпрд╣ рдПрдХ рдЕрдореВрд░реНрдд рд╡реНрдпрд╛рдЦреНрдпрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╕рдм рдПрдХ рдмрд╛рдЗрдЯреЗрдХреЛрдб рджреБрднрд╛рд╖рд┐рдпрд╛ рдХреЗ рд╕рдорд╛рди рд╣реИред рдпрджрд┐ рдпрд╣ рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ JVM рджреБрднрд╛рд╖рд┐рдпрд╛ рд╣реЛрддрд╛, рддреЛ рдпрд╣ рд╕реНрдЯреИрдХ рд╕реЗ рджреЛ рдорд╛рди рд▓реЗрддрд╛, рдЕрддрд┐рд░рд┐рдХреНрдд рдкреНрд░рджрд░реНрд╢рди рдХрд░рддрд╛ рдФрд░ рдкрд░рд┐рдгрд╛рдо рд╡рд╛рдкрд╕ рд▓рд╛рддрд╛ред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдо рд╕реНрдЯреИрдХ рд╕реЗ рджреЛ рдиреЛрдбреНрд╕ рдХреЛ рд╣рдЯрд╛рддреЗ рд╣реИрдВ, рдЬреЛ, рдЬрдм рдкреНрд░реЛрдЧреНрд░рд╛рдо рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдЧрдгрдирд╛ рд╣реЛрдЧреА, рдЬреЛрдбрд╝реЗрдВ, рдЬреЛ рдХрд┐ рд╕рдорди рдХрд╛ рдкрд░рд┐рдгрд╛рдо рд╣реИ, рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдПрдХ рдирдпрд╛ рдиреЛрдб рд╣реИ, рдФрд░ рдЗрд╕реЗ рд╕реНрдЯреИрдХ рдкрд░ рд░рдЦреЗрдВред
рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдЧреНрд░рд╛рдл рдЧреНрд░реЗрдЧрд▓ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред
рдорд╢реАрди рдХреЛрдб рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛
рдЧреНрд░реЗрдЧрд▓ рдЧреНрд░рд╛рдл рдХреЛ рдорд╢реАрди рдХреЛрдб рдореЗрдВ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЗрд╕рдХреЗ рд╕рднреА рдиреЛрдбреНрд╕ рдХреЗ рд▓рд┐рдП рдмрд╛рдЗрдЯреНрд╕ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдпрд╣ рдкреНрд░рддреНрдпреЗрдХ рдиреЛрдб рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЗрд╕рдХреА generate
рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рдХреЗред
void generate(Generator gen) { gen.emitAdd(a, b); }
рдореИрдВ рджреЛрд╣рд░рд╛рддрд╛ рд╣реВрдВ, рдпрд╣рд╛рдВ рд╣рдо рдмрд╣реБрдд рдЙрдЪреНрдЪ рд╕реНрддрд░ рдкрд░ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рд╡рд░реНрдЧ рд╣реИ рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рд╣рдо рдорд╢реАрди рдХреЛрдб рдХреЗ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЛ рдЬрд╛рд░реА рдХрд░рддреЗ рд╣реИрдВ, рдпрд╣ рд╡рд┐рд╡рд░рдг рджрд┐рдП рдмрд┐рдирд╛ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред
emitAdd
, , , , . .
int workload(int a) { return a + 1; }
, .
void incl(Register dst) { int encode = prefixAndEncode(dst.encoding); emitByte(0xFF); emitByte(0xC0 | encode); } void emitByte(int b) { data.put((byte) (b & 0xFF)); }


, , ByteBuffer
тАФ .
тАФ .
class HotSpotGraalCompiler implements JVMCICompiler { CompilationResult compileHelper(...) { ... System.err.println(method.getName() + " machine code: " + Arrays.toString(result.getTargetCode())); ... } }

. HotSpot. . OpenJDK, , -, JVM, .
$ cd openjdk/hotspot/src/share/tools/hsdis $ curl -O http://ftp.heanet.ie/mirrors/gnu/binutils/binutils-2.24.tar.gz $ tar -xzf binutils-2.24.tar.gz $ make BINUTILS=binutils-2.24 ARCH=amd64 CFLAGS=-Wno-error $ cp build/macosx-amd64/hsdis-amd64.dylib ../../../../../..
: -XX:+UnlockDiagnosticVMOptions
-XX:+PrintAssembly
.
$ java \ --module-path=graal/sdk/mxbuild/modules/org.graalvm.graal_sdk.jar:graal/truffle/mxbuild/modules/com.oracle.truffle.truffle_api.jar \ --upgrade-module-path=graal/compiler/mxbuild/modules/jdk.internal.vm.compiler.jar \ -XX:+UnlockExperimentalVMOptions \ -XX:+EnableJVMCI \ -XX:+UseJVMCICompiler \ -XX:-TieredCompilation \ -XX:+PrintCompilation \ -XX:+UnlockDiagnosticVMOptions \ -XX:+PrintAssembly \ -XX:CompileOnly=Demo::workload \ Demo
.
workload machine code: [15, 31, 68, 0, 0, 3, -14, -117, -58, -123, 5, ...] ... 0x000000010f71cda0: nopl 0x0(%rax,%rax,1) 0x000000010f71cda5: add %edx,%esi ;\*iadd {reexecute=0 rethrow=0 return_oop=0} ; - Demo::workload@2 (line 10) 0x000000010f71cda7: mov %esi,%eax ;\*ireturn {reexecute=0 rethrow=0 return_oop=0} ; - Demo::workload@3 (line 10) 0x000000010f71cda9: test %eax,-0xcba8da9(%rip)
. , . generate
, .
class AddNode { void generate(...) { ... gen.emitSub(op1, op2, false) ...

, , , .
workload mechine code: [15, 31, 68, 0, 0, 43, -14, -117, -58, -123, 5, ...] 0x0000000107f451a0: nopl 0x0(%rax,%rax,1) 0x0000000107f451a5: sub %edx,%esi ;\*iadd {reexecute=0 rethrow=0 return_oop=0} ; - Demo::workload@2 (line 10) 0x0000000107f451a7: mov %esi,%eax ;\*ireturn {reexecute=0 rethrow=0 return_oop=0} ; - Demo::workload@3 (line 10) 0x0000000107f451a9: test %eax,-0x1db81a9(%rip)
, ? Graal ; ; ; . , Graal.
[26, 27, 96, -84] тЖТ [15, 31, 68, 0, 0, 43, -14, -117, -58, -123, 5, ...]
, , . Graal , .
тАФ . .
interface Phase { void run(Graph graph); }
(canonicalisation)
. , , ( constant folding ) .
тАФ canonical
.
interface Node { Node canonical(); }
, , , . тАФ . -(-x)
x
.
class NegateNode implements Node { Node canonical() { if (value instanceof NegateNode) { return ((NegateNode) value).getValue(); } else { return this; } } }

Graal . , .
Java, canonical
.
Global value numbering
Global value numbering (GVN) тАФ . a + b
, тАФ .
int workload(int a, int b) { return (a + b) * (a + b); }
Graal . тАФ . GVN . hash map , , .


, тАФ , , - . , , , , тАФ .
int workload() { return (getA() + getB()) * (getA() + getB()); }

(lock coarsening)
. . , , , ( inlining ).
void workload() { synchronized (monitor) { counter++; } synchronized (monitor) { counter++; } }
, , , , .
void workload() { monitor.enter(); counter++; monitor.exit(); monitor.enter(); counter++; monitor.exit(); }
. .
void workload() { monitor.enter(); counter++; counter++; monitor.exit(); }
Graal LockEliminationPhase
. run
, . , , .
void run(StructuredGraph graph) { for (monitorExitNode monitorExitNode : graph.getNodes(MonitorExitNode.class)) { FixedNode next = monitorExitNode.next(); if (next instanceof monitorEnterNode) { AccessmonitorNode monitorEnterNode = (AccessmonitorNode) next; if (monitorEnterNode.object() ## monitorExitNode.object()) { monitorExitNode.remove(); monitorEnterNode.remove(); } } } }

, , , , 2
.
void workload() { monitor.enter(); counter += 2; monitor.exit(); }
IGV . , , \ , , , 2
.


Graal , , , . , , , .
Graal , , , , , , .
Graal , , . ? , ?
, , . . , , , , . , , , , , .
( register allocation ). Graal , JIT-, тАФ ( linear scan algorithm ).
, , , - , .
, , , , (.. ), . , , .
( graph scheduling ). . , . , , , .
, .
Graal?
, , , Graal тАФ , Oracle . , Graal?
(final-tier compiler)
C JVMCI Graal HotSpot тАФ , . ( HotSpot) Graal , .
Twitter Graal , Java 9 . : -XX:+UseJVMCICompiler
.
JVMCI , Graal JVM. (deploy) - JVM, Graal. Java-, Graal, JVM.
OpenJDK Metropolis JVM Java. Graal .

http://cr.openjdk.java.net/\~jrose/metropolis/Metropolis-Proposal.html
Graal . Graal JVM, Graal . , Graal . , - , , JNI.
Charles Nutter JRuby Graal Ruby. , - .
AOT (ahead-of-time)
Graal тАФ Java. JVMCI , Graal, , , Graal . , Graal , JIT-.
JIT- AOT- , Graal . AOT Graal.
Java 9 JIT-, . JVM, .
AOT Java 9 Graal, Linux. , , .
. SubstrateVM тАФ AOT-, Java- JVM . , - (statically linked) . JVM , . SubstrateVM Graal. ( just-in-time ) SubstrateVM, , Graal . Graal AOT- .
$ javac Hello.java $ graalvm-0.28.2/bin/native-image Hello classlist: 966.44 ms (cap): 804.46 ms setup: 1,514.31 ms (typeflow): 2,580.70 ms (objects): 719.04 ms (features): 16.27 ms analysis: 3,422.58 ms universe: 262.09 ms (parse): 528.44 ms (inline): 1,259.94 ms (compile): 6,716.20 ms compile: 8,817.97 ms image: 1,070.29 ms debuginfo: 672.64 ms write: 1,797.45 ms [total]: 17,907.56 ms $ ls -lh hello -rwxr-xr-x 1 chrisseaton staff 6.6M 4 Oct 18:35 hello $ file ./hello ./hellojava: Mach-O 64-bit executable x86_64 $ time ./hello Hello! real 0m0.010s user 0m0.003s sys 0m0.003s
Truffle
Graal Truffle . Truffle тАФ JVM.
, JVM, , JIT- (, , , JIT- JVM , ). Truffle тАФ , , Truffle, , ( partial evaluation ).
, ( inlining ) ( constant folding ) . Graal , Truffle .
Graal тАФ Truffle. Ruby, TruffleRuby Truffle , , Graal. TruffleRuby тАФ Ruby, 10 , , , .
https://github.com/graalvm/truffleruby
рдирд┐рд╖реНрдХрд░реНрд╖
, , , JIT- Java . JIT- , , , - . , , . JIT- , byte[]
JVM byte[]
.
, Java. , C++.
Java- Graal - . , , .
. , Eclipse . (definitions), .. .
JIT JIT- JVM, JITWatch , , Graal , . , , - , Graal JVM. IDE, hello-world .
SubstrateVM Truffle, Graal, , Java . , Graal Java. , , - LLVM , , , , .
, , Graal JVM. рдХреНрдпреЛрдВрдХрд┐ JVMCI Java 9, Graal , , Java-.
Graal тАФ . , Graal. , !
More information about TruffleRuby
Low Overhead Polling For Ruby
Top 10 Things To Do With GraalVM
Ruby Objects as C Structs and Vice Versa
Understanding How Graal Works тАФ a Java JIT Compiler Written in Java
Flip-Flops тАФ the 1-in-10-million operator
Deoptimizing Ruby
Very High Performance C Extensions For JRuby+Truffle
Optimising Small Data Structures in JRuby+Truffle
Pushing Pixels with JRuby+Truffle
Tracing With Zero Overhead in JRuby+Truffle
How Method Dispatch Works in JRuby+Truffle
A Truffle/Graal High Performance Backend for JRuby