中文字幕理论片,69视频免费在线观看,亚洲成人app,国产1级毛片,刘涛最大尺度戏视频,欧美亚洲美女视频,2021韩国美女仙女屋vip视频

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
計(jì)算機(jī)漫談
第一章 程序漫談
1.1 硬件、軟件、程序
1.2 計(jì)算機(jī)語言
1.3 語言和實(shí)現(xiàn)語言的工具
1.3.1 機(jī)器語言
1.3.2 匯編語言
1.3.3 高級(jí)語言
1.3.4 語言實(shí)現(xiàn)工具
1.3.4.1 C++ Builder的基本功能
1.3.4.2 VCL vs. MFC
1.1
對(duì)于計(jì)算機(jī),也許你是老鳥,也許你是菜鳥……
但不管怎樣,如果你此時(shí)此地你要學(xué)習(xí)編程,那么你應(yīng)該多多少少知道點(diǎn)什么叫硬件什么叫軟件——反正我不管你懂不懂,為了面子,我很不樂意你問我什么叫硬件什么叫軟件——我做在這凳子半個(gè)小時(shí)了,一直想不出如何給二者下個(gè)定義。
美國一個(gè)電腦神童說:“凡是摔到地上會(huì)壞的就是硬件?!蔽疑罡胁煌祝娝苤?,如果把硬盤摔到地上,那么硬盤壞了,里頭的那些數(shù)據(jù)——都是軟件——也一樣地壞得讓你我心疼。
倘若按字面上理解,那就更加的矛盾重重:硬盤硬是硬件;軟盤軟也是硬件。
還一種說法是:看得見摸得著的為硬件,看不見摸不著的為軟件。剛覺得它說得不錯(cuò),但馬上我就發(fā)覺了它的破綻:我現(xiàn)在用的Word2000,它就在屏幕上,界面美觀,操作方便……
無奈之下,我搬出金山詞霸,它說:“硬件:計(jì)算機(jī)及其它直接參與數(shù)據(jù)運(yùn)算或信息交流的物理設(shè)備”。挺好。硬件就是設(shè)備。平常我們生活中的各種設(shè)備,洗衣機(jī),冰箱,電視,還有螺絲刀,鉗子,都是硬件。
軟件呢?“軟件:控制計(jì)算機(jī)硬件功能及其運(yùn)行的指令、例行程序和符號(hào)語言”。指令、程序和符號(hào)語言是什么且不說,至少我們得知:軟件是用來控制硬件的運(yùn)行的。
這就好辦點(diǎn)。我們可以打比方:譬如汽車,其本身自然是硬件,但關(guān)于駕駛車的那一套技術(shù),及有關(guān)交通規(guī)則,我們可稱為軟件,因?yàn)楹笳呖刂屏饲罢叩倪\(yùn)行方式。
(一般不傳之秘笈:如果你英語一般,學(xué)習(xí)編程時(shí),別忘裝上金山詞霸。并且裝上后立即上網(wǎng)升級(jí)詞霸)
現(xiàn)在來談“指令、程序、和符號(hào)語言”。我想交通方面的“軟件”確實(shí)就是這些東西。我不會(huì)駕車,但曾多次看到警察在我上班坐的班車前用指頭一指,就令我們的司機(jī)臉色發(fā)青。之后,一套既定的處罰程序被執(zhí)行。很快,聽說我們的司機(jī)又在學(xué)習(xí)那些用來表示“單行”、“只許右拐”、“不許停車”、“禁鳴”等奇奇怪怪的符號(hào)語言了……
事實(shí)上,說軟件看不見摸不著其實(shí)也正確。因?yàn)樗鼈兪撬枷?,精神,?guī)則,邏輯。本身是抽象的,確實(shí)不可觸及。但軟件總是要有載體來存放,要有表達(dá)或表現(xiàn)方式,這些使得它們變得形象具體起來。在此意義上,說軟件是摔在地上壞不了的東西,也相當(dāng)行得通,神童畢竟是神童。
最后,什么是程序?我決定斗膽來給它下個(gè)定義:
程序是一組按照一定的邏輯的進(jìn)行組合的指令。
因此,在以后的學(xué)習(xí)過程上,很多時(shí)候,我們會(huì)覺得程序就是指令;同樣很多時(shí)候,我們會(huì)覺得程序就是邏輯。
當(dāng)然,更多的時(shí)候,我們并不區(qū)分程序和軟件二者。也許前者更趨于抽象,而后者趨于具體。比如我們?cè)趯懩切┍磉_(dá)我們的思想邏輯時(shí),我們喜歡說“寫程序”;而當(dāng)程序完成,可以待價(jià)而沽?xí)r,我們稱它為軟件產(chǎn)品。
1.2
程序用計(jì)算機(jī)語言寫成。編程的實(shí)質(zhì)就是你用計(jì)算機(jī)語言來表達(dá)你解決問題的邏輯。
那么,什么叫計(jì)算機(jī)語言?
先不必去解釋。因?yàn)?,?jì)算機(jī)是機(jī)器,機(jī)器不是生物,它怎么能有語言?小貓小狗有語言我尚可相信,機(jī)器也有語言,還要我們?nèi)W(xué)習(xí),這似乎有瀆人類之尊嚴(yán)。
如果我不把這個(gè)結(jié)解開,可能部分特別在意人類尊嚴(yán)的學(xué)生對(duì)學(xué)習(xí)編程從此產(chǎn)生心理障礙,無法繼續(xù)學(xué)習(xí)……
狹義上,我們講的語言,漢語英語廣東話,它是語言,有聲音。小鳥之間吱吱喳喳,大抵也是語言。但其實(shí)語言二字雖都帶口,卻不是說非得有聲才稱為語言:?jiǎn)≌Z無聲,但它也是語言。廣義上講,語言是溝通、交流的一種手段。基于此,我們認(rèn)為所有的機(jī)器或工具,也就包括計(jì)算機(jī),都有它們自己的語言。比如錘子,它的語言是敲打;比如螺絲刀,它的語言是擰,如果你非要擰錘子,非要敲打螺絲刀,那么結(jié)果就像你用法語和廣東佬交談,用粵語和法國佬說話一樣莫名其妙。
一般地,越復(fù)雜的機(jī)器,人類與其溝通的語言也越復(fù)雜。譬如汽車,你想駕馭它,你就必須去駕校參加學(xué)習(xí)。想一想,開車的時(shí)候,我們的確是在和車進(jìn)行溝通。如果你倆之間的溝通出現(xiàn)差錯(cuò)——你心里右轉(zhuǎn),手卻一個(gè)勁向左轉(zhuǎn)方向盤,向機(jī)器發(fā)出了錯(cuò)誤的命令——這將多么可怕!
至此,我們的心理障礙可以消除了。小貓小狗有語言是因?yàn)樗鼈兟斆?,而機(jī)器有語言卻是因?yàn)樗鼈兊谋浚核鼈儽?,沒辦法像動(dòng)物一樣可以通過培訓(xùn)來理會(huì)人類的意愿,所以,讓人類來反過來為它們定一套溝通的規(guī)則,然后人自己去學(xué)會(huì)這些語言,從而可以方便控制機(jī)器。
再所以,我們推論,凡是機(jī)器語言都是笨笨的語言。機(jī)器語言可以分低級(jí)語言和高級(jí)語言,但無論何者,都是笨得可愛——學(xué)得越多你就會(huì)越發(fā)現(xiàn)它的笨和可愛。另外,當(dāng)我說越復(fù)雜的機(jī)器,其語言也越復(fù)雜時(shí),我用“一般地”加以修飾。這是因?yàn)?,發(fā)明和發(fā)展機(jī)器的智者們會(huì)為機(jī)器制造出越來越高級(jí)的語言,這些高級(jí)語言,最終越來越接近人類的自然語言。就像計(jì)算機(jī),我們有信心相信,終有一天,它能聽懂我們的語言——這就是流傳在程序員中的一個(gè)夢(mèng)。當(dāng)程序員熬紅眼敲打數(shù)萬行代碼時(shí),他們便會(huì)想起這個(gè)夢(mèng):閉上雙眼,伸腰,對(duì)PC說:“BEGIN……”;深呼吸一次,然后說:“END”。張眼時(shí)發(fā)現(xiàn)計(jì)算機(jī)已完成了所有工作……
(一般不傳之秘笈:程序員必備之工具:日產(chǎn)樂敦牌眼藥水一瓶,用于預(yù)防角膜炎;韓產(chǎn)777牌指甲刀一枚,用于鉸除因擊鍵刺激而瘋長(zhǎng)的指甲;國產(chǎn)肛泰若干,治療因長(zhǎng)期坐姿不當(dāng)而導(dǎo)致的痔瘡)
回到計(jì)算機(jī)。它是機(jī)器,也是人類有史以來,繼發(fā)明使用火、電、電子這些改善人類生活的工具后,最為重要,最為先進(jìn),最為廣泛使用的工具。它的機(jī)器語言之復(fù)雜程度可想而知,已經(jīng)復(fù)雜到必須成為一門大學(xué)的專業(yè)課程。然而別忘了我們前面的結(jié)論,語言只是溝通的手段。在這個(gè)意義上,當(dāng)你用鼠標(biāo)或鍵盤在計(jì)算機(jī)上進(jìn)行輸入時(shí),只要你輸入的是正確操作,我們都認(rèn)為你在使用計(jì)算機(jī)語言,因?yàn)槟愦_實(shí)是在用一種特定的方式或動(dòng)作,進(jìn)行和計(jì)算機(jī)的交流。
當(dāng)然,這里的課程并不特意教你任何有關(guān)計(jì)算機(jī)的基本操作。計(jì)算機(jī)的基本操作主要是指如何使用計(jì)算機(jī)內(nèi)已有的軟件產(chǎn)品,比如Windows本身(操作系統(tǒng)是軟件,稱為系統(tǒng)軟件);比如辦公系統(tǒng)MS Office或WPS Office(這些實(shí)現(xiàn)工作生活中具體應(yīng)用需求的稱為應(yīng)用軟件);比如游戲(一種特定的,只拿來玩的應(yīng)用,稱為游戲軟件)。但我們不同,我們學(xué)的是如何編寫軟件。也就是說,我們將是發(fā)明人,設(shè)計(jì)師,創(chuàng)造者;而他們(到今天仍拒不學(xué)習(xí)編程的家伙)都只是使用者。(我突然有些不安:這么說其實(shí)純屬煽情。公平地講,任何人的任憑創(chuàng)造都是別人的勞動(dòng)成果之上,任何人也都在創(chuàng)造自己的杰作)
程序(或軟件)是用計(jì)算機(jī)語言寫出來的。
寫一個(gè)程序,大致是這么一個(gè)過程:
人有一個(gè)問題或需求,想用計(jì)算機(jī)解決……
人想出解決問題或?qū)崿F(xiàn)需求的思路……
人將思路抽象成數(shù)學(xué)方法和邏輯表達(dá)或某種流程的模式……
程序員將數(shù)學(xué)方法,邏輯表達(dá)中的數(shù)據(jù)和流程用計(jì)算機(jī)語言表達(dá),稱為代碼……
用計(jì)算機(jī)高級(jí)語言寫成的代碼被語言的實(shí)現(xiàn)工具(VC,VB,Delphi,或C++ Builder)轉(zhuǎn)換成計(jì)算機(jī)的最低級(jí)機(jī)器語言。這就完成了人與機(jī)器在程序制定上的最后溝通。
可見,你的思路是先用人類自己的語言思考,然后用一門計(jì)算機(jī)語言寫成代碼,最終,需要一個(gè)語言工具來將它轉(zhuǎn)換成機(jī)器可以理解的機(jī)器語言。我們要學(xué)的就是一門承上啟下的計(jì)算機(jī)語言。這樣語言有很多:BASIC,Pascal ,C, C++, Java, C#……我們學(xué)C和C++。它是使用最多的語言。有關(guān)C,C++的更多特點(diǎn),我們將在下一節(jié)談到。
盡管你完全可以直接用最低級(jí)的計(jì)算機(jī)語言——機(jī)器語言——來寫代碼,那樣就不需要語言工具了,但在這里你要弄清了,我們不是教機(jī)器語言。下一節(jié),你會(huì)明白用機(jī)器直接能懂的語言——不妨稱之為原始的機(jī)器語言——寫軟件,在今天是多么的不現(xiàn)實(shí)。
1.3
1.3.1
你知道香蕉叫什么嗎?就叫香蕉?叫banana?
錯(cuò),都錯(cuò)。
香蕉叫“牙牙”。
這是一個(gè)baby的語言,一個(gè)嬰兒還沒學(xué)會(huì)人類的主要語言,所以面對(duì)喜歡的東西總是發(fā)出咿咿呀呀的聲音,也許你聽不懂,但這是她的語言。符合小孩特點(diǎn)的語言。
計(jì)算機(jī)的機(jī)器語言也一樣,必須符合計(jì)算機(jī)的硬件特點(diǎn)。而痛苦就在這里,越符合機(jī)器的特點(diǎn),同時(shí)也就越不符合人類的特點(diǎn)。
計(jì)算機(jī),全稱電子計(jì)算機(jī),20世紀(jì)40年代,無線電技術(shù)和無線電工業(yè)的的發(fā)展為電子計(jì)算機(jī)的研制準(zhǔn)備了物質(zhì)基礎(chǔ)。1943年~1946年美國賓夕法尼亞大學(xué)研制的電子數(shù)字積分和計(jì)算機(jī)ENIAC(Electroic Numerical Integrator And Computer)是世界上第一臺(tái)電子計(jì)算機(jī)。ENIAC計(jì)算機(jī)共用了18000多個(gè)電子管,15000個(gè)繼電器,占地170 m2 ……
這是計(jì)算機(jī)的始祖,一堆電子管。隨后,電子計(jì)算機(jī)進(jìn)入第二時(shí)期,小巧的晶體管取代了電子管;再后,集成電路又取代晶體管,電子計(jì)算機(jī)進(jìn)入第三時(shí)期。
但無論是哪一時(shí)期(以后也許不是),計(jì)算機(jī)始終采用電子器件作為其基本器件,因此,電子器件的特點(diǎn),就是計(jì)算機(jī)的特點(diǎn)。
為什么使要電子?為什么木頭不能做計(jì)算機(jī)——還真別說不能,您也應(yīng)該知道,最早出現(xiàn)的用于計(jì)算的機(jī)器,真是木頭的。你用過計(jì)算尺嗎?算了,這玩意兒太簡(jiǎn)單。以前有人用木頭作成齒輪,經(jīng)過設(shè)計(jì),當(dāng)表示個(gè)位數(shù)的齒輪轉(zhuǎn)動(dòng)一圈時(shí),就會(huì)帶動(dòng)表示十位數(shù)上的齒輪轉(zhuǎn)動(dòng)1格。以此原理,只要你轉(zhuǎn)動(dòng)轉(zhuǎn)軸,木頭機(jī)器就會(huì)算出123+456 = 579……
電子元件沒有齒輪,但它們的特點(diǎn)是它們有兩種很穩(wěn)定的狀態(tài):導(dǎo)電或不導(dǎo)電,假如用不通電時(shí)表示0,通電時(shí)表示1,再通過集成電路實(shí)現(xiàn)進(jìn)位的機(jī)制。于是,計(jì)數(shù)功能就有了基礎(chǔ)。我們用圖表示:
我們生活中常用的數(shù)逢十進(jìn)一,稱為10進(jìn)制。而計(jì)算機(jī),由于其電子元件的特點(diǎn),它是二進(jìn)制數(shù)。這里簡(jiǎn)單地對(duì)比一下這兩種進(jìn)制造成的區(qū)別,以幫助你更容易看明白上圖。
十進(jìn)制數(shù):最低位稱為個(gè)位,高一位稱為十位,再高一位稱為百位。為什么這樣稱呼?因?yàn)樵趥€(gè)位上,0表示0,1表示1,2表示2,3表示3……;在十位上,0表示0,1表示10,2表示20,3表示30……總之,每高一位長(zhǎng)十倍,為十進(jìn)制。
二進(jìn)制數(shù):最低位仍可稱為個(gè)位,但這里稱為1位。1位上,0表示0,1表示1,2呢?沒有2,因?yàn)榉?就得進(jìn)1(后面同)。高一位稱為2位,0表示0,1表示2,再高一位稱為4位,0表示0,1表示4。可以看出,每高一位長(zhǎng)2倍,為二進(jìn)制。
現(xiàn)在看上面的圖,00,01,10,是三個(gè)二進(jìn)制數(shù)。根據(jù)上面的進(jìn)位方法,你可以算出它位分別表示十進(jìn)制數(shù)的0,1,2來嗎?如果你算得出來,不錯(cuò),值得表揚(yáng)。算不出來,別急,我來告訴你。首先,當(dāng)你面對(duì)二進(jìn)制數(shù)時(shí),先要扳過來它們從低到高(從右到左)的位依次不再是個(gè)位十位百位,而是:1位,2位和4位。
00:都是0,所以它就是0;
01:2位為0,1位為1,表示0個(gè)2和1個(gè)1,所以是1;
10:2位為1,1位為0,表示1個(gè)2和0個(gè)1,所以是2。
計(jì)算機(jī)的機(jī)器語言正是由這些0和1組成。事實(shí)上,計(jì)算機(jī)里的所有數(shù)據(jù),無論是一個(gè)程序,一篇文稿,一張照片,一首MP3,最終都是0和1。
世界就是這樣奇妙。萬事萬物五彩繽紛,但進(jìn)了計(jì)算機(jī),卻只是個(gè)0和1的組合。不由得你會(huì)想起道教的古老玄機(jī):“無極生太極,太極生兩儀,兩儀生四象,四象生八卦,八卦生十六爻”
嚴(yán)重跑題。
機(jī)器語言盡是0和1,于是我們可以想像當(dāng)時(shí)(還沒有其它語言時(shí))的程序員是如何編寫程序的。他們寫程序不用坐在計(jì)算機(jī)前,而在家里或什么地方,拿筆在紙上畫圈,一圈兩圈三圈(感覺有點(diǎn)象阿Q?),圈夠了就給專門的打孔小姐照著在紙帶上打成孔。最后這些紙帶被計(jì)算機(jī)“吃”進(jìn)去并讀懂,然后執(zhí)行。
來看一眼侏羅紀(jì)的程序吧:
(如用孔表示1,則左圖表示三行數(shù)110,011,101)
面對(duì)這樣的“程序”你是否表示狐疑?別以為我瞎說,也許你的電腦很先進(jìn),是P4吧?但在你的電腦上,仍有那種程序歷史遺跡:軟驅(qū)是也。如果有軟驅(qū),那你應(yīng)該能找到一張軟盤。知道軟盤有寫保護(hù)嗎?仔細(xì)看看那個(gè)寫保護(hù)的開關(guān)——就是一個(gè)方孔——打開,告訴軟驅(qū)本張軟盤不能進(jìn)行寫操作,關(guān)閉,告訴軟驅(qū)本張軟盤可以進(jìn)行寫操作。
1.3.2
前面說機(jī)器語言盡是0和1,那么是不是可以隨便寫一串0和1就算是程序呢?不是。就像漢語是由漢字組成,可我要是說下面這一串漢字:
天愛我京門北安
你覺得我是在說人話嗎?
機(jī)器也有自己固定詞匯,在機(jī)器語言里,稱為機(jī)器指令,程序是由指令及數(shù)據(jù)組成。這些指令是一些固定的0和1的組合(不同產(chǎn)商不同型號(hào)的機(jī)器,其指令又有不同)。作為程序員,就得將這些指令一次次正確地用0和1拼寫出來。
你決不會(huì)將“我愛北京天安門”說成上面的話,但你極有可能將 10101101 寫成 10010101,對(duì)不?所以很自然地,出現(xiàn)了用符號(hào)來表示這些固定的二進(jìn)制指令的語言,這就是匯編語言。
下面是一段我從C++ Builder的CPU調(diào)試窗口摘出的代碼,它實(shí)現(xiàn)的功能是:
已知b 等于 1; c等于2; 然后計(jì)算 b + c 值,并將該值賦給 a 。
把這段代碼的機(jī)器語言(左)和匯編語言(右)進(jìn)行對(duì)照,你可看出二者各自特點(diǎn)。
10001010 01010101 11000100 mov edx,[ebp-0x3c]
00000011 01010101 11000000 add edx,[ebp-0x40]
10001001 01010101 11001000 mov [ebp-0x38],edx
匯編語言僅是機(jī)器語言的一種助記符,沒有本質(zhì)的區(qū)別,所以很多時(shí)候,我們把二者等同視之。
無論是機(jī)器還是匯編語言,都讓人看了頭痛,好在我們并不去學(xué)它們。
1.3.3
匯編語言和機(jī)器語言雖然很難記難寫,但它們的代碼效率高,占用內(nèi)存少,這相當(dāng)符合當(dāng)時(shí)計(jì)算機(jī)的存儲(chǔ)器昂貴,處理器功能有限等硬件特點(diǎn)。
眾所周知,計(jì)算機(jī)的硬件發(fā)展飛速,功能越來越強(qiáng)大。一方面,它有能力,人們也要求它能處理越來越復(fù)雜或龐大數(shù)據(jù)量的計(jì)算功能,機(jī)器/匯編語言已經(jīng)無法勝任實(shí)現(xiàn)這些需求;另一方面,硬件的發(fā)展和關(guān)鍵元件價(jià)格的降低,使得程序員不需要在程序的降低內(nèi)存占用,運(yùn)算時(shí)間上花太多的精力, 這樣,各門高級(jí)語言便接二連三地出現(xiàn)了。
那么,高級(jí)語言“高級(jí)”在何處呢?前面我們說過,一門計(jì)算機(jī)語言“越符合機(jī)器的特點(diǎn),同時(shí)也就越不符合人類的特點(diǎn)” 。人類總是希望凡事能舒服點(diǎn)就舒服點(diǎn),于是某一天,先知先覺們一聲怒吼“是該到讓計(jì)算機(jī)語言接近人類的時(shí)候了!”從此冒出了Pascal,冒出了C, C++, BASIC語言等數(shù)百種高級(jí)語言,現(xiàn)在又有Java, C#等等。高級(jí)語言高級(jí)在哪里呢?就高級(jí)在它總是盡量接近“高級(jí)動(dòng)物”的自然語言和思維方式。
那么多高級(jí)語言,我們?yōu)槭裁刺袅薈++呢?
向來頭痛這種問題,其實(shí)無論是Pascal, BASIC,還是C++,甚至C和C++相比,每一種語言都有極大的相通之處,又都有各自的獨(dú)到之處。我大致鼓吹一下C++吧。]
首先,這是全世界用得最多的計(jì)算機(jī)程序語言。
其次,C/C++語言既有高級(jí)語言的優(yōu)點(diǎn),又在很多方面保留了低級(jí)語言速度快,可進(jìn)行很多具有可直接映射硬件結(jié)構(gòu)的操作的長(zhǎng)處,我們無時(shí)不用的Windows等操作系統(tǒng),就是用C和匯編寫成。事實(shí)上很多人稱它為中級(jí)語言,這樣兩頭俱備的語言,當(dāng)然值得學(xué)。
再次,C語言本身,只有32個(gè)關(guān)鍵字(固定詞),C++也只是進(jìn)行了有限的擴(kuò)展。另外,C/C++語言是眾多語言中最簡(jiǎn)潔,緊湊,靈活的語言,學(xué)得易,用得爽!
再再次,由于前面所說的,C/C++是中級(jí)語言,它所生成的機(jī)器代碼自然更接近于直接用匯編所寫(和其它語言相比),所以,同樣的程序,用C/C++寫,代碼小卻跑得快。
再再再次,C/C++語言是少見的,不專屬于(因?yàn)榘鏅?quán)或龔斷)某一家公司或組織,你完全不必?fù)?dān)心你只是學(xué)了某門某戶的C或C++,到別的地兒全玩不轉(zhuǎn)。C/C++有美國國家標(biāo)準(zhǔn)協(xié)會(huì)制定語言標(biāo)準(zhǔn)。事實(shí)上,你就是到UNIX,Linux上寫點(diǎn)C/C++代碼,也能跑。
最后,一門語言再好,如果沒有其實(shí)現(xiàn)工具(語言本身只是一種規(guī)范,必須有編譯器可以實(shí)現(xiàn)它),那么又不成了屠龍之技,C/C++,你可能用微軟的VC,也可以用我們推薦的Borland C++ Builder,二者都相當(dāng)優(yōu)秀。
1.3.4
1.3.4.1
我們用高級(jí)語言寫程序,我們很得意,因?yàn)楦呒?jí)語言比較接近人類的語言,我們用起來得心應(yīng)手,所以我們當(dāng)然得意。但我們更得意的一定是讓程序代碼趕快變成可執(zhí)行文件。
無論是在寫代碼的過程,還是最后要編譯成可執(zhí)行文件,都需要有一個(gè)工具存在。這一具一般成為編程集成環(huán)境(IDE)。之所以稱為集成,是因?yàn)閺膶懘a到最后軟件的出爐,我們需要它的地方實(shí)在太多了。這里列出其中最重要的功能項(xiàng)。
1、 代碼編輯 方便的代碼編輯功能。盡管你可以使用記事本、Word或其它任何文本編輯器來寫代碼,但除非特殊需要,否則那將是極為低效的方法。相反,現(xiàn)在的編程集成環(huán)境,都相當(dāng)?shù)闹悄?,舉例如代碼自動(dòng)功能,可以很多情況下自動(dòng)完成我們所需的代碼,既準(zhǔn)確還迅速。Borland公司出品的編程集成環(huán)境不僅有常見的關(guān)鍵字高亮等功能,還支持代碼模板,支持鍵盤宏,同樣支持高級(jí)的腳本插件功能。
2、 界面設(shè)計(jì) 可視化的程序界面設(shè)計(jì)功能。你所要產(chǎn)生的窗口,在設(shè)計(jì)期間就真實(shí)地出現(xiàn),包括字體,顏色,定位,比如,你不僅可以插入falsh的動(dòng)畫,而且無需運(yùn)行,就直接可以在你的界面上看到該動(dòng)畫的演播,這是別的編程環(huán)境不能做到的。
3、 程序編譯 這更是編程工具的主要功能。前面已講過,我們寫的代碼,在成為機(jī)器能懂的可執(zhí)行程序時(shí),必須通過編譯。
4、 程序調(diào)試 如何盡量減少你的程序的BUG?沒有編程集成環(huán)境都提供的強(qiáng)大調(diào)試功能,我們做的程序?qū)⒑翢o質(zhì)量保證。
5、 代碼優(yōu)化 Borland 提供的編譯器不僅在編譯速度一直在美國屢獲大獎(jiǎng),而且其代碼自動(dòng)優(yōu)化功能一直領(lǐng)先對(duì)手幾近一個(gè)時(shí)代。使用編程集成環(huán)境,我們可以輕松獲得更快更優(yōu)的最終可執(zhí)行程序文件。
6、 輔助程序安裝 程序的安裝已屬于另外一種工具的范疇,但我們?nèi)钥梢酝ㄟ^編程集成環(huán)境來決定最終生成單一可執(zhí)行文件,還是帶有其它動(dòng)態(tài)庫。如果是后者,我們還可以通過集成環(huán)境來檢查程序運(yùn)行時(shí)調(diào)用了哪些動(dòng)態(tài)庫文件。
C++ Builder 提供的功能遠(yuǎn)不止我上面所說的,并不是因?yàn)槲易毂?,而是我認(rèn)為對(duì)一個(gè)工具,你只有動(dòng)手使用,才會(huì)真正了解它。
C++是一門語言,而Borland C++ Builder 則是語言實(shí)現(xiàn)工具。作為一個(gè)編程工具,CB提供以上功能正是份內(nèi)之事。在這個(gè)意義上,你可以認(rèn)為CB是Word2000,而C++則是英語或漢語。正如我們用英語或漢語在Word2000上寫出優(yōu)美文章,編程可說為:我們用C++語言在CB上編寫出優(yōu)美的程序。
1.3.4.2
在作為一種編程工具的意義上,我們認(rèn)為C++ Builder和你也許常聽的VC (Visual C++)沒有什么本質(zhì)的區(qū)別。就像Word2000和WPS2000在本質(zhì)都是字處理軟件。但現(xiàn)在我們要從另外一個(gè)角度討論C++ Builder這個(gè)編程工具。
這個(gè)角度,就是“封裝”——面向?qū)ο缶幊趟枷胫械淖钪匾彩亲罨A(chǔ)的概念。
一個(gè)要學(xué)習(xí)編程的人,可能從C開始學(xué)起。學(xué)C時(shí),我們沒有接觸那些挺玄的概念,到了C++,一切就來了,什么面向?qū)ο?,什么封裝、繼承、多態(tài)……于是我們興奮起來,努力去理解,掌握,運(yùn)用這些概念所代表的技術(shù),在掌握這些別人暫時(shí)未理能的概念之后而頗有成就感……。現(xiàn)在我要問的是,為什么要有這些概念?這些技術(shù)?正確回答這個(gè)問題,不僅有助于我們今后對(duì)編程語言各種概念的學(xué)習(xí),而且它能讓我們避免成為新技術(shù)的奴隸——這一切也許聽起來有些形而上,不過我想通過以下討論,至少可以回答一個(gè)很現(xiàn)實(shí)的問題:為什么要選C++ Builder?而不是我們更常聽的VC?這是我碰到的編程初學(xué)者較疑惑的問題之一。
如果人類長(zhǎng)有翅膀,那么飛機(jī)大抵永遠(yuǎn)不會(huì)被發(fā)明。飛機(jī)的發(fā)明,是為了彌補(bǔ)人類自已不能飛翔的缺陷。不能說所有的技術(shù)都是這樣,但C++對(duì)于C的發(fā)展,完全是為彌補(bǔ)程序員腦力的不足。一個(gè)在校生在學(xué)會(huì)C后,往往并沒有機(jī)會(huì)用C去實(shí)踐一個(gè)大中型的項(xiàng)目,體會(huì)不到在一個(gè)龐大軟件工程中,非面向?qū)ο笳Z言的短處,所以在之后學(xué)習(xí)C++的過程中,也就很難真正體會(huì)到面向?qū)ο笳Z言的長(zhǎng)處。簡(jiǎn)短一點(diǎn)說:不知道C的短處,就不懂C++的長(zhǎng)處。相反,倒是很快就發(fā)現(xiàn)C++的缺點(diǎn):它的代碼效率多數(shù)情況下都要比C低不少。
前面我們說過低級(jí)語言與高級(jí)語言的對(duì)比。C++語言也正是從語法結(jié)構(gòu),語言功能上來限定或?qū)崿F(xiàn)一門編程語言更加接近人在現(xiàn)實(shí)生活中的思維習(xí)慣,從而達(dá)到減輕人的記憶和判斷上的負(fù)擔(dān)。這其中最佳的方法之一就是所謂的“封裝”。
關(guān)于封裝,初學(xué)階段最直觀的比喻就是抽屜。抽屜將各種對(duì)象分門別類地進(jìn)行存儲(chǔ)。譬如中藥房,上千種的中藥被上千個(gè)貼有標(biāo)簽的抽屜“封裝”起來,這一充滿藝術(shù)性的“封裝”,使一個(gè)一點(diǎn)不懂中藥的人也可以去當(dāng)抓藥師,相反,如果沒有這些“封裝”呢?
上一段中我們把對(duì)象兩字設(shè)為黑體,你應(yīng)該在理解封裝的同時(shí)明白什么叫對(duì)象了:對(duì)象就是東西,就是物品,就是事物。不信你把上段中的“對(duì)象”替換為“東西”或“物品”,或“事物”是不是讀得更順點(diǎn)?總而言之,面向?qū)ο蟮木幊谭椒ㄆ鋵?shí)就是說,讓編程的思路盡量符合人們生活中事務(wù)處理中已經(jīng)掌握的科學(xué)方法。它并不是牛頓發(fā)現(xiàn)地心引力一樣的科學(xué)探索成果,它只是把已有的科學(xué)運(yùn)用到計(jì)算機(jī)編程。
“封裝”中草藥的方法也許只有一種,而程序所要解決的問題,比區(qū)分中草藥要復(fù)雜得多,所以,如何進(jìn)行常用數(shù)據(jù),行為的封裝,也就仁者見仁智者見智。
VC的MFC和CB的VCL都是基于(但不限于)對(duì)Windows API(應(yīng)用程序接口函數(shù))的封裝。為什么要對(duì)API進(jìn)行封裝?這就是回到了我們前面說過的,為什么有了C又會(huì)有C++的問題。因?yàn)椴僮飨到y(tǒng)是用C和匯編寫成的,它獲得到操作系統(tǒng)必須的代碼效率,但對(duì)應(yīng)用程序開發(fā)者而言,它失去了易用性。所以微軟和Borland都使用高級(jí)語言對(duì)之進(jìn)行封裝工作。二者誰進(jìn)行得更好呢?
VC的封裝類庫稱為MFC,它是一種很低階的封裝,它并沒有按照人類的思維習(xí)慣來得新組織重新解釋W(xué)indows對(duì)象(指Windows編程中所需的數(shù)據(jù),處理,機(jī)制,接口), 純粹是API一對(duì)一的翻版。這個(gè)的封裝工作帶來代碼封裝所固有的代碼效率降低的副作用,卻沒有給使用者帶來任何方便。如果你是編程初學(xué)者,而你身邊又有VC高手,那么你一定要多多向他學(xué)習(xí)請(qǐng)教,因?yàn)橐粋€(gè)真正的VC編程高手,其同時(shí)一定也是一個(gè)深刻理解Windows內(nèi)核機(jī)制(消息循環(huán),內(nèi)存管理,多任務(wù)實(shí)現(xiàn),資源使用等),熟悉Windows各種常用API函數(shù)等等的高手。相反,如何一個(gè)人對(duì)這一些知之不多,而自稱為VC高手。你放心,參加了筆者下一級(jí)的Windows編程學(xué)習(xí),只需2星期,你就會(huì)明白那種只會(huì)用VC的向?qū)懗绦虻娜耸鞘裁礃拥摹案呤帧绷?nbsp;。
C++ Builder 對(duì)封裝庫稱為VCL(帶VC字樣,可別以為它是Visual C++,其實(shí)它是:Visual Component Library,即:可視控件庫)。
要想成為Windows編程高手,最終一定要繞過各種封裝,理解Windows對(duì)象。但作為一個(gè)初學(xué)者,我們必須挑選一個(gè)好的封裝。下面我們舉字體(Font)作為例子,將三者:沒有封裝過的Windows 字體API、封裝過的MFC字體對(duì)象、封裝過的VCL字體對(duì)象。做一個(gè)對(duì)比。為了保證不會(huì)有偏倚和差錯(cuò),有關(guān)前二者的代碼,都是筆者從MSDN(微軟提供的幫助文檔)中直接拷貝出來。
Window API  Windows API創(chuàng)建指定樣式字體:
HFONT CreateFont(
int nHeight, // height of font
int nWidth, // average character width
int nEscapement, // angle of escapement
int nOrientation, // base-line orientation angle
int fnWeight, // font weight
DWORD fdwItalic, // italic attribute option
DWORD fdwUnderline, // underline attribute option
DWORD fdwStrikeOut, // strikeout attribute option
DWORD fdwCharSet, // character set identifier
DWORD fdwOutputPrecision, // output precision
DWORD fdwClipPrecision, // clipping precision
DWORD fdwQuality, // output quality
DWORD fdwPitchAndFamily, // pitch and family
LPCTSTR lpszFace // typeface name
);
MFC (Visual C++) 將HFONT封裝為CFont
BOOL CFont::CreateFont (
int nHeight,
int nWidth,
int nEscapement,
int nOrientation,
int nWeight,
BYTE bItalic,
BYTE bUnderline,
BYTE cStrikeOut,
BYTE nCharSet,
BYTE nOutPrecision,
BYTE nClipPrecision,
BYTE nQuality,
BYTE nPitchAndFamily,
LPCTSTR lpszFacename
);
VCL (C++ Builder) 將HFONT封裝為TFont1
要設(shè)置字體名,高度,尺寸等使用以下代碼:
Font->Name = “宋體”; //設(shè)置為宋體
Font->Size = 24; //設(shè)置尺寸為24號(hào)2
將字體的粗,斜,下劃線,刪除線再封裝為TFontStyle屬性:
Font->Style = Font->Style << fsBold << fsUnderlien; //字體增加粗體和下劃線屬性。
對(duì)于字體不常用的旋轉(zhuǎn)等屬性,不進(jìn)行封裝,你可以直接調(diào)用API函數(shù)來設(shè)置TFont的 Handle屬性。
比較表中第一行和第二行:前者是原始的API,后者是VC精心的封裝成果??上Ф邘捉淄?。既然你要封裝,你就是要讓它變得面向?qū)ο?,易記易用;一模一樣的照抄一遍,然后改改參?shù)的名字,意義何在?如你是想維持代碼的效率,那么在繁雜度一樣的情況下,為什么我不直接使用效率更高的API函數(shù)呢?
倘若說,MFC的“封裝”純粹是一種多余,那或許也還可以接受。然而MFC偏偏還要在這種冗余的封裝上建立自已的應(yīng)用程序架構(gòu)。和前面的“封裝”一樣,MFC建立應(yīng)用架構(gòu)的出發(fā)點(diǎn)也是良好的,為了方便Windows程序員編程的難度。結(jié)果卻更糟糕。有問題的架構(gòu)犯了類庫或接口提供者的大忌:“有協(xié)議編程”。
什么叫“有協(xié)議編程”?我們先來講“無協(xié)議編程”。所謂“無協(xié)議編程”是指接口的提供者在提供接口時(shí),同時(shí)也提供接口的使用約定。這一套約定應(yīng)該在接口所要提供的功能上廣泛適用,而無須再有種種特殊的例外。這樣的接口顯然非常適于使用。打個(gè)比方就如交通規(guī)則?!凹t燈停綠燈”行應(yīng)該是普遍適用的規(guī)則,如果在紅燈停綠燈行還附加以下例外條款:
1、 單號(hào)并且在陰天下東行的路面上紅燈行綠燈停;
2、 轎車在乘客人數(shù)為奇數(shù)的情況下見紅燈允許直行但不能右拐;
3、 日間12點(diǎn)到14點(diǎn)區(qū)間并且街心交警為女性時(shí),紅燈?;蛐信R時(shí)取決于女警的身高是否高于1米70……
盡管這些例外都是一些不常見的情況,但想像一下你自已是這種制度下生存的司機(jī)吧。學(xué)習(xí)編程,如果挑錯(cuò)了我們每天都要面對(duì)的封裝類庫。就將永遠(yuǎn)都在努力處理這些無任何意義的問題。和司機(jī)不同的是你倒不會(huì)有多難受——一個(gè)人陷在泥潭中久了,往往就會(huì)認(rèn)為自已掙扎的動(dòng)作優(yōu)美得堪稱藝術(shù)。
MFC的CWnd 提供了對(duì)Windows最基本的窗口元素的封裝,其中對(duì)創(chuàng)建窗口的函數(shù)的封裝為:
未封裝的API:
HWND CreateWindow(
LPCTSTR lpClassName, // registered class name
LPCTSTR lpWindowName, // window name
DWORD dwStyle, // window style
int x, // horizontal position of window
int y, // vertical position of window
int nWidth, // window width
int nHeight, // window height
HWND hWndParent, // handle to parent or owner window
HMENU hMenu, // menu handle or child identifier
HINSTANCE hInstance, // handle to application instance
LPVOID lpParam // window-creation data
);
使用這個(gè)API函數(shù),我們可以創(chuàng)建各種窗口。
CWnd封裝的函數(shù):
virtual BOOL CWnd::Create (
LPCTSTR lpszClassName,
LPCTSTR lpszWindowName,
DWORD dwStyle,
const RECT& rect,
CWnd* pParentWnd,
UINT nID,
CCreateContext* pContext = NULL
);
不用我說,你也能看出這仍然是個(gè)改改參數(shù)的蹩腳的封裝。我們不去管它,現(xiàn)在我們關(guān)心的是:CWnd::Create 對(duì) CreateWindow 進(jìn)行了封裝,可是這一封裝的結(jié)果是:原來CreateWindow能實(shí)現(xiàn)的一些事情,在 CWnd::Create里突然成了例外。是的,為了適應(yīng)CWnd在MFC架構(gòu)中所處的角色,程序員在涉及CWnd時(shí)必須記憶這樣一條例外:
“CWnd的Create用于創(chuàng)建窗口的實(shí)際元素,但其中參數(shù)dwStyle不能包含有窗口風(fēng)格中WS_POPUP(彈出式窗口),如果你要建立一個(gè)帶有該風(fēng)格的窗口,請(qǐng)使用CreateEx……”
……
我仍然要說VC也是一個(gè)很優(yōu)秀的編程工具,但對(duì)于不想浪費(fèi)無謂精力的編程初學(xué)者,我個(gè)人建議使用Borland C++ Builder,因?yàn)樗鼘?shí)現(xiàn)真正的對(duì)象封裝,從而,你可以節(jié)省不低于80%的時(shí)間來學(xué)習(xí)編程本質(zhì)的知識(shí)——就是我們常說的數(shù)據(jù)結(jié)構(gòu)與算法,這些東西最終決定你的編程能力。
這就是C++ Builder提供我們的最重要的東西:
VCL類庫:一個(gè)好的底層類庫,讓我們從學(xué)習(xí)編程最初時(shí)刻就自然而然地學(xué)會(huì)使用面向?qū)ο蟮姆椒▉韺懗绦?。它大大降低了我們?nèi)腴T門檻的高度,卻又讓我們一開始就站在比別人高的位置看待有程序有關(guān)的問題;
組件技術(shù):組件技術(shù)代表了當(dāng)今編程技術(shù)的主要方向,其設(shè)計(jì)思想與MS力推的Active 控件如出一轍,擁有相同的先進(jìn)性。只有借助組件技術(shù),我們才有可能從一個(gè)初學(xué)者,迅速到達(dá)可實(shí)際工作的編程工作者;另一方面,如果作為組件的提供者,我們可以編寫組件的過程中迅速提高自已的編程能力。
C++ Builder還提供了許多其它先進(jìn)技術(shù),如事件委拖等等,歸根到底都通過封裝讓W(xué)indows編程原本需要長(zhǎng)期積累的才有可能掌握的知識(shí)變得直觀易懂。如果你剛剛開始學(xué)習(xí)編程,或者學(xué)習(xí)較長(zhǎng)時(shí)間仍沒有重大突破?;蛟S使用C++ Builder結(jié)合本課程系列,是個(gè)不錯(cuò)的選擇。
(附言:微軟最近推出的C#相信會(huì)對(duì)上述MFC的不足做一個(gè)收拾,它對(duì)C++的擴(kuò)展與約束與Borland C++ Builder 對(duì)C++的擴(kuò)展與約束驚人的相似。如果你樂意,我也真的很建議你在學(xué)完C++ Builder后,繼續(xù)學(xué)習(xí)C#)
[到頁首]
本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
機(jī)器語言與匯編語言(9)王雷 20090830218 信息安全二班
第一章 VB概述
C++編程框架
計(jì)算機(jī)是如何執(zhí)行程序的呢?什么是編程語言?中文可以編程嗎?
編譯性語言、解釋性語言和腳本語言
淺談解釋型與編譯型的區(qū)別
更多類似文章 >>
生活服務(wù)
熱點(diǎn)新聞
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服