{"id":307800,"date":"2020-07-31T15:00:42","date_gmt":"2020-07-31T15:00:42","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=307800"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=307800","title":{"rendered":"\u041a\u0430\u043a \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u044b JIT-\u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u044b"},"content":{"rendered":"\n<div class=\"post__text post__text-html post__text_v1\" id=\"post-content-body\" data-io-article-url=\"https:\/\/habr.com\/ru\/company\/mailru\/blog\/513290\/\">\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/l2\/dj\/ej\/l2djej_af2wenjo1zb_qzrjb2ea.jpeg\" width=\"400\"><\/div>\n<p>  \u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u043c\u044b \u043f\u043e\u0433\u043e\u0432\u043e\u0440\u0438\u043c \u043e \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0441\u0442\u044f\u0445 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0438 \u0440\u0430\u0431\u043e\u0442\u0435 \u0440\u0430\u0437\u043d\u044b\u0445 JIT-\u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u043e\u0432, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043e \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u044f\u0445 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438. \u041e\u0431\u0441\u0443\u0436\u0434\u0430\u0442\u044c \u0431\u0443\u0434\u0435\u043c \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e, \u043e\u0434\u043d\u0430\u043a\u043e \u043c\u043d\u043e\u0433\u0438\u0435 \u0432\u0430\u0436\u043d\u044b\u0435 \u043a\u043e\u043d\u0446\u0435\u043f\u0446\u0438\u0438 \u043e\u043f\u0443\u0441\u0442\u0438\u043c. \u0422\u043e \u0435\u0441\u0442\u044c \u0432 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 <i>\u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e\u0439 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438<\/i>, \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u0438\u0439\u0442\u0438 \u043a \u043e\u0431\u043e\u0441\u043d\u043e\u0432\u0430\u043d\u043d\u044b\u043c \u0437\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f\u043c \u043f\u0440\u0438 \u043b\u044e\u0431\u044b\u0445 \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044f\u0445 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0439 \u0438 \u044f\u0437\u044b\u043a\u043e\u0432.<\/p>\n<p>  \u0427\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0431\u0430\u0437\u043e\u0432\u043e\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043e JIT-\u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0430\u0445, \u043f\u043e\u0447\u0438\u0442\u0430\u0439\u0442\u0435 <a href=\"https:\/\/carolchen.me\/blog\/jits-intro\">\u044d\u0442\u0443 \u0441\u0442\u0430\u0442\u044c\u044e<\/a>. <\/p>\n<p>  \u041d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0435 \u043f\u0440\u0438\u043c\u0435\u0447\u0430\u043d\u0438\u0435: <\/p>\n<blockquote><p>\u042f \u0447\u0430\u0441\u0442\u043e \u0431\u0443\u0434\u0443 \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 \u0438 \u0443\u0442\u0432\u0435\u0440\u0436\u0434\u0430\u0442\u044c, \u0447\u0442\u043e \u043e\u043d\u0430, \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e, \u0435\u0441\u0442\u044c \u0438 \u0432 \u043a\u0430\u043a\u043e\u043c-\u043d\u0438\u0431\u0443\u0434\u044c \u0434\u0440\u0443\u0433\u043e\u043c \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0435. \u0425\u043e\u0442\u044f \u044f \u043d\u0435 \u0432\u0441\u0435\u0433\u0434\u0430 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u044e, \u0435\u0441\u0442\u044c \u043b\u0438 \u044d\u0442\u0430 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f \u0432 \u0434\u0440\u0443\u0433\u043e\u043c JIT (\u0438\u043d\u043e\u0433\u0434\u0430 \u0432\u0441\u0451 \u043d\u0435\u043e\u0434\u043d\u043e\u0437\u043d\u0430\u0447\u043d\u043e), \u043d\u043e \u0435\u0441\u043b\u0438 \u0437\u043d\u0430\u044e \u0442\u043e\u0447\u043d\u043e, \u0442\u043e \u0443\u043a\u0430\u0436\u0443 \u043d\u0430 \u044d\u0442\u043e. \u042f \u0442\u0430\u043a\u0436\u0435 \u043f\u0440\u0438\u0432\u0435\u0434\u0443 \u043f\u0440\u0438\u043c\u0435\u0440\u044b \u043a\u043e\u0434\u0430, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c, \u0433\u0434\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0430 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f, \u043d\u043e \u044d\u0442\u043e \u043d\u0435 \u0442\u043e\u0447\u043d\u043e, \u0432\u0435\u0434\u044c \u043f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043e\u0442\u0434\u0430\u043d \u0434\u0440\u0443\u0433\u043e\u0439 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438. \u041c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u0438 \u043a\u0430\u043a\u0438\u0435-\u0442\u043e \u043e\u0431\u0449\u0438\u0435 \u0443\u043f\u0440\u043e\u0449\u0435\u043d\u0438\u044f, \u043d\u043e \u043d\u0435 \u0431\u043e\u043b\u044c\u0448\u0435, \u0447\u0435\u043c \u0432 \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0435 \u043f\u043e\u0434\u043e\u0431\u043d\u044b\u0445 \u043f\u043e\u0441\u0442\u043e\u0432.<\/p><\/blockquote>\n<p>  <a name=\"habracut\"><\/a>  <\/p>\n<h2>\u041e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u0432\u0435\u0445\u0438<\/h2>\n<p>  <\/p>\n<ul>\n<li>\u041c\u0435\u0442\u0430\u0442\u0440\u0430\u0441\u0441\u0438\u0440\u043e\u0432\u043a\u0430 \u0432 \u0440\u0430\u0431\u043e\u0442\u0435 Pypy<\/li>\n<li>\u041a\u0430\u043a \u044f\u0437\u044b\u043a\u0438 GraalVM \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u044e\u0442 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f \u043d\u0430 C<\/li>\n<li>\u0414\u0435\u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f<\/li>\n<li>\u0418\u043d\u043b\u0430\u0439\u043d\u0438\u043d\u0433 \u0438 OSR<\/li>\n<li>\u041e\u043a\u0435\u0430\u043d\u044b \u043d\u043e\u0434<\/li>\n<li>\u041c\u043d\u043e\u0433\u043e\u0443\u0440\u043e\u0432\u043d\u0435\u0432\u043e\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 JIT<\/li>\n<\/ul>\n<p>  <\/p>\n<h1>(\u041c\u0435\u0442\u0430)\u0442\u0440\u0430\u0441\u0441\u0438\u0440\u043e\u0432\u043a\u0430<\/h1>\n<p>  LuaJIT \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0442\u0430\u043a \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u043c\u0443\u044e \u0442\u0440\u0430\u0441\u0441\u0438\u0440\u043e\u0432\u043a\u0443 (tracing). Pypy \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u043c\u0435\u0442\u0430\u0442\u0440\u0430\u0441\u0441\u0438\u0440\u043e\u0432\u043a\u0443, \u0442\u043e \u0435\u0441\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u0434\u043b\u044f \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0442\u043e\u0440\u043e\u0432 \u0442\u0440\u0430\u0441\u0441\u0438\u0440\u043e\u0432\u043a\u0438 \u0438 JIT. Pypy \u0438 LuaJIT \u2014 \u044d\u0442\u043e \u043d\u0435 \u043e\u0431\u0440\u0430\u0437\u0446\u043e\u0432\u044b\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 Python \u0438 Lua, \u0430 \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u044b. \u042f \u0431\u044b \u043e\u0445\u0430\u0440\u0430\u043a\u0442\u0435\u0440\u0438\u0437\u043e\u0432\u0430\u043b LuaJIT \u043a\u0430\u043a \u0448\u043e\u043a\u0438\u0440\u0443\u044e\u0449\u0435 \u0431\u044b\u0441\u0442\u0440\u0443\u044e, \u0438 \u043e\u043d\u0430 \u0441\u0430\u043c\u0430 \u0441\u0435\u0431\u044f \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u043a\u0430\u043a \u043e\u0434\u043d\u0443 \u0438\u0437 \u0441\u0430\u043c\u044b\u0445 \u0431\u044b\u0441\u0442\u0440\u044b\u0445 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u044f\u0437\u044b\u043a\u043e\u0432\u044b\u0445 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0439 \u2014 \u0438 \u044f \u044d\u0442\u043e\u043c\u0443 \u0431\u0435\u0437\u043e\u0433\u043e\u0432\u043e\u0440\u043e\u0447\u043d\u043e \u0432\u0435\u0440\u044e.<\/p>\n<p>  \u0427\u0442\u043e\u0431\u044b \u043f\u043e\u043d\u044f\u0442\u044c, \u043a\u043e\u0433\u0434\u0430 \u043d\u0430\u0447\u0438\u043d\u0430\u0442\u044c \u0442\u0440\u0430\u0441\u0441\u0438\u0440\u043e\u0432\u043a\u0443, \u0446\u0438\u043a\u043b \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0446\u0438\u0438 \u0438\u0449\u0435\u0442 \u00ab\u0433\u043e\u0440\u044f\u0447\u0438\u0435\u00bb \u0446\u0438\u043a\u043b\u044b (\u043a\u043e\u043d\u0446\u0435\u043f\u0446\u0438\u044f \u00ab\u0433\u043e\u0440\u044f\u0447\u0435\u0433\u043e\u00bb \u043a\u043e\u0434\u0430 \u0443\u043d\u0438\u0432\u0435\u0440\u0441\u0430\u043b\u044c\u043d\u0430 \u0434\u043b\u044f \u0432\u0441\u0435\u0445 JIT-\u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u043e\u0432!). \u0417\u0430\u0442\u0435\u043c \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u00ab\u0442\u0440\u0430\u0441\u0441\u0438\u0440\u0443\u0435\u0442\u00bb \u0446\u0438\u043a\u043b, \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u044f \u0438\u0441\u043f\u043e\u043b\u043d\u044f\u0435\u043c\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0434\u043b\u044f \u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0445\u043e\u0440\u043e\u0448\u043e \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u043c\u0430\u0448\u0438\u043d\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430. \u0412 LuaJIT \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0442\u0440\u0430\u0441\u0441 \u0441 \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u044b\u043c \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435\u043c, \u043f\u043e\u0445\u043e\u0436\u0438\u043c \u043d\u0430 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u043e \u0434\u043b\u044f LuaJIT.<\/p>\n<h3>\u041a\u0430\u043a \u0442\u0440\u0430\u0441\u0441\u0438\u0440\u043e\u0432\u043a\u0430 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u0430 \u0432 Pypy<\/h3>\n<p>  Pypy \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442 \u0442\u0440\u0430\u0441\u0441\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u043f\u043e\u0441\u043b\u0435 1619 \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0439 \u0438 \u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u0435\u0442 \u0435\u0449\u0451 \u043f\u043e\u0441\u043b\u0435 1039 \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0439, \u0442\u043e \u0435\u0441\u0442\u044c \u043d\u0443\u0436\u043d\u043e \u043e\u043a\u043e\u043b\u043e 3000 \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u0447\u0442\u043e\u0431\u044b \u043e\u043d\u0430 \u043d\u0430\u0447\u0430\u043b\u0430 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0431\u044b\u0441\u0442\u0440\u0435\u0435. \u042d\u0442\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0442\u0449\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u043e\u0434\u0431\u0438\u0440\u0430\u043b\u0438\u0441\u044c \u043a\u043e\u043c\u0430\u043d\u0434\u043e\u0439 Pypy, \u0438 \u0432\u043e\u043e\u0431\u0449\u0435 \u0432 \u043c\u0438\u0440\u0435 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u043e\u0432 \u043c\u043d\u043e\u0433\u0438\u0435 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u044b \u043f\u043e\u0434\u0431\u0438\u0440\u0430\u044e\u0442\u0441\u044f \u043f\u0440\u043e\u0434\u0443\u043c\u0430\u043d\u043d\u043e.<\/p>\n<p>  \u0414\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u044f\u0437\u044b\u043a\u0438 \u0437\u0430\u0442\u0440\u0443\u0434\u043d\u044f\u044e\u0442 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044e. \u041d\u0438\u0436\u0435\u043f\u0440\u0438\u0432\u0435\u0434\u0451\u043d\u043d\u044b\u0439 \u043a\u043e\u0434 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0443\u0434\u0430\u043b\u0451\u043d \u0431\u043e\u043b\u0435\u0435 \u0441\u0442\u0440\u043e\u0433\u0438\u043c \u044f\u0437\u044b\u043a\u043e\u043c, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e <code>False<\/code> \u0432\u0441\u0435\u0433\u0434\u0430 \u0431\u0443\u0434\u0435\u0442 \u043b\u043e\u0436\u043d\u044b\u043c. \u041e\u0434\u043d\u0430\u043a\u043e \u0432 Python 2 \u044d\u0442\u043e\u0433\u043e \u043d\u0435\u043b\u044c\u0437\u044f \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0434\u043e \u043c\u043e\u043c\u0435\u043d\u0442\u0430 \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f.<\/p>\n<pre><code class=\"plaintext\">if False:   print(&quot;FALSE&quot;) <\/code><\/pre>\n<p>  \u0414\u043b\u044f \u043b\u044e\u0431\u043e\u0439 \u0440\u0430\u0437\u0443\u043c\u043d\u043e\u0439 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u044d\u0442\u043e \u0443\u0441\u043b\u043e\u0432\u0438\u0435 \u0432\u0441\u0435\u0433\u0434\u0430 \u0431\u0443\u0434\u0435\u0442 \u043b\u043e\u0436\u043d\u044b\u043c. \u041a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e, \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 <code>False<\/code> \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043e, \u0438 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0431\u0443\u0434\u0435\u0442 \u0432 \u0446\u0438\u043a\u043b\u0435, \u0435\u0433\u043e \u043c\u043e\u0433\u0443\u0442 \u043f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u0433\u0434\u0435-\u0442\u043e \u0432 \u0434\u0440\u0443\u0433\u043e\u043c \u043c\u0435\u0441\u0442\u0435. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 Pypy \u043c\u043e\u0436\u0435\u0442 \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u00ab\u0437\u0430\u0449\u0438\u0442\u043d\u0438\u043a\u0430\u00bb. \u0415\u0441\u043b\u0438 \u0437\u0430\u0449\u0438\u0442\u043d\u0438\u043a \u043d\u0435 \u0441\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f, JIT \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u043a \u0446\u0438\u043a\u043b\u0443 \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f. \u0417\u0430\u0442\u0435\u043c Pypy \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0435\u0449\u0451 \u043e\u0434\u043d\u043e\u0439 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u044b (200), \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f <i>trace eagerness<\/i>, \u0440\u0435\u0448\u0430\u0435\u0442, \u043d\u0443\u0436\u043d\u043e \u043b\u0438 \u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043e\u0441\u0442\u0430\u0442\u043e\u043a \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u0443\u0442\u0438 \u0434\u043e \u043a\u043e\u043d\u0446\u0430 \u0446\u0438\u043a\u043b\u0430. \u042d\u0442\u043e\u0442 \u043f\u043e\u0434\u043f\u0443\u0442\u044c \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f <i>\u043c\u043e\u0441\u0442\u043e\u043c<\/i> (bridge).<\/p>\n<p>  \u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, Pypy \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u044d\u0442\u0438 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u044b \u043a\u0430\u043a \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0442\u044c \u0432 \u0445\u043e\u0434\u0435 \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043d\u0430\u0440\u044f\u0434\u0443 \u0441 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0435\u0439 \u0440\u0430\u0437\u0432\u0451\u0440\u0442\u043a\u0438 (unrolling), \u0442\u043e \u0435\u0441\u0442\u044c \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f \u0446\u0438\u043a\u043b\u0430, \u0438 \u0438\u043d\u043b\u0430\u0439\u043d\u0438\u043d\u0433\u0430! \u0418 \u0432\u0434\u043e\u0431\u0430\u0432\u043e\u043a \u043e\u043d \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0445\u0443\u043a\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u043f\u043e\u0441\u043b\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f \u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f.<\/p>\n<pre><code class=\"plaintext\">def print_compiler_info(i):   print(i.type) pypyjit.set_compile_hook(print_compiler_info)  for i in range(10000):   if False:     pass  print(pypyjit.get_stats_snapshot().counters) <\/code><\/pre>\n<p>  \u0412\u044b\u0448\u0435 \u044f \u043d\u0430\u043f\u0438\u0441\u0430\u043b \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0443 \u043d\u0430 \u0447\u0438\u0441\u0442\u043e\u043c Python \u0441 \u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u044e\u0449\u0438\u043c \u0445\u0443\u043a\u043e\u043c \u0434\u043b\u044f \u0432\u044b\u0432\u043e\u0434\u0430 \u043d\u0430 \u044d\u043a\u0440\u0430\u043d \u0442\u0438\u043f\u0430 \u043f\u0440\u0438\u043c\u0435\u043d\u0451\u043d\u043d\u043e\u0439 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438. \u0422\u0430\u043a\u0436\u0435 \u043a\u043e\u0434 \u0432\u044b\u0432\u043e\u0434\u0438\u0442 \u0432 \u043a\u043e\u043d\u0446\u0435 \u0434\u0430\u043d\u043d\u044b\u0435, \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0432\u0438\u0434\u043d\u043e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0437\u0430\u0449\u0438\u0442\u043d\u0438\u043a\u043e\u0432. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u044f \u043f\u043e\u043b\u0443\u0447\u0438\u043b \u043e\u0434\u043d\u0443 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u044e \u0446\u0438\u043a\u043b\u0430 \u0438 66 \u0437\u0430\u0449\u0438\u0442\u043d\u0438\u043a\u043e\u0432. \u041a\u043e\u0433\u0434\u0430 \u044f \u0437\u0430\u043c\u0435\u043d\u0438\u043b \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435 <code>if<\/code> \u043f\u0440\u043e\u0441\u0442\u044b\u043c \u043f\u0440\u043e\u0445\u043e\u0434\u043e\u043c \u0432\u043d\u0435 \u0446\u0438\u043a\u043b\u0430 <code>for<\/code>, \u043e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u0442\u043e\u043b\u044c\u043a\u043e 59 \u0437\u0430\u0449\u0438\u0442\u043d\u0438\u043a\u043e\u0432.<\/p>\n<pre><code class=\"plaintext\">for i in range(10000):   pass # removing the `if False` saved 7 guards! <\/code><\/pre>\n<p>  \u0414\u043e\u0431\u0430\u0432\u0438\u0432 \u044d\u0442\u0438 \u0434\u0432\u0435 \u0441\u0442\u0440\u043e\u043a\u0438 \u0432 \u0446\u0438\u043a\u043b <code>for<\/code>, \u044f \u043f\u043e\u043b\u0443\u0447\u0438\u043b \u0434\u0432\u0435 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438, \u043e\u0434\u043d\u0430 \u0438\u0437 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043e\u0442\u043d\u043e\u0441\u0438\u043b\u0430\u0441\u044c \u043a \u0442\u0438\u043f\u0443 \u00ab\u043c\u043e\u0441\u0442\u00bb!<\/p>\n<pre><code class=\"plaintext\">if random.randint(1, 100) &lt; 20:   False = True <\/code><\/pre>\n<p>  <\/p>\n<h3>\u041f\u043e\u0433\u043e\u0434\u0438, \u0442\u044b \u0436\u0435 \u0433\u043e\u0432\u043e\u0440\u0438\u043b \u043f\u0440\u043e \u043c\u0435\u0442\u0430\u0442\u0440\u0430\u0441\u0441\u0438\u0440\u043e\u0432\u043a\u0443!<\/h3>\n<p>  \u0418\u0434\u0435\u044e \u043c\u0435\u0442\u0430\u0442\u0440\u0430\u0441\u0441\u0438\u0440\u043e\u0432\u043a\u0438 \u043c\u043e\u0436\u043d\u043e \u043e\u043f\u0438\u0441\u0430\u0442\u044c \u043a\u0430\u043a \u00ab\u043d\u0430\u043f\u0438\u0448\u0438 \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0442\u043e\u0440, \u0438 \u043f\u043e\u043b\u0443\u0447\u0438 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u0431\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u043e!\u00bb, \u0438\u043b\u0438 \u00ab\u043f\u0440\u0435\u0432\u0440\u0430\u0442\u0438 \u0441\u0432\u043e\u0439 \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0442\u043e\u0440 \u0432 JIT-\u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440!\u00bb. \u041f\u0438\u0441\u0430\u0442\u044c \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u0442\u0440\u0443\u0434\u043d\u043e, \u0438 \u0435\u0441\u043b\u0438 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0435\u0433\u043e \u0431\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u043e, \u0442\u043e \u0438\u0434\u0435\u044f \u043a\u0440\u0443\u0442\u0430\u044f. Pypy \u00ab\u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442\u00bb \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0442\u043e\u0440 \u0438 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440, \u043d\u043e \u0432 \u043d\u0451\u043c \u043d\u0435\u0442 \u044f\u0432\u043d\u043e\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0442\u0440\u0430\u0434\u0438\u0446\u0438\u043e\u043d\u043d\u043e\u0433\u043e \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0430.<\/p>\n<p>  \u0412 Pypy \u0435\u0441\u0442\u044c \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 RPython (\u0441\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u0439 \u0434\u043b\u044f Pypy). \u042d\u0442\u043e \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a \u0434\u043b\u044f \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0442\u043e\u0440\u043e\u0432. \u0415\u0433\u043e \u044f\u0437\u044b\u043a \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0441\u044f \u043a \u0440\u0430\u0437\u043d\u043e\u0432\u0438\u0434\u043d\u043e\u0441\u0442\u0438 Python \u0438 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u0435\u0442 \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u0442\u0438\u043f\u0438\u0437\u0430\u0446\u0438\u044e. \u041d\u0430 \u044d\u0442\u043e\u043c \u044f\u0437\u044b\u043a\u0435 \u0438 \u043d\u0443\u0436\u043d\u043e \u043f\u0438\u0441\u0430\u0442\u044c \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0442\u043e\u0440. \u042f\u0437\u044b\u043a \u043d\u0435 \u043f\u0440\u0435\u0434\u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d \u0434\u043b\u044f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043d\u0430 \u0442\u0438\u043f\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u043c Python, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043d\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0445 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a \u0438\u043b\u0438 \u043f\u0430\u043a\u0435\u0442\u043e\u0432. \u041b\u044e\u0431\u0430\u044f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u043d\u0430 RPython \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0439 Python-\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043e\u0439. \u041a\u043e\u0434 \u043d\u0430 RPython \u0442\u0440\u0430\u043d\u0441\u043f\u0438\u043b\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0432 \u0421, \u0430 \u0437\u0430\u0442\u0435\u043c \u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u0435\u0442\u0441\u044f. \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u043c\u0435\u0442\u0430\u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u043d\u0430 \u044d\u0442\u043e\u043c \u044f\u0437\u044b\u043a\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0432 \u0432\u0438\u0434\u0435 \u0441\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0439 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u043d\u0430 \u0421.<\/p>\n<p>  \u041f\u0440\u0438\u0441\u0442\u0430\u0432\u043a\u0430 \u00ab\u043c\u0435\u0442\u0430\u00bb \u0432 \u0441\u043b\u043e\u0432\u0435 \u043c\u0435\u0442\u0430\u0442\u0440\u0430\u0441\u0441\u0438\u0440\u043e\u0432\u043a\u0430 \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u0442\u0440\u0430\u0441\u0441\u0438\u0440\u043e\u0432\u043a\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u043f\u0440\u0438 \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0438 \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0442\u043e\u0440\u0430, \u0430 \u043d\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b. \u041e\u043d \u0432\u0435\u0434\u0451\u0442 \u0441\u0435\u0431\u044f \u0431\u043e\u043b\u0435\u0435-\u043c\u0435\u043d\u0435\u0435 \u043a\u0430\u043a \u043b\u044e\u0431\u043e\u0439 \u0434\u0440\u0443\u0433\u043e\u0439 \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0442\u043e\u0440, \u043d\u043e \u043c\u043e\u0436\u0435\u0442 \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u0442\u044c \u0441\u0432\u043e\u0438 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0438 \u043f\u0440\u0435\u0434\u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d \u0434\u043b\u044f \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 \u0442\u0440\u0430\u0441\u0441 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u0441\u0432\u043e\u0435\u0433\u043e \u043f\u0443\u0442\u0438 \u043f\u0440\u043e\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u044f. \u0421 \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u0439 \u0442\u0440\u0430\u0441\u0441\u0438\u0440\u043e\u0432\u043a\u043e\u0439 \u043f\u0443\u0442\u044c \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0442\u043e\u0440\u0430 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u0431\u043e\u043b\u0435\u0435 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c. \u0425\u043e\u0440\u043e\u0448\u043e \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0442\u043e\u0440 \u0438\u0434\u0451\u0442 \u043f\u043e \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u0447\u0435\u0441\u043a\u043e\u043c\u0443 \u043f\u0443\u0442\u0438. \u0410 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0439 \u0432 \u044d\u0442\u043e\u043c \u043f\u0443\u0442\u0438 \u043c\u0430\u0448\u0438\u043d\u043d\u044b\u0439 \u043a\u043e\u0434, \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0439 \u043f\u0440\u0438 \u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 RPython, \u043c\u043e\u0436\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0432 \u043e\u043a\u043e\u043d\u0447\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438.<\/p>\n<p>  \u041a\u043e\u0440\u043e\u0447\u0435, \u00ab\u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u00bb \u0432 Pypy \u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u0435\u0442 \u0432\u0430\u0448 \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0442\u043e\u0440, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 Pypy \u0438\u043d\u043e\u0433\u0434\u0430 \u043d\u0430\u0437\u044b\u0432\u0430\u044e\u0442 \u043c\u0435\u0442\u0430\u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u043e\u043c. \u041e\u043d \u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u0435\u0442 \u043d\u0435 \u0441\u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0443, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u0432\u044b \u0438\u0441\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0435, \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u0443\u0442\u044c \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0442\u043e\u0440\u0430.<\/p>\n<p>  \u041a\u043e\u043d\u0446\u0435\u043f\u0446\u0438\u044f \u043c\u0435\u0442\u0430\u0442\u0440\u0430\u0441\u0441\u0438\u0440\u043e\u0432\u043a\u0438 \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c\u0441\u044f \u043d\u0435\u043f\u043e\u043d\u044f\u0442\u043d\u043e\u0439, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0434\u043b\u044f \u0438\u043b\u043b\u044e\u0441\u0442\u0440\u0430\u0446\u0438\u0438 \u044f \u043d\u0430\u043f\u0438\u0441\u0430\u043b \u043e\u0447\u0435\u043d\u044c \u043f\u043b\u043e\u0445\u0443\u044e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0443, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u043e\u043d\u0438\u043c\u0430\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e <code>a = 0<\/code> \u0438 <code>a++to<\/code>.<\/p>\n<pre><code class=\"plaintext\"># interpreter written with RPython for line in code:   if line == &quot;a = 0&quot;:     alloc(a, 0)   elif line == &quot;a++&quot;:     guard(a, &quot;is_int&quot;) # notice how in Python, the type is unknown, but after being interpreted by RPython, the type is known     guard(a, &quot;&gt; 0&quot;)     int_add(a, 1) <\/code><\/pre>\n<p>  \u0415\u0441\u043b\u0438 \u044f \u0437\u0430\u043f\u0443\u0449\u0443 \u044d\u0442\u043e\u0442 \u0433\u043e\u0440\u044f\u0447\u0438\u0439 \u0446\u0438\u043a\u043b:<\/p>\n<pre><code class=\"plaintext\">a = 0 a++ a++ <\/code><\/pre>\n<p>  \u0422\u0440\u0430\u0441\u0441\u044b \u043c\u043e\u0433\u0443\u0442 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u0442\u0430\u043a:<\/p>\n<pre><code class=\"plaintext\"># Trace from numerous logs of the hot loop a = alloc(0) # guards can go away a = int_add(a, 1) a = int_add(a, 2)  # optimize trace to be compiled a = alloc(2) # the section of code that executes this trace _is_ the compiled code <\/code><\/pre>\n<p>  \u041d\u043e \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u2014 \u043d\u0435 \u043a\u0430\u043a\u043e\u0439 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u044b\u0439 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u043c\u043e\u0434\u0443\u043b\u044c, \u043e\u043d \u0432\u0441\u0442\u0440\u043e\u0435\u043d \u0432 \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0442\u043e\u0440. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0446\u0438\u043a\u043b \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0446\u0438\u0438 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u0442\u0430\u043a:<\/p>\n<pre><code class=\"plaintext\">for line in code:   if traces.is_compiled(line):     run_compiled(traces.compiled(line))     continue   elif traces.is_optimized(line):     compile(traces.optimized(line))     continue   elif line == &quot;a = 0&quot;   # .... <\/code><\/pre>\n<p>  <\/p>\n<h2>\u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0432 JVM<\/h2>\n<p>  \u042f \u0447\u0435\u0442\u044b\u0440\u0435 \u043c\u0435\u0441\u044f\u0446\u0430 \u043f\u0438\u0441\u0430\u043b \u043d\u0430 \u044f\u0437\u044b\u043a\u0435 <a href=\"https:\/\/github.com\/oracle\/truffleruby\">TruffleRuby<\/a> \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 Graal, \u0438 \u0432\u043b\u044e\u0431\u0438\u043b\u0441\u044f \u0432 \u043d\u0435\u0433\u043e.<\/p>\n<p>  Hotspot (\u043d\u0430\u0437\u0432\u0430\u043d\u0430 \u0442\u0430\u043a \u043f\u043e\u0442\u043e\u043c\u0443, \u0447\u0442\u043e \u0438\u0449\u0435\u0442 <i>\u0433\u043e\u0440\u044f\u0447\u0438\u0435<\/i> \u0442\u043e\u0447\u043a\u0438) \u2014 \u044d\u0442\u043e \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u0430\u044f \u043c\u0430\u0448\u0438\u043d\u0430, \u043f\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c\u0430\u044f \u0441\u043e \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u043c\u0438 \u0438\u043d\u0441\u0442\u0430\u043b\u043b\u044f\u0446\u0438\u044f\u043c\u0438 Java. \u0412 \u043d\u0435\u0439 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442\u0441\u044f \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u043e\u0432 \u0434\u043b\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043c\u043d\u043e\u0433\u043e\u0443\u0440\u043e\u0432\u043d\u0435\u0432\u043e\u0433\u043e \u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f. \u041a\u043e\u0434\u043e\u0432\u0430\u044f \u0431\u0430\u0437\u0430 Hotspot \u0432 250 000 \u0441\u0442\u0440\u043e\u043a \u043e\u0442\u043a\u0440\u044b\u0442\u0430, \u0432 \u043d\u0435\u0439 \u0435\u0441\u0442\u044c \u0442\u0440\u0438 \u0441\u0431\u043e\u0440\u0449\u0438\u043a\u0430 \u043c\u0443\u0441\u043e\u0440\u0430. \u0412\u0438\u0440\u0442\u0443\u0430\u043b\u043a\u0430 \u043e\u0442\u043b\u0438\u0447\u043d\u043e \u0441\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441 JIT-\u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0435\u0439, \u0432 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a\u0430\u0445 \u043e\u043d\u0430 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043d\u0435 \u0445\u0443\u0436\u0435 C++ impls (\u043f\u043e \u044d\u0442\u043e\u043c\u0443 \u043f\u043e\u0432\u043e\u0434\u0443 \u0441\u0442\u043e\u043b\u044c\u043a\u043e <s>\u0441\u0440\u0430<\/s> \u0441\u043f\u043e\u0440\u043e\u0432, \u043f\u043e\u0433\u0443\u0433\u043b\u0438\u0442\u0435). \u0425\u043e\u0442\u044f Hotspot \u043d\u0435 \u0434\u0435\u043b\u0430\u0435\u0442 \u0442\u0440\u0430\u0441\u0441\u0438\u0440\u043e\u0432\u043a\u0443, \u043e\u043d\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u044b\u0439 \u043f\u043e\u0434\u0445\u043e\u0434: \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0438\u0440\u0443\u0435\u0442, \u043f\u0440\u043e\u0444\u0438\u043b\u0438\u0440\u0443\u0435\u0442, \u0430 \u0437\u0430\u0442\u0435\u043c \u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u0435\u0442. \u0423 \u044d\u0442\u043e\u0433\u043e \u043f\u043e\u0434\u0445\u043e\u0434\u0430 \u043d\u0435\u0442 \u0441\u0432\u043e\u0435\u0433\u043e \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f, \u043e\u043d \u0431\u043b\u0438\u0436\u0435 \u0432\u0441\u0435\u0433\u043e \u043a JIT \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043c\u0435\u0442\u043e\u0434\u043e\u0432 (\u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f \u043f\u043e \u043c\u0435\u0442\u043e\u0434\u0430\u043c), \u0438\u043b\u0438 \u043a \u043c\u043d\u043e\u0433\u043e\u0443\u0440\u043e\u0432\u043d\u0435\u0432\u043e\u043c\u0443 JIT.<\/p>\n<p>  \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0435 \u0432 Hotspot \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u0438 \u0432\u0434\u043e\u0445\u043d\u043e\u0432\u0438\u043b\u0438 \u043c\u043d\u043e\u0433\u0438\u0445 \u0430\u0432\u0442\u043e\u0440\u043e\u0432 \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0445 JIT-\u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u043e\u0432, \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440 \u044f\u0437\u044b\u043a\u043e\u0432\u044b\u0445 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0445 \u043c\u0430\u0448\u0438\u043d, \u0438 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e Javascript-\u0434\u0432\u0438\u0436\u043a\u043e\u0432. \u0422\u0430\u043a\u0436\u0435 Hotspot \u043f\u043e\u0440\u043e\u0434\u0438\u043b\u0430 \u0432\u043e\u043b\u043d\u0443 \u0442\u0430\u043a\u0438\u0445 JVM-\u044f\u0437\u044b\u043a\u043e\u0432, \u043a\u0430\u043a Scala, Kotlin, JRuby \u0438 Jython. JRuby \u0438 Jython \u2014 \u0437\u0430\u0431\u0430\u0432\u043d\u044b\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 Ruby \u0438 Python, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u044e\u0442 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043a\u043e\u0434 \u0432 JVM-\u0431\u0430\u0439\u0442\u043a\u043e\u0434, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0442\u043e\u043c \u0438\u0441\u043f\u043e\u043b\u043d\u044f\u0435\u0442 Hotspot. \u0412\u0441\u0435 \u044d\u0442\u0438 \u043f\u0440\u043e\u0435\u043a\u0442\u044b \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0443\u0441\u043a\u043e\u0440\u044f\u044e\u0442 \u044f\u0437\u044b\u043a\u0438 Python \u0438 Ruby (Ruby \u0431\u043e\u043b\u044c\u0448\u0435, \u0447\u0435\u043c Python) \u0431\u0435\u0437 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0432\u0441\u0435\u0433\u043e \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u044f, \u043a\u0430\u043a \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u0441 Pypy. \u0415\u0449\u0451 Hotspot \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u0430 \u0442\u0435\u043c, \u0447\u0442\u043e \u043e\u043d\u0430 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f JIT \u0434\u043b\u044f \u043c\u0435\u043d\u0435\u0435 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u044f\u0437\u044b\u043a\u043e\u0432 (\u0445\u043e\u0442\u044f \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0438 \u043e\u043d\u0430 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u0431\u043e\u0439 JIT \u0434\u043b\u044f JVM-\u0431\u0430\u0439\u0442\u043a\u043e\u0434\u0430, \u0430 \u043d\u0435 \u0434\u043b\u044f Java).<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/782\/39d\/af6\/78239daf6d09c1bdc4921a14e79f6987.png\"><\/div>\n<p>  GraalVM \u2014 \u044d\u0442\u043e JavaVM \u0441 \u0447\u0430\u0441\u0442\u044c\u044e \u043a\u043e\u0434\u0430 \u043d\u0430 Java. \u041e\u043d\u0430 \u043c\u043e\u0436\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u043b\u044e\u0431\u043e\u0439 JVM-\u044f\u0437\u044b\u043a (Java, Scala, Kotlin \u0438 \u0442.\u0434.). \u041d\u0430 \u0442\u0430\u043a\u0436\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 Native Image, \u0447\u0442\u043e\u0431\u044b \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 AOT-\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c \u043a\u043e\u0434\u043e\u043c \u0447\u0435\u0440\u0435\u0437 Substrate VM. \u0417\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0434\u043e\u043b\u044f Scala-\u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 Twitter \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043d\u0430 Graal, \u0447\u0442\u043e \u0433\u043e\u0432\u043e\u0440\u0438\u0442 \u043e \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0439 \u043c\u0430\u0448\u0438\u043d\u044b, \u0438 \u043a\u043e\u0435 \u0432 \u0447\u0451\u043c \u043e\u043d\u0430 \u043b\u0443\u0447\u0448\u0435 JVM, \u0445\u043e\u0442\u044f \u0438 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0430 \u043d\u0430 Java.<\/p>\n<p>  \u0418 \u044d\u0442\u043e \u0435\u0449\u0451 \u043d\u0435 \u0432\u0441\u0451! GraalVM \u0442\u0430\u043a\u0436\u0435 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 Truffle: \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a \u0434\u043b\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u044f\u0437\u044b\u043a\u043e\u0432 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f AST-\u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0442\u043e\u0440\u043e\u0432 (Abstract Syntax Tree). \u0412 Truffle \u043d\u0435\u0442 \u044f\u0432\u043d\u043e\u0433\u043e \u0448\u0430\u0433\u0430, \u043a\u043e\u0433\u0434\u0430 \u0441\u043e\u0437\u0434\u0430\u0435\u0442\u0441\u044f JVM-\u0431\u0430\u0439\u0442\u043a\u043e\u0434, \u043a\u0430\u043a \u0432 \u043e\u0431\u044b\u0447\u043d\u043e\u043c \u044f\u0437\u044b\u043a\u0435 JVM. C\u043a\u043e\u0440\u0435\u0435, Truffle \u043f\u0440\u043e\u0441\u0442\u043e \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0442\u043e\u0440\u043e\u043c \u0438 \u0431\u0443\u0434\u0435\u0442 \u043e\u0431\u0449\u0430\u0442\u044c\u0441\u044f \u0441 Graal \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043c\u0430\u0448\u0438\u043d\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430 \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0441 \u043f\u0440\u043e\u0444\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0438 \u0442\u0430\u043a \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u043c\u043e\u0439 \u0447\u0430\u0441\u0442\u0438\u0447\u043d\u043e\u0439 \u043e\u0446\u0435\u043d\u043a\u043e\u0439. \u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u0438\u0435 \u0447\u0430\u0441\u0442\u0438\u0447\u043d\u043e\u0439 \u043e\u0446\u0435\u043d\u043a\u0438 \u0432\u044b\u0445\u043e\u0434\u0438\u0442 \u0437\u0430 \u0440\u0430\u043c\u043a\u0438 \u0441\u0442\u0430\u0442\u044c\u0438, \u0435\u0441\u043b\u0438 \u0432\u043a\u0440\u0430\u0442\u0446\u0435: \u044d\u0442\u043e\u0442 \u043c\u0435\u0442\u043e\u0434 \u0438\u0441\u043f\u043e\u0432\u0435\u0434\u0443\u0435\u0442 \u0444\u0438\u043b\u043e\u0441\u043e\u0444\u0438\u044e \u043c\u0435\u0442\u0430\u0442\u0440\u0430\u0441\u0441\u0438\u0440\u043e\u0432\u043a\u0438 \u00ab\u043d\u0430\u043f\u0438\u0448\u0438 \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0442\u043e\u0440, \u0438 \u043f\u043e\u043b\u0443\u0447\u0438 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u0431\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u043e!\u00bb, \u043d\u043e \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u043a \u043d\u0435\u0439 \u0438\u043d\u0430\u0447\u0435.<\/p>\n<blockquote><p>TruffleJS \u2014 Truffle-\u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f Javascript, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043e\u043f\u0435\u0440\u0435\u0436\u0430\u0435\u0442 \u0434\u0432\u0438\u0436\u043e\u043a V8 \u043f\u043e \u0440\u044f\u0434\u0443 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0435\u0439, \u0447\u0442\u043e \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0432\u043f\u0435\u0447\u0430\u0442\u043b\u044f\u0435\u0442, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e V8 \u0440\u0430\u0437\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u043b\u0441\u044f \u043d\u0430 \u043c\u043d\u043e\u0433\u043e \u043b\u0435\u0442 \u0434\u043e\u043b\u044c\u0448\u0435, Google \u0432\u043b\u043e\u0436\u0438\u043b\u0430 \u0432 \u043d\u0435\u0433\u043e \u043a\u0443\u0447\u0443 \u0434\u0435\u043d\u0435\u0433 \u0438 \u0441\u0438\u043b, \u043d\u0430\u0434 \u043d\u0438\u043c \u0440\u0430\u0431\u043e\u0442\u0430\u043b\u0438 \u043e\u0444\u0438\u0433\u0435\u043d\u043d\u044b\u0435 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0441\u0442\u044b. TruffleJS \u043d\u0435 \u00ab\u043b\u0443\u0447\u0448\u0435\u00bb V8 (\u0438\u043b\u0438 \u043b\u044e\u0431\u043e\u0433\u043e \u0434\u0440\u0443\u0433\u043e\u0433\u043e JS-\u0434\u0432\u0438\u0436\u043a\u0430) \u043f\u043e \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0443 \u043a\u0440\u0438\u0442\u0435\u0440\u0438\u0435\u0432, \u043d\u043e \u044d\u0442\u043e \u0437\u043d\u0430\u043a \u043d\u0430\u0434\u0435\u0436\u0434\u044b \u0434\u043b\u044f Graal.<\/p><\/blockquote>\n<p>  <\/p>\n<h1>\u041d\u0435\u043e\u0436\u0438\u0434\u0430\u043d\u043d\u043e \u043e\u0442\u043b\u0438\u0447\u043d\u044b\u0435 \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u0438 JIT-\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f<\/h1>\n<p>  <\/p>\n<h3>\u0418\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 C<\/h3>\n<p>  \u0423 JIT-\u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0439 \u0447\u0430\u0441\u0442\u043e \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u0435\u0442 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0441 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u043e\u0439 \u0421-\u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0439. \u0421\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0435 \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0442\u043e\u0440\u044b, \u0442\u0430\u043a\u0438\u0435 \u043a\u0430\u043a Lua, Python, Ruby \u0438 PHP, \u0438\u043c\u0435\u044e\u0442 API \u0434\u043b\u044f \u0421, \u0447\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\u043c \u0441\u043e\u0431\u0438\u0440\u0430\u0442\u044c \u043d\u0430 \u044d\u0442\u043e\u043c \u044f\u0437\u044b\u043a\u0435 \u043f\u0430\u043a\u0435\u0442\u044b, \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0443\u0441\u043a\u043e\u0440\u044f\u044f \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435. \u041c\u043d\u043e\u0433\u0438\u0435 \u043f\u0430\u043a\u0435\u0442\u044b \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u044b \u043d\u0430 \u0421, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, numpy, \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u0432\u0440\u043e\u0434\u0435 <code>rand<\/code>. \u0412\u0441\u0435 \u044d\u0442\u0438 \u0421-\u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f \u043a\u0440\u0430\u0439\u043d\u0435 \u0432\u0430\u0436\u043d\u044b \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0438\u0440\u0443\u0435\u043c\u044b\u0435 \u044f\u0437\u044b\u043a\u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u043b\u0438 \u0431\u044b\u0441\u0442\u0440\u043e.<\/p>\n<p>  \u041f\u043e \u0440\u044f\u0434\u0443 \u043f\u0440\u0438\u0447\u0438\u043d \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0442\u044c C-\u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f \u0442\u0440\u0443\u0434\u043d\u043e. \u0421\u0430\u043c\u0430\u044f \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u0430\u044f \u043f\u0440\u0438\u0447\u0438\u043d\u0430 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e API \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u043d \u0441 \u0443\u0447\u0451\u0442\u043e\u043c \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0435\u0439 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0435\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438. \u0411\u043e\u043b\u0435\u0435 \u0442\u043e\u0433\u043e, \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0442\u044c \u0421-\u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f \u043b\u0435\u0433\u0447\u0435, \u043a\u043e\u0433\u0434\u0430 \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0442\u043e\u0440 \u043d\u0430\u043f\u0438\u0441\u0430\u043d \u043d\u0430 \u0421, \u0442\u0430\u043a \u0447\u0442\u043e JRuby \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0442\u044c \u0421-\u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f, \u043d\u043e \u0443 \u043d\u0435\u0433\u043e \u0435\u0441\u0442\u044c API \u0434\u043b\u044f Java-\u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0439. \u0412 Pypy \u043d\u0435\u0434\u0430\u0432\u043d\u043e \u043f\u043e\u044f\u0432\u0438\u043b\u0430\u0441\u044c \u0431\u0435\u0442\u0430-\u0432\u0435\u0440\u0441\u0438\u044f \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0438 \u0421-\u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0439, \u0445\u043e\u0442\u044f \u0432 \u0435\u0451 \u0440\u0430\u0431\u043e\u0442\u043e\u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0441\u0442\u0438 \u044f \u043d\u0435 \u0443\u0432\u0435\u0440\u0435\u043d \u0432 \u0441\u0432\u044f\u0437\u0438 \u0441 <a href=\"https:\/\/www.hyrumslaw.com\/\">\u0437\u0430\u043a\u043e\u043d\u043e\u043c \u0425\u0430\u0439\u0440\u0430\u043c\u0430<\/a>. LuaJIT \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u0421-\u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f, \u0432 \u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0435 \u0438 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0444\u0438\u0447\u0438 \u0432 \u0441\u0432\u043e\u0438\u0445 \u0421-\u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f\u0445 (LuaJIT \u2014 \u043f\u0440\u043e\u0441\u0442\u043e \u043e\u0444\u0438\u0433\u0435\u043d\u043d\u0430\u044f \u0448\u0442\u0443\u043a\u0430!)<\/p>\n<p>  Graal \u0440\u0435\u0448\u0430\u0435\u0442 \u044d\u0442\u0443 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e Sulong, \u0434\u0432\u0438\u0436\u043a\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0430 GraalVM \u0438\u0441\u043f\u043e\u043b\u043d\u044f\u0435\u0442 LLVM-\u0431\u0430\u0439\u0442\u043a\u043e\u0434, \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u044f \u0435\u0433\u043e \u0432 \u044f\u0437\u044b\u043a Truffle. LLVM \u2014 \u044d\u0442\u043e \u043d\u0430\u0431\u043e\u0440 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432, \u0438 \u043d\u0430\u043c \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0437\u043d\u0430\u0442\u044c, \u0447\u0442\u043e \u0421 \u043c\u043e\u0436\u043d\u043e \u0441\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432 LLVM-\u0431\u0430\u0439\u0442\u043a\u043e\u0434 (\u0443 Julia \u0442\u043e\u0436\u0435 \u0435\u0441\u0442\u044c LLVM-\u0431\u044d\u043a\u0435\u043d\u0434!). \u042d\u0442\u043e \u0441\u0442\u0440\u0430\u043d\u043d\u043e, \u043d\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e\u0431\u044b \u0432\u0437\u044f\u0442\u044c \u0445\u043e\u0440\u043e\u0448\u0438\u0439 \u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u0435\u043c\u044b\u0435 \u044f\u0437\u044b\u043a \u0441 \u0431\u043e\u043b\u0435\u0435 \u0447\u0435\u043c \u0441\u043e\u0440\u043e\u043a\u0430\u043b\u0435\u0442\u043d\u0435\u0439 \u0438\u0441\u0442\u043e\u0440\u0438\u0435\u0439, \u0438 \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0435\u0433\u043e! \u041a\u043e\u043d\u0435\u0447\u043d\u043e, \u043e\u043d \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0441\u043e\u0432\u0441\u0435\u043c \u043d\u0435 \u0442\u0430\u043a \u0431\u044b\u0441\u0442\u0440\u043e, \u043a\u0430\u043a \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e \u0441\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0421, \u043d\u043e \u0437\u0430\u0442\u043e \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432.<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/9d1\/f74\/e69\/9d1f74e697711bd99dc412e16f9fd313.png\"><\/div>\n<p>  LLVM-\u0431\u0430\u0439\u0442\u043a\u043e\u0434 \u0443\u0436\u0435 \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043d\u0438\u0437\u043a\u043e\u0443\u0440\u043e\u0432\u043d\u0435\u0432\u044b\u0439, \u0442\u043e \u0435\u0441\u0442\u044c \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0442\u044c JIT \u043a \u044d\u0442\u043e\u043c\u0443 \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u043e\u043c\u0443 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044e \u043d\u0435 \u0442\u0430\u043a \u043d\u0435\u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e, \u043a\u0430\u043a \u043a \u0421. \u0427\u0430\u0441\u0442\u044c \u0440\u0430\u0441\u0445\u043e\u0434\u043e\u0432 \u043d\u0430\u043c \u0432\u043e\u0437\u043c\u0435\u0449\u0430\u0435\u0442\u0441\u044f \u0442\u0435\u043c, \u0447\u0442\u043e \u0431\u0430\u0439\u0442\u043a\u043e\u0434 \u043c\u043e\u0436\u043d\u043e \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u043c\u0435\u0441\u0442\u0435 \u0441 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u043e\u0439 \u0447\u0430\u0441\u0442\u044c\u044e Ruby-\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b, \u0430 \u0441\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0443\u044e \u0421-\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0443 \u043c\u044b \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u0435 \u0441\u043c\u043e\u0436\u0435\u043c. \u0412\u0441\u0435 \u044d\u0442\u0438 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u043e\u0432 \u043f\u0430\u043c\u044f\u0442\u0438, \u0438\u043d\u043b\u0430\u0439\u043d\u0438\u043d\u0433\u0438, \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u043c\u0451\u0440\u0442\u0432\u044b\u0445 \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u043e\u0432 \u043a\u043e\u0434\u0430 \u0438 \u043f\u0440\u043e\u0447\u0435\u0435 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0442\u044c \u043a \u043a\u043e\u0434\u0443 \u043d\u0430 \u0421 \u0438 Ruby, \u0432\u043c\u0435\u0441\u0442\u043e \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c \u0431\u0438\u043d\u0430\u0440\u043d\u0438\u043a \u043d\u0430 \u0421 \u0438\u0437 Ruby-\u043a\u043e\u0434\u0430. \u041f\u043e \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u043c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u043c \u0421-\u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f TruffleRuby \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u0431\u044b\u0441\u0442\u0440\u0435\u0435 \u0421-\u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0439 CRuby.<\/p>\n<p>  \u0427\u0442\u043e\u0431\u044b \u044d\u0442\u0430 \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u0440\u0430\u0431\u043e\u0442\u0430\u043b\u0430, \u0432\u0430\u043c \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0437\u043d\u0430\u0442\u044c, \u0447\u0442\u043e Truffle \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u043c \u043e\u0442 \u044f\u0437\u044b\u043a\u0430, \u0438 \u043d\u0430\u043a\u043b\u0430\u0434\u043d\u044b\u0435 \u0440\u0430\u0441\u0445\u043e\u0434\u044b \u043d\u0430 \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043c\u0435\u0436\u0434\u0443 \u0421, Java \u0438\u043b\u0438 \u043b\u044e\u0431\u044b\u043c \u0434\u0440\u0443\u0433\u0438\u043c \u044f\u0437\u044b\u043a\u043e\u043c \u0432\u043d\u0443\u0442\u0440\u0438 Graal \u0431\u0443\u0434\u0443\u0442 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b.<\/p>\n<p>  \u0421\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0441\u0442\u044c Graal \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 Sulong \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0447\u0430\u0441\u0442\u044c\u044e \u0438\u0445 \u043f\u043e\u043b\u0438\u0433\u043b\u043e\u0442-\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0435\u0439, \u0447\u0442\u043e \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u0435\u0442 \u0432\u044b\u0441\u043e\u043a\u0443\u044e \u0432\u0437\u0430\u0438\u043c\u043e\u0437\u0430\u043c\u0435\u043d\u044f\u0435\u043c\u043e\u0441\u0442\u044c \u044f\u0437\u044b\u043a\u043e\u0432. \u042d\u0442\u043e \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0445\u043e\u0440\u043e\u0448\u043e \u0434\u043b\u044f \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0430, \u043d\u043e \u0435\u0449\u0451 \u0438 \u0434\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043b\u0435\u0433\u043a\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u044f\u0437\u044b\u043a\u043e\u0432 \u0432 \u043e\u0434\u043d\u043e\u043c \u00ab\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438\u00bb.<\/p>\n<h3>\u0412\u0435\u0440\u043d\u0451\u043c\u0441\u044f \u043a \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0438\u0440\u0443\u0435\u043c\u043e\u043c\u0443 \u043a\u043e\u0434\u0443, \u043e\u043d \u0431\u044b\u0441\u0442\u0440\u0435\u0435<\/h3>\n<p>  \u041c\u044b \u0437\u043d\u0430\u0435\u043c, \u0447\u0442\u043e JIT \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442 \u0432 \u0441\u0435\u0431\u0435 \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0442\u043e\u0440 \u0438 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440, \u0438 \u0447\u0442\u043e \u0434\u043b\u044f \u0443\u0441\u043a\u043e\u0440\u0435\u043d\u0438\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u043e\u043d\u0438 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u044f\u0442 \u043e\u0442 \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0442\u043e\u0440\u0430 \u043a \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0443. Pypy \u0441\u043e\u0437\u0434\u0430\u0451\u0442 \u043c\u043e\u0441\u0442\u0438\u043a\u0438 \u0434\u043b\u044f \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u0433\u043e \u043f\u0443\u0442\u0438, \u0445\u043e\u0442\u044f \u0441 \u0442\u043e\u0447\u043a\u0438 \u0437\u0440\u0435\u043d\u0438\u044f Graal \u0438 Hotspot \u044d\u0442\u043e <i>\u0434\u0435\u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f<\/i>. \u041c\u044b \u0433\u043e\u0432\u043e\u0440\u0438\u043c \u043d\u0435 \u043e \u0441\u043e\u0432\u0435\u0440\u0448\u0435\u043d\u043d\u043e \u0440\u0430\u0437\u043d\u044b\u0445 \u043f\u043e\u043d\u044f\u0442\u0438\u044f\u0445, \u043d\u043e \u043f\u043e\u0434 \u0434\u0435\u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u043f\u043e\u043d\u0438\u043c\u0430\u0435\u0442\u0441\u044f \u0432\u043e\u0437\u0432\u0440\u0430\u0442 \u043a \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0442\u043e\u0440\u0443 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0441\u043e\u0437\u043d\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438, \u0430 \u043d\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043d\u0435\u0438\u0437\u0431\u0435\u0436\u043d\u043e\u0441\u0442\u0435\u0439 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u044f\u0437\u044b\u043a\u0430. Hotspot \u0438 Graal \u0430\u043a\u0442\u0438\u0432\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 \u0434\u0435\u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044e, \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e Graal, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0443 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432 \u0435\u0441\u0442\u044c \u0436\u0451\u0441\u0442\u043a\u0438\u0439 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c \u043d\u0430\u0434 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0435\u0439, \u0438 \u0438\u043c \u043d\u0443\u0436\u043d\u043e \u0435\u0449\u0451 \u0431\u043e\u043b\u044c\u0448\u0435 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044f \u043d\u0430\u0434 \u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0440\u0430\u0434\u0438 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0439 (\u043f\u043e \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044e, \u0441\u043a\u0430\u0436\u0435\u043c, \u0441 Pypy). \u0422\u0430\u043a\u0436\u0435 \u0434\u0435\u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0432 JS-\u0434\u0432\u0438\u0436\u043a\u0430\u0445, \u043e \u0447\u0451\u043c \u044f \u0431\u0443\u0434\u0443 \u043c\u043d\u043e\u0433\u043e \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043e\u0442 \u043d\u0435\u0451 \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u0440\u0430\u0431\u043e\u0442\u0430 JavaScript \u0432 Chrome \u0438 Node.js.<\/p>\n<p>  \u0427\u0442\u043e\u0431\u044b \u0431\u044b\u0441\u0442\u0440\u043e \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c \u0434\u0435\u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044e, \u0432\u0430\u0436\u043d\u043e \u0443\u0431\u0435\u0434\u0438\u0442\u044c\u0441\u044f \u0432 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u0431\u044b\u0441\u0442\u0440\u043e\u043c \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0438 \u043c\u0435\u0436\u0434\u0443 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u043e\u043c \u0438 \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0442\u043e\u0440\u043e\u043c. \u041f\u0440\u0438 \u0441\u0430\u043c\u043e\u0439 \u043d\u0430\u0438\u0432\u043d\u043e\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0442\u043e\u0440 \u043f\u0440\u0438\u0434\u0451\u0442\u0441\u044f \u00ab\u0434\u043e\u0433\u043e\u043d\u044f\u0442\u044c\u00bb \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440, \u0447\u0442\u043e\u0431\u044b \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0434\u0435\u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044e. \u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0441\u0432\u044f\u0437\u0430\u043d\u044b \u0441 \u0434\u0435\u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0445 \u043f\u043e\u0442\u043e\u043a\u043e\u0432. Graal \u0441\u043e\u0437\u0434\u0430\u0451\u0442 \u043d\u0430\u0431\u043e\u0440 \u0444\u0440\u0435\u0439\u043c\u043e\u0432 \u0438 \u0441\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0435\u0433\u043e \u0441\u043e \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c \u043a\u043e\u0434\u043e\u043c, \u0447\u0442\u043e\u0431\u044b \u0432\u0435\u0440\u043d\u0443\u0442\u044c\u0441\u044f \u043a \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0442\u043e\u0440\u0443. \u0421 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u044b\u0445 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439 (safepoints) \u043c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0442\u0430\u043a, \u0447\u0442\u043e Java-\u043f\u043e\u0442\u043e\u043a \u0432\u0441\u0442\u0430\u043d\u0435\u0442 \u043d\u0430 \u043f\u0430\u0443\u0437\u0443 \u0438 \u0441\u043a\u0430\u0436\u0435\u0442: \u00ab\u041f\u0440\u0438\u0432\u0435\u0442, \u0441\u0431\u043e\u0440\u0449\u0438\u043a \u043c\u0443\u0441\u043e\u0440\u0430, \u043c\u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c\u0441\u044f?\u00bb, \u0442\u0430\u043a \u0447\u0442\u043e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u043f\u043e\u0442\u043e\u043a\u043e\u0432 \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u043d\u0430\u043a\u043b\u0430\u0434\u043d\u044b\u0445 \u0440\u0430\u0441\u0445\u043e\u0434\u043e\u0432. \u041f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0433\u0440\u0443\u0431\u043e, \u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0431\u044b\u0441\u0442\u0440\u043e, \u0447\u0442\u043e\u0431\u044b \u0434\u0435\u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f \u043e\u043a\u0430\u0437\u0430\u043b\u0430\u0441\u044c \u0445\u043e\u0440\u043e\u0448\u0435\u0439 \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u0435\u0439.<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/f2b\/b00\/399\/f2bb00399b8214987f42f3268ec5ee4a.png\"><\/div>\n<p>  \u0410\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e \u043f\u0440\u0438\u043c\u0435\u0440\u0443 \u0441 \u043c\u043e\u0441\u0442\u0438\u043a\u0430\u043c\u0438 \u0432 Pypy, \u0434\u0435\u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043c\u043e\u0436\u043d\u043e \u0438 \u043f\u0430\u0440\u0442\u0438\u0437\u0430\u043d\u0441\u043a\u0438\u0439 \u043f\u0430\u0442\u0447\u0438\u043d\u0433 (monkey patching) \u0444\u0443\u043d\u043a\u0446\u0438\u0439. \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u044d\u043b\u0435\u0433\u0430\u043d\u0442\u043d\u0435\u0435, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043c\u044b \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0434\u0435\u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u0443\u044e\u0449\u0438\u0439 \u043a\u043e\u0434 \u043d\u0435 \u0442\u043e\u0433\u0434\u0430, \u043a\u043e\u0433\u0434\u0430 \u0437\u0430\u0449\u0438\u0442\u043d\u0438\u043a \u0442\u0435\u0440\u043f\u0438\u0442 \u043d\u0435\u0443\u0434\u0430\u0447\u0443, \u0430 \u043a\u043e\u0433\u0434\u0430 \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u043f\u0430\u0440\u0442\u0438\u0437\u0430\u043d\u0441\u043a\u0438\u0439 \u043f\u0430\u0442\u0447\u0438\u043d\u0433. <\/p>\n<p>  \u041e\u0442\u043b\u0438\u0447\u043d\u044b\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 JIT-\u0434\u0435\u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438: \u043f\u0435\u0440\u0435\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f (conversion overflow), \u044d\u0442\u043e \u043d\u0435\u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0439 \u0442\u0435\u0440\u043c\u0438\u043d. \u0420\u0435\u0447\u044c \u043e \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u0438, \u043a\u043e\u0433\u0434\u0430 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\/\u0432\u044b\u0434\u0435\u043b\u0435\u043d \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u044b\u0439 \u0442\u0438\u043f (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, <code>int32<\/code>), \u043d\u043e \u0435\u0433\u043e \u043d\u0443\u0436\u043d\u043e \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u044c \u0432 <code>int64<\/code>. TruffleRuby \u0434\u0435\u043b\u0430\u0435\u0442 \u044d\u0442\u043e \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0434\u0435\u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0439, \u043a\u0430\u043a \u0438 V8.<\/p>\n<p>  \u0421\u043a\u0430\u0436\u0435\u043c, \u0435\u0441\u043b\u0438 \u0432 Ruby \u0437\u0430\u0434\u0430\u0442\u044c <code>var = 0<\/code>, \u0432\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0435 <code>int32<\/code> (\u0432 Ruby \u044d\u0442\u043e \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f <code>Fixnum<\/code> \u0438 <code>Bignum<\/code>, \u043d\u043e \u044f \u0431\u0443\u0434\u0443 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f <code>int32<\/code> \u0438 <code>int64<\/code>). \u0412\u044b\u043f\u043e\u043b\u043d\u044f\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044e \u0441 <code>var<\/code>, \u0432\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c, \u043d\u0435 \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u0435\u0442 \u043b\u0438 \u043f\u0435\u0440\u0435\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f. \u041d\u043e \u043e\u0434\u043d\u043e \u0434\u0435\u043b\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c, \u0430 \u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u0434, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u043f\u0435\u0440\u0435\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f, \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u0434\u043e\u0440\u043e\u0433\u043e, \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u044f \u0447\u0430\u0441\u0442\u043e\u0442\u0443 \u0447\u0438\u0441\u043b\u043e\u0432\u044b\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439.<\/p>\n<p>  \u0414\u0430\u0436\u0435 \u043d\u0435 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0432 \u043d\u0430 \u0441\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438, \u043c\u043e\u0436\u043d\u043e \u0443\u0432\u0438\u0434\u0435\u0442\u044c, \u043a\u0430\u043a \u043a\u0430\u043a \u044d\u0442\u0430 \u0434\u0435\u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f \u0443\u043c\u0435\u043d\u044c\u0448\u0430\u0435\u0442 \u043e\u0431\u044a\u0451\u043c \u043a\u043e\u0434\u0430.<\/p>\n<pre><code class=\"plaintext\">int a, b; int sum = a + b; if (overflowed) {   long bigSum = a + b;   return bigSum; } else {   return sum; }  int a, b; int sum = a + b; if (overflowed) {   Deoptimize! } <\/code><\/pre>\n<p>  \u0412 TruffleRuby \u0434\u0435\u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0435\u0440\u0432\u044b\u0439 \u043f\u0440\u043e\u0433\u043e\u043d \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0439 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438, \u0442\u0430\u043a \u0447\u0442\u043e \u043c\u044b \u043d\u0435 \u0442\u0440\u0430\u0442\u0438\u043c \u043d\u0430 \u044d\u0442\u043e \u0440\u0435\u0441\u0443\u0440\u0441\u044b \u043f\u0440\u0438 \u043a\u0430\u0436\u0434\u043e\u043c \u043f\u0435\u0440\u0435\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0438 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438.<\/p>\n<h3>WET-\u043a\u043e\u0434 \u2014 \u0431\u044b\u0441\u0442\u0440\u044b\u0439 \u043a\u043e\u0434. \u0418\u043d\u043b\u0430\u0439\u043d\u0438\u043d\u0433 \u0438 OSR<\/h3>\n<p>  <\/p>\n<pre><code class=\"plaintext\">function foo(a, b) {  return a + b; } for (var i = 0; i &lt; 1000000; i++) {  foo(i, i + 1); } foo(1, 2); <\/code><\/pre>\n<p>  \u0412 V8 \u0434\u0435\u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u0434\u0430\u0436\u0435 \u0442\u0430\u043a\u0438\u0435 \u0442\u0440\u0438\u0432\u0438\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438, \u043a\u0430\u043a \u044d\u0442\u0438 \u0442\u0440\u0438\u0433\u0433\u0435\u0440\u044b! \u0421 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043e\u043f\u0446\u0438\u0439 \u0432\u0440\u043e\u0434\u0435 <code>--trace-deopt<\/code> \u0438 <code>--trace-opt<\/code> \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0441\u043e\u0431\u0440\u0430\u0442\u044c \u043c\u043d\u043e\u0433\u043e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043e JIT, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043c\u043e\u0434\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435. \u0412 Graal \u0435\u0441\u0442\u044c \u043e\u0447\u0435\u043d\u044c \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b, \u043d\u043e \u044f \u0431\u0443\u0434\u0443 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f V8, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043e\u043d \u0443 \u043c\u043d\u043e\u0433\u0438\u0445 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d.<\/p>\n<p>  \u0414\u0435\u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044e \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u044f\u044f \u0441\u0442\u0440\u043e\u043a\u0430 (<code>foo(1, 2)<\/code>), \u0447\u0442\u043e \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u043d\u0435\u0434\u043e\u0443\u043c\u0435\u043d\u0438\u0435, \u0432\u0435\u0434\u044c \u0438\u043c\u0435\u043d\u043d\u043e \u044d\u0442\u043e\u0442 \u0432\u044b\u0437\u043e\u0432 \u0441\u0434\u0435\u043b\u0430\u043d \u0432 \u0446\u0438\u043a\u043b\u0435! \u041c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u00abInsufficient type feedback for call\u00bb (\u043f\u043e\u043b\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u043f\u0440\u0438\u0447\u0438\u043d \u0434\u0435\u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 \u043b\u0435\u0436\u0438\u0442 <a href=\"https:\/\/chromium.googlesource.com\/v8\/v8\/+\/roll\/src\/deoptimize-reason.h\">\u0437\u0434\u0435\u0441\u044c<\/a>, \u0438 \u0432 \u043d\u0451\u043c \u0435\u0441\u0442\u044c \u0437\u0430\u0431\u0430\u0432\u043d\u0430\u044f \u043f\u0440\u0438\u0447\u0438\u043d\u0430 \u00abno reason\u00bb). \u0412 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u0441\u043e\u0437\u0434\u0430\u0451\u0442\u0441\u044f \u0444\u0440\u0435\u0439\u043c \u0432\u0432\u043e\u0434\u0430, \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u044e\u0449\u0438\u0439 \u043b\u0438\u0442\u0435\u0440\u0430\u043b\u044b <code>1<\/code> \u0438 <code>2<\/code>.<\/p>\n<p>  \u0422\u0430\u043a \u0437\u0430\u0447\u0435\u043c \u0434\u0435\u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c? V8 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0443\u043c\u0451\u043d, \u0447\u0442\u043e\u0431\u044b \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0442\u0438\u043f\u043e\u0432: \u043a\u043e\u0433\u0434\u0430 <code>i<\/code> \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0441\u044f \u043a \u0442\u0438\u043f\u0443 <code>integer<\/code>, \u043b\u0438\u0442\u0435\u0440\u0430\u043b\u044b \u043f\u0435\u0440\u0435\u0434\u0430\u044e\u0442\u0441\u044f \u0442\u043e\u0436\u0435 \u043a\u0430\u043a <code>integer<\/code>.<\/p>\n<p>  \u0427\u0442\u043e\u0431\u044b \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f \u0432 \u044d\u0442\u043e\u043c, \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u0437\u0430\u043c\u0435\u043d\u0438\u043c \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u044e\u044e \u0441\u0442\u0440\u043e\u043a\u0443 \u043d\u0430 <code>foo(i, i +1)<\/code>. \u041d\u043e \u0434\u0435\u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f \u0432\u0441\u0451 \u0440\u0430\u0432\u043d\u043e \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f, \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u044d\u0442\u043e\u0442 \u0440\u0430\u0437 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0434\u0440\u0443\u0433\u043e\u0435: \u00abInsufficient type feedback for binary operation\u00bb. \u041f\u041e\u0427\u0415\u041c\u0423?! \u0412\u0435\u0434\u044c \u044d\u0442\u043e \u0442\u043e\u0447\u043d\u043e \u0442\u0430\u043a\u0430\u044f \u0436\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0438\u0441\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0432 \u0446\u0438\u043a\u043b\u0435, \u0441 \u0442\u0435\u043c\u0438 \u0436\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u043c\u0438!<\/p>\n<p>  \u041e\u0442\u0432\u0435\u0442, \u0434\u0440\u0443\u0433 \u043c\u043e\u0439, \u043a\u0440\u043e\u0435\u0442\u0441\u044f \u0432 \u0437\u0430\u043c\u0435\u0449\u0435\u043d\u0438\u0438 \u0432 \u0441\u0442\u0435\u043a\u0435 (on-stack replacement, OSR). \u0418\u043d\u043b\u0430\u0439\u043d\u0438\u043d\u0433 \u2014 \u044d\u0442\u043e \u043c\u043e\u0449\u043d\u0430\u044f \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0430 (\u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e JIT), \u043f\u0440\u0438 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u044e\u0442 \u0431\u044b\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u044f\u043c\u0438, \u0430 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u0442\u0441\u044f \u0432 \u043c\u0435\u0441\u0442\u0430 \u0432\u044b\u0437\u043e\u0432\u0430. JIT-\u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u044b \u0434\u043b\u044f \u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u0438\u044f \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438 \u043c\u043e\u0433\u0443\u0442 \u0438\u043d\u043b\u0430\u0439\u043d\u0438\u0442\u044c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043a\u043e\u0434\u0430 \u0432 \u0445\u043e\u0434\u0435 \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f (\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u0435\u043c\u044b\u0435 \u044f\u0437\u044b\u043a\u0438 \u043c\u043e\u0433\u0443\u0442 \u0438\u043d\u043b\u0430\u0439\u043d\u0438\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438).<\/p>\n<pre><code class=\"plaintext\">\/\/ partial output from printing inlining details  [compiling method 0x04a0439f3751 &lt;JSFunction (sfi = 0x4a06ab56121)&gt; using TurboFan OSR] 0x04a06ab561e9 &lt;SharedFunctionInfo foo&gt;: IsInlineable? true Inlining small function(s) at call site #49:JSCall <\/code><\/pre>\n<p>  \u0422\u0430\u043a \u0447\u0442\u043e V8 \u0441\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u0435\u0442 <code>foo<\/code>, \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442, \u0447\u0442\u043e \u0435\u0451 \u043c\u043e\u0436\u043d\u043e \u0438\u043d\u043b\u0430\u0439\u043d\u0438\u0442\u044c, \u0438 \u0438\u043d\u043b\u0430\u0439\u043d\u0438\u0442 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e OSR. \u041e\u0434\u043d\u0430\u043a\u043e \u0434\u0432\u0438\u0436\u043e\u043a \u0434\u0435\u043b\u0430\u0435\u0442 \u044d\u0442\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f \u043a\u043e\u0434\u0430 \u0432\u043d\u0443\u0442\u0440\u0438 \u0446\u0438\u043a\u043b\u0430, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u044d\u0442\u043e \u0433\u043e\u0440\u044f\u0447\u0438\u0439 \u043f\u0443\u0442\u044c, \u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u044f\u044f \u0441\u0442\u0440\u043e\u043a\u0430 \u0435\u0449\u0451 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0432 \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0442\u043e\u0440\u0435 \u043d\u0430 \u043c\u043e\u043c\u0435\u043d\u0442 \u0438\u043d\u043b\u0430\u0439\u043d\u0438\u043d\u0433\u0430. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0443 V8 \u043f\u043e\u043a\u0430 \u043d\u0435\u0442 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u0439 \u0441\u0432\u044f\u0437\u0438 \u043e \u0442\u0438\u043f\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <code>foo<\/code>, \u0432\u0435\u0434\u044c \u043d\u0435 \u043e\u043d\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0432 \u0446\u0438\u043a\u043b\u0435, \u0430 \u0435\u0451 \u0438\u043d\u043b\u0430\u0439\u043d\u0435\u043d\u043d\u0430\u044f \u0432\u0435\u0440\u0441\u0438\u044f. \u0415\u0441\u043b\u0438 \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c <code>--no-use-osr<\/code>, \u0442\u043e\u0433\u0434\u0430 \u0434\u0435\u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 \u043d\u0435 \u0431\u0443\u0434\u0435\u0442, \u0432\u043d\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u043c\u044b \u043f\u0435\u0440\u0435\u0434\u0430\u0434\u0438\u043c, \u043b\u0438\u0442\u0435\u0440\u0430\u043b \u0438\u043b\u0438 <code>i<\/code>. \u041e\u0434\u043d\u0430\u043a\u043e \u0431\u0435\u0437 \u0438\u043d\u043b\u0430\u0439\u043d\u0438\u043d\u0433\u0430 \u0434\u0430\u0436\u0435 \u043d\u0438\u0447\u0442\u043e\u0436\u043d\u044b\u0435 \u043c\u0438\u043b\u043b\u0438\u043e\u043d \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0439 \u0431\u0443\u0434\u0443\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0437\u0430\u043c\u0435\u0442\u043d\u043e \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u0435\u0435. JIT-\u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0432\u043e\u043f\u043b\u043e\u0449\u0430\u044e\u0442 \u043f\u0440\u0438\u043d\u0446\u0438\u043f \u00ab\u0440\u0435\u0448\u0435\u043d\u0438\u0439 \u043d\u0435\u0442, \u0442\u043e\u043b\u044c\u043a\u043e \u043a\u043e\u043c\u043f\u0440\u043e\u043c\u0438\u0441\u0441\u044b\u00bb. \u0414\u0435\u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 \u0434\u043e\u0440\u043e\u0433\u0438, \u043d\u043e \u043e\u043d\u0438 \u043d\u0435 \u0438\u0434\u0443\u0442 \u0432 \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u0441\u043e \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c\u044e \u043f\u043e\u0438\u0441\u043a\u0430 \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u0438 \u0438\u043d\u043b\u0430\u0439\u043d\u0438\u043d\u0433\u0430, \u043f\u0440\u0435\u0434\u043f\u043e\u0447\u0442\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u0432 \u044d\u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435.<\/p>\n<p>  \u0418\u043d\u043b\u0430\u0439\u043d\u0438\u043d\u0433 \u043d\u0435\u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u0435\u043d! \u042f \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u043b \u0432\u044b\u0448\u0435\u043f\u0440\u0438\u0432\u0435\u0434\u0451\u043d\u043d\u044b\u0439 \u043a\u043e\u0434 \u0441 \u043f\u0430\u0440\u043e\u0439 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u043d\u0443\u043b\u0435\u0439, \u0438 \u043f\u0440\u0438 \u043e\u0442\u043a\u043b\u044e\u0447\u0451\u043d\u043d\u043e\u043c \u0438\u043d\u043b\u0430\u0439\u043d\u0438\u043d\u0433\u0435 \u043e\u043d \u0440\u0430\u0431\u043e\u0442\u0430\u043b \u0432\u0447\u0435\u0442\u0432\u0435\u0440\u043e \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u0435\u0435.<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/896\/68c\/3b6\/89668c3b6fe58f97ba6ec4b51b1a8805.png\"><\/div>\n<p>  \u0425\u043e\u0442\u044f \u044d\u0442\u0430 \u0441\u0442\u0430\u0442\u044c\u044f \u043f\u043e\u0441\u0432\u044f\u0449\u0435\u043d\u0430 JIT, \u0438\u043d\u043b\u0430\u0439\u043d\u0438\u043d\u0433 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u0435\u043d \u0438 \u0432 \u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u0435\u043c\u044b\u0445 \u044f\u0437\u044b\u043a\u0430\u0445. \u0412\u0441\u0435 LLVM-\u044f\u0437\u044b\u043a\u0438 \u0430\u043a\u0442\u0438\u0432\u043d\u043e \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u044e\u0442 \u0438\u043d\u043b\u0430\u0439\u043d\u0438\u043d\u0433, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0438 LLVM \u0442\u043e\u0436\u0435 \u0431\u0443\u0434\u0435\u0442 \u044d\u0442\u043e \u0434\u0435\u043b\u0430\u0442\u044c, \u0445\u043e\u0442\u044f Julia \u0438\u043d\u043b\u0430\u0439\u043d\u0438\u0442 \u0438 \u0431\u0435\u0437 LLVM, \u044d\u0442\u043e \u0432 \u0435\u0451 \u043f\u0440\u0438\u0440\u043e\u0434\u0435. JIT \u043c\u043e\u0433\u0443\u0442 \u0438\u043d\u043b\u0430\u0439\u043d\u0438\u0442\u044c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u044d\u0432\u0440\u0438\u0441\u0442\u0438\u043a, \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c\u044b\u0445 \u0432 \u0445\u043e\u0434\u0435 \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f, \u0438 \u0441\u043f\u043e\u0441\u043e\u0431\u043d\u044b \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0430\u0442\u044c\u0441\u044f \u043c\u0435\u0436\u0434\u0443 \u0440\u0435\u0436\u0438\u043c\u0430\u043c\u0438 \u0431\u0435\u0437 \u0438\u043d\u043b\u0430\u0439\u043d\u0438\u043d\u0433\u0430 \u0438 \u0441 \u0438\u043d\u043b\u0430\u0439\u043d\u0438\u043d\u0433\u043e\u043c \u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u043e\u043c OSR.<\/p>\n<h3>\u0417\u0430\u043c\u0435\u0442\u043a\u0430 \u043e JIT \u0438 LLVM<\/h3>\n<p>  LLVM \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043a\u0443\u0447\u0443 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432, \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0445 \u0441 \u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\u043c. Julia \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0441 LLVM (\u043e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435, \u0447\u0442\u043e \u044d\u0442\u043e \u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439, \u0438 \u043a\u0430\u0436\u0434\u044b\u0439 \u044f\u0437\u044b\u043a \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0435\u0433\u043e \u043f\u043e-\u0440\u0430\u0437\u043d\u043e\u043c\u0443), \u0442\u0430\u043a\u0436\u0435, \u043a\u0430\u043a \u0438 Rust, Swift \u0438 Crystal. \u0414\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0441\u043a\u0430\u0437\u0430\u0442\u044c, \u0447\u0442\u043e \u044d\u0442\u043e \u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0438 \u0437\u0430\u043c\u0435\u0447\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043f\u0440\u043e\u0435\u043a\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0442\u0430\u043a\u0436\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 JIT, \u0445\u043e\u0442\u044f \u0432 LLVM \u043d\u0435\u0442 \u0437\u043d\u0430\u0447\u0438\u043c\u044b\u0445 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0445 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438\u0445 JIT. \u041d\u0430 \u0447\u0435\u0442\u0432\u0451\u0440\u0442\u043e\u043c \u0443\u0440\u043e\u0432\u043d\u0435 \u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f JavaScriptCore \u043a\u0430\u043a\u043e\u0435-\u0442\u043e \u0432\u0440\u0435\u043c\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0441\u044f LLVM-\u0431\u044d\u043a\u0435\u043d\u0434, \u043d\u043e \u0435\u0433\u043e \u0437\u0430\u043c\u0435\u043d\u0438\u043b\u0438 \u043c\u0435\u043d\u044c\u0448\u0435 \u0434\u0432\u0443\u0445 \u043b\u0435\u0442 \u043d\u0430\u0437\u0430\u0434. \u0421 \u0442\u0435\u0445 \u043f\u043e\u0440 \u044d\u0442\u043e\u0442 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439 \u043d\u0435 \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u0445\u043e\u0440\u043e\u0448\u043e \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u0434\u043b\u044f \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438\u0445 JIT, \u0432 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c \u043f\u043e\u0442\u043e\u043c\u0443, \u0447\u0442\u043e \u043e\u043d \u043d\u0435 \u043f\u0440\u0435\u0434\u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0432 \u0443\u0441\u043b\u043e\u0432\u0438\u044f\u0445 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u043d\u043e\u0441\u0442\u0438. \u0412 Pypy \u0435\u0433\u043e \u043f\u044b\u0442\u0430\u043b\u0438\u0441\u044c \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c 5-6 \u0440\u0430\u0437, \u043d\u043e \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043b\u0438\u0441\u044c \u043d\u0430 JSC. \u041f\u0440\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 LLVM \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 allocation sinking \u0438 \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0435\u043d\u0438\u044f \u043a\u043e\u0434\u0430 (code motion) \u0431\u044b\u043b\u0438 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u044b. \u0422\u0430\u043a\u0436\u0435 \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043c\u043e\u0449\u043d\u044b\u0435 JIT-\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0432\u0440\u043e\u0434\u0435 range-inferencing (\u044d\u0442\u043e \u043a\u0430\u043a \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0442\u0438\u043f\u043e\u0432, \u043d\u043e \u0441 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u043c \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u043e\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f). \u041d\u043e \u043a\u0443\u0434\u0430 \u0432\u0430\u0436\u043d\u0435\u0435, \u0447\u0442\u043e \u0441 LLVM \u043d\u0430 \u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0442\u0440\u0430\u0442\u0438\u0442\u0441\u044f \u043e\u0447\u0435\u043d\u044c \u043c\u043d\u043e\u0433\u043e \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432.<\/p>\n<h3>\u0410 \u0435\u0441\u043b\u0438 \u0432\u043c\u0435\u0441\u0442\u043e \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u043e\u0433\u043e \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439 \u0443 \u043d\u0430\u0441 \u0431\u0443\u0434\u0435\u0442 \u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0433\u0440\u0430\u0444, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u043e\u0434\u0438\u0444\u0438\u0446\u0438\u0440\u0443\u0435\u0442 \u0441\u0435\u0431\u044f?<\/h3>\n<p>  \u041c\u044b \u043f\u043e\u0433\u043e\u0432\u043e\u0440\u0438\u043b\u0438 \u043e\u0431 LLVM-\u0431\u0430\u0439\u0442\u043a\u043e\u0434\u0435 \u0438 \u043e Python\/Ruby\/Java-\u0431\u0430\u0439\u0442\u043a\u043e\u0434\u0435 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u043e\u0433\u043e \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f. \u0412\u0441\u0435 \u043e\u043d\u0438 \u0432\u044b\u0433\u043b\u044f\u0434\u044f\u0442 \u043a\u0430\u043a \u043d\u0435\u043a\u0438\u0439 \u044f\u0437\u044b\u043a \u0432 \u0432\u0438\u0434\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439. \u0412 Hotspot, Graal \u0438 V8 \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u043e\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u00abSea of Nodes\u00bb (\u043f\u043e\u044f\u0432\u0438\u043b\u043e\u0441\u044c \u0432 Hotspot), \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0431\u043e\u043b\u0435\u0435 \u043d\u0438\u0437\u043a\u043e\u0443\u0440\u043e\u0432\u043d\u0435\u0432\u044b\u043c AST. \u042d\u0442\u043e \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u043f\u0440\u043e\u0444\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u0430 \u043d\u0430 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0438 \u043e\u0431 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u043e\u043c \u043f\u0443\u0442\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0440\u0435\u0434\u043a\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f (\u0438\u043b\u0438 \u043f\u0435\u0440\u0435\u0441\u0435\u043a\u0430\u0435\u0442\u0441\u044f \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u043a\u0430\u043a\u043e\u0433\u043e-\u0442\u043e \u0448\u0430\u0431\u043b\u043e\u043d\u0430). \u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435, \u0447\u0442\u043e \u044d\u0442\u0438 AST \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u043e\u0432 \u043e\u0442\u043b\u0438\u0447\u0430\u044e\u0442\u0441\u044f \u043e\u0442 AST \u043f\u0430\u0440\u0441\u0435\u0440\u043e\u0432.<\/p>\n<p>  \u041e\u0431\u044b\u0447\u043d\u043e \u044f \u043f\u0440\u0438\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u044e\u0441\u044c \u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u00ab\u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0439\u0442\u0435 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0434\u043e\u043c\u0430!\u00bb, \u043d\u043e \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0442\u044c \u0433\u0440\u0430\u0444\u044b \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0442\u0440\u0443\u0434\u043d\u043e, \u0445\u043e\u0442\u044f \u0438 \u043e\u0447\u0435\u043d\u044c \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e, \u0430 \u0437\u0430\u0447\u0430\u0441\u0442\u0443\u044e \u0438 \u043a\u0440\u0430\u0439\u043d\u0435 \u043f\u043e\u043b\u0435\u0437\u043d\u043e \u0434\u043b\u044f \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0430. \u042f, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043d\u0435 \u043c\u043e\u0433\u0443 \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u0432\u0441\u0435 \u0433\u0440\u0430\u0444\u0438\u043a\u0438 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0438\u0437-\u0437\u0430 \u043d\u0435\u0445\u0432\u0430\u0442\u043a\u0438 \u0437\u043d\u0430\u043d\u0438\u0439, \u043d\u043e \u0438 \u0438\u0437-\u0437\u0430 \u043f\u0440\u0435\u0434\u0435\u043b\u043e\u0432 \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0435\u0439 \u043c\u043e\u0435\u0433\u043e \u043c\u043e\u0437\u0433\u0430 (\u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0430 \u043c\u043e\u0433\u0443\u0442 \u043f\u043e\u043c\u043e\u0447\u044c \u0438\u0437\u0431\u0430\u0432\u0438\u0442\u044c\u0441\u044f \u043e\u0442 \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043c\u0435\u043d\u044f \u043d\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0443\u0435\u0442).<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/50c\/2e1\/d9f\/50c2e1d9f2092eb3039c95d5b6c878bc.png\"><\/div>\n<p>  \u0412 \u0441\u043b\u0443\u0447\u0430\u0435 \u0441 V8 \u043c\u044b \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u043c \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 D8 \u0441 \u0444\u043b\u0430\u0433\u043e\u043c <code>--print-ast<\/code>. \u0414\u043b\u044f Graal \u044d\u0442\u043e \u0431\u0443\u0434\u0435\u0442 <code>--vm.Dgraal.Dump=Truffle:2<\/code>. \u041d\u0430 \u044d\u043a\u0440\u0430\u043d \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0432\u043e\u0434\u0438\u0442\u044c\u0441\u044f \u0442\u0435\u043a\u0441\u0442 (\u043e\u0442\u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u043b\u0441\u044f \u0433\u0440\u0430\u0444). \u041d\u0435 \u0437\u043d\u0430\u044e, \u043a\u0430\u043a \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 V8 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u044e\u0442 \u0432\u0438\u0437\u0443\u0430\u043b\u044c\u043d\u044b\u0435 \u0433\u0440\u0430\u0444\u044b, \u043d\u043e \u0432 Oracle \u0435\u0441\u0442\u044c \u00abIdeal Graph Visualizer\u00bb, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0440\u0438\u043c\u0435\u043d\u0451\u043d \u043d\u0430 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439 \u0438\u043b\u043b\u044e\u0441\u0442\u0440\u0430\u0446\u0438\u0438. \u0423 \u043c\u0435\u043d\u044f \u043d\u0435 \u0431\u044b\u043b\u043e \u0441\u0438\u043b \u043f\u0435\u0440\u0435\u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0442\u044c IGV, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u044f \u0432\u0437\u044f\u043b \u0433\u0440\u0430\u0444\u044b \u0443 \u041a\u0440\u0438\u0441\u0430 \u0421\u0438\u0442\u043e\u043d\u0430 (Chris Seaton), \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e Seafoam, \u0447\u044c\u0438 \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0438 \u0441\u0435\u0439\u0447\u0430\u0441 \u0437\u0430\u043a\u0440\u044b\u0442\u044b.<\/p>\n<p>  \u041b\u0430\u0434\u043d\u043e, \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u0432\u0437\u0433\u043b\u044f\u043d\u0435\u043c \u043d\u0430 JavaScript AST!<\/p>\n<pre><code class=\"plaintext\">function accumulate(n, a) {   var x = 0;   for (var i = 0; i &lt; n; i++) {     x += a;   }   return x; }  accumulate(1, 1) <\/code><\/pre>\n<p>  \u042d\u0442\u043e\u0442 \u043a\u043e\u0434 \u044f \u043f\u0440\u043e\u0433\u043d\u0430\u043b \u0447\u0435\u0440\u0435\u0437 <code>d8 --print-ast test.js<\/code>, \u0445\u043e\u0442\u044f \u043d\u0430\u0441 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0443\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u044f <code>accumulate<\/code>. \u041f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u0442\u0435, \u0447\u0442\u043e \u044f \u0432\u044b\u0437\u0432\u0430\u043b \u0435\u0451 \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u0438\u043d \u0440\u0430\u0437, \u0442\u043e \u0435\u0441\u0442\u044c \u043c\u043d\u0435 \u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u0436\u0434\u0430\u0442\u044c \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c AST. <\/p>\n<p>  \u0422\u0430\u043a \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 AST (\u044f \u0443\u0431\u0440\u0430\u043b \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u0430\u043b\u043e\u0432\u0430\u0436\u043d\u044b\u0435 \u0441\u0442\u0440\u043e\u043a\u0438):<\/p>\n<pre><code class=\"plaintext\">FUNC at 19 . NAME &quot;accumulate&quot; . PARAMS . . VAR (0x7ff5358156f0) (mode = VAR, assigned = false) &quot;n&quot; . . VAR (0x7ff535815798) (mode = VAR, assigned = false) &quot;a&quot; . DECLS . . VARIABLE (0x7ff5358156f0) (mode = VAR, assigned = false) &quot;n&quot; . . VARIABLE (0x7ff535815798) (mode = VAR, assigned = false) &quot;a&quot; . . VARIABLE (0x7ff535815840) (mode = VAR, assigned = true) &quot;x&quot; . . VARIABLE (0x7ff535815930) (mode = VAR, assigned = true) &quot;i&quot; . BLOCK NOCOMPLETIONS at -1 . . EXPRESSION STATEMENT at 38 . . . INIT at 38 . . . . VAR PROXY local[0] (0x7ff535815840) (mode = VAR, assigned = true) &quot;x&quot; . . . . LITERAL 0 . FOR at 43 . . INIT at -1 . . . BLOCK NOCOMPLETIONS at -1 . . . . EXPRESSION STATEMENT at 56 . . . . . INIT at 56 . . . . . . VAR PROXY local[1] (0x7ff535815930) (mode = VAR, assigned = true) &quot;i&quot; . . . . . . LITERAL 0 . . COND at 61 . . . LT at 61 . . . . VAR PROXY local[1] (0x7ff535815930) (mode = VAR, assigned = true) &quot;i&quot; . . . . VAR PROXY parameter[0] (0x7ff5358156f0) (mode = VAR, assigned = false) &quot;n&quot; . . BODY at -1 . . . BLOCK at -1 . . . . EXPRESSION STATEMENT at 77 . . . . . ASSIGN_ADD at 79 . . . . . . VAR PROXY local[0] (0x7ff535815840) (mode = VAR, assigned = true) &quot;x&quot; . . . . . . VAR PROXY parameter[1] (0x7ff535815798) (mode = VAR, assigned = false) &quot;a&quot; . . NEXT at 67 . . . EXPRESSION STATEMENT at 67 . . . . POST INC at 67 . . . . . VAR PROXY local[1] (0x7ff535815930) (mode = VAR, assigned = true) &quot;i&quot; . RETURN at 91 . . VAR PROXY local[0] (0x7ff535815840) (mode = VAR, assigned = true) &quot;x&quot; <\/code><\/pre>\n<p>  \u041f\u0430\u0440\u0441\u0438\u0442\u044c \u0442\u0430\u043a\u043e\u0435 \u0441\u043b\u043e\u0436\u043d\u043e, \u043d\u043e \u044d\u0442\u043e \u043f\u043e\u0445\u043e\u0436\u0435 \u043d\u0430 AST \u043f\u0430\u0440\u0441\u0435\u0440\u0430 (\u0432\u0435\u0440\u043d\u043e \u043d\u0435 \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c). \u0410 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435 AST \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043e \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e Acorn.js<\/p>\n<p>  \u0417\u0430\u043c\u0435\u0442\u043d\u043e\u0435 \u043e\u0442\u043b\u0438\u0447\u0438\u0435 \u2014 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445. \u0412 AST \u043f\u0430\u0440\u0441\u0435\u0440\u0430 \u043d\u0435\u0442 \u044f\u0432\u043d\u043e\u0433\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432, \u0430 \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u0435 \u0446\u0438\u043a\u043b\u0430 \u0441\u043f\u0440\u044f\u0442\u0430\u043d\u043e \u0432 \u043d\u043e\u0434\u0443 <code>ForStatement<\/code>. \u0412 AST \u0443\u0440\u043e\u0432\u043d\u044f \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0430 \u0432\u0441\u0435 \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u044f \u0441\u0433\u0440\u0443\u043f\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u044b \u0441 \u0430\u0434\u0440\u0435\u0441\u0430\u043c\u0438 \u0438 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u043c\u0438.<\/p>\n<p>  AST \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0430 \u0442\u0430\u043a\u0436\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u044d\u0442\u043e \u0434\u0443\u0440\u0430\u0446\u043a\u043e\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435 <code>VAR PROXY<\/code>. AST \u043f\u0430\u0440\u0441\u0435\u0440\u0430 \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u0441\u0432\u044f\u0437\u0438 \u043c\u0435\u0436\u0434\u0443 \u0438\u043c\u0435\u043d\u0430\u043c\u0438 \u0438 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u043c\u0438 (\u043f\u043e \u0430\u0434\u0440\u0435\u0441\u0430\u043c) \u0438\u0437-\u0437\u0430 \u043f\u043e\u0434\u043d\u044f\u0442\u0438\u044f \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 (hoisting), \u043e\u0446\u0435\u043d\u043a\u0438 (eval) \u0438 \u043f\u0440\u043e\u0447\u0435\u0433\u043e. \u0422\u0430\u043a \u0447\u0442\u043e AST \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 <code>PROXY<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u043e\u0437\u0434\u043d\u0435\u0435 \u0441\u0432\u044f\u0437\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u0441 \u0444\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439.<\/p>\n<pre><code class=\"plaintext\">\/\/ This chunk is the declarations and the assignment of `x = 0`  . DECLS . . VARIABLE (0x7ff5358156f0) (mode = VAR, assigned = false) &quot;n&quot; . . VARIABLE (0x7ff535815798) (mode = VAR, assigned = false) &quot;a&quot; . . VARIABLE (0x7ff535815840) (mode = VAR, assigned = true) &quot;x&quot; . . VARIABLE (0x7ff535815930) (mode = VAR, assigned = true) &quot;i&quot; . BLOCK NOCOMPLETIONS at -1 . . EXPRESSION STATEMENT at 38 . . . INIT at 38 . . . . VAR PROXY local[0] (0x7ff535815840) (mode = VAR, assigned = true) &quot;x&quot; . . . . LITERAL 0 <\/code><\/pre>\n<p>  \u0410 \u0442\u0430\u043a \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 AST \u0442\u043e\u0439 \u0436\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b, \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u043e\u0435 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e Graal!<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/770\/7d0\/3d8\/7707d03d8d9c1e085ab96d6249e16a7f.png\"><\/div>\n<p>  \u0412\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043a\u0443\u0434\u0430 \u043f\u0440\u043e\u0449\u0435. \u041a\u0440\u0430\u0441\u043d\u044b\u043c \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0435\u043d \u043f\u043e\u0442\u043e\u043a \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f, \u0441\u0438\u043d\u0438\u043c \u2014 \u043f\u043e\u0442\u043e\u043a \u0434\u0430\u043d\u043d\u044b\u0445, \u0441\u0442\u0440\u0435\u043b\u043a\u0430\u043c\u0438 \u2014 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f. \u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435, \u0447\u0442\u043e \u0445\u043e\u0442\u044f \u044d\u0442\u043e\u0442 \u0433\u0440\u0430\u0444 \u043f\u0440\u043e\u0449\u0435, \u0447\u0435\u043c AST \u0438\u0437 V8, \u044d\u0442\u043e \u043d\u0435 \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e Graal \u043b\u0443\u0447\u0448\u0435 \u0443\u043f\u0440\u043e\u0441\u0442\u0438\u043b \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0443. \u041f\u0440\u043e\u0441\u0442\u043e \u043e\u043d \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 Java, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043a\u0443\u0434\u0430 \u043c\u0435\u043d\u0435\u0435 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u043d. \u0422\u043e\u0442 \u0436\u0435 \u0433\u0440\u0430\u0444 Graal, \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0438\u0437 Ruby, \u0431\u0443\u0434\u0435\u0442 \u0431\u043b\u0438\u0436\u0435 \u043a \u043f\u0435\u0440\u0432\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0438.<\/p>\n<p>  \u0417\u0430\u0431\u0430\u0432\u043d\u043e, \u0447\u0442\u043e AST \u0432 Graal \u0431\u0443\u0434\u0443\u0442 \u043c\u0435\u043d\u044f\u0442\u044c\u0441\u044f \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043a\u043e\u0434\u0430. \u042d\u0442\u043e\u0442 \u0433\u0440\u0430\u0444 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d \u0441 \u043e\u0442\u043a\u043b\u044e\u0447\u0451\u043d\u043d\u044b\u043c OSR \u0438 \u0438\u043d\u043b\u0430\u0439\u043d\u0438\u0433\u043e\u043c, \u043f\u0440\u0438 \u043c\u043d\u043e\u0433\u043e\u043a\u0440\u0430\u0442\u043d\u043e\u043c \u0432\u044b\u0437\u043e\u0432\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0441\u043e \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u043c\u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u043c\u0438, \u0447\u0442\u043e\u0431\u044b \u043e\u043d\u0430 \u043d\u0435 \u0431\u044b\u043b\u0430 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u0430. \u0418 \u0434\u0430\u043c\u043f \u0441\u043d\u0430\u0431\u0434\u0438\u0442 \u0432\u0430\u0441 \u0446\u0435\u043b\u043e\u0439 \u043f\u0430\u0447\u043a\u043e\u0439 \u0433\u0440\u0430\u0444\u043e\u0432! \u0412 Graal \u0434\u043b\u044f \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0435 AST (V8 \u0434\u0435\u043b\u0430\u0435\u0442 \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u044b\u0435 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438, \u043d\u043e \u043d\u0435 \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 AST). \u041a\u043e\u0433\u0434\u0430 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0448\u044c \u0432 Graal \u0433\u0440\u0430\u0444\u044b, \u0442\u043e \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0448\u044c \u0431\u043e\u043b\u044c\u0448\u0435 \u0434\u0435\u0441\u044f\u0442\u0438 \u0441\u0445\u0435\u043c \u0441 \u0440\u0430\u0437\u043d\u044b\u043c\u0438 \u0443\u0440\u043e\u0432\u043d\u044f\u043c\u0438 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438. \u041f\u0440\u0438 \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0438\u0441\u0438 \u043d\u043e\u0434 \u043e\u043d\u0438 \u0437\u0430\u043c\u0435\u043d\u044f\u044e\u0442 \u0441\u0435\u0431\u044f (\u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u044e\u0442) \u0434\u0440\u0443\u0433\u0438\u043c\u0438 \u043d\u043e\u0434\u0430\u043c\u0438. <\/p>\n<p>  \u0412\u044b\u0448\u0435\u043f\u0440\u0438\u0432\u0435\u0434\u0451\u043d\u043d\u044b\u0439 \u0433\u0440\u0430\u0444 \u2014 \u043f\u0440\u0435\u043a\u0440\u0430\u0441\u043d\u044b\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u0440\u0438 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438 \u0442\u0438\u043f\u0438\u0437\u0438\u0440\u0443\u0435\u043c\u043e\u043c \u044f\u0437\u044b\u043a\u0435 (\u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0430 \u0432\u0437\u044f\u0442\u0430 \u0438\u0437 \u00abOne VM to Rule Them All\u00bb, 2013). \u041f\u0440\u0438\u0447\u0438\u043d\u0430 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043e\u0432\u0430\u043d\u0438\u044f \u044d\u0442\u043e\u0433\u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430 \u0442\u0435\u0441\u043d\u043e \u0441\u0432\u044f\u0437\u0430\u043d\u0430 \u0441 \u0442\u0435\u043c, \u043a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0447\u0430\u0441\u0442\u0438\u0447\u043d\u0430\u044f \u043e\u0446\u0435\u043d\u043a\u0430 \u2014 \u0432\u0441\u0451 \u0434\u0435\u043b\u043e \u0432 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438.<\/p>\n<h3>\u0423\u0440\u0430 JIT \u0441\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043b \u043a\u043e\u0434! \u0414\u0430\u0432\u0430\u0439 \u0441\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u0435\u043c \u0441\u043d\u043e\u0432\u0430! \u0418 \u0441\u043d\u043e\u0432\u0430!<\/h3>\n<p>  \u0412\u044b\u0448\u0435 \u044f \u0443\u043f\u043e\u043c\u0438\u043d\u0430\u043b \u043f\u0440\u043e \u00ab\u043c\u043d\u043e\u0433\u043e\u0443\u0440\u043e\u0432\u043d\u0435\u0432\u043e\u0441\u0442\u044c\u00bb, \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u0443\u0436\u0435 \u043e\u0431 \u044d\u0442\u043e\u043c \u043f\u043e\u0433\u043e\u0432\u043e\u0440\u0438\u043c. \u0418\u0434\u0435\u044f \u043f\u0440\u043e\u0441\u0442\u0430\u044f: \u0435\u0441\u043b\u0438 \u043c\u044b \u0435\u0449\u0451 \u043d\u0435 \u0433\u043e\u0442\u043e\u0432\u044b \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043a\u043e\u0434, \u043d\u043e \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0446\u0438\u044f \u0434\u043e \u0441\u0438\u0445 \u043f\u043e\u0440 \u043e\u0431\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0434\u043e\u0440\u043e\u0433\u043e, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u0443\u044e \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u044e, \u0430 \u0437\u0430\u0442\u0435\u043c \u0444\u0438\u043d\u0430\u043b\u044c\u043d\u0443\u044e, \u043a\u043e\u0433\u0434\u0430 \u0431\u0443\u0434\u0435\u043c \u0433\u043e\u0442\u043e\u0432\u044b \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0431\u043e\u043b\u0435\u0435 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043a\u043e\u0434.<\/p>\n<p>  Hotspot \u2014 \u044d\u0442\u043e \u043c\u043d\u043e\u0433\u043e\u0443\u0440\u043e\u0432\u043d\u0435\u0432\u044b\u0439 JIT \u0441 \u0434\u0432\u0443\u043c\u044f \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0430\u043c\u0438: C1 \u0438 C2. C1 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0431\u044b\u0441\u0442\u0440\u0443\u044e \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u044e \u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 \u043a\u043e\u0434, \u0437\u0430\u0442\u0435\u043c \u043f\u0440\u043e\u0432\u043e\u0434\u0438\u0442 \u043f\u043e\u043b\u043d\u043e\u0435 \u043f\u0440\u043e\u0444\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0441\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u04212 \u043a\u043e\u0434. \u042d\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u043c\u043e\u0447\u044c \u0440\u0435\u0448\u0438\u0442\u044c \u043c\u043d\u043e\u0433\u0438\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u0441 \u043f\u0440\u043e\u0433\u0440\u0435\u0432\u043e\u043c. \u041d\u0435 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0441\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043a\u043e\u0434 \u0432\u0441\u0451-\u0440\u0430\u0432\u043d\u043e \u0431\u044b\u0441\u0442\u0440\u0435\u0435 \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0446\u0438\u0438. \u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, \u04211 \u0438 \u04212 \u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u044e\u0442 \u043d\u0435 \u0432\u0435\u0441\u044c \u043a\u043e\u0434. \u0415\u0441\u043b\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e, \u0441 \u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u044c\u044e \u04212 \u043d\u0430\u043c \u043d\u0435 \u043f\u043e\u043c\u043e\u0436\u0435\u0442 \u0438 \u0434\u0430\u0436\u0435 \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c\u0441\u044f (\u0435\u0449\u0451 \u0438 \u0441\u044d\u043a\u043e\u043d\u043e\u043c\u0438\u043c \u0432\u0440\u0435\u043c\u044f \u043d\u0430 \u043f\u0440\u043e\u0444\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438!). \u0415\u0441\u043b\u0438 \u04211 \u0437\u0430\u043d\u044f\u0442 \u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\u043c, \u0442\u043e\u0433\u0434\u0430 \u043f\u0440\u043e\u0444\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u044c\u0441\u044f, \u0440\u0430\u0431\u043e\u0442\u0430 \u04211 \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u0435\u0440\u0432\u0430\u043d\u0430 \u0438 \u0437\u0430\u043f\u0443\u0449\u0435\u043d\u043e \u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u04212.<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/86d\/54e\/44d\/86d54e44dd9aa385be9bb15467fea2bd.png\"><\/div>\n<p>  \u0412 JavaScript Core \u0443\u0440\u043e\u0432\u043d\u0435\u0439 \u0435\u0449\u0451 \u0431\u043e\u043b\u044c\u0448\u0435! \u041f \u0441\u0443\u0442\u0438, \u0442\u0430\u043c <i>\u0442\u0440\u0438 JIT<\/i>. \u0418\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0442\u043e\u0440 JSC \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u043b\u0451\u0433\u043a\u043e\u0435 \u043f\u0440\u043e\u0444\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435, \u0437\u0430\u0442\u0435\u043c \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u0442 \u043a Baseline JIT, \u0437\u0430\u0442\u0435\u043c \u043a DFG (Data Flow Graph) JIT, \u0438 \u043d\u0430\u043a\u043e\u043d\u0435\u0446 \u043a FTL (Faster than Light) JIT. \u0421 \u0442\u0430\u043a\u0438\u043c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e\u043c \u0443\u0440\u043e\u0432\u043d\u0435\u0439 \u0441\u043c\u044b\u0441\u043b \u0434\u0435\u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0435 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u043e\u043c \u043e\u0442 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0430 \u043a \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0442\u043e\u0440\u0443, \u0434\u0435\u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f \u043c\u043e\u0436\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c\u0441\u044f \u043d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 DFG \u0438 \u0437\u0430\u043a\u0430\u043d\u0447\u0438\u0432\u0430\u044f Baseline JIT (\u044d\u0442\u043e \u043d\u0435 \u0442\u0430\u043a \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 Hotspot C2-&gt;C1). \u0412\u0441\u0435 \u0434\u0435\u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 \u0438 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u044b \u043d\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0442\u0441\u044f \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e OSR (\u0437\u0430\u043c\u0435\u0449\u0435\u043d\u0438\u044f \u0432 \u0441\u0442\u0435\u043a\u0435).<\/p>\n<p>  Baseline JIT \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u043f\u043e\u0441\u043b\u0435 100 \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0439, \u0430 DFG JIT \u2014 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u043f\u043e\u0441\u043b\u0435 1000 (\u0441 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u043c\u0438 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f\u043c\u0438). \u042d\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e JIT \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u0441\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043a\u043e\u0434 \u0433\u043e\u0440\u0430\u0437\u0434\u043e \u0431\u044b\u0441\u0442\u0440\u0435\u0435, \u0447\u0435\u043c \u0442\u043e\u0442 \u0436\u0435 Pypy (\u0443 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u044d\u0442\u043e \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 \u043e\u043a\u043e\u043b\u043e 3000 \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0439). \u041c\u043d\u043e\u0433\u043e\u0443\u0440\u043e\u0432\u043d\u0435\u0432\u043e\u0441\u0442\u044c \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 JIT \u043f\u044b\u0442\u0430\u0442\u044c\u0441\u044f \u0441\u043e\u043e\u0442\u043d\u0435\u0441\u0442\u0438 \u0434\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043a\u043e\u0434\u0430 \u0441 \u0434\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c\u044e \u0435\u0433\u043e \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438. \u0415\u0441\u0442\u044c \u043a\u0443\u0447\u0430 \u0443\u043b\u043e\u0432\u043e\u043a, \u043a\u0430\u043a\u043e\u0439 \u0432\u0438\u0434 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 (\u0438\u043d\u043b\u0430\u0439\u043d\u0438\u043d\u0433, \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0442\u0438\u043f\u043e\u0432 \u0438 \u0442.\u0434.) \u0438\u0441\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u043d\u0430 \u043a\u0430\u0436\u0434\u043e\u043c \u0438\u0437 \u0443\u0440\u043e\u0432\u043d\u0435\u0439, \u0438 \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0442\u0430\u043a\u0430\u044f \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u044f \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0439.<\/p>\n<h2>\u041f\u043e\u043b\u0435\u0437\u043d\u044b\u0435 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0438<\/h2>\n<p>  <\/p>\n<ul>\n<li><a href=\"https:\/\/www.freelists.org\/post\/luajit\/How-does-LuaJITs-trace-compiler-work,1\">How LuaJIT&#8217;s Trace Compiler Works from Mike Pall<\/a><\/li>\n<li><a href=\"https:\/\/tratt.net\/laurie\/research\/pubs\/html\/bolz_tratt__the_impact_of_metatracing_on_vm_design_and_implementation\/\">Impact of Meta-tracing on VMs by Laurie Tratt<\/a><\/li>\n<li><a href=\"https:\/\/morepypy.blogspot.com\/2010\/09\/escape-analysis-in-pypys-jit.html\">Pypy Escape Analysis<\/a><\/li>\n<li><a href=\"https:\/\/tratt.net\/laurie\/blog\/entries\/why_arent_more_users_more_happy_with_our_vms_part_1.html\">Why Users aren&#8217;t More Happy with VMs by Laurie Tratt<\/a><\/li>\n<li>\u041f\u0440\u043e JS-\u0434\u0432\u0438\u0436\u043a\u0438:\n<ul>\n<li><a href=\"https:\/\/flaviocopes.com\/node-runtime-v8-options\/\">List of V8 Compiler Options<\/a><\/li>\n<li><a href=\"https:\/\/webkit.org\/blog\/3362\/introducing-the-webkit-ftl-jit\/\">JSCore Replacing their LLVM Backend for a \u00abFaster Than Light\u00bb JIT<\/a><\/li>\n<\/ul>\n<\/li>\n<li>\u041f\u0440\u043e \u0434\u0435\u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438:\n<ul>\n<li><a href=\"https:\/\/engineering.shopify.com\/blogs\/engineering\/optimizing-ruby-lazy-initialization-in-truffleruby-with-deoptimization\">Deoptimizing TruffleRuby Lazy Initialization by me<\/a><\/li>\n<li><a href=\"https:\/\/chrisseaton.com\/truffleruby\/deoptimizing\/\">Deoptimizing Ruby by Chris Seaton<\/a><\/li>\n<li><a href=\"https:\/\/v8.dev\/blog\/lazy-unlinking\">V8 Lazy Deopts<\/a><\/li>\n<\/ul>\n<\/li>\n<li>\u041f\u0440\u043e Graal:\n<ul>\n<li><a href=\"http:\/\/lafo.ssw.uni-linz.ac.at\/papers\/2013_Onward_OneVMToRuleThemAll.pdf\">One VM to Rule Them All (a paper)<\/a><\/li>\n<li><a href=\"https:\/\/chrisseaton.com\/truffleruby\/cext\/\">High Performance C Extensions by Chris Seaton<\/a><\/li>\n<li><a href=\"https:\/\/chrisseaton.com\/truffleruby\/basic-graal-graphs\/\">Understanding Graal Graphs by Chris Seaton<\/a><\/li>\n<li><a href=\"https:\/\/chrisseaton.com\/truffleruby\/tenthings\/\">Top 10 Things to do with GraalVM by Chris Seaton<\/a><\/li>\n<\/ul>\n<\/li>\n<li>\u041f\u0440\u043e \u0447\u0430\u0441\u0442\u0438\u0447\u043d\u0443\u044e \u043e\u0446\u0435\u043d\u043a\u0443:\n<ul>\n<li><a href=\"https:\/\/stefan-marr.de\/papers\/oopsla-marr-ducasse-meta-tracing-vs-partial-evaluation\/\">Partial Evaluation vs Meta-tracing<\/a><\/li>\n<li><a href=\"https:\/\/chrisseaton.com\/rubytruffle\/pldi17-truffle\/pldi17-truffle.pdf\">Paper that introduces partial evaluation for Graal<\/a><\/li>\n<\/ul>\n<\/li>\n<li>\u0420\u0430\u0437\u043d\u043e\u0435:\n<ul>\n<li><a href=\"https:\/\/jvns.ca\/blog\/2016\/07\/23\/rigorous-benchmarking-in-reasonable-time\/\">Benchmarking correctly is hard by Julia Evans<\/a><\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/div>\n<p> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/company\/mailru\/blog\/513290\/\"> https:\/\/habr.com\/ru\/company\/mailru\/blog\/513290\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"\n<div class=\"post__text post__text-html post__text_v1\" id=\"post-content-body\" data-io-article-url=\"https:\/\/habr.com\/ru\/company\/mailru\/blog\/513290\/\">\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/l2\/dj\/ej\/l2djej_af2wenjo1zb_qzrjb2ea.jpeg\" width=\"400\"><\/div>\n<p>  \u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u043c\u044b \u043f\u043e\u0433\u043e\u0432\u043e\u0440\u0438\u043c \u043e \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0441\u0442\u044f\u0445 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0438 \u0440\u0430\u0431\u043e\u0442\u0435 \u0440\u0430\u0437\u043d\u044b\u0445 JIT-\u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u043e\u0432, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043e \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u044f\u0445 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438. \u041e\u0431\u0441\u0443\u0436\u0434\u0430\u0442\u044c \u0431\u0443\u0434\u0435\u043c \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e, \u043e\u0434\u043d\u0430\u043a\u043e \u043c\u043d\u043e\u0433\u0438\u0435 \u0432\u0430\u0436\u043d\u044b\u0435 \u043a\u043e\u043d\u0446\u0435\u043f\u0446\u0438\u0438 \u043e\u043f\u0443\u0441\u0442\u0438\u043c. \u0422\u043e \u0435\u0441\u0442\u044c \u0432 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 <i>\u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e\u0439 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438<\/i>, \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u0438\u0439\u0442\u0438 \u043a \u043e\u0431\u043e\u0441\u043d\u043e\u0432\u0430\u043d\u043d\u044b\u043c \u0437\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f\u043c \u043f\u0440\u0438 \u043b\u044e\u0431\u044b\u0445 \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044f\u0445 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0439 \u0438 \u044f\u0437\u044b\u043a\u043e\u0432.<\/p>\n<p>  \u0427\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0431\u0430\u0437\u043e\u0432\u043e\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043e JIT-\u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0430\u0445, \u043f\u043e\u0447\u0438\u0442\u0430\u0439\u0442\u0435 <a href=\"https:\/\/carolchen.me\/blog\/jits-intro\">\u044d\u0442\u0443 \u0441\u0442\u0430\u0442\u044c\u044e<\/a>. <\/p>\n<p>  \u041d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0435 \u043f\u0440\u0438\u043c\u0435\u0447\u0430\u043d\u0438\u0435: <\/p>\n<blockquote><p>\u042f \u0447\u0430\u0441\u0442\u043e \u0431\u0443\u0434\u0443 \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 \u0438 \u0443\u0442\u0432\u0435\u0440\u0436\u0434\u0430\u0442\u044c, \u0447\u0442\u043e \u043e\u043d\u0430, \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e, \u0435\u0441\u0442\u044c \u0438 \u0432 \u043a\u0430\u043a\u043e\u043c-\u043d\u0438\u0431\u0443\u0434\u044c \u0434\u0440\u0443\u0433\u043e\u043c \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0435. \u0425\u043e\u0442\u044f \u044f \u043d\u0435 \u0432\u0441\u0435\u0433\u0434\u0430 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u044e, \u0435\u0441\u0442\u044c \u043b\u0438 \u044d\u0442\u0430 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f \u0432 \u0434\u0440\u0443\u0433\u043e\u043c JIT (\u0438\u043d\u043e\u0433\u0434\u0430 \u0432\u0441\u0451 \u043d\u0435\u043e\u0434\u043d\u043e\u0437\u043d\u0430\u0447\u043d\u043e), \u043d\u043e \u0435\u0441\u043b\u0438 \u0437\u043d\u0430\u044e \u0442\u043e\u0447\u043d\u043e, \u0442\u043e \u0443\u043a\u0430\u0436\u0443 \u043d\u0430 \u044d\u0442\u043e. \u042f \u0442\u0430\u043a\u0436\u0435 \u043f\u0440\u0438\u0432\u0435\u0434\u0443 \u043f\u0440\u0438\u043c\u0435\u0440\u044b \u043a\u043e\u0434\u0430, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c, \u0433\u0434\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0430 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f, \u043d\u043e \u044d\u0442\u043e \u043d\u0435 \u0442\u043e\u0447\u043d\u043e, \u0432\u0435\u0434\u044c \u043f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043e\u0442\u0434\u0430\u043d \u0434\u0440\u0443\u0433\u043e\u0439 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438. \u041c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u0438 \u043a\u0430\u043a\u0438\u0435-\u0442\u043e \u043e\u0431\u0449\u0438\u0435 \u0443\u043f\u0440\u043e\u0449\u0435\u043d\u0438\u044f, \u043d\u043e \u043d\u0435 \u0431\u043e\u043b\u044c\u0448\u0435, \u0447\u0435\u043c \u0432 \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0435 \u043f\u043e\u0434\u043e\u0431\u043d\u044b\u0445 \u043f\u043e\u0441\u0442\u043e\u0432.<\/p><\/blockquote>\n<p>  <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-307800","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/307800","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=307800"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/307800\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=307800"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=307800"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=307800"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}