llvm與gcc

llvm與gcc

  1. llvm 是一個編譯器,也是一個編譯器架構,是一系列編譯工具,也是一個編譯器工具鏈,開源 C++11 實現。

  2. gcc 相對于 clang 的優勢:

    • gcc 支持更過語言前端,如 Java, Ada, FORTRAN, Go等
    • gcc 支持更多地 CPU 目標架構
    • gcc 支持更多語言擴展,比如 gcc 可以完美地支持 Linux Kernel 的編譯,而 clang 會遇到一些擴展的問題
  3. clang 相對于 gcc 的優勢:

    • clang 的 AST 和整個設計是人類可以閱讀的
    • clang 的模塊化和復用性更好,clang 從初衷上就是以 API 的形式設計,可以被源碼分析工具,重構,IDE等復用。而 gcc 在設計時就沒有這個考量,gcc 被設計為“一大團”靜態編譯器,總之就是可以實現功能,并且功能很強大(上面優點),但其中內容基本不可知,gcc 的設計就沒有考慮復用性
    • clang 可以序列化其生成的 AST 到硬盤上并且被其他程序讀入,這對整個程序的分析很有用,gcc 不支持這項功能
    • llvm 的優化在全程都會進行,包括編譯時優化,鏈接時優化,裝載時優化,運行時優化,以及閑時優化。可參考:LLVM全時優化。
    • clang 更快且用更少內存
    • clang 在設計時就考慮提供更加清晰準確地診斷信息(error 和 warning 信息)
    • gcc 的許可證是 GPL,clang 是 BSD

gcc 就像橡皮泥,能夠塑造出任何優秀的作品,但基本沒有復用性可言;llvm 就像樂高積木,雖然更加粗獷,但是模塊化和復用性極佳。

在這里插入圖片描述

那么,llvm 框架模塊化的優勢究竟是怎樣在其他領域為其他應用帶來巨大的便利的呢?以下整理自 知乎@藍色 大佬的一個回答(LLVM相比于GCC,有哪些技術上的優勢?):

  • 統一的IR與模塊化。你可以很輕易的抽取LLVM的組件(以庫的形式)出來用于其它領域,如抽取LLVM JIT用于 MapD 這樣的 GPU 數據庫,或者抽取LLVM的整個后端(優化與CodeGen)用于 TVM 這樣的深度學習推理框架。這樣帶來的好處就是 LLVM 不再僅僅是用于給 Clang 等編譯器前端提供服務的編譯器后端,而是可以為需要JIT / CodeGen 功能的所有領域服務,比如提到的GPU數據庫、深度學習推理框架,還包括安全、區塊鏈等應用領域。而這一切LLVM所需要的僅僅是一個統一的中間表示格式:LLVM IR。所以,現在比較常見的開發模式變為:

    各種各樣的應用(DSL、GPU數據庫、TVM、安全、區塊鏈等)----> 生成 LLVM IR ----> LLVM的優化 ----> LLVM Code Gen ----> 目標代碼(ARM、x86、Hexagon、NVPTX、AMDGPU、WebAssembly…)。 這在LLVM出現之前,基本上是做不到的事情,不僅GCC,包括其它編譯器都可以理解為“一坨”,根本抽不出來。

  • 快速的可定制化。這一點架設在第一點的基礎上,由于在LLVM中編寫優化Pass非常方便,所以針對各種各樣的應用,可以變為:

    • 各種各樣的應用(DSL、GPU數據庫、TVM、安全、區塊鏈等)----> 生成 LLVM IR ----> 編寫針對自己特定應用的優化Pass ----> LLVM的優化 ----> LLVM Code Gen ----> 目標代碼(ARM、x86、Hexagon、NVPTX、AMDGPU、WebAssembly…)

    • 也包括:各種各樣的應用(DSL、GPU數據庫、TVM、安全、區塊鏈等)----> 生成 LLVM IR ----> 編寫針對自己特定應用的優化Pass ----> LLVM的優化 ----> LLVM Code Gen ----> 目標代碼(ARM、x86、Hexagon、NVPTX、AMDGPU、WebAssembly,自己的后端(如AI芯片)…)

  • 使用現代C++代碼編寫并有良好的代碼組織。LLVM使用C++11編寫,代碼十分清晰與規范,對于閱讀并且改寫非常的方便。同時,其代碼組織非常的好,每一個地方放什么東西,一目了然。而我也與一些同僚聊過,大家也都覺得LLVM是更好讀、更好改的代碼。

  • License優勢。這一點是優勢,但是是否是技術優勢,看如何理解,但是這一點確實幫助了LLVM很多,讓其快速被各大公司采用并不斷回饋它。

Ref:

https://www.youtube.com/watch?v=RzrHuP2aVEg

https://www.zhihu.com/question/23807363

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/532650.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/532650.shtml
英文地址,請注明出處:http://en.pswp.cn/news/532650.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

攻防世界web新手區解題 view_source / robots / backup

1**. view_source** 題目描述:X老師讓小寧同學查看一個網頁的源代碼,但小寧同學發現鼠標右鍵好像不管用了。 f12查看源碼即可發現flag 2. robots 題目描述:X老師上課講了Robots協議,小寧同學卻上課打了瞌睡,趕緊來教教…

python參數傳遞*args和**kwargs

python參數傳遞*args和**kwargs 和* 實際上真正的Python參數傳遞語法是 * 和 ** 。*args 和 **kwargs 只是一種約定俗成的編程實踐。我們也可以寫成 *vars 和 **kvars 。就如同其他常規變量的命名一樣, args 和 kwargs 只是一種習慣的名稱。 *args 和 **kwargs 一…

聽GPT 講Rust源代碼--src/tools(25)

File: rust/src/tools/clippy/clippy_lints/src/methods/suspicious_command_arg_space.rs 在Rust源代碼中,suspicious_command_arg_space.rs文件位于clippy_lints工具包的methods目錄下,用于實現Clippy lint SUSPICIOUS_COMMAND_ARG_SPACE。 Clippy是Ru…

Java一次編譯,到處運行是如何實現的

Java一次編譯,到處運行是如何實現的 轉自:https://cloud.tencent.com/developer/article/1415194 (排版微調) JAVA編譯運行總覽 Java是一種高級語言,要讓計算機執行你撰寫的Java程序,也得通過編譯程序的…

JIT(動態編譯)和AOT(靜態編譯)編譯技術比較

JIT(動態編譯)和AOT(靜態編譯)編譯技術比較 轉自:https://www.cnblogs.com/tinytiny/p/3200448.html Java 應用程序的性能經常成為開發社區中的討論熱點。因為該語言的設計初衷是使用解釋的方式支持應用程序的可移植…

python解釋器

python解釋器 計算機編程語言 本部分參考自:https://zhuanlan.zhihu.com/p/141212114 從計算機編程語言說起,它主要分為三類:機器語言、匯編語言、高級語言。 機器語言是一種計算機可以直接識別并執行的二進制指令集。由于其可以直接交給…

編譯型語言與解釋型語言

編譯型語言與解釋型語言 首先要說明,編譯型語言與解釋型語言這種分類方法是不科學的,或者說已經過時了,但是這種稱呼大抵還是能夠讓人明白我們將要討論的是什么東西。 文中所列參考是筆者認為比較有幫助的一些擴展閱讀內容。 首先貼一個很形…

常見的各種shell及其區別

常見的各種shell及其區別 引子 for((i1;i<10;i)); do echo $(expr $i \* 3 1); done 網上搜到的 shell for循環腳本&#xff0c;別人都能正常運行&#xff0c;我卻報錯&#xff1a; Syntax error: Bad for loop variable究竟是怎么回事呢&#xff1f; shell簡介…

shell腳本 變量

shell腳本 變量類型 什么是Shell變量 用一個固定的字符串去表示不固定的內容。 Shell變量的類型 shell腳本中自定義變量的類型&#xff0c;我們這里分為&#xff1a; 自定義變量環境變量位置變量與定義變量 這四類&#xff0c;它們有一些相同點&#xff0c;但又有些不同點…

攻防世界web新手區解題 /cookie / disabled_button / weak_auth

cookie 題目描述&#xff1a;X老師告訴小寧他在cookie里放了些東西&#xff0c;小寧疑惑地想&#xff1a;‘這是夾心餅干的意思嗎&#xff1f;’ 使用burp suite抓包查看 發現提示&#xff1a; look-herecookie.php 于是在url后加上 cookie.php 得到提示查看返回 就得到了f…

Python 函數式編程

Python 函數式編程 轉自&#xff1a;https://www.liaoxuefeng.com/wiki/1016959663602400/1017328525009056&#xff0c;推薦去該鏈接讀原文&#xff0c;有習題和熱烈的評論區交流。 函數式編程 函數是Python內建支持的一種封裝&#xff0c;我們通過把大段代碼拆成函數&…

Python中的生成器與迭代器

Python中的生成器與迭代器 轉自&#xff1a;https://www.liaoxuefeng.com/wiki/1016959663602400/1017323698112640&#xff0c;推薦去該鏈接讀原文&#xff0c;有習題和熱烈的評論區交流。 生成器 通過列表生成式&#xff0c;我們可以直接創建一個列表。但是&#xff0c;受…

基于GET報錯的sql注入,sqli-lab 1~4

根據注入類型可將sql注入分為兩類&#xff1a;數字型和字符型 例如&#xff1a; 數字型&#xff1a; sleect * from table where if 用戶輸入id 字符型&#xff1a;select * from table where id 用戶輸入id &#xff08;有引號) 通過URL中修改對應的D值&#xff0c;為正常數字…

Python 裝飾器詳解(上)

Python 裝飾器詳解&#xff08;上&#xff09; 轉自&#xff1a;https://blog.csdn.net/qq_27825451/article/details/84396970&#xff0c;博主僅對其中 demo 實現中不適合python3 版本的語法進行修改&#xff0c;并微調了排版&#xff0c;本轉載博客全部例程博主均已親測可行…

xss原理和注入類型

XSS漏洞原理 : XSS又叫CSS(cross Site Script), 跨站腳本攻擊,指的是惡意攻擊者往Web頁面里插入惡意JS代碼,當用戶瀏覽該頁時,嵌入其中的Web里的JS代碼就會被執行,從而達到惡意的特殊目的. 比如:拿到cooike XSS漏洞分類: 反射性(非存儲型) payload沒有經過存儲,后端接收后,直接…

Python 裝飾器詳解(中)

Python 裝飾器詳解&#xff08;中&#xff09; 轉自&#xff1a;https://blog.csdn.net/qq_27825451/article/details/84581272&#xff0c;博主僅對其中 demo 實現中不適合python3 版本的語法進行修改&#xff0c;并微調了排版&#xff0c;本轉載博客全部例程博主均已親測可行…

存儲型xss案例

存儲型xss原理: 攻擊者在頁面插入xss代碼,服務端將數據存入數據庫,當用戶訪問存在xss漏洞的頁面時,服務端從數據庫取出數據展示到頁面上,導致xss代碼執行,達到攻擊效果 案例: 在一個搭建的論壇網站中, 根據存儲型xss注入的條件,要找到可以存儲到數據庫的輸入位置,并且這個位置…

反射型XSS案例

**原理:**攻擊者將url中插入xss代碼,服務端將url中的xss代碼輸出到頁面上,攻擊者將帶有xss代碼的url發送給用戶,用戶打開后受到xss攻擊 需要url中有可以修改的參數 案例: 可能存在反射型xss的功能(點) : 搜索框等&#xff08;所有url會出現參數的地方都可以嘗試&#xff09;……

Python 裝飾器詳解(下)

Python 裝飾器詳解&#xff08;下&#xff09; 轉自&#xff1a;https://blog.csdn.net/qq_27825451/article/details/84627016&#xff0c;博主僅對其中 demo 實現中不適合python3 版本的語法進行修改&#xff0c;并微調了排版&#xff0c;本轉載博客全部例程博主均已親測可行…

xss-lab靶場通關writeup(1~6.......在更新)

level 2 : 標簽被編碼&#xff0c;利用屬性完成彈窗 輸入 發現沒有彈窗 查看源代碼&#xff1a; 發現&#xff1a; <>符號被編碼 說明keybord參數進行了處理&#xff0c;那么只能從屬性上進行惡意編碼&#xff1a;先將屬性的引號和標簽閉合&#xff0c;用 // 將后面的…