⑴ 如何開發一個符合 ansi-c 標準的c語言編譯器

當今幾乎所有的實用的編譯器/解釋器(以下統稱編譯器)都是用C語言編寫的,有一些語言比如Clojure,Jython等是基於JVM或者說是用Java實現的,IronPython等是基於.NET實現的,但是Java和C#等本身也要依靠C/C++來實現,等於是間接調用了C。所以衡量某種高級語言的可移植性其實就是在討論ANSI/ISO C的移植性。
C語言是很低級的語言,很多方面都近似於匯編語言,在《Intel 32位匯編語言程序設計》一書中,甚至介紹了手工把簡單的C語言翻譯成匯編的方法。對於編譯器這種系統軟體,用C語言來編寫是很自然不過的,即使是像Python這樣的高級語言依然在底層依賴於C語言(舉Python的例子是因為Intel的黑客正在嘗試讓Python不需要操作系統就能運行——實際上是免去了BIOS上的一次性C代碼)。現在的學生,學過編譯原理後,只要有點編程能力的都可以實現一個功能簡單的類C語言編譯器。
可是問題來了,不知道你有沒有想過,大家都用C語言或基於C語言的語言來寫編譯器,那麼世界上第一個C語言編譯器又是怎麼編寫的呢?這不是一個「雞和蛋」的問題……
還是讓我們回顧一下C語言歷史:1970年Tomphson和Ritchie在BCPL(一種解釋型語言)的基礎上開發了B語言,1973年又在B語言的基礎上成功開發出了現在的C語言。在C語言被用作系統編程語言之前,Tomphson也用過B語言編寫過操作系統。可見在C語言實現以前,B語言已經可以投入實用了。因此第一個C語言編譯器的原型完全可能是用B語言或者混合B語言與PDP匯編語言編寫的。我們現在都知道,B語言的執行效率比較低,但是如果全部用匯編語言來編寫,不僅開發周期長、維護難度大,更可怕的是失去了高級程序設計語言必需的移植性。所以早期的C語言編譯器就採取了一個取巧的辦法:先用匯編語言編寫一個C語言的一個子集的編譯器,再通過這個子集去遞推完成完整的C語言編譯器。詳細的過程如下:
先創造一個只有C語言最基本功能的子集,記作C0語言,C0語言已經足夠簡單了,可以直接用匯編語言編寫出C0的編譯器。依靠C0已有的功能,設計比C0復雜,但仍然不完整的C語言的又一個子集C1語言,其中C0屬於C1,C1屬於C,用C0開發出C1語言的編譯器。在C1的基礎上設計C語言的又一個子集C2語言,C2語言比C1復雜,但是仍然不是完整的C語言,開發出C2語言的編譯器……如此直到CN,CN已經足夠強大了,這時候就足夠開發出完整的C語言編譯器的實現了。至於這里的N是多少,這取決於你的目標語言(這里是C語言)的復雜程度和程序員的編程能力——簡單地說,如果到了某個子集階段,可以很方便地利用現有功能實現C語言時,那麼你就找到N了。下面的圖說明了這個抽象過程:

那麼這種大膽的子集簡化的方法,是怎麼實現的,又有什麼理論依據呢?先介紹一個概念,「自編譯」Self-Compile,也就是對於某些具有明顯自舉性質的強類型(所謂強類型就是程序中的每個變數必須聲明類型後才能使用,比如C語言,相反有些腳本語言則根本沒有類型這一說法)編程語言,可以藉助它們的一個有限小子集,通過有限次數的遞推來實現對它們自身的表述,這樣的語言有C、Pascal、Ada等等,至於為什麼可以自編譯,可以參見清華大學出版社的《編譯原理》,書中實現了一個Pascal的子集的編譯器。總之,已經有計算機科學家證明了,C語言理論上是可以通過上面說的CVM的方法實現完整的編譯器的,那麼實際上是怎樣做到簡化的呢?這張圖是不是有點熟悉?對了就是在講虛擬機的時候見到過,不過這里是CVM(C Language Virtual Machine),每種語言都是在每個虛擬層上可以獨立實現編譯的,並且除了C語言外,每一層的輸出都將作為下一層的輸入(最後一層的輸出就是應用程序了),這和滾雪球是一個道理。用手(匯編語言)把一小把雪結合在一起,一點點地滾下去就形成了一個大雪球,這大概就是所謂的0生1,1生C,C生萬物吧?

附上出處鏈接:http://www.csdn.net/article/2015-11-27/2826350

⑵ 什麼是ANSI C,為什麼學習C語言要以它為標准

ANSI即American National Standards Institute,美國國家標准學會。制定過很多的標准,為相關領域的科學與技術發展做出了巨大的貢獻。
ANSI C即有由ANSI 制定的C語言的標准,最早的C語言的標准就是由ANSI所提出來的,該標准檔後來被國際標准化組織(ISO)點贊並且ISO發布的修訂版也被ANSI點贊了,所以名稱ANSI C(而不是 ISO C)被廣泛使用。
有了這樣的標准,我們在一個平台或者語言工具里編寫的C語言代碼才可以幾乎不做修改的在其他平台或者語言工具里運行出同樣的結果來。
但是ANSI C僅僅包含C語言核心,與所運行的硬體平台幾乎無關,從而難以完成在任何實際平台實用的應用程序的開發。因此,任何一個C語言的編譯工具,如TC、VC等都對ANSI C進行了擴充,根據所在系統平台,加入了自己的規則和庫之類的。

⑶ ansi在C語言裡面是什麼意思

C語言 由ANSI標準定義的32個關鍵字由ANSI標準定義的共32個 : auto double int struct break else long switch case enum register typedef char extern return union cons

⑷ 什麼是ANSI C

ANSI C是美國抄國家標准協會(ANSI)對 C語言發布的標准。使用C的軟體開發者被鼓勵遵循ANSI C文檔的要求,因為它鼓勵使用 跨平台的代碼。

C 的第一個標準是由ANSI發布的。雖然這份文檔後來被國際標准化組織(ISO)點贊並且ISO發布的修訂版也被ANSI點贊了,但名稱ANSI C(而不是 ISO C)仍被廣泛使用。一些軟體開發者使用 ISO C,還有一些使用 Standard C。

(4)ansic語言擴展閱讀:

主要編譯器的支持

ANSI C現在被幾乎所有廣泛使用的編譯器支持。現在多數C代碼是在ANSI C基礎上寫的。任何僅僅使用標准C並且沒有任何硬體依賴假設的代碼實際上能保證在任何 平台上用遵循C標準的編譯器編譯成功。如果沒有這種預防措施,多數程序只能在一種特定的 平台或特定的編譯器上編譯,例如,使用非標准庫,例如圖形用戶界面庫,或者有關編譯器或平台特定的特性例如 數據類型的確切大小和位元組序。

⑸ C語言里有ANSIC語言這個說法嗎

這也就是C語言的了,就是如你所說的,國際標準的!ANSI是一個國際組織的,很多方面的相關規定都有它哦~~~要知道C也是很多種的,而各種C的類型風格多少也所不同,有的語法別的C允許,而另一種C又是禁止的,這樣就會出現移植到不同平台的兼容性降低~~~~所以要有一種大家都認可的標准化的C,所以ANSI組織就Do it!呵呵,我知道就這么多了!

⑹ c語言中怎麼把字元轉成對應的ansic碼

不用轉……它在內存中就是以ASCII存的,你在printf的時候用%d輸出就行了
例如
main()
{
char c='A';
printf("%c\n",c); //這行輸出的是A
printf("%d\n",c); //這行輸出的是65
return 0;
}
你可以直接把字元當成數字來用,這樣說應該明白一點。

⑺ ANSI C語言標准

由ANSI標準定義的C語言關鍵字共32個 :
auto double int struct break else long switch
case enum register typedef char extern return union
const float short unsigned continue for signed void
default goto sizeof volatile do if while static
根據關鍵字的作用,可以將關鍵字分為數據類型關鍵字和流程式控制制關鍵字兩大類。
1 數據類型關鍵字
A基本數據類型(5個)
void :聲明函數無返回值或無參數,聲明無類型指針,顯式丟棄運算結果
char :字元型類型數據,屬於整型數據的一種
int :整型數據,通常為編譯器指定的機器字長
float :單精度浮點型數據,屬於浮點數據的一種
double :雙精度浮點型數據,屬於浮點數據的一種
B 類型修飾關鍵字(4個)
short :修飾int,短整型數據,可省略被修飾的int。
long :修飾int,長整形數據,可省略被修飾的int。
signed :修飾整型數據,有符號數據類型
unsigned :修飾整型數據,無符號數據類型
C 復雜類型關鍵字(5個)
struct :結構體聲明
union :共用體聲明
enum :枚舉聲明
typedef :聲明類型別名
sizeof :得到特定類型或特定類型變數的大小
D 存儲級別關鍵字(6個)
auto :指定為自動變數,由編譯器自動分配及釋放。通常在棧上分配
static :指定為靜態變數,分配在靜態變數區,修飾函數時,指定函數作用域為文件內部
register :指定為寄存器變數,建議編譯器將變數存儲到寄存器中使用,也可以修飾函數形參,建議編譯器通過寄存器而不是堆棧傳遞參數
extern :指定對應變數為外部變數,即在另外的目標文件中定義,可以認為是約定由另外文件聲明的韻蟮囊桓觥耙

⑻ ansic c語言和turbo c語言有什麼區別

ANSI C 是美國 American National Standards Institute (ANSI) 出版的C語言標准。

凡只用ANSI C 寫的程序,所有編譯器,MS VC++, Turbo C 等都支持。

Turbo C 除支持ANSI C外,還增加了許多別的東西(別的庫函數),例如繪圖函數。TC 的繪圖函數 TC 支持, 別的編譯器不支持。同樣 MS VC++ 增加的繪圖函數,TC 不支持。

可以說 ANSI C 是基礎的 簡單的 「標準的」 C,其它的 C 是擴充擴展了的C.

⑼ ANSI C編程什麼意思,跟我們現在學的c/c++有什麼不同

ANSI C是一個標准,美國國家標准協會制定的一個C語言的標准~

補充:C語言與C++的區別有很多:
1,全新的程序程序思維,C語言是面向過程的,而C++是面向對象的。
2,C語言有標準的函數庫,它們鬆散的,只是把功能相同的函數放在一個頭文件中;而C++對於大多數的函數都是有集成的很緊密,特別是C語言中沒有的C++中的API是對Window系統的大多數API有機的組合,是一個集體。但你也可能單獨調用API。
3,特別是C++中的圖形處理,它和語言的圖形有很大的區別。C語言中的圖形處理函數基本上是不能用在中C++中的。C語言標准中不包括圖形處理。
4,C和C++中都有結構的概念,但是在C語言中結構只有成員變數,而沒成員方法,而在C++中結構中,它可以有自己的成員變數和成員函數。但是在C語言中結構的成員是公共的,什麼想訪問它的都可以訪問;而在VC++中它沒有加限定符的為私有的。 4,C語言可以寫很多方面的程序,但是C++可以寫得更多更好,C++可以寫基於DOSr程序,寫DLL,寫控制項,寫系統。
5,C語言對程序的文件的組織是鬆散的,幾乎是全要程序處理;而c 對文件的組織是以工程,各文件分類明確。
6,C++中的IDE很智能,和VB一樣,有的功能可能比VB還強。
7,C++對可以自動生成你想要的程序結構使你可以省了很多時間。有很多可用的工具如加入MFC中的類的時候,加入變數的時候等等。
8,C++中的附加工具也有很多,可以進行系統的分析,可以查看API;可以查看控制項。 9,調試功能強大,並且方法多樣。

⑽ c語言標準是什麼意思,什麼ansi utf8是什麼

ANSI C是美國國家標准協會(ANSI)對C語言發布的標准。使用C的軟體開發者被鼓勵遵循ANSI C文檔的要求,因為它鼓勵使用跨平台的代碼。

C語言 由ANSI標準定義的32個關鍵字由ANSI標準定義的共32個 : auto double int struct break else long switch case enum register typedef char extern return union cons

UTF8是一種儲存和傳送的格式,如前所述,每個Unicode/UCS字元都以 2或4個bytes來儲存,看看以下的比較:

以"I am Chinese"為例
用ANSI儲存:12 Bytes
用Unicode/UCS2儲存:24 Bytes + 2 Bytes(header)
用UCS4儲存:48 Bytes + 4 Bytes(header)

以"我是中國人"為例
用ANSI儲存:10 Bytes
用Unicode/UCS2儲存:10 Bytes + 2 Bytes(header)
用UCS4儲存:20 Bytes + 4 Bytes(header)

由此可見直接以Unicode/UCS的原始形式來儲存是一種極大的浪費,而且也不利於互聯網的傳輸(中文稍為合算一點^_^)。

有見及此,Unicode/UCS的壓縮形式--UTF8出現了,套用官方網站的首句話『UTF-8 stands for Unicode Transformation Format-8. It is an octet (8-bit) lossless encoding of Unicode characters.』,由於UTF也適用於編碼UCS,故亦可稱為『UCS transformation formats (UTF)』

UTF8是以8bits即1Bytes為編碼的最基本單位,當然也可以有基於16bits和32bits的形式,分別稱為UTF16和UTF32,但目前用得不多,而UTF8則被廣泛應用在文件儲存和網路傳輸中。