計算機編譯器開發
1. 計算機編譯器是什麼,怎麼用
計算機編譯器可以說是計算機軟體的生產工具,幾乎所有的軟體都是由編譯器編譯而成的。用的方法有兩種,第一個種是集成在了開發環境里,第二種是用命令行編譯。
2. 編譯器是什麼
簡單講,編譯器就是將「一種語言(通常為高級語言)」翻譯為「另一種語言(通常為低級語言)」的程序。一個現代編譯器的主要工作流程:源代碼 (source code) → 預處理器 (preprocessor) → 編譯器 (compiler) → 目標代碼 (object code) → 鏈接器 (Linker) → 可執行程序 (executables)
高級計算機語言便於人編寫,閱讀交流,維護。機器語言是計算機能直接解讀、運行的。編譯器將匯編或高級計算機語言源程序(Source program)作為輸入,翻譯成目標語言(Target language)機器代碼的等價程序。源代碼一般為高級語言 (High-level language), 如Pascal、C、C++、Java、漢語編程等或匯編語言,而目標則是機器語言的目標代碼(Object code),有時也稱作機器代碼(Machine code)。
對於C#、VB等高級語言而言,此時編譯器完成的功能是把源碼(SourceCode)編譯成通用中間語言(MSIL/CIL)的位元組碼(ByteCode)。最後運行的時候通過通用語言運行庫的轉換,編程最終可以被CPU直接計算的機器碼(NativeCode)。
編譯是從源代碼(通常為高級語言)到能直接被計算機或虛擬機執行的目標代碼(通常為低級語言或機器語言)的翻譯過程。然而,也存在從低級語言到高級語言的編譯器,這類編譯器中用來從由高級語言生成的低級語言代碼重新生成高級語言代碼的又被叫做反編譯器。也有從一種高級語言生成另一種高級語言的編譯器,或者生成一種需要進一步處理的的中間代碼的編譯器(又叫級聯)。
典型的編譯器輸出是由包含入口點的名字和地址, 以及外部調用(到不在這個目標文件中的函數調用)的機器代碼所組成的目標文件。一組目標文件,不必是同一編譯器產生,但使用的編譯器必需採用同樣的輸出格式,可以鏈接在一起並生成可以由用戶直接執行的EXE,
所以我們電腦上的文件都是經過編譯後的文件。
3. 計算機各種語言編譯器怎麼來的
大部分的語言編譯器都是用C開發的(核心部分則可能用到匯編),這一點與操作系統的開發類似(比如linux或者Windows),後期的各種IDE或者軟體部分可能用諸如C++、Delphi(這兩個在linux上都有對應的版本)或者VB等等開發。
最初的匯編編譯器當然是直接用二進制機器碼開發的。「是不是這個編譯器編寫出的程序也必須在這個相應的操作系統上運行?」這個並不完全正確,有些語言是可以跨平台運行的的,比如JAVA,它的口號就是,「一次編譯,到處運行」
4. 計算機語言的編譯器是怎麼開發的
編譯器用語言都寫編譯器主要功能進行詞、語、語義析間代碼優化間代碼根據間代碼匯編語言匯編語言變機器碼整編譯器算用任意語言實現
5. 計算機編譯程序主要是做什麼工作
編譯程序就是將高級語言程序設計語言源程序翻譯成計算機可執行代碼的軟體
6. 計算機語言 編譯器的問題
簡單點說你就是想知道程序設計語言、編譯器和開發環境之間的關系吧。
程序開發一般分為3個階段:1、編碼階段,2、編譯階段,3、運行階段。
編碼階段使用的就是程序設計語言,在樓主這就是Fortran。程序設計語言除了定義了文法以外,其他的任何事情他都不做
至於編譯階段使用的就是編譯器。編譯器與程序設計語言的關系就是,翻譯者與語言的關系。
因為計算機是無法識別程序設計語言的(Fortran),它只能識別機器語言或者匯編語言,而編譯器的作用就是把Fortran翻譯成機器語言或者匯編語言。
至於開發環境,就是程序運行時的環境。簡單的可以理解為樓主安裝的軟體。
編譯器 是開發環境的一部分。
開發環境,一般包括代碼編輯器、編譯器、調式工具等。
至於樓主要的開發軟體,網路一下很多的,所以不用擔心。
實在找不到,樓主可以找我
7. 開發新的計算機語言是不是就是開發新的編譯器
計算機語言和編譯器完全不能等同。
1、英國和美國,是不同國家,但官方語言屬於同一語系。
2、對於Pascal語言,有Turbo Pascal、Delphi、Free Pascal等等;雖然這些編譯器可能運行在不同平台上,執行標准不同,語法也不同,但都可以統稱為Pascal編譯器。
C++之類的,有VC、Borland C++ Builder...
至於匯編,就更多了...
3、你自己如果有時間,完全可以自定義一套完備的詞法、語法規則,也可以稱作開發了一種新的計算機語言;但是如果要寫出可以編譯這套語法的編譯器,就不是那麼簡單了。
8. 怎麼研發一款編程語言
編程語言,作為人與計算機溝通的橋梁,有著重要和深遠的意義。有過計算機編程經驗的人,多少學習或掌握過一到多種編程語言。計算機專業領域的編程語言成百上千種,主流的編程語言也有數十種之多。每種編程語言面向的領域和特性都不盡相同,不過歸根結底是為了解決人與計算機之間溝通的效率問題,提高計算機的生產力。想必有不少人對那些主流編程語言的創造者十分傾佩,也相信有不少人會好奇一門編程語言是如何誕生的。那麼如何創造一門編程語言呢?
總的來看,創造一門編程語言需要有以下幾個過程:
(1)設計語言的特性。
(2)定義語言的單詞、語法和語義。
(3)實現編譯器或者解釋器將程序翻譯為計算機底層表示。
(4)生成計算機程序的二進制存儲格式。
(5)完善語言的運行時環境和標准庫。
一、語言特性設計
所謂語言特性,就是編程語言為開發者提供了什麼樣的原子性功能特徵。比如是否支持數學表達式計算、字元串處理,是否支持變數、函數和遞歸,是否支持分支、循環復合語句等。語言的變數類型是強類型、弱類型,還是動態類型,程序是過程式、函數式,還是面向對象的。是否支持模板、泛型和反射機制,是否支持多線程和並發特性,是否支持錯誤和異常處理機制等等。
語言特性設計是一門編程語言最關鍵的環節,直接決定了語言的基本特徵和雛形。當然,這也是最難的一個環節,因為語言設計是面向具體問題領域的,是語言設計者從大量的編程實踐中的獲得的總結和升華。比如C語言設計者希望面向計算機底層,擁有對操作系統和硬體的直接操縱能力。而Python的設計者則希望盡可能地減少操作計算機資源的繁瑣過程,以獲得語言的簡潔性、高度的靈活性和擴展性。SQL的設計者面向具體的數據查詢和分析領域,希望幫助開發者獲得快速檢索和操縱數據的能力。而Go語言的設計者則希望在保留C語言優秀功能的基礎上,擴展編程語言對高並發環境的支持,並擁有垃圾回收和快速編譯的能力。
凡此種種,編程語言特性的設計都是面向具體的問題領域的,是語言設計者構建於開發者和計算機之間的中間層,是對開發過程中重復功能邏輯的原子性「封裝」,最終的目的是為了提升具體問題領域內的軟體開發效率。
二、單詞、語法和語義
和人類使用的自然語言類似,編程語言也有自身的單詞、語法和語義,專業上稱為詞法記號、語言文法和語義。
常見的詞法記號可以分為數字、字元、字元串、標識符、關鍵字,以及用於連接表達式的運算符、分割語句或者程序段落的界符等符號。這些是編程語言程序的基本單位,通過它們的有序組合,構建出了一門編程語言形形色色的代碼片段。
編程語言的文法是用來描述語言的語法規則的,具體來說是規定詞法記號之間的排列組合的順序與規則。它描述了編程語言程序的基本模式,不符合該模式的詞法記號的排列被擋在了合法語言程序的大門之外。同時,它也是各種編程語言對於開發者最明顯的差異化特徵。一個有經驗的開發者可以很容易地通過掃視一段代碼,就能分辨出這是哪種編程語言編寫的計算機程序。
編程語言的語義描述了一段符合語言語法的程序,對於計算機而言的真正含義,是開發者最終要傳達給計算機的意願和指令。語言的語義必須是准確的、無二義性的,編譯器也正是通過語義的指導,將計算機程序翻譯為計算機可識別的表達形式。
三、程序的翻譯
計算機程序是用來供人閱讀和修改的,計算機硬體並不能理解程序內的思想和含義。因此,必須有一個翻譯轉換的過程,將人所表達的意願准確無誤地傳遞給計算機,讓計算機明確並執行人下發的指令。實現這種翻譯工作的工具就是編譯器或解釋器。
對於編譯器來說,它的輸入是人類書寫的計算機語言程序,輸出則是計算機可識別的底層表示。首先,它需要識別出程序中的單詞,即詞法分析。然後,根據單詞的組合模式識別出程序的語法結構,即語法分析。最後,根據不同的語法結構對應的語義,將程序按照每個語法模塊的形式轉換為計算機可識別的指令序列,即語義分析和目標代碼生成。
眾所周知編譯器的實現具有一定的復雜度,其根本原因來自於語言語法的結構靈活性和計算機底層表達形式的多樣性,這也是創造一門編程語言最核心的環節。
四、二進制存儲
編譯器將語言程序翻譯轉換後,需要將轉換後的結果存儲起來,以便計算機在需要的時候將其載入、執行。這里不可避免的涉及到兩個問題:
(1)轉換後的結果是什麼樣的形式?
(2)轉換後的結果保存在哪裡?
第一個問題描述的是計算機程序被轉換為怎樣的形式,才是計算機可以識別的。由於計算機中實際運行程序的硬體模塊是CPU,因此計算機程序只有被轉換為CPU的二進制指令格式才能被正確識別、執行。比如常見的Intel體系的CISC指令格式、ARM體系的RISC執行格式等。
第二個問題描述的是計算機程序轉化為二進制指令格式後,以什麼樣的方式保存在計算機的磁碟上。由於絕大多數的計算機程序是需要通過運行在計算機硬體之上的操作系統載入運行的,因此計算機程序的二進製表達形式必須以對應操作系統可識別的文件格式存儲。比如常見的Windows操作系統的PE文件格式、Linux操作系統的ELF文件格式等。
五、運行時環境和標准庫
理論上講,一門編程語言如果能提供出完備的操縱操作系統和硬體的原子性功能就已經成功了。但是不提供強大的運行時環境支持和標准庫,是很難讓一門編程語言真正的好用和流行的。沒有人希望簡單地列印一行字元串,還需要使用編程語言提供的基本特性實現調用操作系統提供的列印介面的邏輯。Java語言之所以久興不衰,正是因為它不僅提供了完善的運行時環境和開發庫支持,甚至提供了更強大的開發框架和工具支持。
因此可見,除了完備的語言特性,為開發者提供更方便好用的庫和框架支持,消除軟體構建過程中復雜和重復的邏輯,才是一門優秀編程語言的長盛之道。
六、自己動手,立即開始!
《自己動手構造編譯系統——編譯、匯編與鏈接》一書詳細闡述了一門編程語言從無到有的過程,從語言的功能特性設計,到詞法、文法、語義分析;從編譯器、匯編器的設計實現,到目標文件的鏈接生成可執行文件;甚至編譯優化器的實現、二進制指令、可執行文件格式以及語言運行時和標准庫的概念,都在書中做了認真細致地剖析。相信對本書的閱讀,將是一次不錯的獲得知識的體驗!
9. 計算機語言是如何開發出來的
計算機語言是「設計」出來的,設計只需要思考和寫文檔,而該語言的編譯器才是「開發」出來的。編譯器也是程序,所以也需要用編程語言來編寫,至於用什麼語言就隨開發者的便了。很多編程語言是用別的更基礎的語言開發的,其中用最多的就是C語言。C語言編譯器很多,大部分都是用別的C語言編譯器編譯出來的,而最早的C語言編譯器是用匯編語言寫出來的,最早的匯編語言編譯器是通過「編譯器自舉」開發出來的。
相關回答
一個很深奧的問題
一、新建項目 啟動Microsoft Visual Studio 。NET,新建一個C#項目MyApp,本例工程存放於F:\Csharp\MyApp。 二、添加控制項 在Form1 窗體上添加三個控制項(見圖1):主菜單MainMenu、標簽Label1和按鈕Button1。
Label1和Button1控制項的屬性均採用預設設置。MainMenu控制項中添加三個菜單項menuItem1、menuItem2、menuItem3。Text屬性分別設為「語言」、「中文」和「English」。
menuItem2、 menuItem3 的RadioCheck屬性設為True。 圖 1 三、創建配置文件 在項目中添加一個文本文件 i,保存當前程序的語言版本設置。該文件中只有一行內容。
如果是「English」,則表示程序為英文版;如果是「Chinese」則為中文版。這里暫且保存為「English」。 四、創建資源文件 。NET中的資源文件有三種: 文本(。txt )文件、XML 格式的。
10. 編譯器和開發環境的關系
談談程序設計語言、編譯器和開發環境之間的關系
許多初學者都會對這三個概念區分不清,應該說這三個概念是完全不同的,不能混為一談。在本文中,我就盡我最大的能力來講講這三個概念以及他們之間的關系。
首先說程序設計語言,它同人類的自然語言一樣也是一個語言,並且它是自然語言的一個子集。大家都知道自然語言是極其龐大和復雜的系統,具有很多不不確定性和不精確性,因此至今我們也沒有辦法對自然語言進行形式化的描述。程序設計語言只是自然語言的一個很小的子集,在計算機系統中,一切都是需要確定性和精確性的描述,因此程序設計語言也是極為規范的,在程序設計語言中,幾乎就不允許存在不確定性和不精確性,也就是說不能存在文法的二義性。這樣一個程序設計語言就可以通過一系列的產生式來進行形式化的描述,這一系列的產生式就被稱為文法,語言就是由文法來定義的。從另外一個角度來說,一個程序設計語言,它僅僅是一個語言,它只對程序進行形式上的要求。或者說,程序設計語言對應於編程中的編碼階段。我們有必要對程序開發的三個階段進行了解,程序開發從時間先後順序上可以分為三個階段:1.編碼階段,2.編譯階段,3.運行階段。在編碼階段,我們使用的就是程序設計語言。語言除了定義了文法以外,其他的任何事情他都不做。當然一種語言也有很多種版本,比如 BASIC 語言,就有很多種版本,C語言也是如此。這里所講的語言的版本與編譯器的版本是不一樣的。C語言的標准版本就是 ANSI C,如果初學者會提出這樣的問題「C語言哪個更好?」,這樣的問題反映出他們對語言與編譯器之間的關系的認識的不足。如果從語言的角度來講 VC 和 TC 是沒有多大區別的,他們基本上都能支持 ANSI C。
再來看看編譯器。編譯器與語言的關系就是,翻譯者與語言的關系。編譯器就是一個翻譯,他把使用某種語言書寫的源程序,翻譯成為等價的使用目標語言書寫的目標程序。前面我們也說了,語言是一個抽象的概念,是由文法來定義的。唯一實在的東西,也就是定義語言的文法。在使用語言時,我們只能說,使用這種語言去書寫一段程序。編譯器則是能夠將某種語言的源程序進行翻譯,然後生成目標程序。我們通常會說,某個編譯器支持了什麼語言,也就是說這個編譯器能識別並翻譯這種語言。現在的C編譯器,一般都是支持了 ANSI C 語言的,另外,編譯器的設計者可能還會對 ANSI C 進行一定的擴充,而且各個編譯器進行擴充功能都是不同的,因此可能就會出現一個編譯器誕生以後,就會出現一個新的語言的現象。TC 和 VC 就分別對 ANSI C 進行了不同的擴充,比如在 TC 中有 far 等關鍵字,ANSI C 中是沒有的,在 VC 中有內嵌匯編的語法 _asm,而在 TC 中則是使用 asm 關鍵字,這些內容在 ANSI C 中沒有的。編譯器的輸入時源程序,而其輸出則是目標程序。一般情況下,源程序是使用某種高級語言書寫的,而目標程序則是某個特定機器的機器語言程序。另一方面,編譯器除了提供編譯功能,還會提供一些運行庫。所謂運行庫就是由一些事先寫好的子程序所組成的子程序庫。例如C語言中的 printf 函數,就是由C的運行庫提供的。在 ANSI C 中定義了一些C語言的標准庫函數,這些庫函數是標准C必須具備的,也可以說這些庫函數成為了 ANSI C 的一個部分。另外,不同的編譯器還可以提供自己的,非標準的庫給用戶使用,在 TC 中的 Graphics 庫,其實就是由 TC 提供的,它不是屬於 ANSI C 的。簡單的說,編譯器是由編譯程序和運行庫組成的。在程序的編譯階段,就是使用編譯器對源程序進行編譯生成目標程序。
在程序的運行階段則是在一個特定的平台上,由這個平台來執行編譯生成的程序。Java 虛擬機是一個平台,DOS 和 Windows 也是平台,編譯器的作用就是溝通源程序和程序的運行平台。源程序相對於一個運行平台來說是不可識別的,但當編譯器將源程序編譯成為這個平台所能夠識別的目標語言以後,程序就可以在這個平台上運行了。
應該看到,編譯器在其中起到了很重要的作用。我們現在可以明確一些概念了,程序設計語言只是語言,它本身很難說有什麼好壞,這就如同說「漢語和英語哪個好」一樣。使用某一種程序設計語言,我們可以書寫自己的程序,從而向計算機表達自己希望完成的功能。這個階段,我們稱為編碼階段。編譯器由編譯程序和運行庫組成,編譯程序負責將源程序翻譯成為目標程序,運行庫提供了一些基本的子程序給程序編寫者使用。我們可以說編譯器是否支持某種語言,例如 TC 編譯器是支持 ANSI C 的,而 GCC 則是一個能夠支持多種語言的編譯器。然而不同的編譯器除了提供對某種語言的支持以外,還可能對該語言進行了某些功能擴充。編譯器在對語言的支持上,差別都是不太大的,這是因為許多語言都制定了一個標准,例如 ANSI C。編譯器的另外一個重要特性,就是對運行平台的支持。平台指的是一個程序運行所需要的所有軟體和硬體的基礎。編譯器對運行平台的支持,是通過將源程序編譯成為目標程序,以及編譯器所提供的運行庫來實現的。例如,TC只能將C源程序編譯生成,使用 80x86 CPU,操作系統為 DOS 的 16bit DOS 程序。VC只能將C源程序編譯生成 80x86 CPU、操作系統為 Windows 的 32bit Windows 程序。使用編譯器對源程序進行編譯被稱為編譯階段,這個階段編譯程序將源程序編譯為某個平台的目標代碼。程序在具體的平台上運行時,被稱為運行階段。應該指出,在編碼階段使用到的是程序設計語言,以及編譯器所提供的庫函數,這個階段產生的是源程序。在編譯階段使用的是源程序和編譯器,這個階段產生的是目標程序。在運行階段使用到的是目標程序和運行平台,這個時候產生的是程序運行結果。
因此說討論一個程序設計語言好壞沒有多大意義,因為他們使用的場合不同,比如匯編語言和 Java 語言,要談論這兩個語言的好壞是沒有實際意義的。而說「C語言哪個好」之類的話也是沒有意義的,我想大家學的C也就是在 ANSI C 基礎上的C,並且不同的C語言之間的差別是極小的。我們通常指的 TC、VC 都是指編譯器,而不是語言。編譯器能夠支持一種或者多種的程序設計語言,TC 能夠支持 ANSI C,VC 能夠支持 ANSI C 和 ANSI C++,而 GCC 則是一個支持多語言的編譯器。如果真要說 VC 比 TC 好,只能說 VC 編譯器提供的庫函數更多,並且 VC 能夠支持的平台是 Windows,而 VC 編譯出來的代碼也都是 32bit 的。
在以上概念中糾纏了這么久,我也不再想多說了。再來看開發環境。為了能夠方便程序設計者進行編碼、調試等工作,編譯器製造商在製作好一個編譯器以後,都會提供一個集成開發環境(又稱為IDE)。在這個 IDE 中,用戶可以完成編碼、編譯、調試、運行的全部工作。並且在最新的IDE中,可能還會提供一個可視化的設計功能,可以方便用戶進行程序界面的設計。例如 VB 等。另外一個方面,開發環境除了包括 IDE 以外,還包括了程序運行的平台。比如硬體是 IBM PC 兼容機,操作系統是 Windows 等。
可能,能講的也就這么多了,感覺講的並不是很好,不過我已經盡力了。有些東西是很難說清楚的,「只能意會不可言傳」指的就是這個了。不要怪我講的不好,還是自己用心去理解和體會吧。