日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

从LLVM说起,有关CPU架构,JIT等

發(fā)布時間:2024/3/26 编程问答 58 豆豆
生活随笔 收集整理的這篇文章主要介紹了 从LLVM说起,有关CPU架构,JIT等 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

文章目錄

    • LLVM
    • CPU架構
      • PowerPC
      • ARM
      • X86
      • MIPS
    • 編譯執(zhí)行和解釋執(zhí)行
    • JIT編譯

LLVM

LLVM(Low Level Virtual Machine,不過官方為了避免混淆已經(jīng)棄用該名稱,將LLVM作為項目的全名),這是一個用 C++ 編寫的開源項目,最開始作為伊利諾伊州大學的一個研究項目由 Swift 語言的創(chuàng)始人 Chris Lattner 進行開發(fā)。LLVM項目是模塊化、可重用的編譯器以及工具鏈技術的集合。

LLVM提供了與編譯器相關的支持,可以作為多種語言編譯器的后端來使用,能夠進行程序語言的編譯期優(yōu)化、鏈接優(yōu)化、在線編譯優(yōu)化、代碼生成。

LLVM從一個學術研究項目進化成C、C++和Objective C編譯器的通用后端。成功的關鍵是性能和適應能力,兩者都得益于LLVM獨特的設計和實現(xiàn)。
傳統(tǒng)的編譯器架構為:
Source Code -> [ Frontend & Optimizer & Backend ] -> Machine Code
對比,LLVM的架構為:
Source Code @ x -> [ x Frontend ] -> [ LLVM Optimizer @ IR ] -> [ LLVM m Backend ] -> Machine Code @ m
其中,x為C/C++, Objcect C等多種語言;m為x86,PowerPC,ARM等多種CPU架構。

  • 不同的前端后端使用統(tǒng)一的中間代碼LLVM Intermediate Representation (LLVM IR)
  • 優(yōu)化階段是一個通用的階段,它針對的是統(tǒng)一的LLVM IR,和具體語言無關;
  • 擴展性好:如果需要支持一種新的編程語言,那么只需要實現(xiàn)一個新的前端;如果需要支持一種新的硬件設備,那么只需要實現(xiàn)一個新的后端
  • 關于架構和示例,更詳盡的說明參見:https://www.jianshu.com/p/1367dad95445

    LLVM常見應用:

  • 作為一種編程語言的預先(AOT ahead-of-time)編譯器,或者用于即時編譯(JIT just-in-time)編譯器。
  • 使用 LLVM 進行自動代碼優(yōu)化。
  • 創(chuàng)建一門新的語言。LLVM將創(chuàng)建語言過程中最麻煩的事情:把編程語言翻譯成多個平臺上的可執(zhí)行代碼,做了支持和簡化,所以,更容易使它創(chuàng)建一門新的語言。
  • 為多種語言進行橋接,因為在IR層次多種語言是一致的,所以,你可以將你的語言轉換為其他任何支持LLVM的語言。
  • 使用LLVM豐富的工具鏈作為自己編程語言的強大支持。
  • CPU架構

    PowerPC

    二十世紀九十年代,IBM(國際商用機器公司)、Apple(蘋果公司)和Motorola(摩托羅拉)公司開發(fā)PowerPC芯片成功,并制造出基于PowerPC的多處理器計算機。
    后來,主流的PowerPC處理器制造商有IBM、Freescale? Semiconductor(原摩托羅拉半導體部)、AMCC、LSI等。其中以IBM和Freescale的PowerPC處理器最為流行。

    目前,PowerPC已經(jīng)走向沒落。
    INTEL面對的是大眾市場,信奉“摩爾定律”,在競爭激烈的隔熱PC的市場,保持超強戰(zhàn)斗力。IBM面對專業(yè)市場,新一代出來后,做得好不好,銷量其實都差不多,技術人員向前發(fā)展的精神動力幾乎就沒有了。
    由于 IBM PC 兼容機的逐步普及,技術上相對落后的英特爾反而占了更多的市場份額。在業(yè)務上,半導體只是摩托羅拉的一個部門,而微機處理器又只是其半導體部門的一項業(yè)務,可是它對于英特爾來講卻是全部。隨著蘋果也開始使用英特爾的處理器,摩托羅拉徹底推出了微機處理器市場:2005年,喬幫主在WWDC大會上正式宣布將在2年內將全部電腦產(chǎn)品轉向Intel平臺,2006年1月,搭載Intel Core Duo處理器的iMac和Macbook Pro就已經(jīng)面世。
    Android+ARM的陣營,使得一些公司做手機等終端的門檻大大的降低:小米、Oppo、華為這樣的廠商迅速崛起,也是得益于此。
    網(wǎng)關、交換機、路由等等本應該是屬于大功耗RISC處理器的應用場景,PowerPC、MIPS原本牢牢占據(jù)這個領域,但是隨著多核ARM的強大,逐步也失去優(yōu)勢。

    ARM

    ARM架構,過去稱作進階精簡指令集機器(Advanced RISC Machine,更早稱作:Acorn RISC Machine),是一個32位精簡指令集(RISC)處理器架構,其廣泛地使用在許多嵌入式系統(tǒng)設計。

    ARM 公司本身并不靠自有的設計來制造或出售 CPU ,而是將處理器架構授權給有興趣的廠家。例如,生產(chǎn)廠商有:TI (德州儀器)/Samsung(三星)/Freescale(飛思卡爾)/Marvell(馬維爾)/Nvidia(英偉達)。
    對于授權方來說,ARM 提供了 ARM 內核的整合硬件敘述,包含完整的軟件開發(fā)工具(編譯器、debugger、SDK),以及針對內含 ARM CPU 硅芯片的銷售權。

    X86

    x86架構是重要地可變指令長度的CISC(復雜指令集電腦,Complex Instruction Set Computer),是英代爾Intel首先開發(fā)制造的一種微處理器體系結構的泛稱。

    架構底層有大量的硬件專利,x86架構做pc主板還有大量的外設和接口的專利,這么多年下來,形成了堅強的壁壘。第三方要想突破這樣的壁壘,還需要各種外設和操作系統(tǒng)來形成的新的標準和專利的話,基本不可能。
    那么只有從intel或者AMD獲得x86架構的授權一條路,現(xiàn)在想獲得授權,這兩家都不會賣了,就算賣也是天價,加上研發(fā)成本的投入,成本就太高了,沒法正常運營。
    現(xiàn)在Amd市場占有率現(xiàn)在也就是百分之十左右,在盈利和虧損之間徘徊,第三家介入的話,不會比AMD更好。
    intel的強大還在于它是最先進的半導體生產(chǎn)工藝制造商,三星和臺積電都要排在后面。

    威盛是除Intel、AMD之外,唯一一家擁有X86架構授權的公司,當然也是從intel授權來的,曾經(jīng)有“臺灣英特爾”之稱,也曾于研發(fā)投入和人才各方面的原因,除了在低功耗等領域有領先的產(chǎn)品,后來也逐步退出了這個市場。

    MIPS

    MIPS是世界上很流行的一種RISC處理器。MIPS的意思是“無內部互鎖流水級的微處理器”(Microprocessor without interlocked piped stages),其機制是盡量利用軟件辦法避免流水線中的數(shù)據(jù)相關問題。
    MIPS技術公司是美國著名的芯片設計公司,MIPS自己只進行CPU的設計,之后把設計方案授權給客戶,使得客戶能夠制造出高性能的CPU。

    編譯執(zhí)行和解釋執(zhí)行

    編譯過程是將源代碼轉換為機器碼的過程。
    編譯執(zhí)行:整體編譯完了,再開始執(zhí)行。舉例:C/C++。
    解釋執(zhí)行:直接解釋源代碼,并且直接執(zhí)行,沒有編譯過程。舉例:JavaScript,python。

    無論是編譯執(zhí)行還是解釋執(zhí)行,都需要經(jīng)過:源碼 -> 詞法分析 -> 單詞流 -> 語法分析 -> 抽象語法樹 的過程。
    此后,
    編譯執(zhí)行會先將抽象語法樹經(jīng)過優(yōu)化器并產(chǎn)生優(yōu)化后的中間代碼(可選),然后再生成目標代碼。
    解釋執(zhí)行會先將抽象語法樹轉換為指令流(可選),然后再通過解釋器進行解釋執(zhí)行。

    編譯器:把源程序的每一條語句都編譯成機器語言,并保存成二進制文件,這樣運行時計算機可以直接以機器語言來運行此程序,速度很快。
    解釋器:只在執(zhí)行程序時,才一條一條把字節(jié)碼解釋成機器語言給計算機來執(zhí)行。

    Java的執(zhí)行模式:

  • 方式一:用javac編譯器將java源代碼編譯成我們常見的 .class文件(其中實現(xiàn)的是字節(jié)碼,一種中間代碼),然后程序在運行時,JVM將需要用到的 .class文件加載到內存中,從class文件中逐行讀出每條指令,JVM中解釋器解釋每條指令并執(zhí)行,即解釋執(zhí)行。
  • 方式二:JDK1.2版本開始引入JIT編譯。開始依然是由javac編譯為.class文件,在程序運行時,JIT通過預熱(收集信息找出熱點)將熱點代碼以方法為單位,從字節(jié)碼轉換為機器碼。在這種情況下,部分熱點代碼就是編譯執(zhí)行而不是解釋執(zhí)行了。
  • 方式三:oracle JDK9就引入了實驗性的AOT特性,直接將字節(jié)碼編譯成機器碼,這樣避免了JIT等方面的預熱消耗。
  • JIT編譯

    動態(tài)編譯(dynamic compilation)指的是“在運行時進行編譯”;與之相對的是事前編譯(ahead-of-time compilation,簡稱AOT),也叫靜態(tài)編譯(static compilation)。
    JIT編譯(just-in-time compilation)狹義來說是當某段代碼即將第一次被執(zhí)行時進行編譯,因而叫“即時編譯”。JIT編譯是動態(tài)編譯的一種特例。JIT編譯一詞后來被泛化,時常與動態(tài)編譯等價。

    sun公司在jdk8之后的JVM技術實現(xiàn)是HotSpot,這里還有一層關系,JDK是java開發(fā)環(huán)境,JRE是java運行環(huán)境,JDK包含JRE,而JRE包含JVM。也就是說HotSpot是JVM的實現(xiàn)技術,是用C+匯編語言編寫的,主要功能包括一個解釋器和兩個編譯器,這也是為什么jdk8之后的JAVA是編譯與解釋混合執(zhí)行模式的原因。兩個編譯器可以成為JIT編譯器,即動態(tài)編譯器,是兩種模式,server模式和client模式。

    JVM(特指Oracle JDK的HotSpot虛擬機)中的JIT特性:

  • HotSpot虛擬機中內置了兩個即時編譯器:Client Complier和Server Complier,分別用在客戶端和服務端。默認是采用解釋器與其中一個編譯器直接配合的方式工作。
  • 用Client Complier可以獲取更高的編譯速度,用Server Complier可以獲取更好的編譯質量。程序使用哪個編譯器,取決于虛擬機運行的模式。HotSpot虛擬機會根據(jù)自身版本與宿主機器的硬件性能自動選擇運行模式,用戶也可以使用“-client”或“-server”參數(shù)去強制指定虛擬機運行在Client模式或Server模式。
  • 運行過程中會被即時編譯器編譯的“熱點代碼”有兩類:被多次調用的方法和被多次調用的循環(huán)體。
  • 在優(yōu)化時,無論循環(huán)體還是方法,編譯器都是以整個方法作為編譯對象。
  • HotSpot虛擬機采用基于計數(shù)器的熱點探測方法,會設定方法調用計數(shù)器和回邊計數(shù)器。
  • 觸發(fā)了JIT編譯后,在默認設置下,執(zhí)行引擎并不會同步等待編譯請求完成,而是繼續(xù)進入解釋器按照解釋方式執(zhí)行字節(jié)碼;編譯工作在后臺線程中進行;當編譯工作完成后,下一次調用該方法或代碼時,就會使用已編譯的版本。
  • 對一般的Java方法而言,編譯后代碼的大小相對于字節(jié)碼的大小,膨脹比可能達到10倍以上。
  • 總結

    以上是生活随笔為你收集整理的从LLVM说起,有关CPU架构,JIT等的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內容還不錯,歡迎將生活随笔推薦給好友。