Ⅰ 怎麼編譯DSL文件為AML文件
編譯DSL文件為AML文件:
1、利用編譯程序從源語言DSL文件編寫的源程序產生目標程序AML文件;
2、用編譯程序產生目標程序的動作。 編譯就是把高級語言變成計算機可以識別的2進制語言,計算機只認識1和0,編譯程序把人們熟悉的語言換成2進制的。
編譯程序把一個源程序翻譯成目標程序的工作過程分為五個階段:詞法分析;語法分析;語義檢查和中間代碼生成;代碼優化;目標代碼生成。主要是進行詞法分析和語法分析,又稱為源程序分析,分析過程中發現有語法錯誤,給出提示信息。
(1)規范編譯文件擴展閱讀:
編譯程序的語法分析器以單詞符號作為輸入,分析單詞符號串是否形成符合語法規則的語法單位,如表達式、賦值、循環等,最後看是否構成一個符合要求的程序;
按該語言使用的語法規則分析檢查每條語句是否有正確的邏輯結構,程序是最終的一個語法單位。編譯程序的語法規則可用上下文無關文法來刻畫。
語法分析的方法分為兩種:自上而下分析法和自下而上分析法。自上而下就是從文法的開始符號出發,向下推導,推出句子。
而自下而上分析法採用的是移進歸約法,基本思想是:用一個寄存符號的先進後出棧,把輸入符號一個一個地移進棧里,當棧頂形成某個產生式的一個候選式時,即把棧頂的這一部分歸約成該產生式的左鄰符號
Ⅱ C語言文件的編譯與執行的四個階段並分別描述
開發C程序有四個步驟:編輯、編譯、連接和運行。
任何一個體系結構處理器上都可以使用C語言程序,只要該體系結構處理器有相應的C語言編譯器和庫,那麼C源代碼就可以編譯並連接到目標二進制文件上運行。
1、預處理:導入源程序並保存(C文件)。
2、編譯:將源程序轉換為目標文件(Obj文件)。
3、鏈接:將目標文件生成為可執行文件(EXE文件)。
4、運行:執行,獲取運行結果的EXE文件。
(2)規范編譯文件擴展閱讀:
將C語言代碼分為程序的幾個階段:
1、首先,源代碼文件測試。以及相關的頭文件,比如stdio。H、由預處理器CPP預處理為.I文件。預編譯的。文件不包含任何宏定義,因為所有宏都已展開,並且包含的文件已插入。我歸檔。
2、編譯過程是對預處理文件進行詞法分析、語法分析、語義分析和優化,生成相應的匯編代碼文件。這個過程往往是整個程序的核心部分,也是最復雜的部分之一。
3、匯編程序不直接輸出可執行文件,而是輸出目標文件。匯編程序可以調用LD來生成可以運行的可執行程序。也就是說,您需要鏈接大量的文件才能獲得「a.out」,即最終的可執行文件。
4、在鏈接過程中,需要重新調整其他目標文件中定義的函數調用指令,而其他目標文件中定義的變數也存在同樣的問題。
Ⅲ 誰能簡單闡述下java編譯執行的過程
Java虛擬機(JVM)是可運行Java代碼的假想計算機。
只要根據JVM規格描述將解釋器移植到特定的計算機上,就能保證經過編譯的任何Java代碼能夠在該系統上運行。
本文首先簡要介紹從Java文件的編譯到最終執行的過程,隨後對JVM規格描述作一說明。
一.Java源文件的編譯、下載、解釋和執行
Java應用程序的開發周期包括編譯、下載、解釋和執行幾個部分。
Java編譯程序將Java源程序翻譯為JVM可執行代碼?位元組碼。
這一編譯過程同C/C++的編譯有些不同。
當C編譯器編譯生成一個對象的代碼時,該代碼是為在某一特定硬體平台運行而產生的。
因此,在編譯過程中,編譯程序通過查表將所有對符號的引用轉換為特定的內存偏移量,以保證程序運行。
Java編譯器卻不將對變數和方法的引用編譯為數值引用,也不確定程序執行過程中的內存布局,而是將這些符號引用信息保留在位元組碼中,由解釋器在運行過程中創立內存布局,然後再通過查表來確定一個方法所在的地址。
這樣就有效的保證了Java的可移植性和安全性。
運行JVM位元組碼的工作是由解釋器來完成的。
解釋執行過程分三部進行:代碼的裝入、代碼的校驗和代碼的執行。
裝入代碼的工作由"類裝載器"(classloader)完成。
類裝載器負責裝入運行一個程序需要的所有代碼,這也包括程序代碼中的類所繼承的類和被其調用的類。
當類裝載器裝入一個類時,該類被放在自己的名字空間中。
除了通過符號引用自己名字空間以外的類,類之間沒有其他辦法可以影響其他類。
在本台計算機上的所有類都在同一地址空間內,而所有從外部引進的類,都有一個自己獨立的名字空間。
這使得本地類通過共享相同的名字空間獲得較高的運行效率,同時又保證它們與從外部引進的類不會相互影響。
當裝入了運行程序需要的所有類後,解釋器便可確定整個可執行程序的內存布局。
解釋器為符號引用同特定的地址空間建立對應關系及查詢表。
通過在這一階段確定代碼的內存布局,Java很好地解決了由超類改變而使子類崩潰的問題,同時也防止了代碼對地址的非法訪問。
隨後,被裝入的代碼由位元組碼校驗器進行檢查。
校驗器可發現操作數棧溢出,非法數據類型轉化等多種錯誤。
通過校驗後,代碼便開始執行了。
Java位元組碼的執行有兩種方式:
1.即時編譯方式:解釋器先將位元組碼編譯成機器碼,然後再執行該機器碼。
2.解釋執行方式:解釋器通過每次解釋並執行一小段代碼來完成Java位元組碼程序的所有操作。
通常採用的是第二種方法。
由於JVM規格描述具有足夠的靈活性,這使得將位元組碼翻譯為機器代碼的工作
具有較高的效率。
對於那些對運行速度要求較高的應用程序,解釋器可將Java位元組碼即時編譯為機器碼,從而很好地保證了Java代碼的可移植性和高性能。
二.JVM規格描述
JVM的設計目標是提供一個基於抽象規格描述的計算機模型,為解釋程序開發人員提很好的靈活性,同時也確保Java代碼可在符合該規范的任何系統上運行。
JVM對其實現的某些方面給出了具體的定義,特別是對Java可執行代碼,即位元組碼(Bytecode)的格式給出了明確的規格。
這一規格包括操作碼和操作數的語法和數值、標識符的數值表示方式、以及Java類文件中的Java對象、常量緩沖池在JVM的存儲映象。
這些定義為JVM解釋器開發人員提供了所需的信息和開發環境。
Java的設計者希望給開發人員以隨心所欲使用Java的自由。
JVM定義了控制Java代碼解釋執行和具體實現的五種規格,它們是:
JVM指令系統
JVM寄存器
JVM棧結構
JVM碎片回收堆
JVM存儲區
2.1JVM指令系統
JVM指令系統同其他計算機的指令系統極其相似。
Java指令也是由操作碼和操作數兩部分組成。
操作碼為8位二進制數,操作數進緊隨在操作碼的後面,其長度根據需要而不同。
操作碼用於指定一條指令操作的性質(在這里我們採用匯編符號的形式進行說明),如iload表示從存儲器中裝入一個整數,anewarray表示為一個新數組分配空間,iand表示兩個整數的"與",ret用於流程式控制制,表示從對某一方法的調用中返回。
當長度大於8位時,操作數被分為兩個以上位元組存放。
JVM採用了"bigendian"的編碼方式來處理這種情況,即高位bits存放在低位元組中。
這同Motorola及其他的RISCCPU採用的編碼方式是一致的,而與Intel採用的"littleendian"的編碼方式即低位bits存放在低位位元組的方法不同。
Java指令系統是以Java語言的實現為目的設計的,其中包含了用於調用方法和監視多先程系統的指令。
Java的8位操作碼的長度使得JVM最多有256種指令,目前已使用了160多種操作碼。
2.2JVM指令系統
所有的CPU均包含用於保存系統狀態和處理器所需信息的寄存器組。
如果虛擬機定義較多的寄存器,便可以從中得到更多的信息而不必對棧或內存進行訪問,這有利於提高運行速度。
然而,如果虛擬機中的寄存器比實際CPU的寄存器多,在實現虛擬機時就會佔用處理器大量的時間來用常規存儲器模擬寄存器,這反而會降低虛擬機的效率。
針對這種情況,JVM只設置了4個最為常用的寄存器。
它們是:
pc程序計數器
optop操作數棧頂指針
frame當前執行環境指針
vars指向當前執行環境中第一個局部變數的指針
所有寄存器均為32位。
pc用於記錄程序的執行。
optop,frame和vars用於記錄指向Java棧區的指針。
2.3JVM棧結構
作為基於棧結構的計算機,Java棧是JVM存儲信息的主要方法。
當JVM得到一個Java位元組碼應用程序後,便為該代碼中一個類的每一個方法創建一個棧框架,以保存該方法的狀態信息。
每個棧框架包括以下三類信息:
局部變數
執行環境
操作數棧
局部變數用於存儲一個類的方法中所用到的局部變數。
vars寄存器指向該變數表中的第一個局部變數。
執行環境用於保存解釋器對Java位元組碼進行解釋過程中所需的信息。
它們是:上次調用的方法、局部變數指針和操作數棧的棧頂和棧底指針。
執行環境是一個執行一個方法的控制中心。
例如:如果解釋器要執行iadd(整數加法),首先要從frame寄存器中找到當前執行環境,而後便從執行環境中找到操作數棧,從棧頂彈出兩個整數進行加法運算,最後將結果壓入棧頂。
操作數棧用於存儲運算所需操作數及運算的結果。
2.4JVM碎片回收堆
Java類的實例所需的存儲空間是在堆上分配的。
解釋器具體承擔為類實例分配空間的工作。
解釋器在為一個實例分配完存儲空間後,便開始記錄對該實例所佔用的內存區域的使用。
一旦對象使用完畢,便將其回收到堆中。
在Java語言中,除了new語句外沒有其他方法為一對象申請和釋放內存。
對內存進行釋放和回收的工作是由Java運行系統承擔的。
這允許Java運行系統的設計者自己決定碎片回收的方法。
在SUN公司開發的Java解釋器和HotJava環境中,碎片回收用後台線程的方式來執行。
這不但為運行系統提供了良好的性能,而且使程序設計人員擺脫了自己控制內存使用的風險。
2.5JVM存儲區
JVM有兩類存儲區:常量緩沖池和方法區。
常量緩沖池用於存儲類名稱、方法和欄位名稱以及串常量。
方法區則用於存儲Java方法的位元組碼。
對於這兩種存儲區域具體實現方式在JVM規格中沒有明確規定。
這使得Java應用程序的存儲布局必須在運行過程中確定,依賴於具體平台的實現方式。
JVM是為Java位元組碼定義的一種獨立於具體平台的規格描述,是Java平 *** 立性的基礎。
目前的JVM還存在一些限制和不足,有待於進一步的完善,但無論如何,JVM的思想是成功的。
對比分析:如果把Java原程序想像成我們的C++原程序,Java原程序編譯後生成的位元組碼就相當於C++原程序編譯後的80x86的機器碼(二進製程序文件),JVM虛擬機相當於80x86計算機系統,Java解釋器相當於80x86CPU。
在80x86CPU上運行的是機器碼,在Java解釋器上運行的是Java位元組碼。
Java解釋器相當於運行Java位元組碼的「CPU」,但該「CPU」不是通過硬體實現的,而是用軟體實現的。
Java解釋器實際上就是特定的平台下的一個應用程序。
只要實現了特定平台下的解釋器程序,Java位元組碼就能通過解釋器程序在該平台下運行,這是Java跨平台的根本。
當前,並不是在所有的平台下都有相應Java解釋器程序,這也是Java並不能在所有的平台下都能運行的原因,它只能在已實現了Java解釋器程序的平台下運行。
Ⅳ c++如何編譯啊 ~
以linux系統為例:
1、在連網的情況下,在終端中使用root超級用戶許可權輸入以下命令:
sudo apt-get install g++
並回車即可安裝C++編譯器g++。
2、安裝完畢,即可開始新建我們的一個C++工程了。下面以一個hello工程為例,簡單地介紹如何編譯一個 C++工程。
3、登錄Linux系統,打開終端,在當前目錄下使用mkdir命令新建一個hello的目錄;然後使用cd hello進入hello目錄中,並使用vi工具新建hello.h、hello.cpp、main.cpp、makefile四個文件。四個文件的內容分別如下:
1. hello.h文件
#ifndef HELLO_H_
#define HELLO_H_
class Hello {
public:
void print();
};
#endif
2. hello.cpp文件
#include "hello.h"
#include <iostream>
using namespace std;
void Hello::print() {
cout<<"Hello, welcome to Redhat Linux os!"<<endl;
}
3. main.cpp文件
#include "hello.h"
#include <iostream>
using namespace std;
int main() {
Hello h;
h.print();
return 0;
}
注意:這三個文件要以空白行結束,否則編譯時會有警告信息。
4. makefile文件
# this is a makefile of the c++ project hello
# the standard c++ compiler in the Redhat linux is g++
# written by young on June 27th, 2009
TARGET = .
CC = g++
CFLAGS = -g
CFLAGC = -c
MAINC = main.cpp
HELLO = hello.cpp
OBJ = hello.o
INCLUDE = -I$(TARGET)
EXEC = $(TARGET)/main
all: $(EXEC)
$(EXEC): $(OBJ) $(MAINC)
$(CC) $(CFLAGS) $(OBJ) $(MAINC) $(INCLUDE) -o $@
rm -f $(OBJ)
@echo "<<<<<< $@ is created successfully! >>>>>>"
$(OBJ): $(HELLO)
$(CC) $(CFLAGC) $(HELLO) -o $@
clean:
rm -f $(EXEC)
注意: makefile文件中的命令行(紅色字體)一定要以Tab建開頭,否則編譯通不過。
寫好makefile文件後,即可編譯工程。在終端中輸入make命令,回車後將顯示如下信息:
g++ -c hello.cpp -o hello.o
g++ -g hello.o main.cpp -I. -o main
rm -f hello.o
<<<<<< main is created successfully! >>>>>>
這些信息說明工程已被正確編譯,當前目錄下將生成一個main的可執行文件。
同樣,你也可以不使用makefile文件,而直接在終端上輸入以下兩行命令:
g++ -c hello.cpp -o hello.o
g++ -g hello.o main.cpp -I. -o main
也可以編譯這個工程。
使用ls -l命令查看當前目錄下的所有文件,確實有一個main文件。
在終端中輸入./main,即可運行程序。
Ⅳ 用eclipse怎麼編譯java文件啊
1在安裝完eclipse後不需要配置的,在安裝的時候都是會配置完成的,eclipse運行java步驟:
2打開eclipse新建一個工程
3輸入名字,如「例子」
4找到「例子」程序,找到src,點擊右鍵,新建一個java程序
5起個名,如「out」
6然後編寫代碼
7編寫完代碼後,點擊下圖三角圖運行該程序