(Translated by https://www.hiragana.jp/)
即時編譯 - 维基百科,自由的百科全书 とべ转到内容ないよう

即時そくじへんやく

本页使用了标题或全文手工转换
维基百科ひゃっか自由じゆうてき百科ひゃっかぜん
重定しげさだこうJIT
不同ふどう类型てきそく时编译实现

ざい计算つくえわざなかそく时编译英語えいごJust-in-time compilation,缩写为JITまた及时编译[1]实时编译[2]),也称为动态こぼしある运行时编译[3]いち种执ぎょう计算つくえだいてき方法ほうほう,这种方法ほうほう设计ざいほどじょ执行过程ちゅうざい執行しっこう)而不ざい执行ぜん进行编译[4]通常つうじょう,这包括ほうかつみなもとだいあるさらつね见的节码いたつくえてき转换,しかきさき直接ちょくせつ执行。实现 JIT 编译まとけい统通常会じょうかい不断ふだん分析ぶんせきただしざい执行てきだい码,并确定代さだよ码中そく时编译加そくてき部分ぶぶんざい这些部分ぶぶんちゅうゆかり编译あるおもしん编译带来てき性能せいのうひさげだかはたちょう过编译该だい码的开销。

JIT编译两种传统てきつくえだい码翻译方ほう——ひさげぜん编译えいahead-of-time compilation(AOT)直譯ちょくやく——てき结合,它结あいりょう两者てき优点缺点けってん[4]だい致来说,JIT编译,以解释器てき开销以及编译链接(かい释之がいてき开销,结合りょう编译だい码的速度そくどあずかかい释的灵活せい。JIT编译動態どうたいへんやくてきいち种形しきまこと适应优化えいadaptive optimization动态じゅう编译特定とくていほろてき加速かそく[nb 1][5]——いん此,ざい论上,JIT编译しずか态编译能够产せいさらかいてき执行速度そくどかい释和JIT编译とく别适あい动态编程语言いん为运ぎょう时系统可以处きさき绑定えいLate bindingまとすうすえ类型并实ほどこせ安全あんぜん证。

应用

[编辑]

JIT编译以应よう于某些程じょ,也可以用于某些能りょくとく别是动态能力のうりょく,如せい则表达式れい如,いち个文ほん编辑以把运行时提供ていきょうてきせい则表达式编译なりつくえ码,从而さらかい进行ひきはい——这不能ふのうひっさげぜん完成かんせいいん为patternただざい运行时提供ていきょういち些现だいてき运行时环さかい赖JIT编译らい实现高速こうそくだい码执ぎょう包括ほうかつだい多数たすうJava实现,以及ほろてき.NETかまち。类似,许多せい则表达式库都具有ぐゆう对正则表达式进行JIT编译てきこうのう以编译成节码,也可以编译成つくえ码。JIT编译也用于一些模拟器ちゅう,以便はたつくえだい码从いち个CPU体系たいけい结构转换到另一个CPU体系たいけい结构。

JIT编译てき一个常见实现是首先进行AOT编译,げんだい码编译成节码(きょ拟机だい码),しょう节码编译しかきさきはたJIT编译为机码(动态编译),而不かい释字节码。あずかかい释相,这提だかりょう运行时性能せいのうただしだい价是编译造成ぞうせいてきのべ迟。あずかかい释器いち样,JIT编译不断ふだん进行こぼし译,ただし对编译后てきだい码进ぎょう缓存最大さいだい限度げんど减少ざい给定运行将来しょうらい执行しょうどうだい码的のべ迟。

がいじゅつ

[编辑]

ざい节码编译てきけい统中,みなもとだい转换为称为节码的中てきちゅう表示ひょうじ形式けいしき节码にんなん特定とくてい计算つくえてきつくえだい码,以在计算つくえ体系たいけい结构移植いしょくしかきさき以在きょ拟机うえかい释或运行节码。JIT编译ざい许多部分ぶぶんある全部ぜんぶ、很少)读取节码,并将它们动态编译なりつくえだい码,以便ほどじょのう够更かい运行。这可以针对每个文けんまい个函すう甚至にんなん任意にんいだい码片だん进行编译; だい码可以在そくはた执行时进ぎょう编译(いん此称为“そく时”),しかきさき缓存并在以后重用じゅうよう,无需おもしん编译。

そうした,传统てきかい释型きょ拟机ただかい释字节码,通常つうじょう性能せいのうようていとくゆうかい释器甚至需要じゅようくびさき编译なり节码就可以解释源だい码,ただし性能せいのうさらせい态编译的だいあるほん地代じだいざい部署ぶしょぜん编译。动态编译环境ざい执行间可以使用しよう编译てき环境。 使用しようJITわざ术的一个共同目标是达到或超过静态编译的性能,どう保持ほじ节码かい释的优势:解析かいせき原始げんしげんだい码和执行基本きほん优化てき许多“しげるじゅう工作こうさく通常つうじょうざい编译时处てきざい部署ぶしょまえ:从字节码编译到つくえ码要从源だい码编译快とく与本よもと地代じだい不同ふどう部署ぶしょてき节码移植いしょくてきよし于运ぎょう时可以控せい编译,如解释字节码,所以ゆえん它可以在安全あんぜんてきすなばこちゅう运行。从字节码到つくえ码的编译さら容易ようい编写,いん为便携式节码编译やめ完成かんせいりょうだい部分ぶぶん工作こうさく

JITだい通常つうじょうかい释器性能せいのうさらこのみ。另外,ざいぼう些情况下,它的性能せいのう以比せい态编译更こういん为许优化ただざい运行时可ぎょう[6][7]

  1. 编译以针对目标CPU应用ほどじょ运行てき操作そうさけい统模がた进行优化。れい如,JIT以在检测到CPU支持しじSSE2りょうCPU指令しれい时选择它们。よう使用しようせい态编译器获得这种优化级别てき特殊とくしゅせい,必须为每个预てき平台ひらだい/体系たいけい结构编译一个二进制文件,あるものざい一个二进制文件中包含多个版本的部分代码。
  2. 该系统能够收集しゅうしゅう关于ほどじょざい其所ざい环境ちゅう实际运行じょう况的统计しんいき,并且のう够重しん排列はいれつ和重かずえしん编译以获とくさいけい性能せいのうただし一些静态编译器也可以将概要信息作为输入。
  3. 该系统可以进ぎょう全局ぜんきょくだい码优れいうち库函すう),どう时不しつ动态链接てき优点,也不かいしつしずか态编译器链接固有こゆうてき开销。具体ぐたいらい说,ざい进行全局ぜんきょくない联替换时,せい态编译过ほど可能かのう需要じゅよう运行时检查,并确如果对象てき实际类重うつしりょうない联方ほう,就会发生きょ拟调よう,并且对数组访问的边界条件じょうけん检查可能かのう需要じゅようざい循环ちゅう处理。ざい多情たじょう况下,使用しようそく时编译,这种处理以从循环ちゅう移出いしゅつ通常つうじょうかいだいだいひさげ高速度こうそくど
  4. つきかん使用しようせい态编译的垃圾收集しゅうしゅう语言以做到这いちてんただし节码けい统可以更容易よういじゅうしん排列はいれつ执行てきだい码,以获どくさらこのみてき缓存利用りようりつ

よし于JIT必须ざい运行时呈现和执行本地ほんじ进制映像えいぞういん真正しんせいてきつくえだい码JIT需要じゅようまこと许在运行时执ぎょうすうすえてき平台ひらだい,这使とくざいもと哈佛结构てきつくえじょう使用しよう这种JITなり不可能ふかのうてき事情じじょう——对于ぼう操作そうさけい统和きょ拟机也是如此。しか而,一种特殊类型的“JIT”可能かのう并不针对物理ぶつりつくえてきCPU体系たいけい结构,而是いち种优てきVM节码,ざい这种じょう况下,对原始げんしつくえだい码的げんせいうらないりょうじょう风,とく别是ざい节码てきVMさい终将JITよう于本つくえだい码的じょう况下。[8]

启动のべ迟和优化

[编辑]

よし于加载和编译节码しょ需的时间,JITざい应用ほどじょてきはつはじめ执行ちゅうかい导致轻微いたあきら显的のべ迟。ゆう时这种延迟被しょう为“启动时间のべ迟”ある“预热时间”。一般いっぱんらい说,JIT执行てき优化えつ生成せいせいてきだい码就こしよしみただしはつはじめのべ迟也かい增加ぞうかよし此,JIT编译必须ざい编译时间希望きぼう生成せいせいてきだい码质りょう间进ぎょう权衡。じょりょうJIT编译そと,IO绑定操作そうさ也会增加ぞうか启动时间:れい如,JVMてき“rt.jar”类数すえぶんけん为40 MB,JVM必须ざい这个巨大きょだいてき上下じょうげぶんぶんけんちゅう寻找大量たいりょうすうすえ[9]

SunてきHotSpot Javaきょ拟机使用しようてき一种可能的优化方法是将解释和JIT编译结合おこりらい。应用ほどじょだい码最はつかい释的,ただしJVM监视哪些节码序列じょれつ经常执行,并将它们转换为机だい码,以便ざいかたけんじょう直接ちょくせつ执行。对于ただ执行几次てき节码,这节しょうりょう编译时间并减しょうりょうはつはじめのべ迟;对于频繁执行てき节码,JIT编译よう于在缓慢かい释的はつはじめ阶段きさき以高そく运行。此外,ゆかり于程じょはな费大りょう时间执行てき其实ただいちしょう部分ぶぶんだい码,いん此减しょうてき编译时间非常ひじょう重要じゅうようさいきさきざいはつはじめだい码解释期间,以在编译ぜん收集しゅうしゅう执行统计しんいき,这有じょ于执ぎょうさらこのみてき优化。[10]

せい确的权衡以根すえ具体ぐたいじょう况而变化。れい如,SunてきJavaきょ拟机ゆう两种主要しゅようしき: きゃく户机和服わふく务器。ざいきゃく户端しき,执行最小さいしょう程度ていどてき编译优化,以减しょう启动时间。ざいふく务器しきはた执行大量たいりょうてき编译优化,以牺牲启动时间来最大さいだい限度げんどひさげだか应用ほどじょ运行时的性能せいのう。其他Javaそく时编译器使用しよう一个方法执行次数的运行时度量,结合方法ほうほうてき节码だい小作こさく为一种启发式方法来决定何时编译。[11]还有てき使用しよう执行てき次数じすうあずか检测循环しょう结合。[12]一般いっぱんらい说,ざい短期たんき运行てき应用ほどじょちゅうじゅん确预测要优化てき方法ほうほうようざい长期运行てき应用ほどじょちゅうじゅん确得[13]

ほろてき本地ほんじ镜像生成せいせいえいNative Image Generator(Ngen)另一种减少初始延迟的方法。[14]Ngenしょう通用つうようちゅう间语げん映像えいぞうえいCommon Intermediate Languageなかてき节码预编译成つくえほんつくえだい码。よし此,需要じゅよう运行时编译。Visual Studio 2005带的.NET Framework 2.0ざいあんそうきさきりつそくざい所有しょゆうほろ软库dllじょう运行Ngen。预JIT提供ていきょうりょう一种提高启动时间的方法。ただし,它生成せいせいてきだい码质りょう可能かのう如JIT生成せいせいてきだい码质りょうこのみ原因げんいんあずかしずか态编译的だい码(ぼつゆう按配あんばいおけ优化えいprofile-guided optimizationざい极端じょう况下如JIT编译てきだい码的原因げんいんしょうどう缺乏けつぼう分析ぶんせきすうすえらい驱动,れい如,ない联缓そん[15]

还有いち些Java实现はたAOT编译あずかJIT编译Excelsior JETあるかい释器(GNU Compiler for Java)结合おこりらい

历史

[编辑]

最早もはや发布てきJIT编译通常つうじょう归功于约翰·むぎ卡锡ざい1960ねんLISPてき研究けんきゅう[16]ざいてき重要じゅうよう论文《符号ふごうひょう达式てき递归函数かんすう及其ざいつくえじょうてき计算》(Recursive functions of symbolic expressions and their computation by machine, Part Iだいいち部分ぶぶんちゅうひっさげいたりょうざい运行时被转换てき函数かんすういん此不需要じゅよう保存ほぞん编译出来できあな[17](虽然さらじゅん确的说法编译并执ぎょうけいえいCompile and go system”)。另一个早期的应用来自肯·汤普逊ざいぶんほん编辑QEDてきせい则表达式しきひきはいちゅう使用しようりょうJIT。[18]为了ひさげ高速度こうそくど,Thompsonざいあいようぶん系統けいとう上通かみとおり过JITいたIBM 7090だい码实现了せい则表达式ひきはい[16]1970ねん,Mitchellくび创了一种有影响力的从解释中获取编译代码的技术,ざい实验语言LC²ちゅう实现りょう这种わざ术。[19][20]

Smalltalk(1983ねん)开创りょうJIT编译てきしん领域。れい如,按需こぼし译为つくえだい码,缓存结果以供以后使用しようとううちそん不足ふそく时,けい统会删除部分ぶぶんだい码,并在需要じゅよう时重しん生成せいせい[4][21]SunてきSelf语言广泛あらため进了这些わざ术,一度是世界上速度最快的Smalltalkけい统;运用完全かんぜんめんこう对象てき语言实现りょうだか达优C语言一半いっぱんてき速度そくど[22]

SelfSunほう弃了,ただし研究けんきゅう转向りょうJava语言。“そく时编译”这个术语从制づくり术语“及时ちゅうらいてき,并由Java普及ふきゅう,James Gosling从1993ねん开始使用しよう这个术语。[23]目前もくぜんだい多数たすうJavaきょ拟机てき实现使用しようJITわざ术,いんHotSpot建立こんりゅうざい这个研究けんきゅうもと础之じょう,而且使用しよう广泛。

HPてき项目Dynamo[24]いち个实验性てきJIT编译,其字节码格式かくしきつくえだい码格しきしょうどうてき;该系统将PA-6000つくえだい码转换为PA-8000つくえだい码。あずかちょく相反あいはん,这导致了速度そくどてきひさげだかざいぼう些情况下30%,いん为这样做まこと许在つくえだい码级别进ぎょう优化,れい如,ない联代码以さら好地こうち使用しよう缓存,优化对动态库てき调用,以及许多其他つね规编译器无法尝试てき运行时优[25][26]

2019ねん3がつ30にちPHP宣布せんぷJITはた于2021ねん加入かにゅうPHP 8[27][28]

安全あんぜん

[编辑]

JIT编译从根本上ほんかん使用しよう执行すうすえいん此带らいりょう安全あんぜん挑战可能かのうてきほら

JIT编译てき实现包括ほうかつしょうげんだい码或节码编译なりつくえ码并执行它。这通常つうじょう直接ちょくせつざいないそんちゅう完成かんせいてき——JIT编译はたつくえだい直接ちょくせつ输出いたうちそんちゅう并立そく执行,而不ぞう通常つうじょうてきひさげぜん编译样将其输いた磁盘,しかきさきさく为单どくてきほどじょ调用だい码。ざい现代てき体系たいけい结构ちゅうゆかり执行そら间保护えいexecutable space protection,这会ぐういたいち个问题——无法ざい任意にんいないそんうら執行しっこうほどしきざい任意にんいないそんうら執行しっこうほどしき存在そんざい潜在せんざいてき安全あんぜんほらよし此,必须しょうないそん标记为可执行;于安ぜん原因げんいん,应在だい码写入内じゅだいそん并标记为ただ读之きさき执行,いん为可うつし/执行ないそん一个安全漏洞(まいりW^XえいW^X)。[29]れいFirefox なかてき JavaScript JIT 编译ざい Firefox 46 はん本中ほんなか引入りょう这种护。[30]

JIT喷射えいJIT sprayingいち利用りようほら利用りようまとわざ术,它使用しようJIT编译进行うずたか喷射えいheap spraying——生成せいせいてきないそんしかきさき执行てき,如果执行以移动到堆積たいせきちゅう,这就まこと利用りよう

まいり

[编辑]

ちゅう

[编辑]
  1. ^ ひさげぜん编译也可以针对特定とくていてきほろ体系たいけい结构,ただしAOTJIT间的别在于可移植いしょくせい。JIT以在运行时生成せいせい为当ぜん运行てきCPUりょうじょうせいてきだい码,而AOT必须ごとさき知道ともみち标CPU,而不为微构的广义しゅう进行优化,这样てきだい码不仅不能ふのうざい其他CPU类型じょう执行,而且可能かのう完全かんぜん稳定。

参考さんこう文献ぶんけん

[编辑]

引用いんよう

[编辑]
  1. ^ ちょう宇新, うめよしみ, & ほどとら. (1999). くに产开放けい统平だい Java 及时编译てき设计与实现 (Doctoral dissertation). http://www.cnki.com.cn/Article/CJFDTotal-JSJX199912010.htm页面そん档备份そん互联网档あん
  2. ^ ほろ软语げん门户术语搜索そうさく页面そん档备份そん互联网档あんちゅうえい语Just-in-time compilationいた简体ちゅうぶん
  3. ^ Languages, Compilers, and Runtime Systems, University of Michigan, Computer Science and Engineering, [2018-03-15], (原始げんし内容ないようそん于2018-03-26) 
  4. ^ 4.0 4.1 4.2 Aycock 2003.
  5. ^ Does the JIT take advantage of my CPU?. David Notario's WebLog. [2018-12-03]. (原始げんし内容ないようそん于2018-12-04). 
  6. ^ Croce, Louis. Just in Time Compilation (PDF). Columbia University. (原始げんし内容ないよう (PDF)そん档于2018-05-03). 
  7. ^ What are the advantages of JIT vs. AOT compilation. Stack Overflow. 2010-01-21. (原始げんし内容ないようそん于2020-04-24). 
  8. ^ javascript - Compile a JIT based lang to Webassembly. Stack Overflow. [2018-12-04]. (原始げんし内容ないようそん于2019-12-14). 
  9. ^ Haase, Chet. Consumer JRE: Leaner, Meaner Java Technology. Sun Microsystems. May 2007 [2007-07-27]. (原始げんし内容ないようそん于2007-08-12). At the OS level, all of these megabytes have to be read from disk, which is a very slow operation. Actually, it's the seek time of the disk that's the killer; reading large files sequentially is relatively fast, but seeking the bits that we actually need is not. So even though we only need a small fraction of the data in these large files for any particular application, the fact that we're seeking all over within the files means that there is plenty of disk activity.  
  10. ^ The Java HotSpot Performance Engine Architecture. Oracle.com. [2013-07-05]. (原始げんし内容ないようそん于2013-07-21). 
  11. ^ Schilling, Jonathan L. The simplest heuristics may be the best in Java JIT compilers (PDF). SIGPLAN Notices. February 2003, 38 (2): 36–46 [2020-04-18]. doi:10.1145/772970.772975. (原始げんし内容ないよう (PDF)そん档于2015-09-24). 
  12. ^ Toshio Suganuma, Toshiaki Yasue, Motohiro Kawahito, Hideaki Komatsu, Toshio Nakatani, "A dynamic optimization framework for a Java just-in-time compiler", Proceedings of the 16th ACM SIGPLAN conference on Object-oriented programming, systems, languages, and applications (OOPSLA '01), pp. 180–195, October 14–18, 2001.
  13. ^ Matthew Arnold, Michael Hind, Barbara G. Ryder, "An Empirical Study of Selective Optimization", Proceedings of the 13th International Workshop on Languages and Compilers for Parallel Computing-Revised Papers, pp. 49–67, August 10–12, 2000.
  14. ^ Native Image Generator (Ngen.exe). Msdn2.microsoft.com. [2013-07-05]. (原始げんし内容ないようそん于2008-04-05). 
  15. ^ Matthew R. Arnold, Stephen Fink, David P. Grove, Michael Hind, and Peter F. Sweeney, "A Survey of Adaptive Optimization in Virtual Machines页面そん档备份そん互联网档あん)", Proceedings of the IEEE, 92(2), February 2005, pp. 449–466.
  16. ^ 16.0 16.1 Aycock 2003,2. JIT Compilation Techniques, 2.1 Genesis, p. 98.
  17. ^ McCarthy, J. Recursive functions of symbolic expressions and their computation by machine, Part I. Communications of the ACM. April 1960, 3 (4): 184–195. CiteSeerX 10.1.1.111.8833可免费查阅. doi:10.1145/367177.367199. 
  18. ^ Thompson 1968.
  19. ^ Aycock 2003,2. JIT Compilation Techniques, 2.2 LC², p. 98–99.
  20. ^ Mitchell, J.G. The design and construction of flexible and efficient interactive programming systems. 1970. 
  21. ^ Deutsch, L.P.; Schiffman, A.M. Efficient implementation of the Smalltalk-80 system (PDF). POPL '84: Proceedings of the 11th ACM SIGACT-SIGPLAN Symposium on Principles of Programming Languages. 1984: 297–302 [2020-04-18]. ISBN 0-89791-125-3. doi:10.1145/800017.800542. (原始げんし内容ないよう (PDF)そん档于2004-06-18). 
  22. ^ そん副本ふくほん. [2020-04-18]. (原始げんし内容ないようそん档于2006-11-24). 
  23. ^ Aycock, 2003 & 2.14 Java, p. 107, footnote 13.
  24. ^ "Dynamo: A Transparent Dynamic Optimization System"页面そん档备份そん互联网档あん) Vasanth Bala, Evelyn Duesterwald, Sanjeev Banerjia - PLDI '00 Proceedings of the ACM SIGPLAN 2000 conference on Programming language design and implementation - pages 1 to 12 - doi:10.1145/349299.349303. Retrieved March 28, 2012
  25. ^ John Jannotti. HP's Dynamo - Page 1 - (3/2000). Ars Technica. [2013-07-05]. (原始げんし内容ないようそん于2012-02-05). 
  26. ^ The HP Dynamo Project. [2016-04-12]. (原始げんし内容ないようそん档于2002-10-19). 
  27. ^ PHP Gr8. [2020-04-18]. (原始げんし内容ないようそん于2020-02-23). 
  28. ^ PHP 8 and 7.4 to come with Just-in-time (JIT) to make most CPU-intensive workloads run significantly faster. April 2019 [2020-04-18]. (原始げんし内容ないようそん档于2020-10-07). 
  29. ^ "How to JIT – an introduction页面そん档备份そん互联网档あん)", Eli Bendersky, November 5th, 2013 at 5:59 am
  30. ^ De Mooij, Jan. W^X JIT-code enabled in Firefox. Jan De Mooij. [2016-05-11]. (原始げんし内容ないようそん于2016-05-14). 

らいみなもと

[编辑]

外部がいぶ链接

[编辑]