资源描述
弟一早IwSSSciglwF在本章中,我明各回一些算械概的基本知,藉 由道些基本知,迤而阜雪重月窗的程式1殳言十。除此之 外,我号也符金十封小吾言的编群器及轨行猿境做一些 明,加弓兔者在往接章fp中系柬雪靶例日寺所需要的基本知 三郊截2大铜 1.1甯月窗硬if-1.1.1 算数暹罩元(Arithmetic and Logic Unit)-1.1.2 控制军元(Control Unit)-1.1.3 言己I意ft罩元(Memory unit and Storage Unit)-1.1.4 本俞入军元(Input un让)-1.1.5 率俞出罩元(Output unit)1.2 1.3程式言-1.3.1 械器i吾言-1.3.2 低p皆言-1.3.3 高E皆I吾言 1.4 吾言曾介3大铜(余勖 1.5程式朗彝流程典编群器-1.5.1(吾言程式的n彝流程-1.5.2 秘睾器(Compiler)汴甫充】-1.5.3 整合IS凌璟境(IDE;Integrated Development Environment)1.6褊群器舆程式H例-1.6.1 GCC*器-1.6.2 Dev-C+整合IS凌璟境-1.6.3 Borland C+Builder 1.7本章回屉金及下章fg霓41.1 重月窗硬醴雷月辍硬ft就是您可以看到的霜月辍金殳借(拆外段),不谩若光是道檬形容 重月第硬ft未免谩於曾军。除上,若彳能功能面加以国分,可揩霜月第硬ft分 篇5大军元(如下圈),5彳固军元分别负责不同的工作。1主:算数暹tt军元典控制军元 合耦中央虑理罩元(就是 常11到的CPU),中央虑理 军元和主常己1意18期篇重月辍 的核心部分,其绘的周遏(率俞入军元典率俞出 军元)必须典之速结,透谩中央虑理罩元的控制,使周遏善殳借正常作。资料流A控制虢51.1.1 算数暹It罩元算数暹翰罩元(曾耦ALU)是轨行程式中各算的军 位。道些建算即可以分焉刖大:算数建算典暹库为!算。算 81算包含加、减、乘、除等等的数值算,而暹牵前!算即 包含AND、OR、NOT、移位等位元/位元的暹算。6112 控制军元控制军元(麓耦CU)的功能焉控制流程及串俞入、串俞出、taw、算数暹tt等4大军元的作。控制罩元中包含(1后己会呆 指令圉句嗔序的微程式(microprogram)、(2)取得下一指令 的暹II重路,噩勤元件的解礁器(decoder)及聚多逗撵 器(multiplexer)。-富指令谨入CPU之彼,控制元件曾先谨行指令解礁(Decode),加按照 指令槿行封鹰的微程式,彝出不同的虢完成指令所需要完成 的各项功能,最接轨行暹It雷路以便取得下一彳固指令。7113看己|意醴军元割意飕军元分篇主割意既main 0010、)典率甫助翻意11(secondary memory),主要功能是用对1存资料(程式也是 一槿资料),任何要被款I行的程式都必须放置於主中,CPU才能存取官亥程式,封於新型的作棠系统而言,部分的单甫助I小意It常作是虚掇的主I己情It以便解决程式谩多 或谩大而辗法完全载入主官己情If的冏题。81.1.3言己意醴军元-(又耦焉内部看出意醴),目前以半醇1S元件制成,特性焉存取速度 快、成本高。主言己I意1S依照存取特性又可以分焉随檄存取春出意醴(Random Access Memory;曾本神RAM)及唯信薪己|意fl(Read Only Memory;WS ROM)-RAM的成本较低,但是辗法於重力消失日寺保存资料,故焉挥赞性言己|意醴的一。ROM成本较高,但郤可以在辗重力的月犬况下保存资料,傅统的ROM只能 嘉入资料一次,因此通常只曾把兽勤霜月图所需要的小程式信者存在ROM狸面,例如BIOS就是使用ROM做焉看己感H。KJ:目前ROM已II成可以重禊嘉入资料,例如:EPROM、EEPROM等。其中的P篇Programmable的施嘉,穗焉可程式化的 ROM,清除原本资料的方式刖舆RAM有所不同,例如使用紫外清除瓷 料以及较高重屋清除资料。但成本仍比一般的RAM高出1午多。-本甫助看己1意醴(又耦篇外部看己息if),目前以磁性物IS或光擘材料系且成,例 如:硬碟檄、软碟片、光碟片。率甫助言己I意fl的存取速度相封於主看出意醴慢了 数十倍以上,但裂作成本即比主看出意醴低了数十倍以上,因此遹合房者存大量 的咨判。9114 输入罩元率俞入军元是具有串俞入功能的遇遏,例如维篮、滑 鼠、搐才旱等等。使用者可以藉由道些串俞入装置取得港 通的管道。使用者101.1.5本俞出军元输出里元恰典输入里元相反,所有具有输出功能的尚殳倩皆腐输出军元 的元件,主要功能是揩程式轨行的结果(文字、磬音、影像)输出或81 示。常免的输出装置有簧幕、印表檄等等。某些遇遏同日寺具有输入典 输出的功能,例如:斶控式螯幕、曾震勤的搐才旱等等。-1:螯寸於Linux/Unix作渠系统而言,任何除了CPU舆主割意fg之外的 都可聘之视篇遇遏输出入福殳倩,因此,硬碟械也被视舄输出入的装置(device),如果您封Linux指令熟悉的,可以很曾军的把原本输出到 螯幕的文字,醇换篇率俞出到槽案。111.2雷分篇资料舆程式雨大,事上不是哪一,都是以0、1的二 位元表示法信者存在霜月辍北殳倩中(例如:信者存於硬碟檄中)。而程式又可以 分扁素就程通(System Program)舆屣由程式(ApplicationProgram)。系橱呈式一般篇较接近硬醴底眉的低F皆程式,例如:作棠系 统(Operating System)、褊群程式(Compiler)、和J睾程式(Assembler),建 结程式(Linker)等都腐於系统程式。)1用程式即是架横在系统程式之上,依摞某槿特殊需求而出来的款:11,例如:Office、幔矜系统、霜月辍遁 翱笛笛C系统程式典鹰用程式层鼾系m系统程式典鹰用程式F皆JWI121.3程式言1吾言的用途是做焉人典人港通的槁楔,例如:和美阈人交 就要用英文港通。同檬地,人若要和重月窗弹通的i舌,就必须 使用重月您懂的暮吾言,道槿言吾言耦焉程式言(Programming Language)。而一般我件号用来典人港通的暮吾 言同邦用焉自然得吾言(Natural Language)。-程式1吾言依撼典自然i吾言的相似度又可以分焉3槿:檄器高吾言、低F皆 常吾言及高E皆言。其中高F皆言舆人所使用的自然暮吾言最焉相近,而械器常吾言即和人所使用的i吾言南辕北辙。131.3程式暂吾言Bl 1-6程式言分141.3.1 械器官吾言械器言(Machine Language)是重月留硬ft唯一看得懂的言吾 言,换句弓系兑,械器言就是一速串的0、1二迤位数字 合,因此又耦焉械器礁。一般人通常看不懂道些0、1所代表 的特殊涵羲,其於重月第而言,道些0、1的系且合数字,可 能代表某槿资料,也可能代表某彳固指令。由於大多数的人辗 法了解或I小意道一建串0、1数字所代表的涵羲,因而彝展了 低B皆言典高隋言吾言。-LiJ:资料或程式碓是用二迤位表示,但有的日寺候篇了缩短道一 建串的二谨位数字表示,某些善籍或歉:醴曾符檄器官吾言使用16迤制来 加以表逵。例如:01001001-49H。151.3.2 低卜皆言吾言低B皆I吾言(Low-level Language)是一槿接近於械器得吾言的 表示方法,不谩郤使用人比敕容易看出意的军字形式来封J1 一速串的0、瞬且合。最典型的低B皆言就是系且合言吾言(Assembly Language)。在系且合言中,使用算子典 算元来表示一速串的0、1系且合,而道些算子即使用似英 文的缩嘉以利人的言己情舆理解,例如:使用INC来代表 Increment(累加指令)。161.3.2 低F皆言吾言8051檄器言指令80511合言吾言指令00000100INC轨行累加110000100DIV轨行除法805择且合善吾言指令舆檄器善吾言指令的封-在上表中,很明SI的可以看出,系且合言吾言的指令典械器言的指令是 一封一的封鹰信期系,但是谷肚匕檄器言容易吉出意,除此之外,其他 合i吾言的尚殳言十都舆檄器言的尚殳言十相同,我彳咒可以优下表中更明碓地 看出雨者的相同舆相累虑:x86械器官吾言x86系且合得吾言0000001111001000ADD CX,AX轨行暂存器加法101110010011010000010010MOV CX,1234H揩CX暂存器的值指定焉1234Hx86I合言舆檄器官吾言的封)1171.3.2 低B皆管吾言-由上述的雨彳固表格中,我凭可以得知黑件事,(1遍且合言吾言比檄器言 更接近人所使用的自然言。不同的CPU所使用的合言吾言也不 相同。任何一彳固完整的系且合言吾言指令恰好封一系且械器言的0、1 串列。合言吾言舆械器言吾言一封一的特性,使得系且合言吾言可以完全 掌控重月您的硬ft结情,如此一来,在轨行效率上自然也就完 全交由程式福殳白币决定。不谩,由於不同的CPU必须使用不 同的系且合得吾言她且必须封於CPU的系且微结情有充分言忍知,因此,造槿低F皆暂吾言仍营瓢法被余色大多数的人所接受,因而 樊展了更接近於人自然言的高F皆得吾言。!:系且群程式(Assembler)是一槿用来揩合言醇换焉械器 常吾言的一套程式,相率交於其他系统程式而言,程式腐於一槿 比较容易的系统程式。181.3.3 高B皆言吾言系且合i吾言虽隹然比械器言更接近於自然言,但系且合言的程式尚殳金十白市必 须封於轨行程式的虑理器有更多的了解,加且每彳固虑理器的系且合常吾言她不 相同,因此,一槿比余且合i吾言更接近自然言吾言且不因更换檄器而改燮法 的程式常吾言也被赞展出来,此槿i吾言就是高B皆言。高E皆言(High-level Language)使用更接近人思雉的方式来卷殳六十程 式,富程式尚殳六十完成之接,必须通谩另外一些翻群程式的翻群接才能多句被 重月辍孰行。高B皆得吾言的建算子通常具有比较强大的功能,因此,军一行的 高P皆I吾言程式可能被翻群成多的檄器礁以便完成亲隹的工作。-依撼手的不同,我优可以招高F皆言II分成褊群式言舆直群式|吾言。群式言的翻群程式不褊群器(compiler),而直群言吾言的翻群程式耦焉直 群器(interpreter)。由於褊群器典直群器比起系且群器的功能更篇弓苗大及,因此,高E皆言通常具有较高的硬113蜀立性(machine independent),也 就是具有可揣性(portable)。换句1番兑,富您在A檄器上所撰离的高F皆言 程式,如果想要拿到B械器上轨行日寺,通常不需要修改程式或只需要小幅度的 修改,因篇您只需要更换另外一套在B械器上轨行的褊群器或直群器就可以符 程式重新翻群加在B檄器上正硅轨行。191.3.3 高F皆I吾言编群式暂吾言-褊群器探用整批作渠(Batch)方式来虑理程式翻群的工作,换句信舌,富我正明等程式尚殳常十完交由褊群器翻群之接,褊群器曾揩翻群 结果存成一彳固目的槽(objectfile),而造彳固目的槽可由速结其他目 的槽及程式之接形成可轨行槽(execute file),加由霜月辍直接轨 行。常见的褊群式|吾言有C、C+(褊群器篇gcc、g+、VC+、BCB)、Pascal、Object Pascal(褊群器篇Delphi、Kylix)等等。-褊群式言吾言使用模化技巧,也就是把某些具有特殊功能的片段程式 彳蜀立成一彳固彳固的函式,加揩之集合成一彳固函式)槽案,如此一来,就 可以需要使用功能的程式透谩速系吉的方式加以结合,缩短撰嘉程 式的日寺。例如:ANSI-C的math函式康中就包含多求三角函数的 函式,所以我件号她不需要自行撰嘉求三角函数的辞系田步骤,只要在需 要求三角函数值日寺,引用Math函式廛即可。一彳固基本褊群式言的程 式虑理流程如下圈。201.3.3高B皆言吾言原始程式槽编群式言的程式虑理流程211.3.3 高B皆管吾言直群式言吾言-直群器舆褊群器虑理程式的步骤不同,富我什弘吏用直群式昌吾言撰嘉程式完 加使用直群器来翻群程式日寺,她不曾崖生目的槽或可轨行槽。直群器曾聘程 式一行一行的入,逐行翻群加送交由重月的轨行,因此,每一次要轨行褊群 式言吾言程式日寺,都必须兽勤直群器来重新翻群程式。也正因焉如此,所以常 程式中有金昔生日寺,前面没有金昔的程式仍曾被轨行,36且停留在金昔的 那一行程式,因此较遹合用於程式谩程,道一黑占即舆褊群式言吾言完全不 同。所以,直群器具有签督轨行状况的效果。常见的JavaScript、VBScript、Python等都腐於直群式言。直葬it言 原始程式直群器逐行 轨行程式直群式言的程式虑理流程221.3.3 高B皆言 LiJ:-近年来,由於整合式璟境(Integrated Development Environment WS IDE)的樊展,使得褊群式|吾言也同檬可以具有签督程式逐行轨行的能力,因 此,也改善了褊群程式18樊除金昔的困H。仁寥探It】:-在前面提谩(吾言是褊群式言吾言,但事真的是如此喝?其道是有的。多老白市及作者在官果本(包含本耆某些部分)或授官果谩程中,都曾符C、C+等稠焉褊群式言吾言,但事上,在聚多程式言的原文等级善籍中,彳能 未看到此K叙述。道是由於程式|吾言原本就没有道槿分,褊群器典直群器 只不谩是程式的工具。例如一般我凭曾使用C的褊群器来褊群C程式,但 事上,J5史也曾出瑜蜃午多特定用途的c直群群(Interpreter),例如 Stanford大擘的Thetis C Interpreter以及趣高E皆看吾言的CH(superset of C interpreter)。若有典趣者,句至下列雁I站查前J。ttp:/cse.stanf o rd.ed u/iel.ucdavis.edu/CH/231.4 Ci吾言曾介丹吾言舆C+十言吾言有著奥妙的信期系,因此有人,C+是与吾言的延伸,也有人言兑,C+是一槿全新的言。J1雨槿法都算正碓,因焉C+是使 用基本的言法,但C+更重要的是一槿全新的物件蹲向瞿免念。在本 SP中,我北明哥分别介貂道雨槿言的特色舆JE史背景。丹吾言是在70年代,由同If宣瞬室的Ken Thompson舆Dennis Rtchie共同 赞展的一套重月窗言,版本耦篇K&R C。之彼美阈阈家才票型琳曾(ANSI)於1983年揩与吾言才票型化,制三了出一套才票型的,吾言,耦舄 ANSI-C(於1988年完成制定),善亥版本即篇各槿吾言褊群器统一支援 的版本,其i吾法免附金呆。-有了檄型之接,俳吾言便具有可揣性。除此之外,由於言不但具有指檄可 以直接存取常己1意18的资料,36且又是高E皆言中最低F皆的一槿程式言吾言,例 如,(吾言可以在某些璟境下操控硬醴资源,甚至於是直接嵌入系且合得吾言(不 谩常您使用道些指令的日寺候,符曾降低言原本的可摧性)。以上槿槿,使 得言成篇一彳固非常成功的言吾言,加且在之彼加入物件醇向形成C+言吾言,因此,直到目前篇止,C及C+仍是最多程式常殳得十白市所使用的程式言吾言。241.4 Ci吾言曾介-(:管吾言的樊展屣史有其特殊背景,虎吾言原本不叫做薪吾言,而是另一槿程式 言吾言用吾言,Ken Thompson舆Dennis Rtchie丽人焉了常殳UNIX作渠系统,因此符言加以延伸篇屈吾言,由於具有容易IS樊、效率高及可操控硬18等 特性,因此同檬是由同室所樊展的UNIX系统,系统核心的大部分程式 礁都是使用C来撰嘉,36且在UNIX作渠系统中的公用程式及言的褊群器也 是由C所撰嘉的。QJ:禹何C的褊群器程式可以用C来撰离呢?那用来撰嘉褊群器的C程 式又必须用什麽束西来褊群呢?答案富然也是褊群器哪,但道彳固褊群器又 是用什麽言撰嘉而成的呢?,日寺常是初擘程式言者心中的一大疑冏。(一槿程式言的第一彳固褊群器是如何嘉成的呢?)A:其最基本的C褊群器碓是由系且合言来撰嘉的,但是造彳固基 本瀛睾器只提供了符固曾罩的C指令(例如:10彳固指令),然接我优就可 以利用道10彳固指令来撰嘉提供更多指令的c褊群器,如此遇而彳复始,褊群 器所提供的言指令就越来越多,直到符合所有ANSI-C所定羲的指令篇 止,如此一来,除了最基本的褊群器是由系且合言完成的之外,其绘樊展 中各E皆段的褊群器就是使用官亥高E皆言撰嘉的,道槿技巧,在褊群器的赞 展理中常常可以看到。251.4 Ci吾言曾介 命令式型熊程式暮吾言(Imperative Paradigm Programming Language)-命令式型魅的程式言是透谩一建串指定叙述(assign statement海合 而成,指定叙述是表示式(expression),揩一些子算式加以系且合,只 要依序孰行道些叙述就可以得到结果,(吾言是一槿命令式型熊的程 式I吾言,其他如BASIC、Pascal、FORTRAN、COBOL等也都腐於x=x+1;-上述是一彳固ct吾言表示式,明了ci吾言腐於命令式型熊的程式暮吾言。而上述的建算式,若以数擘式子来表示,MUBxt+1=xt+1 其中t代表 日寺。-命令式型魅的言吾言通常提供了黑槿基本的控制流程结横,包含循序流 程系吉横、逗撵流程结横、退圈流程结横等等,我彳呼将在本耆中陛介 貂道黑槿流程控制。261.4 Ci吾言曾介乐吉情化程式暮吾言(Structural Programming Language)-(吾言是一槿结情化程式言,也就是探用结情化分析言殳常十的方法,招冏题由上向下,由大到小切割成多子冏题,分别尊得子冏题的解 答,最彼再结合起来解决所要解决的冏题。道槿方法,也可以耦焉模 系且化tstf。解决子冏题的方法被分成一彳固彳固的模系且,在。言吾言中期耦 篇函式。在c的程式1殳六十中,程式1殳1十白币必须卷殳舒加余且合适些函式来 解决冏题。-除此之外,一彳固结情化的程式言逮有另一项重要的特性,也就是使 用for、while等倒牛式退圈来取代got。蛹条件跳耀指令。你吾言是解其 化的程式言,员隹然它仍提供了got。叙述(在与吾言中,指令被耦之 舄叙述),但郤建使用者离不得已不要使用got。叙述。271.4 Ci吾言曾介 C+物件醇向程式|吾言(OOPL;Object-Oriented Programming Language)-(吾言在凌展超大型程式日寺遇到了一些雉上的困萋隹,因此接来宾豳 室的Bjarne Stroustrup博士揩吾言加上物件醇向IStKOOD;Object-Oriented Design)而成篇。+言吾言。曾军的得兑,金吾言可以祝g C+言的子集,而更明硅的,C+是基於C的法加加上物件醇向 瞿免念所情成的一槿新的程式言,因此我便3可以符C+舆C以集合信封 彳系加以表示如下圈。281.4 Ci吾言曾介-彳他上圈可知,(吾言是。+言吾言中,除了OOP概念以外的部分。所以 一般常11到的C+程式/殳言十,其也已包含了 C程式1殳六十。由於C+常吾言推JW非常J嗔利,加且包含了所有的言暮吾法,因此,目前黑乎 没有触Ci吾言的褊群器了,而大多数程式下殳!十白币都曾使用C+褊群器 来编i睾ci吾言程式。-明81地,C+!吾言比Ci吾言亲隹一些,因此,可以完成更大型的程 式。但由於01吾言的效率以及更接近硬ft的特性,因此,在某些强烈 要求效率的埸合中(例如:撰嘉作棠系统及毋|勤程式),我优仍曾使 用系屯小吾言(有日寺典合i吾言配合)而不使用c+i吾言来。殳尚十程式。291.5程式流程舆褊i睾器-13樊Cl吾言程式完成彼,必须谩编群才能多旬被裁i行,在附金耒 中,我俨列出了多可以编群吾言的编群器,除此之外,在 本中,我件号也招金桂寸Cl吾言编群器的基本觐念加以i兑明,建 立一些於(吾言编群器的基本觐念。301.5.1。言吾言程式的流程任何编群式暮吾言程式 都有一定的流程(如右 H),明彝(3言吾言的)1用 程式也同檬可以透谩下圈 流程加以完成。程式流程H1-101.5.1 言程式的流程-Stepl:褊IS典言殳六十程式,您可以使用任何的触文字褊II器来褊HC/C+程式(例 如:Windows的肇本、Linux的Vim或pico等等),然接存成副槽名篇.c典.cpp的原始程式槽,其中触,吾言程式可存槽篇.c,而包 含C+十言吾法或函式Jg的程式即存槽篇.cpp。-Step2:使用褊群器来褊群原始程式(例如:GCC的gcc/g+),*扁蜀吉果符是一 彳固目的槽案(objectfile)。-Step3:使用速结器符目的程式及其他目的程式典程式共同速结成一彳固可轨行 樟,目前大多数的褊群器都具有速结器的功能。-Step4:不您是在褊群谩程或速结谩程中彝生金昔或甚至是程式本身的暹IS出琨 金昔而辗法连到程式需求日寺,都必须迤入侦金部皆段,重新检查加修正原始 程式中的金昔|臭。如此遇而彳复始,直到程式完成您的需求篇止。32152 褊i睾器(Compiler)【未甫充】傅统编群器的功能是符原始程式醇换篇目的礁(如下圈焉(吾 言编群器的工作),目的礁中即包含了械器指令、瓷料值及 相位址。就程式言殳言十白币而言,等殳言十高陪得吾言程式比较不需 要考ji程式轨行的檄器平台,只要在不同的硬醴结横,使用 不同的褊群器羟生逾合於仔亥平台的目的礁即可。Ctf言 原始程式BH-11(吾言编群器的工作331.5.2 编群器(Compiler)汴甫充】编群器的工作主要分舄下列5彳固E皆段,加透谩符虢表言己金泉程式 中相的名耦。凿版式剖析程式符虢表目的碣BI1-12编群器的虑理流程341.5.2 褊i睾器(Compiler)汴甫充】(1)捕描程式(scanner):-捕描程式曾捕描原始程式内容,根撼程式言的文法,揩字、保 留字、别字、算子、燮数名耦、资料值等符航分析出来,而造些 符虢即耦之舄句元(token)。因此,本B皆段的勤作又耦舄曾司麋分析(lexical analysis)。-句元一般以正规表示式(regular expression)加以定羲,且可以使用 有限升犬憩械(f/te state machine;曾耦FSM)加以作。换句善善兑,描 描程式的主要工作是作道些代表句元的有限状憩械,以符程式中的 每一彳固句元分离隹出来。表13-1是一彳固燮数名耦的正规表示式,它规定 了只能使用AZ的英文字母做舄燮数名耦的第一彳固字元,接面即可以 接上0彳固以上的AZ字元或09字元。ID=A-ZA-Z0-9*表1-3燮数名耦的正规表示式351.5.2 褊i睾器(Compiler)ffi充】int j,z;float i;ini k=O,e;IN I ID,ID:FLOAT ID:INT ID=!NTEGERJD;c-2*(2+3);i-2+9.5;whilc(k0)上 播扭短点 上 ID-INTEGER*(INTEGER-INTEGER);(甲田住八 ID INTEGER+FLOAT:r(scanner)严le ID=ID+INTEGER:z=32*27;j=k/9;k=5/0;ID=INTEGER*1NTEGFR EXPONENT 1NTEGFR+1NTEGER:ID=ID.INTEGER;ID-INTEGER.INTEGER;H1-13捕描程式的工作361.5.2 褊i睾器(Compiler)ffi充】(2)剖析程式(parser):-剖析程式曾依撼程式言的法规即判定道些句元的排列是否合乎 法,故此F皆段勤作又法分析(syntax analysis)o-程式言的法规即耦之篇文法(grammar),一般使用BNF(Backus-Naur Form)或EBNF(Extensible BNF)来表示,如下表是音B分。言吾言的文法。compound-statement.declaration-list statement-list f Cz Lz L vz L/Ldeclaration-list:declarationdeclaration-list declarationstatement-list.statementstatement-list statement 表 1 4t3言吾言的部分文法371.5.2 标睾器(Compiler)ffi充】(3)1吾意分析程式(semantic routine):-1吾意分析程式曾法的程式本事换篇中(intermediate representation;ffigIR)福吾意分析程式先崖生中合最佳化虑理器做迤 步的虞理,而中的格式舆系且合得吾言已非常接近。a:=b*c+b*d;意分析程式 semantic routineH1-14中靶例-吾法典意的不同】法是程式言的文法格式,而意即是程式的除意羲。聚例来1兑,假 常殳有一彳固言叙述c=a+b;,剖析程式只是判断官亥叙述是否合乎C的 官吾法定羲,结果常然是合法的C程式叙述。但除上言吾意是否合法,即仍 必须判定a,b,c燮数是否已宣告遇以及瓷料型熊是否正碓。381.5.2 版睾器(Compiler)牌甫充】(4)最佳化虑理程式(optimization processor):-它曾符中谨行最佳化,最佳化即包含封目的礁的大小以及轨行效 率雨槿。加且又可以分焉舆檄器的最佳化以及典檄器有的最佳 化雨大。(5)目的石嘱崖生器(code generator):-它曾符中醇换篇目的礁。封於只虞理一次的褊群器(one-pass compiler)而言,由於不曾崖生中礁,因此,除上是意分析 程式及羟生目的礁程式合侪在一起的。而封於可崖生多槿目白勺礁格式(re-targetable compiler)的跨平台系扁睾器(cross compiler)而言,即曾透 谩檄器描述槽的曲助,符中醇换成所需要的檄器目的礁。391.5.2 褊i睾器(Compiler)ffi充】前置虑理程式(Pre-Processor)-褊群的谩程中,加非一II始就做祭程式礁的醇换,而是必须先谩 某些前置虑理,前置虑理的工作包含了去除注解、载入才票、展IS 巨集等等。负责前置虑理工作的就耦之篇前置虑理程式,它通常已 包含在褊群器之中(一般常兄的,吾言褊群器已包含前置虑理程 式).ti解,删除11解1.-X1一 功能:巨案取代函式*/_ 工#define Sum(a,b)void main(void)前置庭理 void main(void)F F int a=5,b=10,c;int a=5,b=10,c;c4Sum(aJ);和-15前置虑理及巨集展Ifl c=a+b;401.5.3 整合璟境(IDE)傅统的褊群程式n彝流程有些繁,程式禄殳金十自币必须先用文善褊st器撰嘉 原始程式槽,然接再交由褊群器、速结器揩原始程式槽褊群焉具有除金昔功 能的可轨行槽,最除金昔,才重新褊群速结篇最余冬的可轨行 樟。不谩道彳固流程通常不曾一次就完成,因焉程式可能彝生i吾法、常吾意等 金昔,而必须在褊at器、褊群器、除金昔器切换多次,才能多句得到最彼 正碓的原始程式典款i行槽。整合璟境(Integrated Development Environment;麓木禽IDE)是一 套整合性软:11,它揩褊It器、褊群器、速结器、除金昔器、轨行程式等功能 整合在同一套软醴之内,以方便程式言殳金十白币程式之用。-目前大多数的视窗程式整合猿境除了提供上述功能之外,逮提供了 1午多 的视窗套件供程式言殳后十自币使用(道些套件也都被整合在IDE之中)。例如:Borland公司所推出的Builder C+Builder就是一套包含多元件的视窗程式 整合18樊璟境。411.5.3 整合璟境(IDE)_j FonnlpZIILL|Fonm1Pcoe*m|Events|.AceCcrftdMgn*crwAMaBtend lake M)M6M/a255QAnchort AdkxScrol AuoSce 时 ModeBBode4ccm&otdWCh|CAon-WTop)J td bdLe*ToR5 MWaMeu bcScMbie-Oxi2?、g1 CCPS hE4m/Hlpr pWpragma rattain dm”include ponnt Owner):TTorm(Owner)llrrfl cppH1-16 Borland所推出的C+Builder提供了 C+编群器的 完善功能及善亥公司所的各槿视窗元件42153 整合IS彝猿境(IDE)【编群器典整合明凌璟境】-由於整合is凌璟境已包含了褊群器的功能,因此我凭常常曾用整 合IS凌璟境的名耦作焉褊群器的名耦,例如Borland C+Builder是 一彳固整合IS凌璟境,但我俨也可以耦它篇一槿褊群器,因焉它同檬 具有编群器的功能。但反之即较焉不富,例如GCC只具有褊群器的 功能,而未犒gtt器等其他功能纳入,因此,我便识削程GCC扁一 槿褊群器,而不曾耦GCC舄整合凌璟境。【C1吾言典6+言吾言的编群器】-除了少数的古老褊群器(例如Turbo C)之外,大部分的程式下殳差十自市 都使用C+褊群器来褊群(吾言程式,因焉,C+本身已包含了所 有的C箫言程式暮吾法。在本善的附金条中,我什?介貂了非常多槿的 C+褊群器,在本章中,我优只曾里示靶GCC褊群器、Dev C+及 Borland C+Builder 6整合璟境。431.5.3 整合璟境(IDE)命令列式用程式典视窗用程式-0彝鹰用程式分篇雨大,分别是命令列式的J1用程式(Console Application)以皮混葡灌甬程装(Windows Application)。命令列式 的用程式只能多句在命令列琪境中来轨行,例如Unix/Linux的各槿 Shell以及Dos作渠系统或Dos工作视窗。而Microsoft Windows即 舄视窗程式的轨行璟境。-H彝道雨彳固不同槿的用程式必须透谩不同的编群器来完成,36 且视窗程式逮必须透谩视窗作渠系统所提供的各槿API(Application Programming Interface;J用程式介面)来完成某 些情成视窗的重要功能。H樊命令列式的言编群器有GCC、Turbo C、Turbo C+、Borland C+等等,而窗程式的褊群 器有Visual C+、Borland C+Builder等等。加且,能倒)10樊视窗 作棠程式的褊群器也可以IS樊命令列式的J1用程式。本耆符只金十封 10樊命令列式的用程式来加以明。441.6褊i睾器典程式例在本中,我仔用等介貂如何使用GCC来编群,吾言程式以 及透谩Dev-C+、Borland C+Builder明彝程式的例,其绘各槿编群器及整合II樊璟境的使用方法,者自行 附金条的介貂。451.6.1 GCC褊i睾器 GCC是由FSF免费软醴癌曾所赞展的一套C舆C+的褊群器。早期gcc只 能褊群蜜吾言,而g+即是用来褊群C+1吾言(另外逮有g77是用来褊群 Fortra唱吾言),但接来GNU揩多槿|吾言的皤睾器箱g焉GCC(GNU Compiler Collection),加且成篇Unix/Linux作渠系统中最常被使用的褊 群器。GCC彳他1987年推出0.9/1.0版本接,仍营不断赞展中,目前最新的 版本篇3.x版,其中比较著名的版本目1焉2.7、2.95及3.0版。GCC(GNU Compiler Collection)H1-17 GCCm睾器461.6.1 GCC褊i睾器471.6.1 GCC褊i睾器靶例1-1:在Unix/Linux中赞展废吾言程式。-Stepl:WVimch1_01.cogis89807cissolll:/ch01$vim chl_01.cStep2:率俞入右KI程式内容。Step3:ItliVim加存槽。(按下Esc B 然接翰入【:wq】。)481.6.1 GCC褊i睾器-Step4:轨行褊群及速结。gis89807cissolll:-/ch01$gcc chl_01.c-Step5:轨行a,ou瞅行槽。gis89807cissolll:-/chOl$./a.out1*1=1 1*2=2 1*3=3 1*4=4 1*5=51*6=6 1*7=7 1*8=8 1*9 二92*1=2 2*2二4 2*3=6 2*4=8 2*5=102*6=12 2*7=14 2*8=16 2*9二183*1=3 3*2二6 3*3=9 3*4=12 3*5=153*6=18 3*7二21 3*8二24 3*9二274*1=4 4*2二8 4*3=12 4*4二16 4*5=204*6=24 4*7二28 4*8二32 4*9二365*1=5 5*2二10 5*3=15 5*4二20 5*5=255*6=30 5*7二35 5*8=40 5*9=456*1 二6 6*2二12 6*3二18 6*4=24 6*5=306*6=36 6*7=42 6*8=48 6*9=547*1=7 7*2=14 7*3=21 7*4二28 7*5=357*6=42 7*7=49 7*8=56 7*9=638*1=8 8*2二16 8*3=24 8*4二32 8*5=408*6=48 8*7二56 8*8=64 8*9二729*1=9 9*2二18 9*3=27 9*4二36 9*5=459*6=54 9*7=63 9*8二72 9*9二81gis89807cissolll:-/ch01$491.6.1 GCC褊i睾器-:gcc可以用来编群C1吾言,但必须揩程式存槽焉小嘉.c副槽名,若 符程式存槽焉大嘉。副槽名,即曾被gcc常作是C+程式来加以褊 群,虽隹然gcc也可以用来编群C+!吾言,但是卸必须另外修正其他1午多 速结之虞。由於C+已包含小吾言的所有法,因此,我优也可以 直接使用g+来褊群c程式,但此日茅都第t名信者存焉C+程式,也就是 符程式副槽名指定篇cpp(MStepIBvim ch1_01.c改篇vim ch1_01.cpp、Step4的gcc ch1_01.c改焉g+ch1_01.cpp)_ LhJ J:gcc舆g+可以招褊i睾典速系吉分完成,加且可以指定输出槽案的槽名(不一定必须是a.out)。造些疆於gcc舆g+的其他|殳定都是透谩参数尚殳定来加以完成,者可以参附余条人操作。501.6.2 Dev-C+整合H樊璟境 Dev-C+是一彳固免费(Free Software),您可以在下列能I 址中下载道套款:ft,本善所使用的版本焉鞍穗定的4.0版。-Dev-C+是一彳固C/C+言吾言的整合璟境,它使用GCC褊 点睾器 加且支援GTK+的圈形介面(GUI)以及OpenGL檬板(Template),同日寺也能匏0樊视窗J1用程式(Windows Application),不谩在本耆中,我彳呻等只介貂如何使用Dev-C+明彝Cl吾言命令列式)1用程式(Console Application)。511.6.2 Dev-C+整合凌猿境靶例1-2:在Windows中使用Dev-C+凌展C暮吾言程式。-Stepl:安装Dev-C+彼,轨行始/程式集(所有程式)/Dev-1.6.2 Dev-C+整合H樊璟境-Step2:轨行【File/New Project指令,10兽一彳固新的程式事案。531.6.2 Dev-C+整合H樊璟境-Step3:指定程式事案:言、命令列式用程式(Console Application博案。-Step4:输入事案名耦篇p1_02。541.6.2 Dev-C+整合H樊璟境-Step5:指定事案槽的存放目金耒(例如揩靶例存放到C:C_lauagechO1)。551.6.2 Dev-C+整合H樊璟境-Step6:此日寺招H敬(吾言程式樟,其中已包含了一些吾言程式,道是Dev-C+自勤落您加上去的程式内容,以便fp省您的日寺。QH星缪?4崎 醯kQ-J Compi0 1 箝 Linker|哈 Resource|Compile log|Line Unit|Menage561.6.2 Dev-C+整合H樊璟境-Step7:入下圈中的额外程式,然接按下存槽快捷。Save cunenl file571.6.2 Dev-C+整合H樊璟境-Step8:率俞入,吾言原始程式槽名,例如ch1_02或ch1_02.c。581.6.2 Dev-C+整合H樊璟境-St
展开阅读全文