A. 編譯程序是什麼意思編譯是什麼意思
編譯程序(Compiler,compiling program)也稱為編譯器,是指把用高級程序設計語言書寫的源程序,翻譯成等價的機器語言格式目標程序的翻譯程序。
解釋程序是一種語言處理程序,在詞法、語法和語義分析方面與編譯程序的工作原理基本相同,但在運行用戶程序時,它直接執行源程序或源程序的內部形式(中間代碼)。
(1)程序運行期間編譯其他程序擴展閱讀:
結構:
編譯過程分為分析和綜合兩個部分,並進一步劃分為詞法分析、語法分析、語義分析、代碼優化、存儲分配和代碼生成等六個相繼的邏輯步驟。這六個步驟只表示編譯程序各部分之間的邏輯聯系,而不是時間關系。
編譯過程既可以按照這六個邏輯步驟順序地執行,也可以按照平行互鎖方式去執行。在確定編譯程序的具體結構時,常常分若干遍實現。對於源程序或中間語言程序,從頭到尾掃視一次並實現所規定的工作稱作一遍。每一遍可以完成一個或相連幾個邏輯步驟的工作。
可以把詞法分析作為第一遍;語法分析和語義分析作為第二遍;代碼優化和存儲分配作為第三遍;代碼生成作為第四遍。反之,為了適應較小的存儲空間或提高目標程序質量,也可以把一個邏輯步驟的工作分為幾遍去執行。
B. 內存管理的基本問題
內存管理
操作系統對內存的劃分和動態分配,就是內存管理的概念。有效的內存管理在多道程序設計中非常重要,不僅方便用戶使用存儲器、提高內存利用率,還可以通過虛擬技術從邏輯上擴充存儲器。內存管理的功能有:
內存空間的分配與回收
地址轉換:在多道程序環境下,程序中的邏輯地址與內存中的物理地址不可能一致,因此存儲管理必須提供地址變換功能,把邏輯地址轉換成相應的物理地址。
內存空間的擴充:利用虛擬存儲技術或自動覆蓋技術,從邏輯上擴充內存。
存儲保護:保證各道作業在各自的存儲空間內運行,互不幹擾。
程序裝入和鏈接
創建進程首先要將程序和數據裝入內存。將用戶源程序變為可在內存中執行的程序,通常需要以下幾個步驟:
編譯:由編譯程序將用戶源代碼編譯成若干個目標模塊。
鏈接:由鏈接程序將編譯後形成的一組目標模塊,以及所需庫函數鏈接在一起,形成一個完整的裝入模塊。
裝入:由裝入程序將裝入模塊裝入內存運行。
程序的鏈接有以下三種方式:
靜態鏈接:在程序運行之前,先將各目標模塊及它們所需的庫函數鏈接成一個完整的可執行程序,以後不再拆開。
裝入時動態鏈接:將用戶源程序編譯後所得到的一組目標模塊,在裝入內存時,釆用邊裝入邊鏈接的鏈接方式。
運行時動態鏈接:對某些目標模塊的鏈接,是在程序執行中需要該目標模塊時,才對它進行的鏈接。其優點是便於修改和更新,便於實現對目標模塊的共享。
模塊在裝入內存時,同樣有以下三種方式:
絕對裝入。在編譯時,如果知道程序將駐留在內存的某個位置,編譯程序將產生絕對地址的目標代碼。絕對裝入程序按照裝入模塊中的地址,將程序和數據裝入內存。由於程序中的邏輯地址與實際內存地址完全相同,故不需對程序和數據的地址進行修改。
可重定位裝入。在多道程序環境下,多個目標模塊的起始地址通常都是從0開始,程序中的其他地址都是相對於起始地址的,此時應釆用可重定位裝入方式。根據內存的當前情況,將裝入模塊裝入到內存的適當位置。裝入時對目標程序中指令和數據的修改過程稱為重定位,地址變換通常是在裝入時一次完成的,所以又稱為靜態重定位。靜態重定位的特點是在一個作業裝入內存時,必須分配其要求的全部內存空間,如果沒有足夠的內存,就不能裝入該作業。此外,作業一旦進入內存後,在整個運行期間不能在內存中移動,也不能再申請內存空間。
動態運行時裝入,也稱為動態重定位,程序在內存中如果發生移動,就需要釆用動態的裝入方式。裝入程序在把裝入模塊裝入內存後,並不立即把裝入模塊中的相對地址轉換為絕對地址,而是把這種地址轉換推遲到程序真正要執行時才進行。因此,裝入內存後的所有地址均為相對地址,這種方式需要一個重定位寄存器的支持。動態重定位的特點是可以將程序分配到不連續的存儲區中;在程序運行之前可以只裝入它的部分代碼即可投入運行,然後在程序運行期間,根據需要動態申請分配內存;便於程序段的共享,可以向用戶提供一個比存儲空間大得多的地址空間。
C. C#的可執行程序每一次運行時都要進行即時編譯嗎
僅供參考:
1、C#是靜態的強類型語言,所以要先編譯後運行。
2、你這個Exe文件,你是直接點擊打開還是在項目文件中按F5啟動呢,如果是按F5他默認還會進行編譯,然後運行,如果是直接點擊打開Exe,即是直接運行這個已經編譯過的文件,
D. 匯編編譯軟體自帶的例子程序不會出錯,編譯其它的程序就出錯,不知為什麼,望高手指教
是不是環境變數設置問題呢。網上給你找了點說明,
ml.err和環璄變數設置問題
2008-05-16 14:36
如果你設置的masm32在在D盤根目錄上,可設置批處理文件,內容如下,用記事本寫,保存為阿asm.cmd,文件名隨你。
@echo off
set include=d:\masm32\include;%include%
set lib=d:\masm32\lib;%lib%
set patch=d:\masm32\bin;%patch%
打開命令提示符的窗口,在運行中輸入cmd,f運行上術批處理文件。
用CD命令,進入masm32目錄中的bin目錄,命令格式如下:
cd /d d:\masm32\bin\
運行bin目錄中的ml.exe編譯成test.obj , rc.exe編譯test.rc文件,最後用link.exe
格式如下:
ml /c /coff test.asm
rc test.rc
link /subsystem:windows test.obj test.res
特別要注意進入bin目錄中,我們要用到裡面的3文件,還有裡面的一些.dll文件,設置環境變數也很重要,否則在編譯時找不到你用include 所包含的文件,如果你不設置環境變數也可以,那麼你要用完完整 的路徑包含你所用的的.inc .lib 等文件才行,比如你用你用到include的文件夾中的windows.inc你要用到
include d:\masm32\include\windows.inc
好了,就寫這么多了。
asmlove
E. dev-c++運行程序的時候一直在編譯,不出現運行界面是怎麼
1、程序中存在語法錯誤:如果程序中存在語法錯誤,將會導致程序編譯失敗。在Dev-C++中,編譯器會在編譯時檢查代碼的語法是否正確,如果存在語法錯誤,編譯器會提示錯誤信息。因此,需要檢查程序中的語法錯誤並進行修復。
2、程序中存在邏輯錯誤:如果程序中存在邏輯錯誤,將會導致程序編譯出的結果與預期不符。在Dev-C++中,需要蔽悄對程序中的邏輯進行仔細分析,找出錯誤並進行修復。
3、編譯器設置不正確:如果編譯器設置不正確,也會導致程序編譯失敗或編譯出的結果與預宏清渣期不符。在Dev-C++中,需要檢查編譯器設置是否正確,並進行相應的修改。
4、程序中存在資源佔用問題:如果程序中存在資源佔用問題,將會導致編譯器無法正常工作。在Dev-C++中,需要確保程序中不存在資源佔用問題,並進行相應的優化。正鎮
F. 簡述將源程序編譯成可執行程序的過程
一個源程序到一個可執行程序的過程:預編譯、編譯、匯編、鏈接。其中,編譯是主要部分,其中又分為六個部分:詞法分析、語法分析、語義分析、中間代碼生成、目標代碼生成和優化。
預編譯:主要處理源代碼文件中的以「#」開頭的預編譯指令。處理規則如下:
1、刪除所有的#define,展開所有的宏定義。
2、處理所有的條件預編譯指令,如「#if」、「#endif」、「#ifdef」、「#elif」和「#else」。
3、處理「#include」預編譯指令,將文件內容替換到它的位置,這個過程是遞歸進行的,文件中包含其他文件。
4、刪除所有的注釋,「//」和「/**/」。
5、保留所有的#pragma 編譯器指令,編譯器需要用到他們,如:#pragma once 是為了防止有文件被重復引用。
6、添加行號和文件標識,便於編譯時編譯器產生調試用的行號信息,和編譯時產生編譯錯誤或警告是能夠顯示行號。
(6)程序運行期間編譯其他程序擴展閱讀:
編譯過程中語法分析器只是完成了對表達式語法層面的分析,語義分析器則對表達式是否有意義進行判斷,其分析的語義是靜態語義——在編譯期能分期的語義,相對應的動態語義是在運行期才能確定的語義。
其中,靜態語義通常包括:聲明和類型的匹配,類型的轉換,那麼語義分析就會對這些方面進行檢查,例如將一個int型賦值給int*型時,語義分析程序會發現這個類型不匹配,編譯器就會報錯。
G. 運行java程序時,為什麼要先編譯再運行,編譯運行一起進行不行嗎
java講究的是 一次編譯 處處運行,也就是提高了程序的一致性。java的程序之所在不同的操作系統上的運行結果是一樣的,是因為java虛擬機。
所以要運行java都要裝一個叫jdk的東西,裡面有java的虛擬機。這個虛擬機就是來解釋我們寫的代碼。通過這個虛擬機,就實現了代碼的移植。
我們寫好的程序,通過虛擬機,編譯成class文件,然後在運行。但是我們只需要編譯一次即可。
H. 程序的編譯期,鏈接期, 運行期各執行哪些操作
參考一下:
源文件的編譯過程包含兩個主要階段,而它們之間的轉換是自動的。第一個階段是預處理階段,在正式的編譯階段之前進行。預處理階段將根據已放置在文件中的預處理指令來修改源文件的內容。#include指令就是一個預處理指令,它把頭文件的內容添加到.cpp文件中還有其他許多預處理指令
這個在編譯之前修改源文件的方式提供了很大的靈活性,以適應不同的計算機和操作系統環境的限制。一個環境需要的代碼跟另一個環境所需的代碼可能有所不同,因為可用的硬體或操作系統是不同的。在許多情況下,可以把用於不同環境的代碼放在同一個文件中,再在預處理階段修改代碼,使之適應當前的環境。
預處理器顯示為一個獨立的操作,但一般不能獨立於編譯器來執行這個操作。調用編譯器會自動執行預處理過程,之後才編譯代碼。
編譯器為給定源文件輸出的是機器碼,執行這個過程需要較長時間。在對象文件之間並沒有建立任何連接。對應於某個源文件的對象文件包含在其他源文件中定義的函數引用或其他指定項的引用,而這些函數或項仍沒有被解析。同樣,也沒有建立同庫函數的鏈接。實際上,這些函數的代碼並不是文件的一部分。這些工作是由鏈接程序(有時稱為鏈接編輯器)完成的
鏈接程序把所有對象文件中的機器碼組合在一起,並解析它們之間的交叉引用。它還集成了對象模塊所使用的庫函數的代碼。這是鏈接程序的一種簡化表示,因為這里假定在可執行模塊中,模塊之間的所有鏈接都是靜態建立的。實際上有些鏈接是動態的,即這些鏈接是在程序執行時建立的。
鏈接程序靜態地建立函數之間的鏈接,即在程序執行之前建立組成程序的源文件中所包含的函數鏈接。動態建立的函數之間的鏈接(在程序執行過程中建立的鏈接)將函數編譯並鏈接起來,創建另一種可執行模塊—— 動態鏈接庫或共享庫。動態鏈接庫中的函數鏈接是在程序調用函數時才建立的,在程序調用之前,該鏈接是不存在的。
動態鏈接庫有幾個重要的優點。一個主要的優點是動態鏈接庫中的函數可以在幾個並行執行的程序之間共享,這將節省相同函數佔用的內存空間。另一個優點是動態鏈接庫在調用其中的函數之前是不會載入到內存中的。也就是說,如果不使用給定動態鏈接庫中的函數,該動態鏈接庫就不會佔用內存空間