基於llvm編譯器的編程語言
❶ c語言是用什麼語言編寫的匯編嗎
C語言源中信悉自Ken Thompson發明的B語言,而 B語言則源自BCPL語言坦賣。
1967年,劍橋大學的Martin Richards對CPL語言進行了簡化,於是產生了BCPL(Basic Combined Programming Language)語言。
1972年,美國貝爾實驗室的 D.M.Ritchie 在B語言的基礎上最終設計出了一種新的語言,他取了BCPL的第二個字母作為這種語言的名字,這就是C語言。
C語言編譯器:
GCC,GNU組織開發的開源免費的賣乎編譯器
MinGW,Windows操作系統下的GCC
Clang,開源的BSD協議的基於LLVM的編譯器
Visual C++:: cl.exe,Microsoft VC++自帶的編譯器
C語言集成開發環境:
Code::Blocks,開源免費的C/C++ IDE
CodeLite,開源、跨平台的C/C++集成開發環境
Dev-C++,可移植的C/C++IDE
C-Free
Light Table
Visual Studio系列
❷ 適合win10系統的c語言編譯器
桌面操作系統
對於當前主流桌面操作系統而言,可使用 VisualC++、GCC以及 LLVM Clang 這三大編譯器。
Visual C++(簡稱 MSVC)只能用於 Windows 操作系統;GCC 和 LLVM Clang除了可用於Windows操作系統之外,主要用於 Unix/linux操作系統。
像現在很多版本的 Linux 都默認使用 GCC 作為C語言編譯器,而像 FreeBSD、macOS 等系統默認使用 LLVM Clang 編譯器。由於當前 LLVM 項目主要在 Apple 的主推下發展的,所以在 macOS中,Clang 編譯器又被稱為 Apple LLVM 編譯器。
MSVC 編譯器主要用於 Windows 操作系統平台下的應用程序開發,它不開源。用戶可以使用 Visual Studio Community 版本來免費使用它,但是如果要把通過 Visual Studio Community 工具生成出來的應用進行商用,那麼就得好好閱讀一下微軟的許可證和說明書了。
而使用 GCC 與 Clang 編譯器構建出來的應用一般沒有任何限制,程序員可以將應用程序隨意發布和進行商用。
MSVC 編譯器對 C99 標準的支持就十分有限,加之它壓根不支持任何 C11 標准,所以本教程中設計 C11 的代碼例子不會針對 MSVC 進行描述。所幸的是,Visual Studio Community 2017 加入了對 Clang 編譯器的支持,官方稱之為——Clang with Microsoft CodeGen,當前版本基於的是 Clang 3.8。
也就是說,應用於 Visual Studio 集成開發環境中的 Clang 編譯器前端可支持 Clang 編譯器的所有語法特性,而後端生成的代碼則與 MSVC 效果一樣,包括像 long 整數類型在 64 位編譯模式下長度仍然為 4 個位元組,所以各位使用的時候也需要注意。
為了方便描述,本教程後面涉及 Visual Studio 集成開發環境下的 Clang 編譯器簡稱為 VS-Clang 編譯器。
嵌入式系統
而在嵌入式系統方面,可用的C語言編譯器就非常豐富了,比如:
用於 Keil 公司 51 系列單片機的 Keil C51 編譯器;
當前大紅大紫的 Arino 板搭載的開發套件,可用針對 AVR 微控制器的 AVRGCC 編譯器;
ARM 自己出的 ADS(ARM Development Suite)、RVDS(RealView Development Suite)和當前最新的 DS-5 Studio;
DSP 設計商 TI(Texas Instruments)的 CCS(Code Composer Studio);
DSP 設計商 ADI(Analog Devices,Inc.)的 Visual DSP++ 編譯器,等等。
- 通常,用於嵌入式系統開發的編譯工具鏈都沒有免費版本,而且一般需要通過國內代理進行購買。所以,這對於個人開發者或者嵌入式系統愛好者而言是一道不低的門檻。
- 不過 Arino 的開發套件是可免費下載使用的,並且用它做開發板連接調試也十分簡單。Arino 所採用的C編譯器是基於 GCC 的。
- 還有像樹莓派(Raspberry Pi)這種迷你電腦可以直接使用 GCC 和 Clang 編譯器。此外,還有像 nVidia 公司推出的 Jetson TK 系列開發板也可直接使用 GCC 和 Clang 編譯器。樹莓派與 Jetson TK 都默認安裝了 Linux 操作系統。
- 在嵌入式領域,一般比較低端的單片機,比如 8 位的 MCU 所對應的C編譯器可能只支持 C90 標准,有些甚至連 C90 標準的很多特性都不支持。因為它們一方面內存小,ROM 的容量也小;另一方面,本身處理器機能就十分有限,有些甚至無法支持函數指針,因為處理器本身不包含通過寄存器做間接過程調用的指令。
- 而像 32 位處理器或 DSP,一般都至少能支持 C99 標准,它們本身的性能也十分強大。而像 ARM 出的 RVDS 編譯器甚至可用 GNU 語法擴展。
- 下圖展示了上述C語言編譯器的分類。
❸ 如何利用LLVM寫一個編譯器
LLVM有自己的教程,如果你只想做個玩具,那可以首先試著實現LLVM Tutorial: Table of Contents的Kaleidoscope。深入的,請看他的文檔http://llvm.org/docs/
Kaleidoscope是一個範式簡單的腳本語言,教程里的詞法,語法分析都是手寫的,基本流程就是詞法語法解析,利用LLVM的API生成中間代碼並執行。
我用visual studio編譯的LLVM(version 3.6)實現過Kaleidoscope,我遇到的坑不少,如果你想以visual studio編譯的LLVM實現Kaleidoscope,你可能同樣會遇到
1. LLVM的生成目標對象為ELF格式,在windows下使用JIT的API時會出現incompatible object format的錯誤警告,需要在通過重新設定Mole的triple,我的PC的getTargetTriple的結果是「i686-pc-windows-msvc」,直接在後面再加上「-elf」即可
TheMole->setTargetTriple("i686-pc-windows-msvc-elf");
2. LLVM不支持windows下通過動態鏈接導出函數,如果需要使用C/C++的函數,需要通過addSymbol進行注冊
llvm::sys::DynamicLibrary::AddSymbol(/*std::string("_") +*/ "printd", &printd);
3. Kaleidoscope里使用的JIT的查找函數的API,getPointerToFunction已經被棄用了,需要替換為getFunctionAddress
❹ c語言的編程開發
GCC,GNU組織開發的開源免費的編譯器
MinGW,Windows操作系統下的GCC
Clang,開源的BSD協議的基於LLVM的編譯器
Visual C++ :: cl.exe,Microsoft VC++自帶的編譯器 CodeBlocks,開源免費的C/C++ IDE
CodeLite,開源、跨平台的C/C++集成開發環境
Orwell Dev-C++,可移植的C/C++IDE
C-Free
Light Table
Visual Stdio系列 起初,C語言沒有官方標准。1978年由美國電話電報公司(AT&T)貝爾實驗室正式發表了C語言。布萊恩·柯林漢(Brian Kernighan) 和 丹尼斯·里奇(Dennis Ritchie) 出版了一本書,名叫《The C Programming Language》。這本書被 C語言開發者們稱為K&R,很多年來被當作 C語言的非正式的標准說明。人們稱這個版本的 C語言為K&R C。
K&R C主要介紹了以下特色:
結構體(struct)類型
長整數(long int)類型
無符號整數(unsigned int)類型
把運算符=+和=-改為+=和-=。因為=+和=-會使得編譯器不知道使用者要處理i = -10還是i =- 10,使得處理上產生混淆。
即使在後來ANSI C標准被提出的許多年後,K&R C仍然是許多編譯器的最 准要求,許多老舊的編譯器仍然運行K&R C的標准。 1970到80年代,C語言被廣泛應用,從大型主機到小型微機,也衍生了C語言的很多不同版本。
1983年,美國國家標准協會(ANSI)成立了一個委員會X3J11,來制定 C語言標准。
1989年,美國國家標准協會(ANSI)通過了C語言標准,被稱為ANSI X3.159-1989 Programming Language C。因為這個標準是1989年通過的,所以一般簡稱C89標准。有些人也簡稱ANSI C,因為這個標準是美國國家標准協會(ANSI)發布的。
1990年,國際標准化組織(ISO)和國際電工委員會(IEC)把C89標準定為C語言的國際標准,命名為ISO/IEC 9899:1990 - Programming languages -- C 。因為此標準是在1990年發布的,所以有些人把簡稱作C90標准。不過大多數人依然稱之為C89標准,因為此標准與ANSI C89標准完全等同。
1994年,國際標准化組織(ISO)和國際電工委員會(IEC)發布了C89標准修訂版,名叫ISO/IEC 9899:1990/Cor 1:1994 ,有些人簡稱為C94標准。
1995年,國際標准化組織(ISO)和國際電工委員會(IEC)再次發布了C89標准修訂版,名叫ISO/IEC 9899:1990/Amd 1:1995 - C Integrity ,有些人簡稱為C95標准。 1999年1月,國際標准化組織(ISO)和國際電工委員會(IEC)發布了C語言的新標准,名叫ISO/IEC 9899:1999 - Programming languages -- C ,簡稱C99標准。這是C語言的第二個官方標准。
在C99中包括的特性有: 增加了對編譯器的限制,比如源程序每行要求至少支持到 4095 位元組,變數名函數名的要求支持到 63 位元組(extern 要求支持到 31)。 增強了預處理功能。例如: 宏支持取可變參數 #define Macro(...) __VA_ARGS__ 使用宏的時候,允許省略參數,被省略的參數會被擴展成空串。 支持 // 開頭的單行注釋(這個特性實際上在C89的很多編譯器上已經被支持了) 增加了新關鍵字 restrict, inline, _Complex, _Imaginary, _Bool 支持 long long, long double _Complex, float _Complex 等類型 支持不定長的數組,即數組長度可以在運行時決定,比如利用變數作為數組長度。聲明時使用 int a[var] 的形式。不過考慮到效率和實現,不定長數組不能用在全局,或 struct 與 union 里。 變數聲明不必放在語句塊的開頭,for 語句提倡寫成 for(int i=0;i<100;++i) 的形式,即i 只在 for 語句塊內部有效。 允許採用(type_name){xx,xx,xx} 類似於 C++ 的構造函數的形式構造匿名的結構體。 復合字面量:初始化結構的時候允許對特定的元素賦值,形式為:
struct test{int a[3],b;} foo[] = { [0].a = {1}, [1].a = 2 }; struct test{int a, b, c, d;} foo = { .a = 1, .c = 3, 4, .b = 5 }; // 3,4 是對 .c,.d 賦值的 格式化字元串中,利用 u 支持 unicode 的字元。 支持 16 進制的浮點數的描述。 printf scanf 的格式化串增加了對 long long int 類型的支持。 浮點數的內部數據描述支持了新標准,可以使用 #pragma 編譯器指令指定。 除了已有的 __line__ __file__ 以外,增加了 __func__ 得到當前的函數名。 允許編譯器化簡非常數的表達式。 修改了 /% 處理負數時的定義,這樣可以給出明確的結果,例如在C89中-22 / 7 = -3, -22% 7 = -1,也可以-22 / 7= -4, -22% 7 = 6。 而C99中明確為 -22 / 7 = -3, -22% 7 = -1,只有一種結果。 取消了函數返回類型默認為 int 的規定。 允許 struct 定義的最後一個數組不指定其長度,寫做 [](flexible array member)。 const const int i 將被當作 const int i 處理。 增加和修改了一些標准頭文件,比如定義 bool 的 <stdbool.h> ,定義一些標准長度的 int 的 <inttypes.h> ,定義復數的 <complex.h> ,定義寬字元的 <wctype.h> ,類似於泛型的數學函數 <tgmath.h>, 浮點數相關的 <fenv.h>。 在<stdarg.h> 增加了 va_ 用於復制 ... 的參數。里增加了 struct tmx ,對 struct tm 做了擴展。 輸入輸出對寬字元以及長整數等做了相應的支持。 GCC和其它一些商業編譯器支持C99的大部分特性。 2011年12月8日,國際標准化組織(ISO)和國際電工委員會(IEC)再次發布了C語言的新標准,名叫ISO/IEC 9899:2011 - Information technology -- Programming languages -- C ,簡稱C11標准,原名C1X。這是C語言的第三個官方標准,也是C語言的最新標准。
新的標准提高了對C++的兼容性,並增加了一些新的特性。這些新特性包括: 對齊處理(Alignment)的標准化(包括_Alignas標志符,alignof運算符, aligned_alloc函數以及<stdalign.h>頭文件。 _Noreturn 函數標記,類似於 gcc 的 __attribute__((noreturn))。 _Generic 關鍵字。 多線程(Multithreading)支持,包括: _Thread_local存儲類型標識符,<threads.h>頭文件,裡麵包含了線程的創建和管理函數。 _Atomic類型修飾符和<stdatomic.h>頭文件。 增強的Unicode的支持。基於C Unicode技術報告ISO/IEC TR 19769:2004,增強了對Unicode的支持。包括為UTF-16/UTF-32編碼增加了char16_t和char32_t數據類型,提供了包含unicode字元串轉換函數的頭文件<uchar.h>. 刪除了 gets() 函數,使用一個新的更安全的函數gets_s()替代。 增加了邊界檢查函數介面,定義了新的安全的函數,例如 fopen_s(),strcat_s() 等等。 增加了更多浮點處理宏。 匿名結構體/聯合體支持。這個在gcc早已存在,C11將其引入標准。 靜態斷言(static assertions),_Static_assert(),在解釋 #if 和 #error 之後被處理。 新的 fopen() 模式,(「…x」)。類似 POSIX 中的 O_CREAT|O_EXCL,在文件鎖中比較常用。 新增 quick_exit() 函數作為第三種終止程序的方式。當 exit()失敗時可以做最少的清理工作。
❺ c語言如何編程求圓體積和表面積
/*定義浮點型變數*/float r,h,v;/*提示用戶輸入變數*/printf("請輸入圓柱體的半徑和高:")
/*輸入兩個變數*/scanf("%f%f",&r,&h)
/*計算體積*/v=3.14*r*r*h;/*輸出體積值*/printf"圓柱體的體積為%f",float r,h,s,v
printf("please in put r and h:");scanf("%f%f",&r,&h);v=f1( r, h);s=f2( r, h);printf("%f,%f",s,v)
(5)基於llvm編譯器的編程語言擴展閱讀
c語言具體內容:
for循環結構是c語言中最具有特色的循環語句,使用最為靈活方便,它的一般形式為:for(表達式1;表達式2;表達式3)循環體語句 。(其中;不能省略)
表達式1為初值表達式,用於在循環開始前為循環變數賦初值。表達式2是循環控制邏輯表達式,它控制循環執行的條件,決定循環的次數。
表達式3為循環控制變數修改表達式,它使for循環趨向結束。循環體語句是在循環控制條件成立的情況下被反復執行的語句。
但是在整個for循環過程中,表達式1隻計算一次,表達式2和表達式3則可能計算多次,也可能一次也不計算。循環體可能多次執行,也可能一次都不執行。
先執行表達式2,然後執行循環結構,最後表達式3,一直這樣循環下去。for循環語句是c語言種功能最為強大的語句,甚至在一定程度上可以代替其他的循環語句。
do循環結構,do 1 while⑵;的執行順序是1->2->1...循環,2為循環條件。while循環結構,while(1) 2; 的執行順序是1->2->1...循環,1為循環條件
以上循環語句,當循環條件表達式為真則繼續循環,為假則跳出循環。
❻ c語言編程的平台是什麼
c語言編程的平台是:
1、GCC,GNU組織開發的開源免費的編譯器;
2、MinGW,Windows操作系統下的GCC;
3、Clang,開源的BSD協議的基於LLVM的編譯器;
4、Visual C++ :: cl.exe,Microsoft VC++自帶的編譯器。
(6)基於llvm編譯器的編程語言擴展閱讀
選擇開發平台注意事項
一、windows
開發環境:visual studio
特點:集成開發環境、簡單易用、完整的工具集
缺點:需要授權(也有免費版)體積龐大、無法學習到背後工程代碼組織情況、不利於初學者掌握代碼編譯、鏈接過程、工程管理
二、unix 或者類unix (包過aix,open solaris ,*bsd, linux)
開發環境:編譯工具 gcc、clang ...等等
代碼編輯器:vim、emacs等
工程組織:make,CMake
特點:操作系統集成很多工具,所有的工具幾乎開源且免費、短小精悍、功能強大
缺點:需要自己動手搭建開發環境、熟悉編譯工具、
熟悉編輯器操作、熟悉類unix操作系統的操作。
入門門檻高需要在命令模式下使用腳本、make等工具完成開發工作