編譯器語法對比
編譯器是把你的代碼(高級語言)解釋為CPU指令的一種程序。
你說的這個文本編輯器應該是開發環境,編輯器就是幫助你寫出正確語法的代碼、設置工程屬性的一個環境。
『貳』 c語言的編譯器為什麼有許多不同的版本並且在不同的編譯器版本下C語言的語法規則也不盡相同
新的版本都是基於舊的版本升級過來的,以此來改善編譯器的性能、增加對新平台的支持以及提高競爭能力。
不同的編譯器支持的標准語法是一致的(不然沒資格稱C編譯器),但是每個編譯器自身可以添加額外的語法、庫來擴展語言的表達能力,這就是所謂的xx編譯器擴展。使用語言擴展通常能獲得較高的性能和靈活性,但是損失了跨平台性。
不僅僅是編譯器有很多版本,語言本身都有很多版本,目前C語言的版本是C11,下一個版本為C1y。
『叄』 C語言的編譯器為什麼有許多不同的版本並且在不同的編譯器版本下C語言的語法規則也不盡相同
C的標准本來就有多個版本,目前編譯器採用的標准比較常見的是ANSI C和C99。另外語言標准中也存在未定義行為,留給編譯器實現自己去定義。各種編譯器對標準的實現也未必完全遵守(C還好,C++這種特別復雜的語言就很難做到完全遵守標准了),而且往往還增加一些自己的擴展,預定義宏之類的。這些都給跨編譯器編碼帶來麻煩。不過總體而言C是個比較單純的語言,除非程序員故意,一般搞不出太多給編譯器出難題的花樣。作為長期用C++的程序員,非常羨慕C代碼編譯時那種飛快的速度。
麻煩採納,謝謝!
『肆』 編譯器二:LLVM和GCC的區別
GCC: GNU Compiler Collection
GCC屬於傳統編譯器,傳統編譯器的工作原理基本上都是三段式的,可以分為前端(Frontend)、優化器(Optimizer)、後端(Backend)。前端負責解析源代碼,檢查語法錯誤,並將其翻譯為抽象的語法樹(Abstract Syntax Tree)。優化器對這一中間代碼進行優化,試圖使代碼更高效。後端則負責將優化器優化後的中間代碼轉換為目標機器的代碼,這一過程後端會最大化的利用目標機器的特殊指令,以提高代碼的性能。
事實上,不光靜態語言如此,動態語言也符合上面這個模型,例如Java。Java Virtual Machine也利用上面這個模型,將Java代碼翻譯為Java bytecode。這一模型的好處是,當我們要支持多種語言時,只需要添加多個前端就可以了。當需要支持多種目標機器時,只需要添加多個後端就可以了。對於中間的優化器,我們可以使用通用的中間代碼。
這種三段式的結構還有一個好處,開發前端的人只需要知道如何將源代碼轉換為優化器能夠理解的中間代碼就可以了,他不需要知道優化器的工作原理,也不需要了解目標機器的知識。這大大降低了編譯器的開發難度,使更多的開發人員可以參與進來。
雖然這種三段式的編譯器有很多有點,並且被寫到了教科書上,但是在實際中這一結構卻從來沒有被完美實現過。做的比較好的應該屬Java和.NET虛擬機。虛擬機可以將目標語言翻譯為bytecode,所以理論上講我們可以將任何語言翻譯為bytecode,然後輸入虛擬機中運行。但是這一動態語言的模型並不太適合C語言,所以硬將C語言翻譯為bytecode並實現垃圾回收機制的效率是非常低的。
GCC也將三段式做的比較好,並且實現了很多前端,支持了很多語言。但是上述這些編譯器的致命缺陷是,他們是一個完整的可執行文件,沒有給其它語言的開發者提供代碼重用的介面。即使GCC是開源的,但是源代碼重用的難度也比較大。
LLVM: Low Level Virtual Machine
LLVM最初是[Low Level Virtual Machine]的縮寫,定位是一個虛擬機,但是是比較底層的虛擬機。它的出現正是為了解決編譯器代碼重用的問題,LLVM一上來就站在比較高的角度,制定了LLVM IR這一中間代碼表示語言。LLVM IR充分考慮了各種應用場景,例如在IDE中調用LLVM進行實時的代碼語法檢查,對靜態語言、動態語言的編譯、優化等。
LLVM與GCC在三段式架構上並沒有本質區別。LLVM與其它編譯器最大的差別是,它不僅僅是Compiler Collection,也是Libraries Collection。舉個例子,假如說我要寫一個XYZ語言的優化器,我自己實現了PassXYZ演算法,用以處理XYZ語言與其它語言差別最大的地方。而LLVM優化器提供的PassA和PassB演算法則提供了XYZ語言與其它語言共性的優化演算法。那麼我可以選擇XYZ優化器在鏈接的時候把LLVM提供的演算法鏈接進來。LLVM不僅僅是編譯器,也是一個SDK。
『伍』 C++編譯器哪個比較好
編譯器有很多,但是比較好用的還是microsoft visual c++ 。
具體如下:
1、簡介
Microsoft Visual C++是Microsoft公司推出的開發Win32環境程序,面向對象的可視化集成編程系統。
2、特點
它不但具有程序框架自動生成、靈活方便的類管理、代碼編寫和界面設計集成交互操作、可開發多種程序等優點,而且通過簡單的設置就可使其生成的程序框架支持資料庫介面、OLE2,WinSock網路、3D控制界面。它以擁有「語法高亮」,IntelliSense(自動編譯功能)以及高級除錯功能而著稱。比如,它允許用戶進行遠程調試,單步執行等。
3、編譯
允許用戶在調試期間重新編譯被修改的代碼,而不必重新啟動正在調試的程序。其編譯及建置系統以預編譯頭文件、最小重建功能及累加連結著稱。這些特徵明顯縮短程式編輯、編譯及連結的時間花費,在大型軟體計劃上尤其顯著。
『陸』 C#與C++的語法差異(以描述C#為主)
c#的主函數:public static void Main(String[] arg)
c++的主函數:int main( ) 或者int main( int argc, char *argv[] )其中arg都是參數,c#在類中定義main函數,所以要用靜態的定義。
C#要求所有的運算符重載都聲明為public和static,這表示它們與它們的類或結構相關聯,而不是與實例相關聯。
c++還可以用友元函數。
c#字元串是String類型的對象,它的值是文本。在內部,文本被存儲為Char對象的順序只讀集合。C# 字元串末尾沒有以 null 結尾的字元;因此 C# 字元串可以包含任意數目的嵌入式 null 字元(「 」)。字元串的Length屬性代表它包含的Char對象的數量,而不是 Unicode 字元的數量。
C++支持兩種字元串:C風格字元串和string。之所以拋棄char*的字元串而選用C++標准程序庫中的string類,是因為他和前者比較起來,不必擔心內存是否足夠、字元串長度等等,而且作為一個類出現,他集成的操作函數足以完成我們大多數情況下(甚至是100%)的需要。我們可以用 = 進行賦值操作,== 進行比較,+ 做串聯。我們盡可以把它看成是C++的基本數據類型。此外,CString類在MFC中廣泛應用,簡化了字元串的處理。
c++ static靜態變數或靜態函數只有本文件內的代碼才能訪問它,它的名字在其它文件中不可見。
用法1:函數內部聲明的static變數,可作為對象間的一種通信機制
用法2:局部靜態對象
用法3:靜態成員和靜態成員函數c# static
1. 用在類里的屬性、方法前面,這樣的靜態屬性與方法不需要創建實例就能訪問,
通過類名或對象名都能訪問它,靜態屬性、方法只有「一份」:即如果一個類新建有N個
對象,這N 個對象只有同一個靜態屬性與方法
2. 方法內部的靜態變數:
方法內部的靜態變數,執行完靜態變數值不消失,再次執行此對象的方法時,值仍存在,
它不是在棧中分配的,是在靜態區分析的, 這是與局部變數最大的區別c++ extern可以置於變數或者函數前,以標示變數或者函數的定義在別的文件中,提示編譯器遇到此變數和函數時在其他模塊中尋找其定義。此外extern也可用來進行鏈接指定。
c#extern修飾符用於聲明在外部實現的方法。extern修飾符的常見用法是在使用 Interop 服務調入非託管代碼時與DllImport特性一起使用。在這種情況下,還必須將方法聲明為static
內部類實例化了,而外部類還未實例化,這樣內部類就不能訪問外部類的非靜態成員了
不可以,面向對象的方法應該都在類中。不過個人覺著可以用委託來代替這種用法
應該是MyClass &b=new MyClass()
C++中支持指針和引用,指針既可以改地址,也可以改指針指向地址的值。而引用則無法修改地址,只能改值,託管c#取消了指針,引用和c++的引用一樣,只不過不用加&*->之類的符號了,統統用.來訪問
另外,c++和c#一樣結構體是值類型,類是引用類型
1. 值類型的數據存儲在內存的棧中;引用類型的數據存儲在內存的堆中,而內存單元中只存放堆中對象的地址。
2. 值類型存取速度快,引用類型存取速度慢。
3. 值類型表示實際數據,引用類型表示指向存儲在內存堆中的數據的指針或引用
4. 值類型繼承自System.ValueType,引用類型繼承自System.Object
5. 棧的內存分配是自動釋放;而堆在.NET中會有GC來釋放
6. 值類型的變數直接存放實際的數據,而引用類型的變數存放的則是數據的地址,即對象的引用。
7.值類型變數直接把變數的值保存在堆棧中,引用類型的變數把實際數據的地址保存在堆棧中,而實際數據則保存在堆中。
『柒』 C編譯器問題。不同編譯器中編寫C/C++程序語法是否有不同
for(int i=0;i<10;++i) cout<<i;
cout<<i;
Dev-c++里,是錯的。i的作用域只是for
vc6.0里是對的。
這只是c++的寫法。c里變數聲明必須放在前面,不會有這種情況。
其他的沒用過。
『捌』 C++初探:c和c++的區別簡述,以及編譯器對代
目前最著名、最有影響、應用最廣泛的windows、linux和UNIX三個操作系統都是用C語言編寫的。0S是計算機系統(由軟硬體兩個子系統構成)的核心和靈魂,它是軟體中最龐大最復雜的系統軟體。既然如此龐大復雜的0S都可以用c語言編寫,從狹義而言,還有什麼系統軟體和應用軟體不能用c語言編寫呢?由此可以肯定的說,c語言是一門十分優秀而又重要的語言。
c語言程序設計是過程性程序設計語言,它的發展貫穿了計算機發展的歷程,它蘊含了程序設計的基本思想,囊括了程序設計的基本概念,所以它是理工科高等院校的一門基礎課程。
從市面上有關c語言的書籍和高等院校採用的教材來看,它們有一個共性,那就是:脫離了實際應用(全是小打小鬧的小例子),純粹的過程性程序設計,沒有軟體工程思想的體現,沒有一定程序設計風格,僅僅是為了讓大家明白什麼是c語言而已。
高等院校開設c語言程序設計的目的是讓學生對程序設計有個入門,有個直觀的理解,同時為其他後續課程作鋪墊。
C++:
C++語言是在C語言的基礎是擴展而成的.所以兩種語言的基本語法和語義是相同。C++中加入了面向對程序設計(OOP)的特徵。
下面的三個主要性質刻劃OOP語言的特點:
封裝性:把一個數據結構同操作的函數(行為或方法)組合在一起。封裝性是藉助於一種新的結構和數據類型機制——類實現的。
繼承性:建立一個新的派生類,它從一個或多個先前定義的基類中繼承函數和數據,而且可能重新定義或加進新的數據行為,這樣就建立了類的層次。
多態性:給行為取一個名字或符號,它共享一個類的層次,在這個層次中的每個類都以適合自己的方式實現這個行為。
C#:
C#(讀做 "C sharp",中文譯音「夏普」)是微軟公司發布的一種面向對象的、運行於.NET Framework之上的高級程序設計語言,並定於在微軟職業開發者論壇(PDC)上登台亮相.C#是微軟公司研究員Anders Hejlsberg的最新成果.C#看起來與Java有著驚人的相似;它包括了諸如單一繼承,界面,與Java幾乎同樣的語法,和編譯成中間代碼再運行的過程.但是C#與Java有著明顯的不同,它借鑒了Delphi的一個特點,與COM(組件對象模型)是直接集成的,而且它是微軟公司.NET windows網路框架的主角.
Java:
Java是一種可以編寫跨平台應用軟體的面向對象的程序設計語言,由升陽(太陽微電子,Sun Microsystems)公司的James Gosling等人於1990年代初開發的.具有以下特徵的高級程序語言:
簡單 面向對象 可分布 可解釋 強壯 安全性 結構化 輕便 功能強大 多線程 動態...
Java既可以被編譯,也可以被解釋。通過編譯器,可以把Java 程序翻譯成一種中間代碼 - 稱為位元組碼 - 可以被Java解釋器 解釋的獨立於平台的代碼。通過解釋器,每條Java位元組指令被 分析,然後在計算機上運行。只需編譯一次,程序運行時解釋 執行。
