計(jì)算機(jī)概論與C語言簡介_第1頁
計(jì)算機(jī)概論與C語言簡介_第2頁
計(jì)算機(jī)概論與C語言簡介_第3頁
計(jì)算機(jī)概論與C語言簡介_第4頁
計(jì)算機(jī)概論與C語言簡介_第5頁
已閱讀5頁,還剩72頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

第一章

1

在本章中,我何揩回H一些言十算檄概^的基本知WL藉

由道些基本知暹而擘雪霜月皆的程式言殳言十。除此之外,

我何也揩金十封C言吾言的褊群器及軌行猿境做一些^明,加

弓金^者在往彳爰章功「中幺柬雪靶例日寺所需要的基本知言戢。

2

大銅I

?1.1重月普硬te

-1.1.1算數(shù)暹率苴軍元(ArithmeticandLogicUnit)

-1.1.2控制罩元(ControlUnit)

-1.1.3言己t意骨亶罩元(MemoryunitandStorageUnit)

-1.1.4卓俞入罩元(Inputurdt)

-1.1.5片俞出覃元(Outputunit)

?1.2

?1.3程式言吾言

-1.3.1檄器者吾言

-1.3.2低P皆言吾言

-1.3.3高B酊吾言

?1.4(:言吾言曾介

?1.5程式^^流程典褊群器

-1.5.1(^吾言程式的^^流程

-1.5.2編群器(Compiler)【未甫充】

-1.5.3整合|^考姜If境(IDE;IntegratedDevelopmentEnvironment)

?1.6褊群器典程式變^例

-1.6.1GCC褊群器

-1.6.2Dev?C++整合^^IB境

-1.6.3BorlandC++Builder

?1.7本章回展真及下章JR霓

1.1重月做硬it

?硬醴就是您可以看到的重月窗器殳借(拆II外段),不謾若光是it棣形容

硬18未免謾於曾罩。除上,若彳住功能面加以顯分,可符重月第硬醴分

懸5大軍元(如下圈),5彳固軍元分別負(fù)責(zé)不同的工作。

-6主】:

算數(shù)暹輯罩元典控制軍元

合耦中央J8理罩元(就是

常醵到的CPU),中央慮理

軍元和主言己I意醴刖

的核心部分,其繪的周遏

B5ffi(輸入軍元典輸出

軍元)必須典之速留吉,

透謾中央慮理罩元的控制

,使周遏常正常建作。

*資料流?控制機(jī)St

5

1.1.1算數(shù)暹It罩元

?算數(shù)暹單茸罩元(曾耦A(yù)LU)是軌行程式中各類去S算的^18罩

位。造些建算即可以分懸雨大類必算數(shù)建算典iMil算。算

1^8算包含加、減、乘、除等等的數(shù)值建算,而iMil算即

包含AND、OR、NOT、移位等位元/位元^的暹單苴建算。

6

1.1.2控制軍元

?控制軍元(曾耦CU)的功能懸控制流程及憤言周輸入、輸出、

言刖意、算數(shù)暹tt等4大罩元的建作。控制罩元中包含(1畝己^

指令作何真序的微程式(microprogram)、(2)取得卡一指令

的iM霜路(3清回勤元件的解碼器(decoder)及(4)冢多il攆

器(multiplexer)。

-常指令迤入CPU之彳爰,控制元件畬先迤行指令解碼(Decode),加按照

指令槿亍封鷹的微程式,彝出不同的^虢完成^指令所需要完成

的各^功能,最彳爰孰行暹申苴重路以便取得下一他指令。

7

1.1.3言刖意tl罩元

?言刖意18罩元分懸主言刖意I8(mainmemory)奧申甫助言刖意18

(secondarymemory),主要功能是用來儲存資料(程式也是

一槿資料),任何要被軌行的程式都必須放置於主言刖意醴中,

CPU才能存取^程式,封於新型的作槊系統(tǒng)而言,畬揩部分

的申甫助言川意ti常作是虛掇的主言刖意醴以便解決程式謾多或謾

大而瓢法完全戴入主意刖意te的冏題。

8

1.1.3言己]意fg軍元

-主言己I意t亶(又稠卷內(nèi)部言己I意t亶),目前以半醇f要元件制成,特性卷存取速度

快、成本高。主言由意醴依照存取特性又可以分卷隨檄存取言己情醴(Random

AccessMemory;曾耦RAM)及唯^三己t意首要(ReadOnlyMemory;ffiffiROM)o

-RAM的成本較低,但是輾法於重力消失畤保存資料,故卷揮樊性言書意醴的一

ttoROM成本較高,但谷|J可以在輾重力的冊下保存資料,傅統(tǒng)的ROM只能

嘉入資料一次,因此通常只曾把做勤重月留所需要的小程式儲存在ROM貍面,

例如BIOS就是使用ROM做卷言己|意醴。

-【言主】:目前ROM已^^^成可以重^離入資料,例如:EPROM.

EEPROM等。其中的『P』懸Programmable的縮猱和懸可程式化的

ROM,清除原本資料的方式即輿RAM有所不同,例如使用紫外氐泉清除資

料以及較高重屋清除資料。但成本仍比一般的RAM高出言午多。

-$1助言己想醴(又耦懸外部言時意醴),目前以磁性物醴或光擘材料幺且成,例如:

硬碟檄、勒碟片、光碟片。隼甫助言己1'意醴的存取速度相封於主言己I意颼慢了數(shù)十

倍以上,但裂作成本刖比主官己I意颼低了數(shù)十倍以上,因此遹合儲存大量的資

料。

9

1.1.4輸入軍元

?輸入罩元是「具有輸入功能的遇遏者殳借」,例如維黑、滑鼠、

搖捍等等。使用者可以藉由適些輸入裝置典重月皆取得蒲通的

管道。

10

1.1.5輸出軍元

輸出軍元恰典輸入罩元相反,所有「具有輸出功能的皆腐輸出軍元

的元件,主要功能是符程式軌行的《吉果(文字、磬音、影像)輸出或Si示。

常見的輸出裝置有簧幕、印表檄等等。某些遇同畤具有輸入輿輸出

的功能,例如:斶控式蜜幕、畬震勤的搐悍等等。

-n±l:望寸於Linux/Unix作渠系統(tǒng)而言,任何除了CPU典主言己|意醴之外的^^

都可揩之視卷遇諼翰出入因此,硬碟檄也被視卷輸出入的裝置

(device),如果您舉寸Linux指令熟悉的言舌,可以很曾軍的把原本^^輸出到

簧幕的文字,醇換卷輸出到槽案。

11

1.2重月昔軟tl

?重月窗軟18分懸資料典程式雨大類必事^上不^是哪一類隊(duì)都是以0、1的二

位元表示法信者存在重月留言殳借中(例如:信者存於硬碟檄中)。而程式又可以

分卷系統(tǒng)程式(SystemProgram)典Jffi用程式(ApplicationProgram)。

系統(tǒng)程式一般卷較接近硬醴底Jf的低P皆程式,例如:作棠系統(tǒng)(Operating

System)、編群程式(Compiler)、幺且群程式(Assembler),遵名吉程式(Linker)

等都腐於系統(tǒng)程式。鷹用程式即是架橫在系統(tǒng)程式之上,依撼某槿特殊需

求而^^出來的敢:18,例如:Office.幔矜系統(tǒng)、霜月留遁激等等。

待解決的冏勒

服用程式

泉統(tǒng)程式

系統(tǒng)程式典愿用程式信融系III系統(tǒng)程式典鷹用程式陷Jflll

12

1.3程式^言

?言吾言的用途是做懸人典人潢通的槁卞梁,例如:和美閾人交^

就要用英文潢通。同棣地,人若要和重月皆潢通的言舌,就必須

使用重月皆『懂』的言吾言,道槿言吾言耦卷程式言吾言

(ProgrammingLanguage)。而一般我相號用來典人潢通的言吾

言用J耦懸自然言吾言(NaturalLanguage)o

-程式^言依摞輿自然言吾言的相似度又可以分卷3槿:檄器^言、低陷

三吾言及高P皆言吾言。其中高^^言典人類:!所使用的自然言吾言最懸相近,

而檄器^言即和人^所使用的言吾言南$a北轍。

13

1-3程式言吾言

IS1-6程式^言分^

14

131械器^言

?榛器言吾言(MachineLanguage)是重月皆硬醴唯一看得懂的言吾

言,換句者舌言兌,檄器言吾言就是一速串的0、1二暹位數(shù)字^合,

因此又耦懸檄器碣。一般人通??床欢佬?、1所代表的特

殊涵羲,其^^於重月皆而言,造些0、1的^合數(shù)字,可能代

表某槿資料,也可能代表某他指令。由於大多數(shù)的人瓢法了

解或言刖意道一速串0、1數(shù)字所代表的涵羲,因而贊展了低P皆

言吾言典高P黯吾言。

-nii:瓷料或程式碓^是用二暹位表示,但有的畤候卷了縮短道一

速串的二迤位數(shù)字表示,某些善籍或軟醴畬符檄器^言使用16暹制來

加以表逵。例如:01001001->49Ho

15

1.3.2低P皆^言

?低卜皆言吾言(Low-levelLanguage)是一槿接近於檄器者吾言的

表示方法,不謾?quán)S使用人^比較容易言日意的罩字形式來封鷹

一建串的0、色且合。最典型的低隋言吾言就是^合言吾言

(AssemblyLanguage)。在否且合言吾言中,使用建算子典iS

算元來表示一速串的0、色且合,而造些建算子即使用類期以英

文的縮嘉以利人類鼬勺言刖意典理解,例如:使用INC來代表

Increment(累加指令)。

16

1.3.2低P皆^言

8051檄器音吾言指令8051幺且合言吾言指令息我

00000100INC軌行累加1

10000100DIV軌行除法

805保且合^言指令輿檄器^言指令的莖打fi

-在上表中,很明^的可以看出,名且合言吾言的指令典檄器者吾言的指令是

一舉寸一的封鷹信”系,但是郤比檄器言吾言容易言乎意,除此之外,其他^

合言吾言的言殳言十都典檄器者吾言的言殳言十相同,我相弓可以徙下表中更明碓地

看出雨者的相同輿相巽慮:

x86檄器冒吾言x86幺且合音吾言意羲

0000001111001000ADDCX,AX軌行暫存器加法

101110010011010000010010MOVCX,1234H招CX暫存器的值指定卷1234H

x86,^合^言輿檄器^言的舉寸JS

17

1.3.2低P皆^言

-由上述的雨彳固表格中,我年號可以得知襄件事,(1舔且合言吾言比檄器言吾言

更接近人^所使用的自然言吾言。(2)不同的CPU所使用的幺且合言吾言也不

相同。(3)任何一彳固完整的幺且合^言指令恰好封鷹一幺且檄器^言的0、1

由歹ijO

?冬且合言吾言典檄器言吾言一封一的特性,使得^合言吾言可以完全

掌控重月皆的硬醴幺吉橫,如此一來,在軌行效率上自然也就完

全交由程式者殳言十白而決定。不謾,由於不同的CPU必須使用不

同的^合言吾言加且必須封於^CPU的aiMtw吉情有充分熬知,

因此,道槿低隋言吾言仍營瓢法被女色大多數(shù)的人所接受,因而

I變展了更接近於人類直自然言吾言的高p皆言吾言。

?ti±]:幺且群程式(Assembler)是一槿用來揩^合^言醇換卷檄器

^言的一套程式,相較於其他系統(tǒng)程式而言,余且群程式於一槿

比較容易II樊的系統(tǒng)程式。

18

1.3.3高P器吾言

?余且合言吾言雖隹然比檄器者吾言更接近於自然言吾言,但幺且合言吾言的程式言殳言十白市必

須封於軌行程式的慮理器有更多的了解,或且每彳固慮理器的《且合言吾言加不

相同,因此,一槿比《且合言吾言更接近自然言吾言且不因更換檄器而改建言吾法

的程式言吾言也被贊展出來,此槿言吾言就是高P皆言吾言。

?高P器吾言(High-levelLanguage)使用更接近人類比思W隹的方式來言殳言十程

式,常程式言殳言十完成之彳爰,必須通謾另外一些翻群程式的翻群彳奏才能別被

^亍。高P皆言吾言的建算子通常具有比敕弓拿大的功能,因此,軍一行的

高P皆言吾言程式可能被翻群成家午多的檄器礁以便完成^^的工作。

-依摞手^的不同,我憑可以揩高P皆言吾言II分成編群式言吾言典直群式言吾言。編

言睪式^言的翻群程式穗卷編群器(compiler),而直群言吾言的翻群程式穗卷直

群器(interpreter)。由於編群器典直^器比起幺且群器的功能更卷弓金大及親隹,

因止匕高P酊吾言通常具肴較高的硬馥孑蜀立性(machineindependent,,也就是

具有可摧性(portable)0換句者舌言兌,常您在At!器上所撰離的高^^言程式,

如果想要拿到B81器上軌行畤,通常不需要修改程式或只需要小幅度的修改,

因卷您只需要更換另外一套在B檄器上軌行的編群器或直^器就可以符程式重

新翻音睪加在Bt?器上正碓軌行。

19

1.3.3高P器吾言

褊百睪式百吾R

-編群器探用整批作渠(Batch)方式來慮理程式翻群的工作,換句^

者兌,富我件設(shè)各程式^言十完罩加交由編群器翻群之彳爰,編群器畬揩翻群

結(jié)果存成一彳固目的槽(objectfile),而造彳固目的槽可^由速結(jié)其他目

的槽及程式廛之彳爰形成可軌行槽(executefile),或由重月皆直接軌行。

常兄的編者睪式言吾言有C、C++(編者睪器卷gcc、g++、VC++>BCB)、

Pascal、ObjectPascal(編]睪器卷Delphi、Kylix)等等。

-編群式^言使用模條且化技巧,也就是把某些具有特殊功能的片段程式

褐立成一彳都固的函式,加揩之集合成一彳固函式槽案,如此一來,就

可以^需要使用^功能的程式透遇速結(jié)的方式加以結(jié)合,縮短撰嘉程

式的畤?yán)纾篈NSIC的math函式廛中就包含言午多求三角函數(shù)的

函式,所以我憑企不需要自行撰嘉求三角函數(shù)的辭幺出步驟,只要在需

要求三角函數(shù)值日札弓用Math函式廛即可。一彳固基本編群式^言的程

式慮理流程如下圃。

20

1.3.3高陪言吾言

原始程式槽

編群式言吾言的程式慮理流程

21

1.3.3高P皆^言

?直吉睪式言吾言

-直群器典編群器慮理程式的步驟不同,常我憑使用直言睪式言吾言撰嘉程式完

加使用直言睪器來翻群程式畤,加不畬羥生目的槽或可軌行槽。直群器畬招程

式一行一行的^入,逐行翻言睪加送交由雷月皆孰行,因此,每一次要軌行編群

式^言程式畤,都必須做勤直言睪器來重新翻言睪程式。也正因卷如此,所以常

程式中有金昔^^生日寺,前面沒有金昔一^的程式仍畬被軌行,加且停留在金昔^的

那一行程式,因此較遹合用於程式^^謾程,道一黠即典褊言睪式言吾言完全不

同。所以,直群器具有盛督軌行狀況的效果。常兄的JavaScript、VBScript、

Python等都腐於直群式^言。

直群式^言的程式慮理流程

22

1.3.3高P器吾言

?:

-近年央,由於整合式^考酎袁境(IntegratedDevelopmentEnvironment,

IDE)的樊展,使得編群式^言也同檬可以具有盛督程式逐行軌行的能力,因

此,也改善了編言睪程式變除金昔的困國隹。

?仁蓼^輿探言寸】:

-在前面提謾(^吾言是編群式言吾言,但事^真的是如此嚅?其^^是有^^的。

言午多老自幣及作者在^本(包含本耆某些部分)或授音果謾程中,都畬揩C、C++

等耦卷編群式^言,但事^上,在冢多程式言吾言的原文娶余空等級善籍中,彳定

未看到此^敘述。道是由於程式言吾言原本就沒有造槿分類乳編群器典直群器

只不謾是^^程式的工具。例如一般我優(yōu)畬使用C的編者睪器來褊群C程式,但

事^上,屣史也曾^出現(xiàn)謾言午多特定用途的C直群器(Interpreter),例如

Stanford大擘的ThetisCInterpret6r以及趣高P皆言吾言的CH(supersetofC

interpreter)o若有典趣者,可至下列翁站內(nèi)言旬。

?ttp:///

?/CH/

23

1.4(^吾言曾介

?(^吾言典C+十言吾言有著奧妙的信引系,因此有人需兌,C++是言的延伸,

也有人言兌,C++是一槿全新的言吾言。道雨槿言兌法都算正碓,因卷C++是使

用基本的。言吾言言吾法,但C++更重要的是一槿全新的物件醇向覲念。在本

^中,我件設(shè)各分別介貂道雨槿言吾言的特色典JB史背景。

?C吉吾言是在70年代,由同豳^室的KenThompson輿DennisRtchie共同

贊展的一套重月爵者吾言,^版本耦懸K&RC。之彳食美閾閾家檄型癌畬

(ANSI)於1983年符(3言吾言檄型化,制言丁出一套才票型的言,

ANSI-C(於1988年完成制定),版本界J卷各槿吾言編群器統(tǒng)一支援

的版本,其^法官青兄附至象£。

-有了檄型之彳爰,(:言吾言便具有可^性。除此之外,由於言不但具有指襟可

以直接存取言己ts醴的資料,加且又是高隋言吾言中最低P皆的一槿程式言吾言,例

如,(:言吾言可以在某些璟境下操控硬醴資源,甚至於是直接嵌入幺且合言吾言(不

謾常您使用適些指令的日寺候,揩畬降低言原本的可摧性)。以上槿槿,使

得言成卷一他非常成功的言吾言,加且在之彼加入物件醇向形成c++言吾言,

因此,直到目前卷止,C及C++仍是最多程式言殳言十白幣所使用的程式^言。

24

1.4(^吾言曾介

-言的樊展屣史有其特殊背景,(^吾言原本不叫做。言吾言,而是另一槿程式

言吾言B言吾言,KenThompson輿DennisRitchie麗人卷了言殳言十UNIX作渠系統(tǒng),

因此揩8言吾言加以延伸卷言,由於具有容易效率高及可操控硬18等

特性,因此同棣是由^室所樊展的UNIX系統(tǒng),系統(tǒng)核心的大部分程式

礁都是使用C來撰嘉,加且在UNIX作渠系統(tǒng)中的公用程式及言的編者睪器也

是由C所撰離的。

?[Q]:卷何C的編群器程式可以用C來撰離呢?那用來撰嘉編言睪器的C程

式又必須用什麼束西來編言睪呢?答案富然也是褊群器哪,但造彳固編群器又

是用什麼言吾言撰嘉而成的呢?冏堰,日寺常是初阜程式^言^者心中的

一大疑冏。(一槿程式^言的第一彳固褊群器是如何嘉成的呢?)

?[A]:其^最基本的C褊群器^^是由名且合^言來撰嘉的,但是造彳固基

本編群器只提供了黑彳固曾罩的C指令(例如:10彳固指令),然彳爰我憑就可

以利用道10彳固指令央撰嘉提供更多指令的C編群器,如此遇而彳復(fù)始,編群

器所提供的(:言吾言指令就越來越多,直到符合所有ANSI-C所定羲的指令卷

止,如此一來,除了最基本的編群器是由幺且合意吾言完成的之外,其繪贊展

中各陷段的編群器就是使用高隋言吾言撰嘉的,道槿技巧,在編群器的彝

展理^中常??梢钥吹?。

25

1.4(:言吾言曾介

?命令式型魅程式吾吾言(ImperativeParadigmProgramming

Language)

-命令式型魅的程式言吾言是透iS一速串指定敘述(assignstatement舔且合

而成,指定敘述是表示式(expression),招一些子}8算式加以余且合,只

要依序孰行造些敘述就可以得到余吉果,(^吾言是一槿命令式型魅的程

式言吾言,其他^如BASIC、PascaKFORTRAN.COBOL等也都腐於

此類型里三

x=x+1;

-上述是一他明了晶鼎於命令式型熊的程式言吾言。

而上述的51算式,若以敷擘式子來表示,M'J^xt+1=xt+1,其中t代表

畤札

-命令式型魅的言吾言通常提供了黑槿基本的控制流程結(jié)橫,包含循序流

程結(jié)橫、51攆流程結(jié)情、圈流程結(jié)橫等等,我機(jī)設(shè)務(wù)在本耆中陛^介

貂道黑槿流程控制。

26

1.4(:言吾言曾介

?令吉橫化程式言吾言(StructuralProgrammingLanguage)

-(3言吾言是一槿幺吉橫化程式^言,也就是探用結(jié)情化分析言殳言十的方法,

招冏題由上向下,由大到小切割成^多子冏題,分別尊得子冏題的解

答,最彳爰再結(jié)合起來解決所要解決的冏題。造槿方法,也可以耦卷模

^化言殳言十。解泱子冏題的方法被分成一彳即固的模區(qū)且,在言中即稀

卷函式。在C的程式^言十中,程式言殳制喑幣必須^言十3線且合適些函式來

解決冏題。

-除此之外,一彳固東吉情化的程式言吾言遢有另一項(xiàng)重要的特性,也就是使

用for、while等脩件式退圈來取代gotolM條件跳ES指令。(:言吾言是令吉情

化的程式言吾言,雖隹然它仍提供了got。敘述(在言中,指令被未再之

卷敘述),但郤建^使用者離不得已不要使用goto敘述。

27

1.4(^吾言曾介

?C++物件醇向程式言吾言(OOPL;Object-Oriented

ProgrammingLanguage)

-(:言吾言在贊展超大型程式畤遇到了一些雉言要上的困It,因此俊來賓豳

^室的BjarneStroustrup博士符C言吾言加上物件醇向言殳言十(00口;

Object-OrientedDesign)而成卷C++言吾言。曾軍的言兌,C言吾言可以^

C++言吾言的子集,而更明硅的含兌,C++是基於C的^法或加上物件醇向

覲念所橫成的一槿新的程式^言,因此我件號可以符C++輿C以集合昌昌

彳系加以表示如下置I。

C++

物件擎向一-

C

28

1.4(^吾言曾介

-彳隹上圈可知,(3言吾言是C++言吾言中,除了OOP概念以外的部分。所以

一般常II到的C++程式言殳言十,其^也已^包含了C程式音殳言十。由於C++

言吾言推廉非常I慢利,加且包含了所有的言言吾法,因此,目前黑乎

沒有余屯。言吾言的編群器了,而大多數(shù)程式言殳言十白幣都畬使用C++編群器

來編者睪C言吾言程式。

-明^地,c++言吾言比言^^一些,因此,可以完成更大型的程式。

但由於言的效率以及更接近硬t亶的特性,因此,在某些弓金烈要求

效率的埸合中(例如:撰嘉作渠系統(tǒng)及^勤程式),我相號仍畬使用觸

(^吾言(有畤輿幺且合^言配合)而不使用c+十言吾言來言殳言十程式。

29

1.5程式^^流程典編群器

?言吾言程式完成彳灸,必須^謾褊群才能賀(被軌行,在附^

中,我例列出了^多可以褊群(^吾言的褊群器,除此之外,在

本皆「中,我相號也揩金十舉寸c言吾言褊群器的基本11念加以^明,建

立一些^於c言吾言褊群器的基本覲念。

30

1.5.1(^吾言程式的流程

多變?nèi)魏务廴菏秸呶嵫猿淌?/p>

都有一定的流程(如右

H),(^吾言的愿用

程式也同檄可以透謾下圈

流程加以完成。

#include槽案

3目的槽

其他

(objfile)目的碣

4-----------------程式康槽案

速結(jié)器(.lib)

_________;M可軌行槽

01-10程式^^流程

1.5.1言程式的^^流程

—Stspl:

-編本苴輿言殳言十程式,您可以使用任何的余屯文字編It器央褊HOC++程式(例

如:Windows的肇言己本、Linux的Vim或pico等等),然彳爰存成副槽名卷

r.cj輿r.cppj的原始程式槽,其中幺屯c言吾言程式可存槽卷r.cj,而包

含C+十言吾法或函式廛的程式即存槽卷『cpp』。

-Step2:

?使用褊者睪器來編群原始程式(例如:GCC的gcc/g++),編■結(jié)果揩是一

一目的命案(objectfile)o

—Step3:

?使用速余吉器符目的程式及其他目的程式典程式康共同速結(jié)成一彳固可軌行槽,

目前大多數(shù)的編群器都具有速幺吉器的功能。

-Step4:

?不^您是在編群謾程或速幺吉謾程中彝生金昔^或甚至是程式本身的暹It出現(xiàn)

金昔^而輾法逵到程式需求畤,都必須迤入俱金部皆段,重新檢查加修正原始

程式中的金昔如此遇而彳復(fù)始,直到程式完成您的需求卷止。

32

1.5.2編群器(Compiler)"甫充】

■傅統(tǒng)褊群器的功能是符原始程式斡換懸目的礁(如下圈懸(:言吾

言褊群器的工作),目的礁中即包含了檄器指令、資料值及

相^位址。就程式考殳言十肺而言,言十高B解吾言程式比較不需

要考It程式軌行的檄器平臺,只要在不同的硬醴幺吉橫,使用

不同的褊群器羥生遹合於^平臺的目的碣即可。

C寺吾言

原始程式目的的

H1-11(^吾言編群器的工作

33

1.5.2編群器(Compiler)"甫充】

?褊群器的工作主要分卷下列5彳郵皆段,加透遇符虢表言己余象程式

中相^的名耦。

轉(zhuǎn)意分析■中礁

哈W?掩描程式■■剖析程式.

原始程八FJ1程式

符虢表

目的的

H1-12編群器的慮理流程

34

1.5.2編群器(Compiler)"甫充】

?(1)描描程式(scanner):

-捕描程式畬描描原始程式內(nèi)容,根摞程式^言的文法,符昌融建字、保

留字、言微別字、51算子、燮數(shù)名穗、資料值等符虢分析出來,而造些

符虢即耦之懸句元(token)。因此,本P皆段的勤作又耦懸新]麋分析

(lexicalanalysis)。

-句元一般以正規(guī)表示式(regularexpression)加以定毒旋且可以使用

有限男犬Sm(firdtestatemachine;麓穗FSM戶兒以^作。換句言益兌,揭

描程式的主要工作是^作道些代表句元的有限狀魅檄,以符程式中的

每一彳固句元分雕出來。表13-1是一彳固燮數(shù)名耦的正規(guī)表示式,它規(guī)定

了只能使用A~Z的英文字母做卷燮數(shù)名穗的第一彳固字元,彳爰面即可以

接上0彳固以上的A~Z字元或0~9字元。

ID==[A-Z][A-Z0-9]*表1-3燮數(shù)名耦的正規(guī)表示式

35

1.5.2編群器(Compiler)"甫充】

intj,z;INIID.ID:

floati;FLOATID;

inik=O,e;INTID-INTEGFR.ID;

k_?2;ID=?INTEGER;

描描程式IDINTEGER'(INTEGER-INTEGER);

e-2*(2-?-3);IDINTEGER+FLOAT;

i_2+9.5:WHILE(ID<0)

whilc(k<0)(scanner)

?ID=ID+INTEGER;

k=k-1;

ID=INTEGFR*INTFGEREXPONENTINTEGER+INTEGER:

z=3*2**2T:ID-ID.INTFGFR;

j=k/9;IDINTEGERINTEGER:

k=5/0;

111-13描描程式的工作

36

1.5.2編群器(Compiler)"甫充】

?⑵剖析程式(parser):

-剖析程式畬依撼程式言吾言的言吾法規(guī)即判定造些句元的排列是否合乎^

法,故此P皆段勤作又木再懸言吾法分析(syntaxanalysis)。

-程式言吾言的言吾法規(guī)用林再之懸文法(grammar),一般使用BNF(Backus-

NaurForm)或EBNF(ExtensibleBNF)來表示,如下表是部分。言吾言的

文法。

compound-statement'.

{declaration-listoptstatement-listopt}

declaration-list'.

declaration

declaration-listdeclaration

statement-list'.

statement

statement-liststatement表1-4(^吾言的部分文法

37

1.5.2褊群器(Compiler)【不甫充】

?(3)言吾意分析程式(semanticroutine):

-言吾意分析程式蒯舒吾法瓢的程式牽事?lián)中IW%(intermediaterepresentation;

ffi?IR)o言吾意分析程式先羥生中^礁幺合最佳化慮理器做暹一步的虞理,而中

^^的格式典名且合^言已^非常接近。

*bCH

*bd

^意分析程式+Ht2

Bt3

semanticroutineta2一

?=

?

01-14中^^靠g例

仁吾法典言吾意的不同】

?吉吾法是程式言吾言的文法格式,而言吾意即是程式的^除意羲。聚例央言兌,假

喜殳有一他心言吾言敘述『c=a+b;』,剖析程式只是判敘述是否合乎C的

言吾法定羲,余吉果富然是合法的C程式敘述。但^除上^意是否合法,即仍

必須判定a,b,c燮數(shù)是否已^宣告謾以及資料型熊是否正碓。

38

1.5.2編群器(Compiler)"甫充】

?(4)最佳化慮理程式(optimizationprocessor):

-它畬揩中^碣迤行最佳化,最佳化即包含封目的礁的大小以及軌行效

率雨槿。加且又可以分卷典檄器瓢^的最佳化以及典檄器有^的最佳

化雨大類短

?(5)目的石焉羥生器(codegenerator):

-它畬符中換卷目的礁。舉寸於只慮理一次的褊群器(one-pass

compiler)而言,由於不畬羥生中^礁,因此,除上是符言吾意分析

程式及羥生目的礁程式合彳并在一起的。而封於可羥生多槿目的礁格式

(re-targetablecompiler)的跨平臺編者睪器(crosscompiler)而言,用J畬透

謾檄器描述槽的憤助,符中換成所需要的檄器目的礁。

39

1.5.2編群器(Compiler)"甫充】

?前置慮理程式(Pre-Processor)

-編群的謾程中,加非一始就做^除程式礁的醇換,而是必須先幺

某些前置慮理,前置慮理的工作包含了去除注解、載入襟豆^t、展^

巨集等等。負(fù)責(zé)前置慮理工作的就耦之懸前置慮理程式,它通常已^

包含在褊群器之中(一般常見的言褊群器已^包含前置慮理程

式)OI——1~

廠主解].刪除注解

.L______

I/*功能:巨集取代函式*/「A

#defineSum(a.b)a+t>L

voidmain(void)前置慮理voidmain(void)

{

inta=5,b=10,c;

cHSum(a,b)l;

i>

IBI1-15前置慮理及巨集展^

40

1.5.3整合^^璟境(IDE)

?傅統(tǒng)的褊群程式UH變流程有些繁未復(fù),程式考殳言十白幣必須先用文善編$1器撰嘉

原始程式槽,然彳爰再交由編群器、速結(jié)器揩原始程式槽編群懸具有除金昔功

能的可軌行槽,最彳爰幺空謾除金昔瓢^彳爰,才重新編群速結(jié)懸最余冬的可軌行槽。

不謾造彳固流程通常不畬一次就完成,因懸程式可能彝生者吾法、者吾意等金昔Bg,

而必須在褊tt器、編群器、除金昔器^切換來午多次,才能別得到最彼正硅的

原始程式典軌行槽。

?整合|§穹酎裳境(IntegratedDevelopmentEnvironment;麓木再IDE)是一

套整合性軟骨乳它符褊$1器、編群器、速結(jié)器、除金昔器、亍程式等功能

整合在同一套敢:tt之內(nèi),以方便程式^言十肺變程式之用。

-目前大多數(shù)的視窗程式整合境除了提供上述功能之外,遢提供了^多

的視窗套件供程式as言十自幣使用(道些套件也都被整合在IDE之中)。例如:

Borland公司所推出的BuilderC++Builder就是一套包含者午多元件的視窗程式

整合^^璟境。

41

1.5.3整合璟境(IDE)

鼠C”D?IMB6?Fraytctl

fill.OtAhIFVbw&VAc?o90MgaXftobftmipvSf.IHcrw三]?

D0?g0g.ijAdctowlIWh3211Mta>?iDMACC?M!I4kfMWMJDMSTMIIBD<lit

jf>7)□z?116bQ國創(chuàng)山區(qū)0姐就j一至田

Hm)為

—...'

ECTim

「二?

Ac*a?|£i|

More

46MIS1

AttMtex^a29

BMdmHSLaMocq

AMoSodM

AO^?H

B4)ModrbdLHnR^h

i/加但(Cd

,r.

o

icSSn:EI

Al

?1-16Borland所推出的C++Builder提供了C++編群器的

完善功能及^公司所^^的各槿視窗元件

42

153整合^^Ig境(IDE)

■【褊群器典整合酎t境】

-由於整合^^it境已^包含了編群器的功能,因此我憑常常畬用整

合^^璟境的名穗作卷編群器的名科例如BorlandC++Builder是

一彳固整合^考酎曩境,但我件號也可以耦它懸一槿編群器,因卷它同棣

具有編群器的功能。但反之印蟀交懸不常,例如GCC只具有褊群器的

功能,而未招編11器等其他功能納入,因此,我憑只畬穗GCC懸一

槿編群器,而不畬耦GCC卷整合^^璟境。

-除了少數(shù)的古老褊群器(例如TurboC)之外,大部分的程式言殳言十白市

都使用C++編群器來編群(:言吾言程式,因荔C++本身已^包含了所

有的言程式^法。在本耆的附金家中,我仍介貂了非常多槿^的

C++褊群器,在本章中,我憑只曾罩示輪GCC褊群器、DevC++及

BorlandC++Builder6整合變?nèi)缮丫场?/p>

43

153整合^^Ig境(IDE)

?命令列式用程式典視窗鷹用程式

-IS用程式分懸雨大類乳分別是命令列式的鷹用程式(Console

Application)以及視窗用程式(WindowsApplication)。命令列式

的施用程式只能縫I在命令列璟境中來軌行,例如Unix/Linux的各罐

Shell以及Dos作渠系統(tǒng)或Dos工作視窗。而MicrosoftWindows印」

卷視窗程式的軌行璟境。

-it雨彳固不同槿^的鷹用程式必須透謾不同的褊群器來完成,

且變視窗程式遢必須透謾視窗作渠系統(tǒng)所提供的各槿API

(ApplicationProgrammingInterface;Jffi用程式介面)來完成某

些情成視窗的重要功能。^命令列式的言編群器有GCC、

TurboC>TurboC++、BorlandC++等等,而窗程式的編群

器有VisualC++、BorlandC++Builder等等。加且,能匏^視窗

作棠程式的編群器也可以^^命令列式的鷹用程式。本耆符只金十舉寸

H樊命令列式的用程式來加以^明。

44

1.6編群器典程式^^例

?在本fl中,我件跣各介貂如何使用GCC來編群(^吾言程式以

及透i!Dev-C++、BorlandC++Builder^it程式的^例,

其繪各槿褊群器及整合^^琪境的使用方法,言靛和者自行

參^附余錄的介貂。

45

1.6.1GCC編群器

?GCC是由FSF免費(fèi)軟醴憤畬所彝展的一套C輿C++的編群器。早期gcc只

能褊群(:言吾言,而g++即是用來編群C++言吾言(另外遢有g(shù)77是用來褊群

Fortra崎吾言),但彳爰來GNU符多槿言吾言的編群器統(tǒng)穗卷GCC(GNU

CompilerCollection),或且成懸Unix/Linux作渠系統(tǒng)中最常被使用的編

群器。GCC彳他1987年推出0.9/1.0版本彳爰,仍營不斷彝展中,目前最新的

版本卷3.x版,其中比較著名的版本刖懸2.7、2.95及3.0版。

GCC(GNUCompilerCollection)

ffll-17GCC編群器

46

1.6.1GCC編群器

1.6.1GCC編群器

?年6例1-1:在Unix/Linux中考變展C言吾言程式。

-Stepl:^WVim<^Wch1_01.Co

gis89807@cissolll:[-/ch01]$vimchl.Ol.c

-Step2:輸入右Bl程式內(nèi)容。

-Step3:高隹^Vim加存槽。

(按下[Esc]第

然彳爰由俞入【:wq】。)

48

1.6.1GCC編群器

-Step4:軌行編群及速余吉。

gis89807@cissolll:[~/ch01]$gccchl_01.c

-Step5:軌行a.ou懶行K。

gis89807@cissolll:[~/ch01]$./a.out

1*1=11*2=21*3=31*4二41*5=51*6=61*7二71*8=81*9二9

2*1=22*2=42*3=62*4=82*5=102*6=122*7二142*8=162*9二18

3*1=33*2=63*3二93*4二123*5二153*6=183*7二213*8=243*9二27

4*1=44*2=84*3=124*4二164*5二204*6=244*7二284*8=324*9二36

5*1=55*2=105*3二155*4二205*5二255*6:305*7二355*8=405*9二45

6*1=66*2二126*3二186*4二246*5二306*6:366*7二426*8=486*9二54

7*1=77*2=147*3二217*4二287*5二357*6=427*7=497*8=567*9=63

8*1二88*2=168*3二248*4=328*5=408*6=488*7:568*8:648*9:72

9*1二99*2二189*3二279*4二369*5=459*6=549*7=639*8=729*9=81

gis89807@cissolll:[~/ch01]$

49

1.6.1GCC編群器

-■主】:

gcc可以用來編群(3言吾言,但必2期務(wù)程式存槽卷小嘉r.cj副槽名,若

符程式存槽卷大嘉『.C』副槽名,即畬被gcc常作是C++程式來加以褊

W,SI然gcc也可以用來編群C++言吾言,但是郤必須另外修正其他^多

速余吉之虞。由於C++已^包含言的所有^法,因此,我憑也可以

直接使用g++來褊群C程式,但此日寺喜青符槽名信者存懸C++程式,也就是

符程式副本富名指定卷『.cpp』盤青符Stepl的vimch1_01.c改檢zim

ch1_01.cpp>Step4的gccch1_01.c改卷g++ch1_01.cpp)。

-[i±l:

gcc輿g++可以揩編群輿速余吉分^完成,加且可以指定輸出槽案的槽名

(不一定必須是a.out)。道些^於gcc輿g++的其他^定都是透謾參數(shù)

言殳定來加以完成,器亶者可以^^附金耒人操作。

50

1.6.2Dev-C++整合^^璟境

?Dev-C++是一彳固免費(fèi)勒?圈FreeSoftware),您可以在下列區(qū)罔

址中下載適套軟骨乳本耆所使用的版本卷較穩(wěn)定的4.0版。

-/

?Dev-C++是一彳固C/C++言吾言的整合璟境,它使用GCC褊

群器,加且支援GTK+的圈形介面(GUI)以及OpenGUf板

(Template),同日寺也能匏]^穹磬I窗用程式(Windows

Application),不it在本善中,我相股各只介女召如何使用Dev-

C++^f芟C言吾言命令列式愿用程式(ConsoleApplication)。

51

1.6.2Dev-C++整合璟境

勒列1-2:在Windows中使用Dev-C++ft展C言吾言程式。

-Stepl:安裝Dev?C++彳麥,軌行【|^始/程式集(所有程式)/Dev

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論