時間:2023-05-29 17:46:53
開篇:寫作不僅是一種記錄,更是一種創造,它讓我們能夠捕捉那些稍縱即逝的靈感,將它們永久地定格在紙上。下面是小編精心整理的12篇c語言開發,希望這些內容能成為您創作過程中的良師益友,陪伴您不斷探索和進步。
關鍵詞 微機原理與接口 匯編語言與C語言比較
中圖分類號:TP368.1 文獻標識碼:A
0 引言
“微機原理與接口”是信息學科的一門必修課,主要介紹8086微處理器的原理及其擴展接口的應用。然而8253芯片是接口芯片中的一個重要組成部分,因此本文就從8253出發,闡述用匯編語言和C語言對其開發,讓學生更好地用軟件對硬件進行開發。
1 8253知識點進行描述
8253工作方式:
1.1 頻率發生器
在該方式下,計數器裝入初值,開始工作后,計數器的輸出OUT將連續輸出一個時鐘周期寬的負脈沖。兩負脈沖之間的時鐘周期數就是計數器裝入的初值。在這種初始方式下,門控信號GATE用作控制信號。當GATE為低電平時,強迫OUT輸出高電平。當GATE為高電平時,分頻開始。時序波形如圖1所示。
1.2 方波產生器
當裝入數值為N時,若N為偶數,則完成N/2計數時OUT為高電平,完成另外N/2計數時OUT低電平,一直進行下去。若N為奇數,則(N+1)/2計數時OUT保持高電平,而(N-1)/2計數期間OUT為低電平。在GATE為高電平的時,產生對稱方波。時序波形如圖2所示。
1.3 C語言的優點
C語言是一種計算機程序設計語言,它既具有高級語言的特點,又具有匯編語言的特點。C語言已先后被移植到大、中、小及微型機上,它可以作為工作系統設計語言,編寫系統應用程序,也可以作為應用程序設計語言,編寫不依賴計算機硬件的應用程序。由于C語言的易可移植性,在嵌入式系統里面應用廣泛。
1.4 匯編語言的優點
匯編語言是面向機器的程序設計語言。匯編語言是一種功能很強的程序設計語言,也是利用計算機所有硬件特性并能直接控制硬件的語言。匯編語言的長處在于編寫高效且需要對機器硬件精確控制的程序。
總之,雖然匯編語言執行起來速度比較快,但開發起來比較麻煩,尤其是8086架構里面只有有限的寄存器,在開發大型的軟件時就會顯得捉襟見肘,采用C語言開發就可以提高代碼的質量,用一句C就可以代替好幾句匯編語言,會讓開發人員輕松很多,更會讓很多初學者對嵌入式系統的開發產生興趣。
2 實例:C語言方式下和匯編語言下控制8253
8253控制端口地址為 203H;計數器0地址為 200H;計數器1地址為 201H;計數器2地址為 202H。
outportb(0x203, 0x56)
//56H(01010110B).選擇計數器1,低八位讀寫,方式3(方波發生器),二進制計數.
outportb(0x201, 8); // 向計數器1寫入低八位初值8H(00001000B).
outportb(0x203, 0x94); // 向8253控制端口寫控制字94H(10010100B)。選擇計數器2,低八位后讀寫,方式2(分頻脈沖發生器),二進制計數。
outportb(0x202, 6); // 向計數器2寫入低八位初值6H(00000110B).
如果使用匯編語言程序,則變成
MOV DX,203H;指向控制端口
MOV AL, 56H ;設置工作方式
OUT DX, AL;往端口送數據
MOV DX, 201H;指向計數器1
MOV AL, 8;給計數值
OUT DX, AL;往端口送數據
MOV DX,203H;指向控制端口
MOV AL,94H;設置工作方式
OUT DX,AL;往端口送數據
MOV DX,202H;指向計數器2
MOV AL,6;給計數值
OUT DX,AL;往端口送數據
從中可以直觀地可以看出,如果使用匯編語言對8253寫入控制字MOV DX,203H,MOV AL,36H,OUT DX,AL,需要三條語句完成,而且需要3個寄存器,并且寄存器本來就是很少的了,這樣很浪費資源;用C語言只需調用outport函數:outport(0x203,0x36),C語言的代碼長度短了很多,并且也方便學生們掌握,使學生在嵌入式軟件開發上產生更多的興趣,為大型嵌入式軟件的開發奠定堅實的基礎。
3 結束語
根據本文比較C語言和匯編語言對8253的開發,會讓更多的學生明白C語言作為一種面向結構的語言對嵌入式系統開發的優勝性,希望越來越多的學生在微機原理和接口的實驗課上,采用C語言進行開發,削減代碼量,提高效率。由于目前我國正處于信息化高速建設的時代,對嵌入式系統的開發水平也決定著我國在世界上的影響力。因此,讓更多的學生學會用更高效的語言進行嵌入式系統軟件的開發顯得尤其重要,本文就此發表自己的看法。
參考文獻
[1] 馬義德,張在峰,徐光柱,杜桂芳.微型計算機原理及應用(第二版).北京:高等教育出版社,2001.
[2] 王永山,楊宏五.微型計算機原理與應 用(第二版).西安:西安電子科技大學出版社,1999.5.
摘要:近些年來,隨著時代經濟的飛速發展以及科技的進步,當下主流的編程語言中,C++語言作為一種特殊的編程語言,主要來源于C語言的演化,同時C++語言跨平臺軟件開發的如何設計始終是當前軟件開發行業領域研究的熱點之一。本文在對基于C++語言的跨平臺軟件開發設計研究時,首先分析了C++語言,其次分析了跨平臺軟件開發環境,最后探討總結了C++語言的跨平臺軟件開發設計過程。
關鍵詞 :C++語言;跨平臺;軟件開發;設計研究
現如今計算機語言中C++語言使用頻率和次數最多,同時編程速度較高,進而廣泛的應用于跨平臺軟件的開發設計中。跨平臺作為軟件開發中的重要概念之一,不僅僅依賴于實際的操作系統,結合跨平臺開發的實際需求,逐漸推動了現代化軟件工程的蓬勃發展。因此本文對基于C++語言的跨平臺軟件開發設計進行研究有一定的經濟價值和現實意義。
1、C++語言的相關概述
C++語言主要是由C語言演化而來的,C語言開發演化過程中,逐漸注重系統軟件開發的特性,并伴隨著C++語言的興起,其新特性逐漸增加。當前C++語言和其它相對高級的語言相比較而言,有著特殊的運行性能,在實際的運行過程中,并不需要借助于虛擬機將其作為中介,進而將C++語言的運行效率顯著提高。
同時C++語言在實際的開發過程中,往往有著相對較低的開發成本,C++語言應用的過程中,逐漸被引入各種各樣的特性,將其在泛型編程拓展過程中,對于高層次的軟件工程問題有著一定的積極作用。
總之,C++語言有著相對根本性的優勢,不僅僅可以用于高級系統程序的設計和3D游戲的開發應用,同時也可用于數值科學計算以及通用程序設計等。
2、跨平臺軟件開發環境
2.1 跨平臺的相關概念
跨平臺作為現代化軟件開發中相對重要的一種概念,不僅僅對操作系統沒有一定的依賴性,同時對于硬件環境也沒有一定的依賴性,而在實際的開發應用程序過程中,更要將其在另一個操作系統下保持有著正常性的運行,基于跨平臺的實際需求,就要結合現代軟件工程的發展,對各種不同的平臺加以支持,進而將其帶給市場的潛力充分發揮。
2.2 跨平臺軟件開發需要的環境
一般而言,開發環境構成的過程中,往往需要有著一定的軟件編輯器、程序調試器以及程序編譯器三種,但是就其實質性而言,Sandbox這種軟件不僅僅可以實現代碼的編譯,同時也可實現代碼的調試,其內部同樣各種各樣的平臺中往往需要有著各種各樣的代碼庫和依賴庫。開發程序中,同樣也存在多種類型的源代碼,在C++語言的軟件開發和編譯中,就要做好最終結果質量的控制,并有最好的代碼產生,在對錯誤捕捉和調試過程中往往需要一定的支持。
跨平臺軟件開發主要是將抽象實現的一種重要因素,往往需要將抽象以及相關的一些設計逐漸的借助于新的開發手段進行開發研究,實現在不同平臺上都能實現特殊的編譯。
3、C++語言的跨平臺軟件開發設計
C++語言跨平臺軟件開發設計過程中,更要做好各個環節的綜合設計,就其實質性而言,C++語言的跨平臺軟件開發設計可以從以下幾個環節做起:
3.1 將語言的擴展特性避免
一般而言,任何語言在編程的過程中,往往都是對相對較老的程序以及文件進行選擇。這些相對較老的程序包含一些原有的程序和基本公式,相對來說這些程序和公式不僅僅有著規范性,同時也有著標準型,而當前現代化的新程序庫相對來說是雜亂無章的,在跨平臺上產生過程中,常常面臨各種各樣的故障,雖然會獲得一定的支持,同時也會有不精確定義的事故存在。
C++語言的跨平臺軟件開發設計過程中,就要避免語言存在一定的擴展特性,這種跨平臺開發過程中往往有著相對較高的異常靈敏度,無限度的對新特性利用中,就要借助于C++語言標準函數的基本模型,并保證開發軟件和產品有著相對較強的穩定性。
3.2 將動態處理實現
C++語言跨平臺軟件開發中,就要對多種環境運行的可移植代碼庫加以編寫,在實際的項目開發過程中,就要對可能存在的問題加以避免,并處理好一個平臺在另一個平臺上沒有特性這一問題,進而實現動態性的處理。
3.3 借助于腳本文件實現管理
就C++語言的跨平臺軟件開發設計而言,就要做好腳本文件的基本管理工作,保證編寫的程序代碼不僅僅有著簡單易懂的特點,同時也要有著一定的簡潔性,對合理的軟件結構進行構建,將和平臺相關的一些文件以及數據庫充分的分隔,在實際的開發過程中借助于腳本文件進行某種程度上的編譯,將其在各個部位合理的分配。對應用程序使用的過程中,就要將配置文件中的相關配置選項調出來,進而將里面的程序讀取,并在跨平臺軟件開發過程中,盡可能的保證平臺相關聯的文件進行全部的分離,借助于特殊的手段將該功能充分實現。
3.4 對安全的數據串行化使用
現如今,C++語言的跨平臺軟件開發設計過程中,對于如何保證跨平臺數據存儲的安全性和可靠性這一問題,始終是當前軟件開發設計的核心問題之一,而C++語言的跨平臺軟件開發設計過程中,可以借助于軟件的fread指令,做好對每個編譯器和單一目標平臺的綜合性處理,并在實際的跨平臺操作環境中,借助于實際方法對數據進行不同程度上的存儲和加載,進而對平臺的獨立性加以保障,借助于跨平臺將數據在目標文件進行存儲過程中,一般而言,不同的平臺間往往有著一定的差異,在實際的處理過程中,同樣也將會有著多樣性的結果特征。
3.5 C++語言跨平臺開發中的編譯和測試
C++語言跨平臺開發變異和測試過程中,更要做好科學化的編譯和測試,在實際的跨平臺軟件開發過程中,盡可能的保證相關聯的一些代碼在長時間的使用過程中,保證其代碼可以在另外的平臺上加以檢測,并借助于不同的平臺進行測試,進而將bug及時的發現。
3.6 實現抽象
一般而言,實現抽象主要是對跨平臺應用程序中被移植過程中有著一定的有效性,通過對這種方式加以借用,進而實現軟件的單獨性開發,并將具有獨立性和簡潔性的程序拿出,在實際的跨平臺開發設計過程中,往往需要對多種函數進行利用,進而在實際的開發過程中,并不用對所有的函數進行變異,而C++語言跨平臺軟件設計過程中,主要是對封裝方法加以采用,進而將抽象的過程實現,這種封裝方法相對來說,需要視情況而定,一旦存在相對特殊的情況時,就要借助于其它的方式做好程序的基本調用工作,并做好對該功能的基礎命名工作。實現抽象的過程中,一旦對該程序及其公式使用之后,就要將該功能的主要程序直接調用,并將該功能充分實現。
3.7 C++語言跨平臺軟件開發的實現過程
C++語言跨平臺軟件設計開發的實現過程中,首先就要做好功能模塊實現過程和非功能模塊實現過程,在代碼編寫之前,就要對源代碼在文本編寫過程中的相關編輯策略加以規定,對\t格式加以統一,并使得代碼的結構盡可能有著簡單化的基本特點。
C++語言跨平臺軟件開發實現過程,同樣也要對統一的工程寶建立,并對跨平臺的代碼庫加以建立,借助于平臺依賴庫對平臺相關代碼進行封裝,做好對處理器差異、編譯器差異的合理控制,保證有著對齊的內存和有著順序的字節,并將平臺無關的代碼實現,做好內存的管理。
操作系統和接口庫實現的過程中,往往不同的操作系統將會存在各種各樣的系統限制,在實際的開發設計過程中,更要對限制的參數進行適當的調整,并做好對文件描述符的基本限制,尤其是在Unix系統中,就要借助于文件的描述符這種系統性的資源,提高程序的通用性和靈活性。網絡程序開發過程中,任何一個網絡連接將會對一個文件描述符占用,一旦程序將很多的Socket連接打開,其程序在實際的運行過程中借助于fopen將難以打開文件。對這一問題如何加以解決呢?可以將其系統逐漸的升級為64位系統,同時還可以采用64位方式編譯程序,對sys/io.h中的函數操作文件加以使用,并對文件池技術加以采用,將一部分文件描述符預留。進程和線程在實際的限制過程中,就要對線程數進行創建,并將符的數量以及進程線大小的限制加以描述,其操作系統抽象層中操作系統函數不能直接的被調用,更應該將其在一個操作系統抽象層中包裝的庫中實現,將其在底層的操作系統中直接的脫離出來,并保證系統調試有著相對有效的起點。
用戶界面的實現過程中,就要做好跨平臺軟件圖形界面的基礎設計工作,將程序基礎的邏輯代碼和數據構成,金可的借助于跨平臺的開發工具包,借助于C++語言實現,進而開發利用C++語言跨平臺應用程序的一種用戶界面,進而做好相關界面的控制。
結語
總而言之,本文在對C++語言的跨平臺設計進行研究時,通過對C++語言和跨平臺需要的環境進行分析,進而對C++語言跨平臺設計做了主要的探討,進而總結出,C++語言跨平臺設計過程中,不僅僅要有著相對豐富的經驗,同時更要在開發的軟件中將更多的功能和實際的操作容積加入,借助于相對優越的設計,綜合性的提高軟件的額功能。本文研究分析C++語言的跨平臺設計時,希望其中的設計思路以及相關的理論基礎為更多的跨平臺開發設計工程師給予一定的幫助,同時本文中存在的不足之處還望更多相關研究人員給予指正。
參考文獻:
[1] 張馳. 基于C++語言的跨平臺軟件開發的設計與實現[D]. 北京交通大學,2010.
[2] 侯成杰. 航天器C語言軟件常見編程錯誤分析及檢測方法研究[J].空間控制技術與應用,2013,06:53-57.
[3] 楊波,沈承舒. 面向嵌入式軟件開發的C語言程序設計課程改革探索[J]. 計算機教育,2014,05:105-107.
[4] 吳興華. 基于C語言軟件開發的效率、移植及調試[J]. 數字技術與應用,2013,12:172.
[5] 楊鵬. 基于C++語言的跨平臺軟件開發的設計[J]. 硅谷,2014,04:19+21.
[6] 徐巍. 跨平臺移動開發框架的比較分析與實例開發[D]. 吉林大學,2014.
[7] 謝東來. C語言軟件設計中的主要問題分析[J]. 計算機光盤軟件與應用,2013,04:235-236.
【關鍵詞】 C語言 創造性 教學模式
一、引言
創新性思維是思維的高級形式和創造力的核心,是人們特別的意圖或者任務。培養學生的創造性思維是對現代教育的根本使命,特別是高等教育。C語言這門課程具有高度抽象性和邏輯性,可以提供學生廣闊的思維空間。從我多年的教學經驗,形成意見這個過程是一個偉大的培養學生的創新思維的過程。那么我們怎么可以培養學生的創造性思維?現在我將闡述我的觀點。
二、使學生掌握C編程的一般方法
引導學生持有共同的方法C語言是發展的基礎學生的創造性思維。當學生開始他們的C語言學習,他們通常無法找到他們面臨的一個編程問題的出路。為什么呢?一個原因是,學生不能擺脫在中學時的舊的思維模式,另一個是他們還沒有掌握C語言的編程方法。因此,教師應該多說多講編程方法的例子,以便我們能為培養學生的創造性思維創造一個良好的環境。例1:輸入兩正整數為m和n。然后找出它們的最大公約數和最小公倍數。
算法分析:
第一步,讀取問題。學生仔細閱讀問題,關注它是兩個正整數,要輸入數據和理解最大公約數和最小公倍數的定義。
第二步,繪制的流程圖描述算法的實現過程(見圖1)。在該算法中,而循環使用,如果m
第三步,根據算法編寫的C代碼過程。
第四步,上機調試,最終得到程序的正確的結果。
三、舒適的環境啟發學生的創意靈感
教學是教師和學生表達自己的感情和相互傳染的心情的一個過程。培養學生的創造性思維,教師首先要設置一個舒適創意的環境。還有在課堂教學中需要注意:1、教師應尊重每一個學生,特別是對待那些編程不好的學生。這樣,每個學生會覺得自己被認可,然后他們可以無壓力的開拓自己的思維,找到他們的激勵創新。以作者為例如,筆者曾在黑板上給定一個問題,然后讓三學生完成它,。完成之后,作者做了一些算法分析工作,即使結果是錯誤的,還是給予更多的鼓勵、少批評。2、分組討論提倡學生互相幫助。組內成員之間應該沒有任何區別。當討論明確問題的結果,語言代表整個群體的智慧,并使每個組員快樂的討論學習,可以有一個積極的態度和一個很好的機會培養學生的創新思維。
四、突破傳統的研究方法培養學生的創造性思維
通常我們在傳統的三個步驟教學理論給出的定義->解釋定義->顯示定義的例子;然而在實際的C語言編程課程中應該有新的三個步驟:提出問題發現解>總結規律或方法。傳統的方法是從理論到實踐,從抽象的示范和推廣專業化,而C編程應遵循從實踐到理論的方法,從示范到抽象、從專業化的推廣。筆者在教學中,筆者經常首先給出的代碼,然后讓他們的學生驗證碼;有時作者故意犯了一些錯誤,讓學生正確的記錄結果的程序。當回到課堂,這作者將要求學生思考算法和代碼中的錯誤,然后的課堂氣氛也會高,很多學生給出他們的意見,可以很好地發展他們的創造力。最后,老師會分析這個問題并作出結論。作為一個結果,我們可以得到很好的理論教學效果。
例2:4×4矩陣的轉置
該程序的代碼如下:
main()
{int a[4][4]m*p,i;
printf(“Please input a(by row)4×4 matrix:\n”);
for(i=0;i
scanf(“%d%d%d%d”,&a[1][0],&a[1][1],&a[1][2],&a
[1][3]);
p=&a[0][0];
為了發展學生他的創造性思維,討論了該程序的算法。最后,教師應給出分析和結論:矩陣的轉置交換一個a[i] [j]和a[j] [i]。但這個程序使用指針作為參數的函數參考,因此,交換的指針是pointer +4*i+j和pointer + 4*j +i,我考慮的要素多維數組由行(每行4個)存儲,和指針變量是用來存儲一些數組元素的地址,或在其他組元素。如果一個a[1] [3]和a[3][1]交換,事實上交換數組元素所指向的值pointer + 4*i+ 3 和 pointer + 4*3 +i指針,如果學生能理解算法,那么對學生創造力的發展是有益的。
五、鼓勵學生帶著問題去思考
教師設置問題應巧妙利用課堂提問的藝術。課堂提問可以提高學生和老師之間的相互作用。設置問題應按照“學生之間的差異”,所提問題的層次是發展的學生創造性思維的關鍵。
例3:從100到200,找到所有的素數。
教師根據程序提出了一些問題:(1)素數的定義是什么?(2)有多少次循環?如何開始循環工作?(3)結束循環的標志是什么?(4)輸出格式是怎樣的?讓學生思考一會兒,然后回答這些問題。在學生回答,老師給出了自己的結論:一個素數是一個整數且大于1,除了本身和和1之外不能被整除的數。該程序是一個雙重循環,每執行一次外循環,內循環將重復執行,直到表達式不成立;在執行完所有運算后退出循環并輸出結果,顯示每10個數一行。提問是必不可少的學習環節,作者應該給學生一些時間提問,可以鼓勵他們去思考和發展的創造力。作者經常讓學生修改一些程序,他們發現錯誤,提出新的問題,完善程序,這種方法可以激發他們的興趣和創造力。
六、激發學生發散性思維和培養學生的創造力
發散性思維是創新的核心思考。發散性思維是想從不同的觀察方向和角度,發現更多新的信息和尋找答案。在教學過程中,讓學生激勵自己學習和鼓勵他們打破傳統的方式,嘗試新的方法,以找到自己的適合的方法來解決問題。這是提出了一些新的編程方法,程序使用不同的算法,找到自己的解決方案問題和討論這些差異答案。作為一個結果,學生可以發展他們的希望學習和創造性思維的能力。
例4:輸入3個數,A,B,C,找出最大的一個數。
對于這個問題,有些同學給出的代碼如下:
一個問題通過多種方法來解決,教師可以拓寬學生的思想,激發他們的創造性思維。
七、用創造性的方式教授新知
在多年的教學中,筆者發現系統的教學考慮將正常教學與創新教學作為一種系統,通過整合教學實現教學目標。如下圖所示:形成一個系統的教學模式:(1)系統的教學模式是一種模式,可以培養學生的創新品質、是有幫助的為了解創造力的概念教育。(2)系統的教學模式能體現現代教育理念,有利于發揮學生和教師他們的主動性和創造性。(3)系統的教學模式有助于創新教學方法,更有助于拓展新教學方法的運用。教師應強化C語言教學中的理論教學和時間教學的互動,激發并引導學生學習主觀能動性,C的教學過程是培養學生的興趣,激發學生的創新精神和培養他們的創造力思考的一個過程。
參 考 文 獻
[1]譚浩強《C程序設計(第三版)》清華大學出版社,2005。
關鍵詞:教務管理;工作流;Excel AddIn;SendKeys
一、背景概述
大學教學管理日常工作量大,涉及人員和事務復雜。以考務組織為例,對學期末的多門課程排考后,教學秘書需要根據時間節點,查看開課課表、教務通知等多個單獨文檔或表格,在不同管理系統中切換錄入和修改數據,并及時通知相關主考和監考教師,提醒信息,手工操作工作效率低,容易出現錯誤。
目前教務管理、辦公OA和電子郵件等信息系統中普遍存在“信息孤島”現象 [1,2 ],各種系統中的數據只能手工輸入和遷移。本文根據實際工作需求,以日常使用最為頻繁的Excel軟件為基礎,應用工作流模式和C#語言開發加載項(AddIn)插件,實現一鍵發送內容到電子郵件、辦公OA、短信和微信界面。
二、軟件架構
工作流(Workflow),就是“業務過程的部分或整體在計算機應用環境下的自動化”,它主要解決的是“使在多個參與者之間按照某種預定義的規則傳遞文檔、信息或任務的過程自動進行,從而實現某個預期的業務目標,或者促使此目標的實現” [3 ]。經分析調研,大學教務管理工作一般都有嚴格的時間節點,例如監考組織,涉及確認考試時間地點、提前通知主考教師和學生時間、提前通知監考教師時間等,因此,擬開發“教務助手”輔助應用程序,以時間軸為主線將各項工作從不同的系統中導出,整合到日常辦公平臺中,其架構如圖1:
三、主要實現方法
在微軟Visual 2010平臺上,新建一個Excel 2010外接程序(Excel AddIn) [4 ],這是一種托管代碼外接程序,用戶安裝后的軟件后,會自動在Excel軟件上增加加載項菜單 [5 ],在使用Excel軟件過程中隨時點擊菜單項,即可執行相應功能,調取工作簿內容,并啟動其他應用程序,實現協同工作。
本軟件命名為“教務助手”,主要功能有“發OA”“發郵件”“發短信”等3種,并且可以在同一架構下自由擴展。用戶在使用Excel時,可以隨時點擊菜單欄的“加載項”,調出“教務助手”的子菜單(圖2)。
1.在Excel中創建菜單并響應用戶操作的核心代碼(有刪減):
private void ThisAddIn_Startup(object sender, System.EventArgs e){menuCreateMail = commandBarPopupTmp.Controls.Add(Office.MsoControlType.msoControlButton, Type.Missing, Type.Missing, 1, true); menuCreateMail.Caption = “發OA”;}
2.查找并控制其它Windows窗體的核心代碼(有刪減):
【DllImport(“user32.dll”, EntryPoint = “FindWindow”, SetLastError = true)】
private static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
IntPtr hwndCalc = FindWindow(null, “工作任務 ―― 新建任務―― 網頁對話框”);
3.發送字符串和自動填充表單的核心代碼(有刪減):
if (hwndCalc != IntPtr.Zero){ SetForegroundWindow(hwndCalc);
Clipboard.SetText(“監考通知”); SendKeys.SendWait(“^v”);SendKeys.SendWait(“{Tab}”); }
四、應用效果
在安裝該軟件后,教務工作人員如果需要批量通知幾十名監考教師,只須點擊相應菜單,軟件即可自動逐行復制Excel工作簿中的單元格文本,自動匹配人員,獲取手機號碼、Email地址或OA用戶名,使用SendKeys功能,發送文本信息到相關程序或網頁,填寫表單 [6 ],經操作人員手工確認或修改后,執行發送功能,實現半自動的信息批量發送,可大幅節省工作量,并防止手工錄入錯誤。圖2顯示了軟件讀取數據,控制用友致遠A8 辦公系統發送監考通知的過程。
五、總結
教務管理輔助應用程序優化了傳統教學管理中的工作流程,以時間軸為基礎,對涉及到的多個信息系統中的人員、任務和數據進行整合,實現多種渠道的信息公開和傳達,提升了教務工作效率,減少了教學事故發生。
參考文獻:
[1]張珍義.高校數字化校園建設中“信息孤島”現象的探討[J].中國教育信息化,2008(13).
[2]涂振宇.數字化校園建設存在的問題與對策研究[J].信息與電腦(理論版),2014(4).
[3]曹風華. 基于工作流技術的學生評語生成系統的設計與實現[J]. 現代計算機(專業版),2011(10).
[4]苑青,孔捷,冷靜. 利用VSTO和.NET的Office開發技術[J]. 電腦編程技巧與維護,2009(6).
【關鍵詞】編程語言 計算機應用 軟件開發 選擇 研究
計算機應用軟件開發在我們的學習、工作和生活中扮演著重要的角色,被社會大眾廣泛的應用與推廣,發揮著不可忽視的作用和影響。編程語言在計算機應用軟件開發的選擇中,既能夠減輕計算機工作的難度,也能夠有效地提高編程工作量的質量和效率,對于計算機技術的發展和運作有著極其重要的建設性意義。編程語言要加大研發力度,充分發揮出自身的優勢和價值,不斷與計算機應用軟件開發相適應、相契合,從而更好地推動計算機技術的穩定進步與發展。
1 計算機編程語言的相關論述
計算機編程語言的形式、內容較為廣泛和系統,其中具有代表性的是:C語言、C++語言以及JAVA語言等等方面。
1.1 C語言
C語言是處于高級語言與匯編語言之間的一種中級語言,是集高級語言與匯編語言的優點于一身的編程語言。具體來說,C語言具有以下三個方面的特點:
(1)C語言具有清晰化和結構化的特點,對于模塊程序的進行具有很大的推動作用,而且在調試和維護方面也有著強大的作用和功能。
(2) C語言的使用效率較高,移植性較強,進而使C語言能夠移植到各種計算機上,形成各種獨具特色的CZ言模式。
(3) C語言的編寫代碼的質量較高,使執行效率大幅度提升上來;也能夠最大程度地發揮匯編語言的作用。
1.2 C++語言
C++語言是C語言的擴展和延伸,是一種全新的編程語言形式。C++語言匯聚了C語言的眾多特點和優勢,在具備C語言特點的基礎之上,又對編程對象注入了新的編程思想,可以更好地適應編程項目的需求,而且C++語言在很多計算機系統編程中得到了廣泛的應用。
1.3 JAVA語言
JAVA語言主要應用在網絡應用系統之中,具有安全性強、簡易性強、移植性強以及性能高等等特點,具體的特點表現在以下幾個方面:
(1)JAVA語言不易造成程序錯誤的發生;
(2) JAVA語言是完成面向對象的編程語言,具有全面性和統一性;
(3)JAVA語言可以方便我們查閱很多軟件在初期開發的過程中容易出現的錯誤,提高內存的正確率;
(4)JAVA語言可以有效防止非法內存操作的現象發生,因為它自動屏蔽、阻擋了手動釋放內存的功能。
總而言之,編程語言中每一種語言都具有自身的特點和優勢,在計算機應用軟件開發中,要選擇正確地、適合自身的編程語言模式,對于減輕我們的工作量,提升工作效率具有極大的幫助和推動作用。
2 計算機應用軟件開發選擇中應遵循的原則
(1)要從開發項目的整體結構出發,計算機應用系統對于各種編程語言的選擇要十分慎重,積極尋找適合自己的編程語言。
(2)對于計算應用軟件開發的成本費用要十分慎重,例如對視頻處理和信號處理等方面的操作。因此,在此建議使用靜態類型的編程語言,不僅開銷較低,而且效果也非常明顯;
(3)如果應用軟件的開發需要大量的手工勞動和處理,可以考慮選擇簡易性強、靈動性較強的編程語言。與此同時,對于編寫出來的程序我們還要及時地檢查和調節。
(4)在計算機應用軟件開發之前,要對開發環境及時地了解,硬件環境對于各種編程語言的適用性有所不同,所以我們要尋找與自身相匹配的硬件環境,要讓編寫程序在硬件環境中得到最大程度地發揮。
(5)在編程語言的過程中,我們還要充分考慮項目是否適用于位操作,如果適用性較好,就恰恰可以提供出合適數據類型的編程語言。此外,要盡可能地采用專業的編程語言,可以節省很多工作時間,提高工作效率,從而更好地防止編輯錯誤的現象發生。
3 不同編程語言對于計算機應用軟件開發選擇的影響因素
3.1 在軟件的整體規劃方面
在計算機軟件開發過程中,軟件開發人員要對軟件的整體結構進行把握和設計,其中包括了軟件開發的功能和屬性以及軟件延伸等方面的問題。要在首次語言編寫版本助中充分挖掘軟件功能,因此,在編輯語言的選擇過程中,要做好展開整體規劃的準備。
(1)軟件開發人員要充分了解應用程序的功能,要在數據庫語言中選擇一種較為適合的語言。例如:JAVA語言具有相對簡單的功能;而C語言、C++語言就具有相對繁瑣的功能。
(2)在軟件規模方面,要以數據庫的處理對象為基礎和前提,例如:在數據庫的功能相對簡易,可以選用ACCESS語言;
3.2 在軟件開發人員專業技能方面
軟件開發人員的專業技能有限,只能掌握幾種基礎、常用的編程語言,并不能掌握所有的編程軟件;如果軟件開發人員對編程語言不熟悉,就很難保證編程工作的正常運作。這就說明了在開展軟件長期規劃過程中,首先要對編程語言進行合理的分類和管理,軟件開發人員在掌握自身熟悉的編程語言基礎上,要學習不同的編程語言,豐富自身的專業技能和專業水平。
3.3 在軟件開發平臺方面的影響
計算機軟件的開發可以有高級語言和低級語言之分。例如:C語言和C++語言對運行環境的要求相對較低。軟件開發人員要想有效、合理利用編程環境,就必須要處理好如軟件開發平臺的相關問題。
3.4 在硬件資源的限度方面
在計算機應用軟件的開發之中,針對硬件資源的使用是非常有限的。例如:在照相機和汽車的嵌入式設備中,表現得很明顯。因此。我們可以考慮采用C語言和C++語言,進而保證硬件資源得到最大程度地利用和發揮。
4 不同編程語言的應用范圍和領域
4.1 C語言的應用領域及范圍
往往體現在編譯器的開發、硬件驅動的開發以及工業控制方面等等;
4.2 JAVA語言的應用領域及范圍
體現在WEB應用、嵌入式以及系統編程方面等等,側重于企業級的應用開發,現已成為WEB開發中不可或缺的一部分;
4.3 C++語言的應用領域及范圍
C++語言綜合了高級語言和低級語言,具有一定的科學性優點,主要體現在通訊系統、電子郵件以及仿真方面得到了明顯的應用和成效,適用范圍也比較廣闊。
4.4 PHP語言的應用領域及范圍
體現在中小型網站的開發之中和WEB頁面辦公等等。
5 編程語言在計算機應用軟件開發選擇中的建議、對策
計算機應用軟件開發的思想要不斷與時俱進、開拓創新。積極引進先進、科學、高效的計算機技術;借鑒成功的經驗,吸取失敗的教訓;提高編程語言的選擇能力。在具體的應用軟件開發中,編程語言的注意事項有以下幾個方面:
5.1 注重韌饣肪車慕岷嫌朐擻
計算機應用軟件開發的前提和基礎是硬件環境,軟件開發人員要及時、充分地考慮外部的硬件環境。硬件環境對于計算機應用軟件的開發至關重要,如果開發軟件與硬件環境不適合,就會造成軟件不匹配,引發不必要的故障和問題的發生。
所以,在計算機開發之前,首先要選擇好編程語言的適用環境,不能一概而論,要確保編寫程序符合科學技術的發展模式;同時,軟件開發人員要針對編寫程序及時進行調整和改造
5.2 結合應用的行業和范圍
在計算機應用軟件開發的選擇中,要綜合考慮各個方面所存在的問題和因素。例如:要考慮軟件開發人員所從事的事業、不同編程語言的特點等等,要全面、系統的分析,選擇適用于自身軟件開發的編程語言。
此外,軟件開發編程語言由于行業的不同,也會有所限制和約束。例如:要想更好地面向開發對象,可以選擇C語言、C++語言、JAVA語言;計算機軟件開發也會受到一定的工作范圍的影響,例如:C++語言比較適用于信息和通訊的領域。
5.3 合理、有效地運用最為熟悉的編程語言
軟件開發人員在計算機應用軟件的開發過程中,要在最短的時間內熟悉基礎的編程語言,這樣可以節省大量的人力,而且能夠有效節省工作時間,保證了一定的工作質量。而且,軟件開發人員也要注重結合不同編程語言的特性,更好地在計算機平臺中操作和運行,對于編程語言也要注入一定的創新因素,創造最為理想的編程語言形式。
5.4 結合編程語言的需求進行選擇
在需求選擇方面,高級語言適用于后期的開發和維護,使用起來更加便捷、簡易,但是相對復雜、繁瑣,是一個漫長的過程。低級語言適用于對存儲空間和運行時間較高的需求。此外,根據開發環境的不同要慎重考慮適合自身的語言級別。
6 結束語
綜上所述,計算機應用軟件開發是一項復雜、系統的工程,而對于編程語言的選擇也是這項工程中的重中之重。我們要樹立正確的判斷和分析能力,選擇出最適用自身的編程語言。因此,軟件開發人員要全面掌握各種編程語言的特征,加強探索和實踐的能力,以全面熟悉各種編程語言。編程語言在計算機應用軟件開發中,可以大大提高計算機技術的質量和效率,從而推動計算機應用軟件開發更好地走向世界、走向全球,實現計算機技術的可持續發展的戰略需求。
參考文獻
[1]張旭.不同編程語言對計算機軟件開發的影響[J].電腦與電信,2016(10):52-54.
[2]劉嵩鶴,孫和勤.不同編程語言對計算機應用軟件開發的影響[J].數字技術與應用,2015(01):201.
[3]李開元.探究計算機應用軟件開發過程中不同編程語言的影響[J].信息化建設,2015(06):48.
1 計算機軟件開發中匯編語言種類介紹
1.1 C語言。C語言的使用歷史較長,距現在已有40年的歷史,是編程語言中應用較廣泛的語言,是軟件開發中的基礎語言,被廣泛應用在我們的生活中。與它同時代出現的編程語言,早已經被淘汰,足見其強大的生命力。開發者們首選的計算機編程軟件便是C語言,因為它具有很多優點,如短小精悍,靈活方便,表達方式靈活使用,便于理解,數據類型與運算符相當豐富等眾多優點。
1.2 C++和Visual C++。C++語言是基于C語言升級以后的編程語言,它不僅包含了C語言的眾多優點,更是具有面向對象語言的特點。視覺窗口系統的出現使圖形窗口界面成為標準,C語言很難實現這種開發任務,所以C++的出現便解決了這樣的難題。其應用也是非常的廣泛,甚至是任何領域都能應用。因為它強大的功能使我們運用起來相當的靈活多變,事實證明,掌握了C++在學習其他的匯編語言就很容易了。使用VC++可以很容易的編寫出窗口界面,此外VC++在微軟的地位也是很高的,其功能相當的重要。相當多的微軟基礎類庫便在運用C++時用上的,提高了計算機軟件開發的發展進程。
1.3 Java語言。Java語言現在被廣泛的應用,原因是Java具有良好的完備性,它在很大程度上避開了C語言和C++語言在軟件開發中出現的困難。特別的將以前的單機模式發展成目前的網絡模式。Java語言與普通的編譯與解釋的計算機語言有所不同。Java語言集合了C語言與C++語言的特點,取其精華去其糟粕,是較C++語言簡單并且基于其之上的語言。Java語言是完全面向對象的語言,Java還具有出眾的通用性,平臺移植性。還具有更高的安全性及高效性等優點,是軟件開發者運用起來更加方便快捷。
1.4 C#語言。C#語言是在Java語言之后有的另一種編程語言,它繼承了Java語言的優點,也比其有更大的優勢。它是NET構架中重要的參與者,C#語言作為微軟使其得到了廣泛的關注,這更源于它出色的表現。
1.5 Visual Basic。Visual Basic最大的特點是包含事件驅動編程語言。此類編程語言的主要作用是協助開發環境,現在此程序也被大多數開發者所使用。數據庫語言在計算機軟件開發中占有著不可或缺的地位,VB語言的主要功能有圖形用戶界面(GUI)和快速應用程序開發(RAD)。VB較VC++語言來講更加的方便靈活,其結構化查詢(SQL)語言更是被使用頻繁,VB語言在軟件開發前景中大有發展。
1.6 Delphi語言。這是具有強大功能的第四代編輯語言,與VB相比較,Delphi語言功能更加強大,也更加的具有實用性。具有強大而成熟的組件技術的Windows程序的結合功能,并且擁有強大的數據庫支持,以及高速的翻譯器。其適用于眾多的數據庫結構,而且其數據庫的管理系統最為高效。
1.7 Pascal語言。Pascal語言作為一種高級的程序語言被計算機所通用,其特點主要有,嚴格的結構化形式,運行效率比較高,繁多的數據類型和糾錯能力迅速等。此語言可以描述多種數據結構及算法,并且也能充分體現和保持出軟件設計者的風格及習慣。
2 計算機軟件開發中編程語言的選擇
在軟件開發中選擇合適的編程語言至關重要,其影響著整個軟件的使用質量,如果我們選擇了合適的語言編程,它能大大提高軟件的實用效率。所以在計算機軟件我們必須最大限度的了解各個編程語言的功能及特點,實現其最大的實用價值。進行匯編語言選擇前,我們要考慮諸多因素。所以,對計算機編程擁有更多的了解,可以讓我們對以后的軟件開發有很好的掌握。
2.1 考慮應用的行業和領域。依據所從事的行業及領域進行選擇。如果是面向開發對象的可利用Java語言和C++語言,如果是通訊或信息領域可選擇C++和VC++語言較為合適。商業領域也可利用COBOT,利用LIST和PROLOC在工程運算方面使其應用在人工智能上。如果從事的工作是底層或硬件,則可以選擇簡單的C語言和C++語言較好。
2.2 考慮整體內外環境。軟件開發的基礎為硬件環境,其所有的匯編語言都必須適用于硬件環境,所以我們在軟件開發中必須考慮其外部的硬件環境。在編程前對語言的選擇尤為重要,我們必須決定語言的分布選擇,也要考慮工程的整體框架。匯編語言之間都是有很強的聯系性,所以學習眾多語言,是為了學精其中一門或是幾門語言做基礎的。軟件開發中我們運用編程的過程靈活多變,因此,在軟件編寫前選擇的匯編語言需要很好地適應環境。只有這樣才能確保我們編寫出的程序快速調整及高效的應用。
2.3 考慮平臺的支持性。在眾多的考慮因素中,平臺的支持性也是至關重要的,如瀏覽器中程序語言,其在運行中根據語言的適應性選擇使用的編程語言。在平臺這個大環境下,一切的操作都必須適應平臺。根據編程語言自身的優勢在合適的平臺上進行操作,這是一個重要的選擇依據,如代碼是在瀏覽器上運行的,這就使得被選擇的編程語言減少。所以在計算機軟件開發中我們必須要考慮平臺對編程語言的支持性。
2.4 考慮編寫程序的實際需求。在眾多編程語言的使用中,我們都需要保證我們編寫出的程序在實際運用的需求性,并作出及時的調整。在軟件開發中運用我們熟練使用的編程語言來進行編寫,可以大大降低我們軟件開發的時間,也提高了編寫軟件的效率。即便是我們使用了不同的編程語言來進行編寫,但是最后我們還是會完成快速調整程序。所以,快速原型環境對我們來說是很重要的,并且在此環境下,也極大地提升了動態語言和相關性的結合。
2.5 考慮所需的位操作。相當多的文件格式和協議相關工作都需要進行位操作。如果出現眾多的位操作,我們需要選擇簡單的位操作,所以位操作也是軟件開發者們考慮的因素。
2.6 考慮成本問題。我們也應該根據項目的功能進行來進行編程語言的選擇,一個整體的系統是由多個部分組成的,這并不是說一整個系統都需要用一種編程語言來完成,它也是由多種語言來進行編寫的。
對于成本開銷較大的操作,例如,視頻處理,密碼學以及信號處理等,軟件開發者需進行充足的考慮,選擇一些靜態型的語言來進行程序的編寫,如JAVA,C#語言等就是很好的選擇。
1.計算機常用的編程語言
C語言:該語言應用廣泛,是所有計算機語言里最常用的編程語言,從開始出現到現在已經有40年的歷史,C語言具有很多優點, 如:語法簡潔、運算符豐富、數據結構類型豐富、代碼和數據分離的結構化、語法要求不嚴格、功能強大等。C語言是具有兼容能力強的程序語言,移植起來非常容易,利用 C語言為某種計算機寫的軟件可以用到另一種機器上去。如:如果為蘋果機寫的一個程序能夠方便地改為可以在IBM PC上運行的程序。C語言的主要結構成分是函數C的獨立子程序,編寫的程序語言比較容易維護,并且容易實現。
C++:該語言是C語言的升級,它幾乎包含了C語言的所有功能, 在C語言的廣泛引用前提下,C++也應用的非常廣泛,可以說任何領域都可以使用,包括各種操作平臺,這也決定了C++是一種最難學的編程語言,因為,它強大的功能背景下,使用起來非常的靈活多樣。 實踐證明,如果掌握了C++,再學習其他編程語言的時候就會非常容易,因為它貫穿了從硬件到對象的各個環節,學完該語言以后就會對計算機語言有個深刻的認識。
Jav和C#:Java和C#都是出現在 C語言之后,以面向對象為主的語言,Java 語言是在充分吸收了C++的優點,摒棄了C++的一些缺點的基礎上誕生的,并且形成了具有自身特色的優勢,而C#則是在Java 語言之后出現的,它更多地借鑒了Java的優點,同時增加了一些自己的特點。在一定意義上可以說,Java站在C++的肩膀上,而C#站在了 Java的肩膀上。除了跨平臺以外,Java和C# 相比沒有太多優勢,.NET 可以控制迅雷,調用 dll等,這個是Java很難做到的,雖然有JNI或第三方開源程序,但是那些第三方不太成熟,而JNI則需要會寫VC代碼,很難做到。
Pascal語言。是計算機通用設計語言的一種,是高級程序語言,主要特點有:具有嚴格的結構化形式、豐富的數據類型、較高的運行效率和較快的糾錯能力等。這些優點決定了該語言能夠描述各種算法以及數據結構,另外,在應用這種語言的過程中,能夠幫助編程者保持一個很好的習慣和設計風格。
每一種語言都有其存在的理由,都有其獨特的優勢和應用范圍, 編程人員在計算機應用軟件開發過程中應該以提升工作效率為基礎, 以運效果為目標,選擇適合開發項目的程序,選擇最適合的語言,達到提高工作效率,降低工作量的目的。
2.原則
2.1整體結構
開發項目的整理結構決定了用什么樣的開發軟件,使用什么樣的編程語言,整個系統是由多個部分組成,并不是說整個系統都必須要使用同一種編程語言進行編寫,編程語言的選擇應該依據項目功能而定。對于成本投入較大的操作,如:圖形渲染、密碼學、視頻處理以及信號處理等,程序員要認真考慮,盡量用一些靜態類型的語言。
2.2盡量使用最為熟悉的語言
熟練掌握的語言能夠運用在開發軟件方面的話,可以節省大量的時間,并且能夠對軟件工程項目時間表進行準確預測,及時完工。此外,熟悉的語言可以創新,如,開發的軟件是偏重復處理手工勞動時, 就可以根據實際情況選擇簡單、靈活的編程語言,尤其是選擇那些自身就具備相應功能的編程語言。
2.3充分考慮硬件環境
硬件環境是軟件開發的基礎,所有軟件編程語言都應該適應硬件環境,所以軟件開發過程中要考慮外部硬件環境。
通常情況下,編程語言適應了目前版本的硬件環境,但隨著硬件設備的更新,當前的軟件可能就不適應了,不匹配的問題仍然存在。
因此,在程序開發以前要選擇適應環境的編程語言,這樣編出來的程序就能夠長時間較好地運行。只有這樣才能確保任何編程語言編出來的開發軟件都能夠實現并能夠快速調整,因此,快速原型是很重要的,動態語言在這方面表現出了突出的優點,可以和很多相關庫進行結合。
2.4語言的選擇要考慮是否支持平臺
支持平臺也是在編程語言選擇過程中需要考慮的因素。
例如:在瀏覽器中運行的程序語言,根據語言是否適應就可以有選擇的使用一些語言。平臺是一個大環境,所有操作都應該適應于平臺,一些程序開發過程中,程序語言的格式決定了要涉及大量的位操作,此時,要充分考慮大量的位操作是否給軟件開發帶來困難,是否可以避免大量的工作,如果必須要進行大量的位操作,那就應該選擇那些具有容易位操作而且可以提供合適數據類型等特點的編程語言。
同時, 在一些特殊領域,程序員應該使用專業的編程語言,因為這些程序語言具有很強的針對性,使用起來既能夠節省很多的工作時間,還可以防止編程出現較大的失誤。
3.結語
關鍵詞:編譯原理;工具資源;實踐教學
1.背景
編譯理論與技術是計算機科學中發展最迅速、最成熟的一個重要分支,程序設計語言和編譯的發展集中體現了計算機科學的重要成果與精華。編譯原理課程是計算機科學與技術專業的專業必修課程,主要講授程序設計語言編譯程序構造的基本原理和方法。編譯程序的開發堪稱經典理論和先進技術緊密結合的典型示范,因此理論學習和實踐的緊密結合是本課程的突出特色。通過編譯程序構造的問題,可以體驗到如何從實際需求中提出理論問題、理論研究推動技術進步、運用技術工具解決實際問題的過程。
在經典理論的支持下,在編譯程序的研制過程中,產生了非常豐富的工具資源。在這些工具資源的支持下,編譯程序開發的自動化程度得到了顯著提高;相對其他軟件開發任務,編譯程序開發在效率和質量上的優勢非常明顯。更為重要的是,編譯的理論和技術對于計算機科學中的其他領域也有重要的影響。一直以來,編譯的理論和技術在程序設計語言的實現、針對計算機體系結構的優化、新的計算機體系結構的設計、自然語言理解、網絡信息處理、網絡協議的分析與實現等領域都是不可或缺的。國外著名大學(如美國哥倫比亞大學、哈佛大學和斯坦福大學等)的編譯課程教學都特別重視相關的課程實踐項目。以哥倫比亞大學為例,在編譯原理的課程教學中開展了貫穿整個學期的課程實踐項目。在項目中,學生分成小組,自主設計并實現一個小的語言,而這個語言涉及了豐富的領域,包括量子計算、音樂合成、計算機圖形學、游戲、矩陣計算和很多其他領域。在這些教學實踐中,很多編譯開發工具都被應用于各種案例中,包括ANTLR、LEX和YACC等編譯領域經典的開源軟件工具。
通過收集編譯資源(包括開源的編譯器和編譯程序開發工具),以及這些工具在計算機科學各領域中的成功應用案例,可以為開展案例式教學改革打下堅實的基礎。筆者收集了編譯領域常用的開源軟件工具及其應用案例,并對其進行歸類分析和整理,以形成支撐編譯課堂教學和實踐教學的資源庫?;谠撡Y源庫,在今后的編譯原理課程教學中,可以通過采取基于案例的教學方法,形象地向學生展示編譯研究中“經典理論和先進技術有機結合”的突出特點,使學生能夠通過具體的案例切實體驗編譯經典理論在各領域的重要作用。
2.編譯資源分析
在幾十年的研究過程中,編譯領域已經形成了很多編譯資源,如LEX、YACC、JavaCC為代表的編譯模塊開發工具,以及精簡語言編譯器、產品級開源編譯器等。這些工具實現了從Ada、C、Pascal等面向過程語言到Java、C++等面向對象語言的編譯程序,覆蓋了文法、詞法分析、語法分析、中間代碼生成、代碼優化、目標代碼生成等編譯原理教學中所有的知識點。基于這些工具也開發了SQL、XML分析等計算機科學其他領域的應用。下面,筆者從生成語言、知識點覆蓋等角度對互聯網上的編譯資源進行整理分析。
2.1從編程語言的角度分析
從編譯資源所面向的程序語言來看,從面向特殊領域的Fortran語言、DSP語言,面向過程的C語言、Pascal語言,到常見的面向對象的Java語言、C++、C#語言等,均有種類繁多的分析器、生成器、目標代碼優化器等可用于案例教學的編譯資源。
1)面向過程語言的編譯資源。
這方面的編譯資源主要針對C語言和Pascal語言。C語言作為最被廣泛使用的編程語言,也擁有最多的編譯工具資源,如YACC、LEX、ACCENT、BANSHEE等經典工具均可用來產生C語言編程的分析器、生成器。其中,最知名的C語言解析器生成器YACC已經在各種場合得到了廣泛應用。YACC也是常用于編譯課程教學的工具,它采用LALR(1)語法分析方法,最初由AT&T為Unix操作系統開發,在漫長的演變中產生了如Berkeley YACC、GNU BISON、MKS YACC和Abraxas YACC等變種版本,也出現了AYACC、YACC++等面向ADA、c++其他語言的編譯器。由于所產生的解析器需要詞法分析器配合,因此YACC經常和詞法分析器產生器LEX一起使用,目前已有IEEE相關標準對YACC和LEX的功能進行了標準化描述。此外,ACCENT、BEG、CKIT等面向c語言的編譯資源也可以用于編譯課程教學。據我們初步統計,目前互聯網上可用的針對c語言的編譯資源多達20余種,涵蓋了詞法分析、語法分析、前端、后端生成器、代碼優化、程序分析等編譯過程中的各個環節。
2)面向對象語言的編譯資源。
面向對象語言已成為程序開發的主流語言,在應用層軟件、網絡服務開發上占據著絕對優勢地位。因此,目前也相應出現了很多針對面向對象編程語言的編譯資源,特別是C++語言和Java語言。C++語言由于與C語言一脈相承,許多針對c語言的編譯工具也擴展了c++版本,如YACC++、Berkeley YACC、IDC-C等,均可以生成C/C++語言的分析器。
Java語言在最近20年一直是最流行的編程語言。Java語言為了實現跨平臺的目標,在編譯時僅生成字節碼,再由不同平臺的JVM生成目標代碼執行;因此,Java語言的編譯執行具有明確的前端后端,非常有利于編譯程序的開發和編譯原理知識點的分解。目前針對Java語言的編譯資源與工具種類繁多,如JavaCC、JastAdd、Jax、Jfront、Soot、PAT等,我們目前已經收集到相關編譯資源20余種,既有JavaCC等綜合編譯環境,又有Jfront前端工具、PAT正則表達式分析器、OOPS分析優化工具等編譯工具資源。
3)其他專用語言、平臺的編譯資源。
為了符合特殊應用場景的計算需求,出現了一些針對特定領域、特定平臺的程序語言,同樣,在這些領域中對編譯器往往也存在獨特的需求,如嵌入式系統、科學計算等,如針對SPARC平臺的編譯器BEG就能對Fortran、Modula等專用語言進行分析編譯,而Archelon編譯器則針對DSP芯片為執行代碼生成做了專門的優化。ELI是這一類編譯資源的典型代表,它除了支持上述流行編程語言及專用語言如c、Fortran外,甚至支持對用戶定義的語言生成獨有的編譯器,從而幫助用戶快速地實現一種專業程序語言。
2.2從知識點的角度分析
為利于編譯原理課程的教學,我們更希望從知識點的角度梳理相關資源,在講授相關課程時,可以介紹這些經典的編譯工具。通過認識真實編譯系統的工作流程和開發技術,幫助學生理解關鍵知識點。我們從詞法分析、語法分析、編譯前端、編譯后端、程序分析及優化、完整的編譯器平臺等類別對現有的編譯資源進行了梳理和分類。
1)詞法分析。
詞法分析器以UNIX/LINUX上的LEX為典型代表,能夠生成c語言描述的詞法分析器;而AFLEX作為LEX的變種,能生成ADA語言描述的詞法分析器;Quex還能生成C/C++、Python語言描述的詞法分析器;相關的資源還包括LOLO、FLEX等。
2)語法分析。
支持語法分析的編譯工具最為豐富,從簡單到復雜的相關開發案例也最多,可以很好地用于支撐課程教學。如前文所述,語法分析器以YACC為典型代表,這一系列的語法分析器還包括AYACC、BISON、BYACC、BEG。CUP、Jell等Java語言開發的語法分析器生成器,可以生成Java語言描述的語法分析器。ANTLR是一種用Java開發的強大的語法分析器生成工具,可以生成各種語言描述的語法分析器,包括Ada、C、C#、Java、JavaScript、Objective-C等,以及Perl、Python和Ruby等較新的互聯網程序語言和腳本語言,甚至包括SQL、一階邏輯、XPath等應用語言等。ACCENT則是一個包含了詞法分析器和語法分析器的生成工具。JavaCC是當前應用非常廣的一種語法分析器生成工具,能產生Java語言描述的LL(K)分析程序。值得一提的是,目前已經有非常多的利用JavaCC開發的各種語言的分析程序,包括了表達式等簡單語言,如DTD、IDL、RTF等應用語言,以及PHP等實用的腳本語言。隨著技術的發展,甚至出現了OOPS等面向對象的分析器生成工具。
3)編譯前端。
面向c語言的中間代碼生成工具最著名的是Ckit,它支持將c語言程序翻譯譯成SML類型的中間語言,也支持用戶擴展C語言語法的前端編譯。EDG則能將C++和Java等語言翻譯成一種高級的樹結構中間語言,并具有錯誤檢查功能。在面向Java語言方面,比較知名的編譯器前端包括Jfront等。此外,為滿足特定應用場景需求,還出現了IDC-C、SUIF等編譯前端及中間代碼優化工具。
4)編譯后端。
編譯器后端方面的資源相對前端來說較少,比較知名的編譯器后端是BEG,以BEGL中間語言為輸入,可用于生成Motorola 68020、SPARC、MIPSl Intel 386、Pentium?Inmos T800和PowerPC等平臺的目標代碼。在Java語言方面,Sable研究小組基于XML提出了JIL中間表示語言,利用XML的特性為執行代碼的生成和優化提供便利。此外,還有Trimam等針對并行環境生成執行代碼并優化的后端編譯器生成器等工具。
5)程序分析及代碼優化。
在程序分析及代碼優化方面的編譯工具較多,如BANSHEE、CodeSurfer、Omega、OOPS、PAG、SOOT等。其中BANSHEE、CodeSurfer、Kimwitu、MEMPHIS、PAG等工具針對C/C++程序進行分析,Omega、PAT等工具則可以對Fortran、Java程序進行分析,SOOT、OOPS提供了對Java等語言編譯器的優化,上文中提到的Trimam及SUIF等則針對并行環境進行了代碼優化。
6)編譯器平臺。
除上述實現了部分編譯模塊的開發工具之外,還存在著大量實現了從詞法分析、語法分析直至最后目標代碼生成所有環節的編譯器平臺資源,這些資源用于案例教學可以幫助學生對編譯的全過程進行一個整體的理解和把握。這些平臺可以分為兩類:一類是以精簡語言為源語言的小型編譯器,如PL語言(PASCAL子集)編譯器、與ADA和PASCAL類似的TINY編譯器,以及斯坦福大學開發的COOL(The Classroom ObiectOriented Language)編譯器,這些編譯器都是面向專門為教學設計的某種精簡的編程語言,將其翻譯成某種抽象機代碼,借助抽象機解釋器執行;另一類是以GCC、LCC為代表的產品級開源編譯器,面向C/C++這類主流的編程語言,提供開源、實用的編譯程序。
3.編譯資源在課程教學中的應用
通過上面的分析,我們看到編譯開發工具和相關案例是非常豐富的,但是如何將這些工具和案例很好地結合到教學中,則需要做仔細的選擇和考慮。不論從課程教學,還是實踐教學來看,編譯原理課程的學習可以從局部知識點和系統整體兩個層次開展。課程教學需要在掌握編譯各階段的具體知識點的基礎上,加強各知識點之間的融會貫通,并恰當及時地從局部向系統整體引申。
在詞法分析、語法分析、語義分析、優化、目標代碼生成等知識點的學習過程中,可以引人相應模塊的開發工具作為案例。如在講解詞法分析時可以結合LEX、在講解自上而下分析時結合JavaCC、講解自下而上分析時結合BISON,甚至可以在課堂教學時展示這些工具的核心代碼,加深學生對相關算法的印象。也可以在課外安排實踐作業,要求學生選擇這些工具提供的案例資源,以已有的案例為基礎(為調動學習興趣,可以有意識地選擇學生在其他課程中已經熟悉的語言,如數據庫中的SQL、操作系統中的Shell命令語言、離散數學中的謂詞邏輯等),實際生成一個編譯模塊,閱讀分析生成程序,在此基礎上,可要求學生擴展原有案例。通過結合這些工具講解理論知識,并通過實踐作業,使得學生能夠理解局部知識點,并掌握相關成熟的工具的使用。
在系統開發層面,編譯程序的開發是一個典型復雜的軟件開發任務。如果能在理解局部知識點的基礎上,為學生提供一個理解編譯程序整體全貌的平臺,以編譯過程為指導帶動課程知識點的學習,也是非常有益的。如何在編譯程序的功能實用性和教學可用性兩方面保持平衡,一直是編譯教學的難題。開展綜合性實驗,是提高學生對編譯程序整體理解和開發能力的主要途徑。在這方面,有兩種思路。一種是側重整體體驗,主要是面向一個為教學而專門設計的精簡語言,如前文介紹的PL、TINY和COOL等,這些語言通常包含現代程序設計語言典型成分,但更為精簡,學生可以通過課程學習,最后為該語言實現一個完整的編譯器。按照這種方案開展綜合性實驗,有利于學生體驗一個完整的編譯程序開發過程。第二種思路側重實用性和真實性,主要以GCC、LCC這類實用的,甚至是產品級的開源編譯器為平臺開展實踐。由于GCC、LCC這類實用編譯程序代碼量非常大,如何引導學生在紛繁復雜的代碼中理清頭緒、找到和教學知識點相關的程序段,需要教師做好充分的準備。這種思路,對于將來從事編譯程序開發的學生,其收獲可能更大。
計算機軟件開發語言在發展的過程中,一共經歷了三個過程。即面向過程的語言、面向對象和面向方面的語言。第一,面向過程的語言。面向過程的語言的工作原則是將問題進行有效的分解成很多小的模塊,每個模塊中都是構成問題的子問題,在程序編寫過程中,通過自上而下的順序逐步對各個問題進行解決,是一種結構化編碼的語言。在計算機發展初期,計算機語言只有機器語言和匯編語言,語言的限制要求程序的編寫人員要對計算機的硬件很熟悉。隨著計算機的發展,計算機語言也開始向高級語言方向發展,軟件開發過程中受到硬件限制的因素變少。面向過程的語言進行編程時比較簡單,并且結構性也很強,可讀性比較高,但也有一定的缺點,比如數據與程序模塊的分離和程序的可重用性比較差。第二,面向對象的語言。面向對象的語言在結構化設計、并行處理等方面,繼承了前一種語言的優點,同時,還解決了面向過程的語言中數據與代碼分離的缺點。面向對象的語言被用作程序開發語言的主要目的是為了拉近計算機解決問題過程中的空間結構和應用程序的各種體系結構之間的距離,有助于程序開發過程朝著更加便捷順暢的方向發展。繼承性是面向對象的語言的一個重要特征,很多時候通過對這些語言進行層次分類來進行管理,每個類不僅能對基類的操作進行繼承,還能擴展操作和數據。面向對象的語言還有一個重要的特征就是多態性,使用多態性進行處理,可以提高處理問題的抽象級別,降低軟件設計時的復雜性。第三,面向方面的語言。面向方面的語言是在“方面”基礎上進行的程序設計的一種語言。一般說來,可以把計算機的軟件系統看成是很多個為了滿足用戶的各種需求的關注點,而這些關注點就是計算機要解決的需求問題。軟件開發就是為了對這些關注點中的問題進行分析解決。關注點一般有兩類,一是核心關注點,一是橫切關注點。而利用面向方面的語言進行程序設計的關鍵就是橫切關注點。也就是常說的“方面”,Aspect是面向方面的程序設計一個設計單元,面向方面的程序設計可以將核心關注點和橫切關注點進行一個有效的分離,實現更好的軟件結構。但這兩種關注點對應的代碼卻總是交織在一起的,也就是說橫切關注點和核心關注點相互之間的交互關系不能很好地從業務功能中進行有效的分離。面向方面的程序設計過程是一個系統的過程,先進行整體的分析然后對橫切關注點進行細化等,最后又進行整合。根據關聯來實現橫切關注點之間的組合和優化使得程序設計更加精細,是面向方向的語言程序設計的關鍵。這種語言也有一個很大的好處,即一旦遇到客戶對系統有修改的需求時,只需要在“認證”的方面進行修改,而不會影響到系統的其他方面等,可以提高工作效率。
二、常用的計算機軟件開發語言
(一)C語言
C語言是一種在匯編語言和高級語言之間的語言,它匯集了匯編語言和高級語言的有點。最初,C語言能夠應用的系統只有UNIX系統中,隨著人們對計算機技術以及軟件開發等方面的認識越來越多,C語言應用的系統也越來越多,在其他的操作系統中也可以發揮很好的效益。具體說來,C語言的主要特點有幾個方面,第一,C語言是一種結構化的語言,這種語言的一個重要特點就是層次非常清晰,如果是用模塊化的方式進行程序的組織,則C語言是一種十分便利的語言,而且有利于對程序進行調試和維護。第二,C語言中包含很豐富的數據類型和運算符,而且也能夠訪問到計算機系統內存中的物理地址,有利于進行位操作。第三,C語言的效率很高,移植性也比較強,即能夠移植到不同的計算機上,C語言版本可以有很多種,不是單一形式的,同時,在執行的過程中,C語言的效率也比較高。
(二)C++語言
C++語言的一個優點是利用封裝來減少程序變量對系統帶來的影響。C++語言可以看成是C語言的拓展和深化,但它仍然是一種全新的語言,因為它具有的多繼承機制能夠對很多對象的屬性進行一個準確有效的描述。相比于C語言,它更容易被掌握和學習,C++語言屬于一種面向對象的語言,因此,使用C++語言進行編程時可以更好地適應大規模的軟件需求。利用C++語言編寫運行程序的過程主要有四個步驟,即用C++語言進行程序的編寫、對編寫的源程序進行編譯、將一個程序的目標程序和系統的庫文件以及系統信息進行有效的連接,最后是運行程序。
(三)Java語言
這種語言與C++語言相比而言,在安全性和簡潔性方面有更多的優勢,這種語言的特點主要有幾個方面。首先,Java語言與C++語言相比,在程序編寫編譯過程中的很多錯誤都大大減少了,例如在指針以及內存管理中對程序出錯率的控制上,Java語言有更高的效率。其次,Java語言是一種完全面向對象的語言,同時,Java語言還可以在計算機軟件開發初期對很多出現的錯誤進行檢查識別,以降低內存的出錯率。第三,使用Java語言進行程序編寫的過程匯總,能夠將程序編譯成一種中間的文件格式,這種格式的適用性更強,也就是說,只要是包含Java運行系統的機器都能對這種中間文件格式進行讀取和執行等。最后,Java語言的安全性能高,例如它刪除了手動釋放內存,可以很好地防止非法的內存操作。此外,Java語言還具有很多其他的優勢,例如解釋性強、移植性好等,Java語言在Web瀏覽器以及網絡應用系統之中是比較常見的。
(四)C#語言
關鍵詞:c語言;開源軟件;教學方法;程序設計
引言
現今國內高校在教授c語言時,多數教師基于Windows開發環境來講述c語言編程技術。由于Windows平臺的局限性,教師在教授計算機編程語言時,無法深入講解相關的一些知識和技術,使得學生對于編程語言的理解僅僅停留在表面,不能理解計算機編程語言c的本質,很多相關專業的畢業生所能從事的開發工作基本上還都是一些技術含量比較低的應用層開發工作。究其原因是我們在授課的過程中過分依賴集成度很高的IDE開發工具,讓學生一鍵式完成開發全過程,而卻對整個過程一無所知,對細節基本上不清楚。高校作為承載和傳承技術的機構,理當在平常的教學過程中竭盡所能把每一技術細節都講透、講到位,這樣才能培養出合格、有用、適合社會需求的高級技術開發人才。
國內有很多優秀的企業在基于開源軟件開發自己企業的產品,很多的產品都是用很簡陋的工具而不是在諸如Vc這么強大的IDE開發環境下開發完成的。這些開源工具盡管集成度不是很高,但是每個工具各具功能,在產品開發的各個階段起著不同的作用,簡單且實用。如果學生能理解這些工具的作用,實際上也就真正理解了開發一項產品的全過程,把握住了細節、核心。
鑒于以上所述并結合我校的特點和學以致用的辦學宗旨,我們在校、院領導的鼓勵和大力支持下,大膽嘗試基于開源軟件去講授c語言編程技術,多角度去展現c的魅力和本質,放棄了在集成度很高的Windows下單純講述c語言知識點的傳統方式,教學取得了較好效果。
1 講授Gcc編譯器深入理解C語言開發過程
任何用高級語言編寫的程序都要經歷由源代碼到預處理代碼、匯編代碼、計算機可識別的目標代碼到最后的可執行代碼的轉換才能運行。但在Windows平臺下的IDE開發環境里僅僅需要點擊某個按鈕就一步生成可執行文件,這表面上看很便捷,但學生很難在其中體驗到高級語言程序運行原理的一些相關細節。IDE幫我們做了太多的事情而隱含了過程細節,使得學生很難將學習到理論和實際聯系起來。我們在教學實踐中嘗試使用最簡單的Gee編譯器,講述Gee的各項參數,可以使學生比較直觀的體驗到一個高級語言編寫的程序是如何從源代碼逐步變成計算機可執行文件的過程。在授課過程中講述編譯器的各項參數,例如-E參數產生的結果是預處理文件,通過分析這個文件學生真正理解了預處理到底在做些什么工作,也就很容易理解include和關鍵字define的作用;而在講解Gee的_o參數時,通過示例分析學生自然可以明白為什么要在源程序的開頭要調用#include和為什么我們不需要自己編寫prinff函數而直接調用也沒有錯的原因。這樣在c語言教學過程中通過附帶講解這簡單而又實用的Gee開源編譯器工具可以使學生深入理解開發的每一個環節。把握住了開發過程中的每一步每一細節才是真正把握了住了c語言程序的本質和精髓。
2 引入Makefile概念理解項目本質
企業需要的是有多年項目開發經驗、基本功扎實的開發工程師,所以在教授此門課程時,注意到要讓學生建立項目的基礎概念和培養起扎實的基本功。一般,在講述c語言程序設計時多數老師會教學生使用諸如Turbo c、Vc++等軟件。這些軟件是好用,集成度高,但是屏蔽掉了很多的技術細節。隨便寫寫就可編成一個應用程序,學生會有很多的困惑:我就寫了一個小程序怎么就生成這么大的一個應用程序呢?而在教學過程中增補makefile知識,使學生對系統和項目的組成關系有了一定的認識。這較之傳統的一個c文件講述所有c語言的教學模式有了很大的變革。這樣在學生在走出校門進入企業前已在自己的腦海里對項目、模塊有了一個基本的概念。磨刀不誤砍柴工,基礎打好了,干起活來才得心應手。
3 放棄圖形化調試手段使用Gdb調試器
多數Windows平臺下的IDE開發工具所提供的c語言調試程序,可以很方便地對c語言代碼中的錯誤跟蹤定位。但是越是方便的工具越是阻礙了學生處理問題的能力的培養,過于依賴圖形就會使學生在學習新知識的過程中逐步放棄邏輯思維和抽象思維的訓練,也不利于學生對事物本質的挖掘?;诖?,我們在c語言教學過程中大膽放棄使用IDE開發工具去調試c語言程序,而向學生介紹使用開源軟件Gdb。學生通過學習break命令明白設置斷點的含義,通過學習bt命令了解函數調用棧的概念,通過學習info local了解棧幀、局部變量的意義,從而既鞏固了前期課程的知識又能深入理解調試程序的意義。實踐表明在c語言學習過程中介紹引入Gdb調試器知識可以使得學生養成獨立思考解決問題的習慣。
4 開源工具鏈多角度展示C本質魅力
c語言程序設計是一門實踐性很強的課程,同時也是一門很難理解的課程,如果可以把一個知識點從多角度地向學生展現,勢必能夠幫助學生更好地理解c語言。在開源軟件里有很多的小工具可以很方便地從各個方面向學生傳遞c語言的本質。例如可以用vim編輯器寫入ab兩個字符并保存為ab.c,之后我們可以用oat ab.c將文件的內容打印到屏幕上,而如果我們用od ab.c則可以以八進制的方式把文件打印到屏幕上,而用hexdump ab.c則可以以十六進制方式打印。顯然,一個事物可以多角度去看去辨析,才能更全面地了解事物的本質。教學中我們采用了工程實際中常用的幾個開源工具向學生多角度展示c的本質和魅力,例如用objdump-dsSx app>obj.txt這條命令可以很輕松地將一個應用程序反匯編并保存下來。很多學生都想成為計算機高手,這條命令的引入極大地激發起他們的學習興趣,而再引入strings、nm等命令從不同的角度去看同一個可執行應用程序時,學生學習c語言程序設計的興趣大增。學生學習這門課程的原動力一旦得到激發,學習過程自然也就由“要我學”變成“我要學”。
關鍵詞:面向對象的程序設計;內存分配;封裝;STL;多線程技術;軟件工程
現代操作系統的誕生和發展與C語言是密不可分的,因此C語言是非常重要的程序設計語言。C++在C的基礎上增加了面向對象的概念,從而具備了現代編程語言的一切特征。C和C++是密不可分的,在計算機軟件領域,提到C或者C++時,實際上都是指C/C++。對于計算機及信息類專業的學生,甚或對計算機軟件從業人員,C/C++無疑占據著無可替代的核心位置。和C/C++語言本身的重要性相比,目前大多數高校的C/C++課程設置和教學內容卻相對落后,這和教材建設滯后相關,也和教材編著者缺少應用實踐經驗有很大關系。
程序設計是一門實踐性非常強的課程,因此整個教學環節應該以應用為導向,以上機實驗為手段,不斷強化和鞏固各種基本概念和核心技術,才能培養出能勝任實際工作的合格畢業生,讓學生在走向工作崗位的第一天就具備很強的競爭力。
現在,計算機和網絡已經非常普及,這為教學提供了極為方便的實踐手段,與其他專業相比具有天然的優越性。然而,也正因為計算機和網絡的普及,競爭也變得異常激烈,僅僅掌握一點基礎知識,滿足于完成課本作業,已無法適應當前的就業形勢。如何在激烈的就業競爭中勝出,是每個大學生從入學第一天起就必須正視和嚴肅面對的問題,也是每個高校教育工作者需要不斷思考和探索的重大課題。
1以C++為重點,強調面向對象的程序設計思想
目前,大多數高校信息類專業將C和C++作為
兩門課程分開教學,并且主要以C語言為主,C++甚至成為選修課程。這一方面是出于課時劃分的需要,另一方面也和當前流行的教材相關。這樣的劃分雖然秉承了C語言和C++語言的發展歷程,卻忽略了現實需求?,F代程序設計以對象為基本概念,以面向對象的設計為核心思想。面向對象的程序設計應該是程序設計的起點和基本要求,沒有對象這個概念,軟件設計無從談起。
但是和Java等純面向對象的編程語言不同的是,C++語言一開始就繼承或者說兼容了C語言的幾乎全部特征。因此,它并不是一個純面向對象的程序設計語言,這大大增加了它的復雜性。必須強調的是,C++語言的復雜性雖然增加了學生學習的難度,但是正因為它兼容了C語言的語法特征,使其具備了直接操作內存的能力,從而成為開發系統級軟件和大型軟件的不二選擇,其重要性也是其他語言不能比擬的。掌握了C/C++,就等于擁有了通向軟件設計領域的金鑰匙。另一方面,所有的程序設計語言都是相通的,掌握了功能強大、既能接近系統底層又具有高級語言全部特征的C/C++程序設計語言,再學習其他高級語言就會輕車熟路。
合理分配C和C++的教學時間,將重點轉向C++,是一個艱難但重要的選擇。這需要好的教材,也需要好的教學計劃。C和C++是分不開的,不應該將其割裂開,要從起點就強調面向對象的概念。
在教材內容設置上,可以分為基礎篇和高級篇,這樣既利于學生循序漸進,也利于學時劃分?;A篇應包括C和C++的基本概念和語法,如基本數據類型、指針、函數、類的基本概念,對象的生命周期、對象的內存映射等。高級篇應包括類的高級特征和復雜應用,并以最新的C++標準為基礎,培養學生解決復雜和實際問題的能力。如何合理劃分教學內容,需要不斷地探索。高級篇的內容可以集中教學,也可以作為其他課程的實踐部分進行。
2以內存分配和管理為核心,強化專業訓練
由于具備了直接操作內存的能力,C/C++語言的功能變得十分強大,復雜性也大大增強。內存概念應該是編程學習和實踐的核心,是教學與實踐的重中之重。和內存相關的主要概念有:指針、引用、數組、結構、對象生命期、棧、堆、函數參數傳遞等。
現實中使用某軟件時,經常會遇到“程序崩潰”現象。這幾乎都是由于不當的內存訪問引起的,其本質原因是程序中存在嚴重的邏輯錯誤。在編譯時,編譯者不一定能夠及時發現這些錯誤,但在運行時,當錯誤邏輯被觸發時,很有可能造成內存混亂,從而引起非法地址訪問,進而導致程序崩潰。這種錯誤比一般的業務邏輯錯誤導致的計算結果不正確等問題更隱蔽、更致命。一個專業的程序員,必須在編寫代碼階段就保證代碼的高質量,不應該等出現問題再進行查找和排除。因此,在整個程序設計教學中,必須加強內存概念的理解,并不斷地訓練和鞏固。
每個變量所代表的對象,無論是基本數據類型還是復雜對象,運行時都需要實例化,都需要占用內存。內存是何時分配的?分配了多少?何時釋放?棧內存和堆內存的區別是什么?對象生命周期的本質是什么?函數調用的本質是什么?參數是如何傳遞的?函數返回值的本質是什么?這些問題在當前的教學中常常被忽略,而實際上,它們是每個合格的程序員必須深刻理解和準確回答出的問題。因為不理解這些概念,就不可能編寫出正確高效的代碼,設計出來的程序也一定是存在隱患甚至是錯誤百出的。在教學中,應該加強培養學生在這方面的專業素養。
3強調程序結構和高效封裝,為職業級開發作準備
簡單來說,程序的流程無非順序、分支、循環三種。任何復雜、大型的程序,也是這些基本流程組成的。但是,編寫程序時如何劃分結構,合理地編寫函數,做到代碼的復用,用以上幾種簡單流程組合出一個結構清晰而又效率很高的程序,是考驗編程者水平的關鍵,也是任何編程語言開發程序員都要面臨的問題。不過,由于C/C++語言大多用于大型軟件以及系統級軟件的開發,強調程序結構的重要性顯得更為迫切和必要。
編寫程序就如同建筑師設計摩天大樓一樣,既需要嚴謹的結構,也需要藝術性的加工。好的程序代碼,閱讀起來就像欣賞藝術品,給人美的享受。而劣質的程序,完全看不出編寫者的思路,混亂復雜,這樣的程序即使能夠正確執行,也沒有任何生命力。
現代編程技術強調的是高效性和可讀性的結合。在不影響總體效率的情形下,以結構清晰、高可讀性為第一要素,而強調封裝正是這一要求的具體體現。所謂封裝,有兩個層次,一是函數的封裝,二是對象的封裝。函數封裝主要是指將某個單一功能封裝在一個函數內部。合理的函數功能定義有利于寫出結構清晰的程序,有利于代碼的復用,而將不相關的代碼一股腦兒堆在一起,寫出超大函數,則是函數封裝的大忌。對象的封裝就更重要了,這是面向對象程序設計中的核心問題。對象概念要定義清晰、明確,成員函數要功能單一,除非有充足的理由,所有成員變量都應設為私有,對象和外界打交道的唯一途徑就是公共成員函數。封裝對程序的維護至關重要,是現代程序設計的第一要素。
4掌握STL,理解和使用核心數據結構
標準模板庫(Standard Template Library, STL)早已成為C++的標準。在商業軟件開發中,它們是每個程序員都要時刻使用和深度掌握的,重要性不言而喻。
在數據結構課程中,學生會接觸到棧、隊列、鏈表、集合、映射、樹、哈希表等常見數據結構。理解和掌握這些概念,對于簡化程序設計,提高程序效率,程序的標準化、模塊化設計至關重要。
大多數教材會將C/C++作為教學語言,來講解這些基本的數據結構。自己動手編寫簡單的代碼并實現,有利于概念的理解和掌握。但在商業開發中,必須使用成熟的已成為C++標準的STL,作為這些數據結構的標準實現。要掌握和使用STL,首先要深度理解模板技術。模板技術是編程技術發展過程中的一次革命,它的出現極大地提高了代碼的復用程度,同時保持了程序的效率。它和面向對象的技術相輔相成,類似而又不同,掌握好這兩項技術就邁進了C++編程的核心領地。
5重視高級概念
目前,多核技術得到了普通應用,互聯網早已普及到千家萬戶。在軟件開發中,開發人員必須掌握多線程技術和網絡技術,因此教師要著力加大這方面的教學,使學生的知識技能水平跟上時代的步伐。
多線程技術屬于編程中的高級領域,對開發者要求較高。要掌握好多線程技術,必須有扎實的基本功,要深刻理解同步、事件等重要概念。在教學上,教師可結合操作系統等課程進行教學。
網絡編程涉及到的知識也比較多,教師可配合計算機網絡等進行教學。以前,這一領域顯得比較高深,隨著網絡的普及,學生對許多概念都有感性的認識,在此基礎上進行專業訓練,已沒有太多難度。
另外,數據庫操作也是軟件開發中必備的技術,教師可以結合數據庫課程展開教學。
除了以上幾點,和平臺相關的一些技術,如Windows平臺下的窗口、消息、注冊表等技術,以及類Unix平臺下的進程管理、進程間通信、文件系統等,也是非常重要的。對這些高級技術的學習不能僅停留在語言層面,要進一步熟練掌握,這對于立志進入軟件開發行業的學生非常重要。
6重視職業接軌,強調軟件工程
開發軟件,不僅僅是寫代碼。寫代碼僅是其中的一個環節。一個完整的產品或項目開發過程,都要經歷需求分析、方案設計、代碼編寫、系統測試、產品部署、產品維護等各個環節。要加強在各個環節的訓練,提高職業素養,學生才能在就業競爭中占得先機,才能在工作崗位上快速進入狀態。
這些訓練可以安排在高年級,特別是畢業設計階段來實施。教師要鍛煉學生用學到的知識和技能解決實際問題的能力,要提高學生分析問題的能力,提高其綜合設計水平。要訓練和提高學生使用集成開發環境的能力、編譯調試程序的能力、書寫規范文檔的能力、團隊合作開發的能力。通過這些系統的訓練,學生就基本完成了從學業到職業的接軌。
7結語
C/C++語言在計算機相關專業的教學中占據著及其重要的地位,在學生的就業技能儲備中更是排在了十分優先的位置。因此,C/C++語言教學必須緊密結合實際,針對企業對員工知識水平的真實需求,在教學內容及課時分配等環節上進行重大而科學的調整,才可避免教育和就業需求之間的脫節。在教學內容的調整上,參考文獻[1]至[4]等提供了十分重要的素材,本文中提到的幾個方面則是重中之重。
參考文獻:
[1] Scott Meyers. Effective C++中文版[M]. 侯捷,譯. 武漢:華中科技大學出版社,2001.
[2] 侯捷. STL源碼剖析[M]. 武漢:華中科技大學出版社,2002.
[3] Thomas H Cormen, Charles E Leiserson, Ronakd L Rivest,et al. 算法導論[M]. 潘金貴,顧鐵成,李成法,等譯. 北京:機械工業出版社,2007.
[4] Cay S. Horstmann,Gary Cornell. 最新Java 2 核心技術[M]. 王建華,董志敏,楊保明,等譯. 北京:機械工業出版社,2003.
Research on C/C++ Language Teaching Planning For Information Major
ZHAO Gui-qin
(Technical School, Shanghai Jiao Tong University, Shanghai 201101, China)
關鍵詞:地理信息系統;交互式數據處理語言;空間數據引擎;C#;分布式應用
0引言
進行GIS應用開發,若直接從底層做起則開發周期長、成本高。目前應用最為廣泛的模式是集成二次開發[1],就是以當前成熟的商業GIS平臺為基礎,以高級開發語言為支持來進行應用開發。然而目前的商業GIS平臺價格昂貴,并且由于提供廠商在知識產權保護方面的考慮和限制,有些還不能用來開發完全獨立(Standalone)的應用系統。
業界應用最廣的ESRI[2]公司產品系列中提供了功能強大的基于COM技術的ArcObjects組件作為GIS二次開發工具,開發者可以借助其成熟的空間分析技術以及其與ArcSDE空間數據庫之間良好的協作特性,快速地實現GIS應用系統的開發。然而在ArcGIS9.0之前的版本中,ArcObjects不是獨立的軟件開發工具包(SoftwareDevelopmentKit,SDK),無法脫離ArcGIS環境開發獨立的應用系統[2];即便在新的ArcGIS9.0開始支持獨立開發的情形下,昂貴的許可費用仍然使得目標系統的應用成本非常高。這對科研應用目的而言,不但開發成本太高,而且靈活性很差。因而嘗試在系統的設計開發中,選擇基于矩陣運算的交互式數據處理語言(InteractiveDataLanguage,IDL),以及商業化的空間數據管理引擎ArcSDE的集成開發模式,以期在性能和開發成本之間達成一個合理的平衡。
1開發環境
IDL是一種新型的面向圖形對象、基于矩陣的數據處理語言,自帶強大的數學庫支持,在數據運算、分析和空間表現方面有出色的性能[3]。ArcSDE是非常成熟的空間數據庫引擎。通過結合MSSQLServer或Oracle大型關系數據庫系統,可以建立具有良好性能的空間數據庫[2];并且通過利用ArcSDE提供的ClientAPIs(ApplicationProgrammingInterfaces,應用編程接口)接口進行開發,系統的自主性較強。
經過對多種開發環境和編程語言的比較,系統決定采用.NET作為實現平臺。C#是一種新的編程語言,它是專為生成運行在.NET框架上的企業級應用程序而設計的,同時具備C/C++的強大功能及VisualBasic的快速開發能力,是面向下一代操作系統的開發語言[4]。
2系統開發方案
2.1系統體系結構
系統采用多層邏輯結構的胖客戶端/瘦服務器端模式。服務器端由ArcSDE來實現空間數據的管理,結合服務器上的SQLServer構成空間數據庫。客戶端由C#構建,利用其在應用程序開發方面的性能、快捷性及交互界面開發方面的出色能力,以彌補IDL在此方面的不足。IDL在系統中主要負責實現空間數據(含二維和三維)的本地訪問管理和表現,如空間數據的加載、本地管理、地圖渲染、三維顯示等;系統還可借助IDL強大的數據處理能力實現基于矩陣運算的各種分析功能。IDL部分經過良好的封裝被嵌入在客戶端的C#Shell中。
2.2客戶端程序框架
客戶端交互界面由C#和經過.NET封裝的IDLDrawWidget開發控件構建。由于IDL并沒有像其他專業GIS開發組件(如ESRI的MapObjects或ArcObjects)一樣直接提供對GIS應用開發的支持,因而基本的GIS功能需要利用IDL自行實現。圖層控件用標準的Windows基本控件組合開發;鷹眼控件和地圖控件由經過.NET封裝的IDLDrawWidget開發控件來實現;比例尺控件由Windows繪圖函數與IDL函數共同實現。
2.3空間數據管理
系統中所有的空間數據由ArcSDE空間數據庫統一管理,系統與ArcSDE的交互由C#Shell負責管理,具體的交互功能在體系結構圖的DataAcess組件中實現。其中主要使用了經過.NET封裝的ArcSDECAPIs空間數據庫訪問函數庫。
2.4空間數據處理與顯示
系統中使用IDL語言來進行對空間數據的處理與運算。IDL是目前對科學計算可視化支持較好的語言之一,是一種集成了所有科學計算環境中所需函數的面向矩陣運算、用于數據可視化研究與應用開發的第四代計算機語言,也是易于使用、面向矩陣的語言。它具有高級圖像處理能力、交互式二維和三維圖形技術、面向對象的編程方式、OpenGL圖形加速、量化可視化表現、集成的數學與統計學算法、靈活的數據輸入/輸出方式、跨平臺圖形用戶界面工具包、連接ODBC兼容數據庫存取及多種程序連接工具等功能,并且能夠運行于多種操作系統和硬件平臺之上。本質上,IDL是一個巨大的C程序庫,包括了編譯器、解釋器、圖像、算術處理器、用戶界面和大量依賴操作系統的代碼[5]。利用C#和IDL語言混合開發的系統,既包含了IDL語言強大的科學計算能力,又具備了C#語言對系統開發的靈活性以及系統運行的穩定性,使得兩種語言在系統中達到優勢互補,是實現科學計算及可視化的一種有效途徑。
3SDE訪問接口
系統采用了目前較為成熟的空間數據庫引擎ArcSDE與大型關系數據庫管理系統SQLServer來實現對空間數據的分布式存儲和管理。需要解決的首要問題是如何建立與ArcSDE的遠程連接,并與之實現交互操作。
ArcSDE提供的訪問通道有三條[6,7]。三條通道中:使用ArcObjects成本太高;而直接數據庫連接通過SQL語言直接從關系型數據庫中獲取以表、行、列為基礎的數據,這種方法繞過了ArcSDE,適合于對非空間信息的訪問,但處理空間信息的難度很大;ArcSDE的ClientAPIs是較為基礎的一種功能形式,具有較長的歷史和非常廣泛的應用,它面向開放式系統開發,可以用于客戶端與ArcSDE的交互過程。系統中最終采用ArcSDE提供的C語言客戶端API方式,以便在保證系統性能的前提下,降低系統的開發和運行成本。
ArcSDE的CAPIs具有較高的數據訪問性能、較完整的矢量和柵格數據訪問和管理能力。但是它是一個復雜的體系,包括30個結構、21個枚舉以及757個函數,并且不支持面向對象,也沒有提供對.NET環境的支持(只提供了C和Java兩個版本),因而難以直接在.NET環境中以不安全代碼(Unsafe)的方式訪問。
為解決這一問題,系統開發中利用托管(Managed)C++語言,將ArcSDE的CAPIs封裝為.NET環境支持的模塊,然后在.NET環境中使用。
4IDL與C#通信機制
4.1IDL對混合編程的支持
IDL為了更好地實現軟件開發的靈活性和面向對象的功能,不斷地對功能進行擴充,并且增加了許多與其他語言之間的通信接口,并提供了許多與其他語言進行混合編程的內部API函數。IDL6.0可以與標準C、UNIXC、VisualC++、Java、Delphi等高級語言進行混合編程。
IDL提供了以下幾種混合編程方法[8]:
(1)管道;
(2)在IDL中調用COM對象或ActiveX控件;
(3)IDLDrawWidgetActiveX控件;
(4)在IDL中使用Java對象;
(5)通過RPC調用IDL(UNIX);
(6)通過CALL_EXTERNAL函數調用外部函數。
4.2目標系統適用的方式
由于目標系統是在C#編程環境中使用IDL,IDL的MicrosoftWindows版本的ActiveX控件,即IDLDrawWidget最適合本文目標系統開發的要求。IDLDrawWidget控件提供了在Windows程序中以ActiveX組件形式集成IDL功能的機制,為這些程序提供數據的分析和可視化能力。
IDL提供的IDLDrawWidget控件的主要特征如下[8]:
(1)IDLActiveX控件能顯示IDL直接圖形和對象圖形,通過設置“圖形顯示方式”屬性,控制圖形的顯示類型。
(2)IDLActiveX控件能夠響應鼠標事件。這些事件可以由外部程序觸發,也可以由IDL自己產生。
(3)IDLActiveX控件提供了IDL與外部應用環境之間的數據傳輸機制,使得IDL與外部程序之間的數據傳輸變得十分簡單。
(4)IDLActiveX控件可以應用于任何支持ActiveX控件的開發環境中。因此,可以將IDL強大的圖形顯示功能集成到外部應用程序中,脫離IDL環境,具有很強的可塑性。
4.3通信及數據支持
IDL提供了以下Method用于傳遞數據和命令[8]:
(1)SetNamedData——向IDL傳遞數據,支持所有的Variant數據格式;
(2)GetNamedData——支持VT_UI1、VT_I2、VT_I4、VT_R4、VT_R8和VT_BSTR;
(3)CopyNamedArray——返回IDL數組的復本;
(4)SetNamedArray——在.NET、Delphi等環境下不能實現數據共享,只能傳入數據;
(5)ExecuteStr——執行標準IDL語句,也可以作為一種數據的傳遞方式;
(6)VariableExists——用于判斷IDL環境中是否已經存在給定變量名稱的變量;
事件傳遞:
(1)鼠標事件由.NET環境處理;
(2)保留通過文本結果輸出來實現由IDL到.NET環境的主動事件激發的方式。
IDL對空間數據存儲格式的支持:
(1)矢量——支持直接讀寫Shapefile(通過IDLffShape類)、DXF(IDLffDXF);
(2)柵格——不支持GRID空間數據,只支持讀寫圖像格式數據。
4.4C#與IDL間的數據傳遞機制
由于IDL支持的空間數據格式有限,并且不支持ArcSDE,系統中不直接使用IDL讀取空間數據,而是由.NET主環境中的C#Shell負責從空間數據庫讀取數據,然后再傳入IDL環境。
IDL與主環境之間的數據傳遞只處理單值或者數組數據;而點、線、多邊形等較為復雜的矢量結構數據,需要首先分解為單值或數組后傳遞給IDL,再由IDL根據所給數據生成合適的對象圖形,實現空間數據的表現和管理。
5IDL對象與GIS對象
IDL不直接支持GIS中空間數據的管理和表現,需要自己定義和實現該部分功能。系統實現中采用從IDL對象圖形類繼承的方式,擴展已有的IDL圖形功能,定義新的空間數據類。空間數據類完成從.NET環境接收單值和表格數據,并進行管理和渲染表現等任務。
6結束語
利用IDL、ArcSDE和C#來集成開發分布式GIS應用系統,三者相輔相成,優勢互補。其不但在很短的開發周期內以極低的開發成本建立非常專業的GIS應用系統,而且系統在保證數據安全性及性能的前提下,運行成本也很低廉,為GIS的應用提供了一種新的途徑。
參考文獻:
[1]劉光.地理信息系統二次開發教程——組件篇[M].北京:清華大學出版社,2003:1-2.
[2]ESRIInc.ESRI:theGISsoftwareleader[EB/OL].[2005]..
[3]RSIInc.RSI:dataanalysisandvisualizationsoftware[EB/OL].[2005]./pr/detail.asp?PRID=46.
[4]MicrosoftInc.MSDNhomepage[EB/OL].[2005]..
[5]閆殿武.IDL可視化工具入門與提高[M].北京:機械工業出版社,2003:1-360.
[6]ESRIInc.UnderstandingArcSDE[M/CD].[S.l.]:[s.n.],2002.