精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

什么是LLVM?Swift, Rust, Clang等語言背后的支持

開發 后端
要了解用于以編程方式生成機器原生代碼的編譯器框架是如何讓新語言的推出以及對現有的語言進行增強比以往更加容易了。新的語言,還有對現有語言的提升,在整個編程環境中正大行其道。

要了解用于以編程方式生成機器原生代碼的編譯器框架是如何讓新語言的推出以及對現有的語言進行增強比以往更加容易了。

新的語言,還有對現有語言的提升,在整個編程環境中正大行其道。Mozilla 的 Rust、Apple 的 Swift、Jetbrains 的 Kotlin,以及許多其它的語言都給開發者在速度、安全性、便利性、可移植性還有能力這些方面提供了新的選擇。

[[220551]]

為什么現在正當時呢?一個大因素就是那些用來構建語言的新工具,特別是編譯器。它們中首當其沖就是 LLVM (底層虛擬機 Low-Level Virtual Machine),這是一個開源項目,最開始作為伊利諾伊州大學的一個研究項目由 Swift 語言的創始人 Chris Lattner 進行開發。

LLVM 使創建新語言變得更加容易,同時也可以增強現有語言的開發。它提供了一些工具,用于自動執行語言創建任務中最不討人喜歡的部分:創建一個編譯器,將輸出的代碼移植到多個平臺和架構,編寫代碼來處理常見的語言隱喻,比如異常。它的自由授權意味著它可以自由地作為軟件組件重用或作為服務部署。

使用 LLVM 的語言名冊中有許多熟悉的名字。蘋果的 Swift 語言使用 LLVM 作為它的編譯器框架,而 Rust 則將 LLVM 作為其工具鏈的核心組件。而且,許多編譯器都有一個 LLVM 版本,如 Clang、C/C++ 編譯器(這個名稱叫做“C-lang”),它本身就是一個與 LLVM 緊密相連的項目。而 Kotlin,名義上是一種 JVM 語言,正在開發一種名為 Kotlin Native 的語言版本,它使用 LLVM 來編譯成機器原生代碼。

LLVM 定義

在它的核心,LLVM 是一個以編程方式創建機器原生代碼的庫。開發人員使用該 API 以一種稱為中間代理或 IR 的格式生成指令。然后 LLVM 可以將 IR 編譯成一個獨立的二進制文件,或者在另一個程序(如語言解釋器)的上下文中執行 JIT (just-in-time) 編譯。

LLVM 的 API 為開發在編程語言中發現的許多常見結構和模式提供了原始的方式。例如,幾乎每種語言都有函數和全局變量的概念。LLVM 將函數和全局變量作為其 IR 中的標準元素,因此,你只需在意 LLVM 的實現,并關注需要注意的語言部分,而不是花費時間和精力重新創建這些特定的輪子。

 

這是一個 LLVM 中間代理(IR)的例子。右邊是一個簡單的 C 程序;左邊是由 Clang 編譯器翻譯成 LLVM IR 的代碼。

LLVM:專為可移植性而生

關于 LLVM 的一個說法是它像常提到的 C 編程語言:C 語言有時候被認為是一種便攜式、高級的匯編語言,因為它可以緊密地映射到系統硬件的結構,而且它已經被移植到幾乎所有的系統架構。但是,C 語言只是作為一種可移植的匯編語言,是其工作方式的另一種效果;這并不是它的設計目標之一。

相比之下,LLVM 的 IR 是從一開始就設計為可移植的組件。它實現這種可移植性的一種方法是提供獨立于任何特定機器架構的原語。例如,整數類型不局限于底層硬件的***位寬度(例如 32 或 64 位),您可以根據需要使用盡可能多的比特字節來創建基本的整數類型,比如 128 位整數。您也不必擔心手工輸出來匹配特定處理器的指令集;LLVM 也會為你處理這個問題。

如果你希望看到 LLVM IR 的現場示例,請訪問 ELLCC 項目網站,并嘗試在瀏覽器中將 C 代碼轉換為 LLVM IR 的現場演示 Demo。

編程語言中如何使用 LLVM

LLVM 最常見的用例是作為一種語言的預先(AOT ahead-of-time)編譯器。但 LLVM 也可以用于即時編譯。

用 LLVM 進行即時編譯

有些情況下需要在運行時動態生成代碼,而不是預先編譯。例如,Julia 語言就是使用 JIT 編譯代碼,因為它需要快速運行,并通過 REPL(read-eval-print loop)或交互式提示與用戶交互。.Net 和 Mono 可以選擇通過 LLVM 后端方式編譯為原生代碼。

Numba 是一個 Python 的數學加速包,JIT 將所選擇的 Python 函數編譯成機器碼。它也可以預先編譯使用 Numba 裝飾器裝飾的代碼,但是(比如 Julia)Python 作為一種快速發展的解釋性語言,使用 JIT 編譯來產生這樣的代碼更好地補充了 Python 的交互式工作流,比 Python 的預先編譯方式更好。

其他人正在嘗試以非正統方式使用 LLVM 作為 JIT 編譯方式,例如編譯 PostgreSQL 查詢,據說性能提高了五倍。

 

Numba 使用 LLVM 進行即時編譯數字代碼并加速其執行。JIT 加速過的 sum2d 函數的執行速度比常規 Python 代碼快 139 倍。

使用 LLVM 進行自動代碼優化

LLVM 不僅將 IR 編譯為原生機器碼。你也可以直接以編程的方式在整個鏈接過程中高度精細地優化代碼。優化方式是相當積極主動的,能夠實現包括內聯函數在內,消除死代碼(包括未使用的類型聲明和函數參數)和展開循環這些事情。

這里再一次強調,LLVM 的力量讓你不必自己實現所有這一切。LLVM 可以為您處理它們,您也可以根據需要直接禁用。例如,如果你想要一些更小的二進制代碼,那么你可以讓你的編譯器告訴 LLVM 禁用循環展開。

使用 LLVM 的領域特定語言

LLVM 已被用于生成多種通用語言的編譯器,但它也可用于生成高度垂直或排他性問題域的語言。從某種意義上說,這就是 LLVM 最閃光的地方,因為它在創造這樣一類語言方面消除了諸多苦差事,并使其表現良好。

例如,Emscripten 項目采用 LLVM IR 代碼并將其轉換為 JavaScript,理論上支持使用 LLVM 作為后端的任何語言導出可在瀏覽器中運行的代碼。長期規劃是支持基于 LLVM 的后端并能夠生成 WebAssembly 代碼,Emscripten 是 LLVM 靈活性的一個很好的例子。

LLVM 可以被使用的另一種方法是將特定領域的擴展添加到現有語言。Nvidia 使用 LLVM 創建了 Nvidia CUDA 編譯器,該編譯器允許語言為 CUDA 添加原生支持,它是作為你生成的原生代碼的一部分編譯的,而不是通過附帶的庫進行調用的。

在不同語言中使用 LLVM

使用 LLVM 的典型方式是通過你所熟悉的語言來編寫代碼(當然也要有支持 LLVM 的庫)。

兩種常見的可選語言是 C 和 C++。許多 LLVM 開發者會因為以下的原因而默認選擇其中的一個:

  • LLVM 本身是用 C++ 編寫的
  • LLVM 的 API 以 C 和 C++ 版本提供
  • 大量的語言開發往往會以 C/C++ 作為一個基礎

不過,這兩種語言并不是唯一的選擇。許多語言都可以原生調用 C 語言庫,所以理論上可以用任何這樣的語言進行 LLVM 開發。但需要有一個實際的語言庫可以很好地封裝 LLVM API。幸運的是,許多語言和語言運行時都有這樣的庫,包括 C#/.Net/Mono, Rust, Haskell, OCAML, Node.js, Go, 和 Python。

 

需要注意的是,一些與 LLVM 的語言綁定可能不完整。以 Python 為例,有很多種綁定選擇,但每個選項的完整性和實用性各不相同:

LLVM 項目維護著自己的一套到 LLVM 的 C API 的綁定,但是目前他們沒有繼續維護。

llvmpy 在 2015 年后就沒有進行維護了 —— 這對于任何軟件項目都是不利的,在使用 LLVM 時更是如此,因為每個版本的 LLVM 都有一些變化。

由創建 Numba 的團隊開發的 llvmlite 已經成為當前在 Python 中的 LLVM 的競爭者。它只實現了 LLVM 功能的一個子集,正如 Numba 項目的需求所規定的那樣。但是這個子集滿足了絕大多數 LLVM 用戶所需。

llvmcpy 旨在為 C 庫帶來***的 Python 綁定,它以自動化的方式保持更新,并使用 Python 的習慣用法來訪問它們。llvmcpy 還處于早期階段,但是已經可以用 LLVM API 做一些基本的工作。

如果你對如何使用 LLVM 庫構建語言感興趣,不妨看看 LLVM 的創建者撰寫的使用 C++ 或 OCAML 語言的教程,它將一步步指導你創建一種簡單的名為 Kaleidoscope 的語言。它還被移植到其他語言之上:

  • Haskell:參考原始教程的直接移植。
  • Python:在此網站的教程和原始版本非常相近,而另一個版本則是用交互式命令行進行更為雄心勃勃的重寫。這兩種版本都使用 llvmlite 作為到 LLVM 的綁定。
  • Rust 和 Swift:不可避免地,我們不得不將該教程移植到這兩種語言之上,它們都是由 LLVM 自身幫助使其誕生的。

***,這個教程也有其他國家語言版本的。這里有中文版,分別是使用原始的 C++ 和 Python 版本。

LLVM 尚未實現的功能

了解 LLVM 可以實現的功能的同時,有必要知道 LLVM 目前尚未實現的功能。

例如,LLVM 不解析語言的語法。因為目前已經有許多工具實現這個功能,比如 lex/yacc, flex/bison,以及ANTLR。解析語法就意味著必須從編譯中解耦出來,難怪 LLVM 并沒有涉及這個領域。

LLVM 也不會直接干涉到開發語言的軟件文化,比如安裝編譯器的二進制文件、如何在安裝中管理軟件包、升級工具鏈 —— 這些都需要開發者自己去實現。

***也是最重要的一點是,LLVM還沒有對部分通用語言成分給出原語。許多語言都具有某種垃圾回收的內存管理方式,或者是作為管理內存的主要方式,或者作為對 RAII ( C++ 底層實現的自動垃圾回收,表面使用 Rust 語法)等策略的附屬方式。LLVM 并不會給你一個垃圾回收機制,但是它提供了實現垃圾回收的工具,它允許在代碼中使用元數據標記,讓編寫垃圾回收器變得更加容易。

盡管如此,但是 LLVM 未來還有有可能添加原生的機制來實現垃圾回收機制。LLVM 正在快速發展中,大概 6 個月就會有一次大版本的更新。由于當前的許多語言都使用 LLVM 作為開發的核心,因此 LLVM 的迭代速度只會更快而不會放慢。

責任編輯:未麗燕 來源: 開源中國編譯
相關推薦

2016-12-12 14:19:59

LLVMClangApple

2021-12-27 11:11:30

LLVMSPIR-V后端

2018-04-13 10:56:14

編譯器工具開發者

2020-11-03 10:32:22

編譯器工具代碼

2021-04-25 18:09:53

Fedora 35編譯器開發

2023-06-01 19:24:16

2017-04-11 08:36:09

iOS編譯應用

2020-11-13 07:19:45

元編程模型Java

2022-03-02 09:49:14

Rust編程語言

2021-12-09 09:20:42

RustLinux內核開發者

2022-11-24 13:05:27

ClangiOS

2015-12-04 10:05:09

蘋果編程開源

2021-01-14 15:49:10

Linux 5.12GCC編譯器

2024-05-06 09:26:06

Rust語言編碼

2022-03-27 23:11:39

Go語言函數

2016-01-29 09:38:03

編程swiftubuntu

2017-11-21 11:05:29

谷歌操作系統Swift

2024-02-22 10:17:39

AI模型

2025-10-29 02:11:00

2021-03-23 14:50:16

編程語言Rust漏洞
點贊
收藏

51CTO技術棧公眾號

中文字幕久久综合| 丝袜美腿亚洲一区二区| a级黄色片免费| 神马一区二区三区| 久久丁香综合五月国产三级网站| 久色乳综合思思在线视频| 日本少妇xxxx| 日本国产亚洲| 婷婷综合在线观看| 一区二区冒白浆视频| 三级在线观看网站| 韩日av一区二区| 欧美亚洲一级片| 神马午夜精品91| 天天躁日日躁狠狠躁欧美| 欧美精品高清视频| 老头吃奶性行交视频| 国产精品传媒毛片三区| 欧美成人三级在线观看| 免费看成人哺乳视频网站| 日韩亚洲欧美在线观看| 久久婷婷国产91天堂综合精品| 美足av综合网| 亚洲国产高清在线| 久久人人九九| www.av网站| 久久99国产精品免费| 日本精品久久电影| 久久婷婷国产麻豆91| 亚洲免费二区| 中文字幕亚洲图片| 一区二区三区四区免费| 美女呻吟一区| 亚洲电影免费观看高清完整版在线| 中文字幕亚洲影院| 国产伊人久久| 欧美午夜一区二区三区| 老司机午夜av| a欧美人片人妖| 午夜精品福利一区二区三区蜜桃| 欧洲精品在线播放| a毛片在线观看| 亚洲精品美腿丝袜| 穿情趣内衣被c到高潮视频| 免费观看在线午夜影视| 国产精品久久久一本精品| 欧美婷婷久久| 国产午夜视频在线观看| 日本一区二区综合亚洲| 日韩aⅴ视频一区二区三区| 黄色片免费在线| 久久亚洲欧美国产精品乐播| 蜜桃导航-精品导航| 五月婷婷丁香网| 2021久久国产精品不只是精品| 久久riav| 国产大片在线免费观看| 国产亚洲精品精华液| 五月天亚洲综合情| 秋霞午夜在线观看| 亚洲乱码国产乱码精品精的特点| 警花观音坐莲激情销魂小说 | 亚洲欧美制服另类日韩| wwwwxxxx国产| 日韩国产一区| 久久伊人精品一区二区三区| 毛片a片免费观看| 99人久久精品视频最新地址| 欧美有码在线观看| 亚洲精品国产精品国自产网站按摩| 蜜臀av一级做a爰片久久| 国产精品一区二区三区在线播放| 国产精品午夜福利| 成人精品视频.| 欧美成ee人免费视频| a√在线中文网新版址在线| 亚洲特黄一级片| 人妻无码久久一区二区三区免费| 人人视频精品| 欧美肥妇毛茸茸| 一级黄色电影片| 亚洲调教一区| 久久久精品久久久久| 日韩av无码中文字幕| 天堂一区二区在线免费观看| 成人在线观看视频网站| 日本久久一级片| 欧美—级在线免费片| 300部国产真实乱| 在线观看欧美日韩电影| 777欧美精品| 国产成人精品无码片区在线| 成人三级视频| 久久久久久亚洲| 波多野结衣绝顶大高潮| 国产黄色精品网站| 久久久精品国产亚洲| a资源在线观看| 欧美国产三级| 日本精品久久久久影院| 精品国产99久久久久久宅男i| 99视频精品全部免费在线| 视频一区国产精品| av人人综合网| 亚洲一区二区四区| 黄色www视频| 久久精品视频一区二区三区| aaa免费在线观看| 亚洲欧美电影| 日韩欧美国产系列| 亚洲AV无码成人精品区明星换面| 欧美欧美全黄| 国产精品视频免费在线| 无码国产精品高潮久久99| 亚洲欧美激情小说另类| 国产精品宾馆在线精品酒店| 麻豆一区在线| 最近2019中文字幕第三页视频| 国产乡下妇女做爰毛片| 国精品**一区二区三区在线蜜桃| 欧美在线播放一区| av福利在线导航| 日韩视频在线永久播放| 精品丰满少妇一区二区三区| 亚洲影视综合| 国产免费一区| 性欧美videos高清hd4k| 欧美欧美午夜aⅴ在线观看| 少妇大叫太粗太大爽一区二区| 欧美二区视频| 成人久久久久爱| 91在线视频免费看| 欧美亚洲国产bt| 少妇大叫太粗太大爽一区二区| 亚洲激情偷拍| 国产伦一区二区三区色一情| 免费毛片在线看片免费丝瓜视频 | 欧美猛男性生活免费| 91高潮大合集爽到抽搐| 18视频免费网址在线观看| 亚洲精品伦理在线| 激情成人在线观看| 希岛爱理av一区二区三区| 欧美特黄不卡| 欧美精品自拍偷拍| 黑人と日本人の交わりビデオ| 视频一区二区三区在线| 欧美日韩成人一区二区三区| 欧美三区四区| 中文字幕日韩在线观看| 亚洲视频在线观看免费视频| 欧美国产精品专区| 第四色婷婷基地| 国产精品二区不卡| 亚洲一区二区三区在线免费观看| 1区2区在线观看| 日韩欧美国产精品| 国产黄色片视频| 97se亚洲国产综合在线| 人妻内射一区二区在线视频| 精品国产乱码久久久| 国产精品一区二区电影| 日本在线视频观看| 日韩一级完整毛片| 国产一卡二卡在线| 国产色一区二区| 无尽裸体动漫2d在线观看| 亚洲精品国产成人影院| 国产成人av一区二区三区| 玖玖在线播放| 尤物yw午夜国产精品视频| 中文字幕在线观看高清| 亚洲精品中文字幕乱码三区| 深田咏美中文字幕| 日韩成人午夜电影| 操bbb操bbb| 亚洲第一福利专区| 91精品久久久久久久久久久久久| 伦理av在线| 亚洲欧美中文另类| 国产强伦人妻毛片| 日韩欧美在线免费| 四虎精品免费视频| 91在线国产观看| 中文字幕在线综合| 亚洲国产午夜| 亚洲最新免费视频| 欧美成人专区| 成人免费网站在线观看| 色在线免费观看| 久久久国产精品x99av| 亚洲 欧美 激情 小说 另类| 欧美另类一区二区三区| 国产精品999在线观看| 国产精品五月天| 国产精品一区二区人妻喷水| 老司机精品视频导航| 欧美在线一区视频| 91精品国产91久久久久久密臀| 精品国产乱码久久久久久久软件 | 国产91免费视频| 2019年精品视频自拍| 欧美激情videos| 三区四区电影在线观看| 日韩电影中文字幕一区| 国产黄频在线观看| 欧美喷潮久久久xxxxx| 一级黄色大片视频| 亚洲成av人片一区二区三区| 欧美性x x x| 亚洲国产精品成人综合| 国精品无码人妻一区二区三区| 国产v日产∨综合v精品视频| 乌克兰美女av| 视频一区在线播放| 3d动漫一区二区三区| 欧美午夜a级限制福利片| 一级二级三级欧美| 久草成人资源| 美国av一区二区三区| 懂色av一区二区| 7777精品伊久久久大香线蕉语言| 欧美电影在线观看网站| 国产精欧美一区二区三区| 精精国产xxxx视频在线野外| 久久久久久999| 岛国中文字幕在线| 精品国产欧美一区二区三区成人| 高h视频在线| 亚洲男女自偷自拍图片另类| 欧美一级淫片免费视频魅影视频| 日韩欧美久久一区| 国产黄色高清视频| 欧美丰满一区二区免费视频| 一级黄色大毛片| 欧美日韩一区精品| 中文字幕+乱码+中文乱码91| 91成人网在线| 日韩不卡高清视频| 欧美亚洲一区二区在线| 成年人av网站| 在线免费亚洲电影| 波多野结衣视频在线观看| 色综合天天综合网天天狠天天| 天天爽夜夜爽夜夜爽精品| 精品日韩中文字幕| 国产情侣自拍av| 欧美日韩一区二区免费在线观看| 亚洲一区欧美在线| 色综合久久88色综合天天6| 久久久久久不卡| 欧美亚一区二区| 曰批又黄又爽免费视频| 3d动漫精品啪啪一区二区竹菊| 国产免费不卡视频| 精品国产一区二区三区忘忧草| 三级小视频在线观看| 亚洲美女在线观看| 2021av在线| 九九久久综合网站| sm捆绑调教国产免费网站在线观看| 亚洲**2019国产| 香蕉成人av| 国产日韩精品电影| 91精品丝袜国产高跟在线| 国产精品yjizz| 九九综合九九| 国产美女视频免费| 国产精品久久国产愉拍| 无码少妇一区二区三区芒果| 极品尤物av久久免费看| 国产伦精品一区二区三区88av| 国产亚洲一区二区三区| 国产美女久久久久久| 精品国产福利在线| 国产精品999在线观看| 欧美日本韩国一区二区三区视频| 亚洲AV无码精品自拍| 日韩精品高清视频| 免费大片在线观看www| 孩xxxx性bbbb欧美| 成人在线不卡| 国产精成人品localhost| 国产探花一区二区| avove在线观看| 久久亚洲精选| 日本特黄在线观看| 国产午夜亚洲精品理论片色戒| 国产黄色片在线免费观看| 色婷婷综合中文久久一本| 国产黄色大片网站| 怡红院精品视频| 九色porny丨入口在线| 成人做爰www免费看视频网站| 日韩av网站在线免费观看| 亚洲五码在线观看视频| 水蜜桃久久夜色精品一区的特点 | 日日摸日日碰夜夜爽av| 国产一区欧美日韩| 国产又粗又猛又爽又黄av| 亚洲日穴在线视频| 国产情侣小视频| 亚洲国产一区二区三区四区 | 8050国产精品久久久久久| 国产精品视频一区二区三区综合| 欧美午夜精品久久久久久蜜| 午夜欧美精品久久久久久久| 成人午夜激情av| 94色蜜桃网一区二区三区| 天天干中文字幕| 欧美精品久久久久久久久老牛影院 | sm捆绑调教国产免费网站在线观看| 国产伦精品一区二区三区精品视频| 天堂成人娱乐在线视频免费播放网站| 日本xxxxx18| 久久超碰97人人做人人爱| 久久久久久久久久久久| 精品人伦一区二区三区蜜桃网站 | 欧美人成在线观看| 国产精品自拍三区| 日韩一区二区三区四区视频| 91久久精品国产91性色tv| 国产高清第一页| 久久深夜福利免费观看| 成人亚洲视频| 亚洲一区二区在线看| 日本不卡一二三区黄网| 最近中文字幕在线mv视频在线| 日韩欧美一区二区三区| 天堂av中文字幕| 97热精品视频官网| 国产精品国产| 欧美又粗又长又爽做受| 国产精品一区二区三区乱码| 国产盗摄一区二区三区在线| 91麻豆精品国产91久久久| 麻豆tv入口在线看| 91久久久久久久一区二区| 婷婷激情图片久久| 亚洲激情在线看| 亚洲精选一二三| 性一交一乱一色一视频麻豆| 色综合91久久精品中文字幕| 日韩精品中文字幕一区二区| 男人c女人视频| 国产91高潮流白浆在线麻豆| 国产在线综合网| 亚洲国产小视频| www.成人爱| 亚洲乱码国产乱码精品天美传媒| 免费观看30秒视频久久| 萌白酱视频在线| 日韩精品专区在线影院观看| 欧美黑人xx片| 久久久99国产精品免费| 亚洲一区二区免费看| 摸摸摸bbb毛毛毛片| 欧美精品v日韩精品v韩国精品v| 国产网友自拍视频导航网站在线观看| 亚洲综合日韩在线| 99精品福利视频| 午夜在线观看一区| 欧美精品tushy高清| 免费网站在线观看人| 欧美日韩一区在线视频| 日本不卡的三区四区五区| 精品无码一区二区三区蜜臀| 日韩精品在线网站| videos性欧美另类高清| 中国人体摄影一区二区三区| 成人午夜免费电影| 无码人妻精品一区二区| 久久综合九色九九| 蜜臀av一区| 性生活免费在线观看| 亚洲五月六月丁香激情| 黄色影院在线播放| 7777精品久久久大香线蕉小说| 久久激情久久| 中文字幕另类日韩欧美亚洲嫩草| 亚洲精品99久久久久中文字幕| 精品自拍视频| 国产一区二区三区小说| 国产三级精品三级在线专区| 99久久免费国产精精品| 欧美诱惑福利视频| 久久精品亚洲人成影院| 欧美亚一区二区三区| 91精品国产福利在线观看| 麻豆免费在线| 777久久精品一区二区三区无码| 久久久综合网站| www久久久久久| 国产精品一区久久久| 夜夜精品视频| 日本a级片视频| 中文字幕久久久av一区| 久久黄色影视| 亚洲天堂网站在线| 欧洲激情一区二区|