吳福生 王俊 倪明濤



摘 要:C語言課程是計算機專業重要的基礎課,也是學習其它高級程序設計語言的基礎,具有承上啟下的作用。但很多高校教師在講授C語言時,并沒有基于計算機系統結構和匯編語言等課程進行教學,導致C語言教學對學生而言只能達到“知其然”,并沒有“知其所以然”。因此,針對網絡空間安全學科下的C語言教學,提出將計算機系統結構和匯編語言課程作為C語言前期基礎課程的改革思路,從程序語言底層執行過程出發進行C語言課程教學,并對C語言課程教學案例進行分析。
關鍵詞:網絡空間安全;C語言課程;課程改革
DOI:10. 11907/rjdk. 192098
中圖分類號:TP434文獻標識碼:A 文章編號:1672-7800(2020)010-0244-03
Abstract: The C language course is an important basic course for computer science and a preliminary basic course for learning other high-level programming languages. It has the role of linking up and down. Many college teachers do not teach based on computer system structure and assembly language when teaching C language. C language teaching can only enable student know what the course is about without understanding the principles. In the first-level discipline based on cyberspace security, this paper proposes the computer composition principle and assembly language course as the pre-basic course of C language course. It is proposed to teach the C language courses from the implementation process of the underlying language of the programming language. Finally, the analysis of the teaching examples of C language courses is given.
Key Words: cyberspace security; C language course; curriculum reform
0 引言
高級程序設計語言是計算機科學與技術、軟件工程和信息工程等工科專業開設的專業必修課和公共基礎課,在高校的信息類課程教學中占有重要地位。當前,信息安全引起了人們的高度關注,信息安全的基礎教學也得到了前所未有的重視,尤其是高級程序設計語言課程教學顯得尤為重要。然而,傳統高級程序設計語言課程教學已無法滿足如今新形勢下對信息安全的要求,如何進行網絡空間安全學科下的高級程序設計語言(以C語言程序設計課程為例)課程教學面臨挑戰。
C語言課程屬于信息安全專業的必修課,也是學習其它高級語言的基礎,如腳本語言(JavaScript和PHP等)、高級語言(C++和Java等)和Python語言等。很多高校都把C語言課程安排在大學一年級,并采用“理論+實驗”的教學模式,課程考核方式為筆試,但這種傳統教學模式并沒有取得良好的教學效果。C語言課程在整個理工科本科教學中占有重要地位,特別對于網絡空間安全專業,更是必不可少的專業基礎課程,但學生普遍認為C語言課程難學,因此學習興趣不高。導致這種情況的原因之一是傳統教學方式在講授C語言程序代碼執行時,一般只是針對C語言“面向過程”的特點,僅從程序流程上講授C語言執行過程。這種教授方法對于一般要求開設高級語言程序設計課程的工科專業是可行的,但對于網絡空間安全學科專業的學生則是“只知其然,而不知其所以然”,導致其在后期的逆向工程、漏洞分析和計算機病毒分析等課程學習中或具體實際應用中存在困難。主要原因為:①在學習C語言課程時,未開設計算機體系結構的前期基礎課程(例如:計算機組成原理和匯編語言);②教學過程中忽視了對C語言底層執行過程的學習;③教師在課程教學設計中未考慮C語言的特殊性,即C語言是一種過渡性程序設計語言,既可看作低級語言,又可認為是一種高級程序設計語言。
因此,針對目前C語言課程教學中存在的問題,本文對網絡空間安全學科下的C語言課程改革進行探究。本文主要創新點為:①把計算機體系結構課程和匯編語言作為C語言教學的前期課程;②在C語言課程教學過程中融入計算機硬件、匯編指令等基礎知識;③結合網絡空間安全的信息安全規范[1]開展教學活動。
1 相關研究工作
C語言是計算機及其它理工類專業的專業基礎課,在高級語言程序設計課程教學中具有重要地位,大多數高校的理工類專業都把C語言課程作為最重要的專業基礎課之一。因此,很多學者及教師對高校C語言課程本科教學進行了探究。如文獻[2]從計算機專業與非計算機專業兩方面考慮C語言課程教學設計,對C語言理論課與實踐課的教學改革進行探討;文獻[3]設計了一個C 語言課程教學輔導網站,讓學生在課外可隨時隨地進行C語言課程學習,打破了C語言學習的時空限制問題;文獻[4]針對數學本科專業的C語言課程教學,重點分析影響C語言課程教學效果的因素,并提出調整授課內容、改進教學方法以及對考核方式進行改革等對策以提升教學效果;文獻[5]提出利用網絡平臺和雨課堂,把微課與翻轉課堂融合到理論與實踐教學中,以增強學生的編程能力和創新能力。此外,文獻[6]-[10]也對C語言課程改革進行了探討。
網絡空間安全于2015年獲批一級學科,其包括《密碼學》、《操作系統原理及安全》和《網絡安全》等課程, C語言課程也是其中最重要的專業基礎課之一。網絡空間安全學科的C語言課程教學與傳統計算機科學與技術及其它理工科專業有所不同,如果延續傳統的C語言課程教學方法,未教授C語言程序代碼的底層實現過程,將導致學生無法理解C語言程序代碼的實現原理。例如,對于一個簡單的C語言程序,如圖1所示,傳統教學方法是按照C語言程序執行順序進行教學,如圖2所示。
在C語言課程教學中,如果只是基于面向過程的思想講解C語言程序執行過程,學生無法徹底理解C語言程序執行順序的本質,在后期學習逆向工程時會感覺很困難。為了加深網絡空間安全學科專業學生對C語言的理解,本文對課程安排的時間順序及相關教學內容進行調整。
2 教學案例設計
以網絡空間安全一級學科下信息安全專業本科生的C語言程序設計課程為例,對C語言課程的教學改革進行探究。該專業的前期課程除《計算機導論》外,還有《計算機組成原理》和《匯編語言》等。下面以譚浩強[11]的《C語言程序設計(第二版)》為教材,以函數嵌套調用章節作為教學案例進行分析,并與計算機科學與技術和軟件工程等一級學科下的C語言課程教學進行對比。
2.1 傳統C語言課程教學
計算機科學與技術和軟件工程等一級學科下的C語言課程教學步驟如下:
步驟1:復習函數基本概念。
(1)復習函數調用的一般形式:函數名(實參數列表)。例如:圖1程序中的主函數main()調用函數Max_Num(a, b),其中(a, b)為函數Max_Num(a,b)的實參數列表,a、b為函數Max_Num(a, b)的實參。
(2)復習實參與形參數據傳遞,即實參與形參一一對應傳遞數據。
(3)復習函數調用方式:①函數語句。例如函數printf();②表達式。例如c=2*max(a,b);③函數參數。例如m=max(a,max(b,c))。
步驟2:引入新課——函數嵌套調用。函數嵌套調用是指在函數調用過程中,又調用另外一個函數。具體調用過程如圖3所示。
(1)講解函數嵌套調用過程。圖3表示兩層嵌套的情形,其執行過程為:執行main函數中調用a函數的語句時,即轉去執行a函數,在a函數中調用b 函數時,又轉去執行b函數,b函數執行完畢返回a函數的斷點繼續執行,a函數執行完畢返回main函數的斷點繼續執行。
(2)講解嵌套調用C程序的實例,利用函數嵌套計算(a+b)2。C語言順序執行與函數嵌套調用過程如圖4所示。
一般情況下,傳統計算機科學與技術和軟件工程等一級學科的C語言嵌套調用課程教學到此結束,并沒有從底層講解函數調用的整個過程。
2.2 改革后的C語言課程教學
基于網絡空間安全一級學科下的C語言課程教學,其教學步驟1(復習函數基本概念)與步驟2(講解函數嵌套調用過程及實例)與傳統C語言課程教學步驟相同,這里不再贅述,以下重點探討如何根據C語言底層執行過程,解決C語言函數的嵌套調用問題。
為使學生加深對函數嵌套調用過程的理解,對程序代碼底層執行順序進行講解,而傳統C語言程序教學中并未涉及到該教學環節。在基于Linux操作系統的環境下,利用GDB工具對程序代碼(圖4的C語言程序)進行反匯編代碼調試,具體過程如圖5所示。
由圖5可知,程序的底層執行順序為:主函數main通過匯編指令Call調用函數Add,函數Add也通過匯編指令Call調用函數Power,并通過匯編指令Leaveq與retq返回函數。在這種程序嵌套調用過程中,能清楚看到程序跳轉的地址空間。例如,從main函數調用Add函數時,匯編Call指令值為0x4005cc,該地址正好是Add的函數地址。
3 教學案例分析
通過對以上C語言程序教學案例的分析可知,從C語言程序執行的底層(匯編語言)深入講解C語言函數嵌套調用過程,并把《計算機組成原理》和《匯編語言》等課程作為其前期課程,可降低教學難度,也使學生了解C語言函數調用執行過程的本質。在具體教學過程中,不僅教授C語言函數嵌套調用的基本知識,例如通過示例圖3解析函數嵌套調用具體過程,而且通過匯編語言執行跳轉的基本指令(Call指令、Leave指令和Ret指令等)解析C語言程序底層執行過程(例如圖4的 GDB反匯編代碼調試),使學生“知其然”,并“知其所以然”,有助于后期逆向工程、漏洞分析和計算機病毒分析等課程的學習以及具體實際應用。
4 結語
沒有網絡安全就沒有國家安全。網絡空間安全成為一級學科,充分體現了信息安全的重要性,因此培養系統掌握信息安全領域基本理論與基本技術,具備信息安全科學研究、技術開發和應用服務能力的信息安全專業人才是當務之急。C語言教學在信息安全教學中具有重要地位,因此網絡空間安全學科下的C語言教學要求高于一般理工科專業的教學要求。本文對網絡空間安全學科下的C語言程序設計課程教學進行了探究,提出將計算機系統結構和匯編語言課程作為C語言教學前期基礎課程的改革思路,從程序語言底層執行過程出發進行C語言課程教學,可一定程度上降低教學難度,提升教學效果。雖然教學改革取得了一定成效,但網絡空間安全一級學科下的C語言課程教學仍然是一個比較艱巨的任務,未來需要根據實踐效果對教學方式作進一步完善。
參考文獻:
[1] 教育部高等學校信息安全專業教學指導委員會.? 高等學校信息安全專業指導性專業規范[M]. 北京:清華大學出版社,2014.
[2] 李桃迎,陳燕,蔣凡. C 語言程序設計課程實踐教學探討[J]. 科教導刊,2018,26(9):103-104.
[3] 何福保,徐赫迪. C語言重點課程教學輔導網站的分析與設計[J]. 福建電腦,2018, 34(11):137-137.
[4] 葉振. 本科院校數學專業《C 語言程序設計》課程教學探討[J]. 福建電腦,2018, 34(10):172-172.
[5] 李宇. 基于微課的C語言翻轉課堂教學設計與實踐[J]. 軟件導刊(教育技術),2019,18(4):47-48.
[6] 梁志劍,常力丹,井超,等. 基于全學時實驗的程序設計基礎課程教學改革[J]. 計算機教育,2018,10(10):150-156.
[7] 熊春榮. “C語言程序設計”課程案例驅動教學模式的研究與實踐[J]. 玉林師范學院學報,2018,31(5):119-121.
[8] 王曉華,汪榮貴,楊娟,等. 新工科背景下離散數學為核心的專業基礎課程實踐教學體系研究[J]. 計算機教育, 2018 (10):146-149.
[9] 于純妍. 基于新型課堂的C語言程序設計課程教學改革方法[J]. 教育教學論壇,2019 (30):86-87.
[10] 方菲,張大為. 基于微信平臺的C語言網絡先行混合教學模式[J]. 軟件導刊,2019,18 (5): 209-211.
[11] 譚浩強. C程序設計(第二版)[M]. 北京:清華大學出版社,2009.
(責任編輯:黃 健)