學期2024-2025- 學號20241317 《計算機基礎與程式設計》第七週學習總結
作業資訊
這個作業屬於哪個課程 | <班級的連結>(如2024-2025-1-計算機基礎與程式設計) |
---|---|
這個作業要求在哪裡 | <作業要求的連結>(如2024-2025-1計算機基礎與程式設計第一週作業) |
這個作業的目標 | <寫上具體方面> |
作業正文 | https://www.cnblogs.com/manurios/p/18537875 |
教材學習內容總結
《電腦科學概論》第 7 版第六章主要內容如下:
1. 低階程式設計語言:
- 機器語言:計算機硬體能夠直接理解和執行的語言,由一系列二進位制程式碼組成。每條機器語言指令只能執行一個非常低階的任務,直接與硬體互動,這是最底層的語言。其編寫和理解對人類來說非常困難且容易出錯,但對計算機硬體的控制最為直接。
- 組合語言:是對機器語言的改進,用助記符表示機器指令,比機器語言更易於編寫和理解。不過,它仍然與硬體緊密相關,需要透過彙編器將其轉換為機器語言才能被計算機執行。
- pep/9 虛擬機器:是一種為模擬真實機器的重要特徵而設計的假想機器。其記憶體單元由 65536 位元組的儲存空間構成,機器指令一共 8 位,前四位是操作碼,後四位是地址碼。
2. 組合語言的組成部分: - 指令集:是 CPU 支援的所有指令的集合。
- 暫存器:用於儲存資料和地址的小型儲存區域,CPU 中的算術邏輯單元可直接對暫存器中的資料進行操作,能加快資料的處理速度。
- 定址模式:確定運算元位置的方法,如直接定址(運算元的地址直接包含在指令中)、間接定址(指令中的地址是運算元地址的儲存位置)等。
- 指令格式:操作碼和運算元的組合方式,不同的計算機體系結構和指令集有不同的指令格式要求。
3. 組合語言程式設計: - 編寫彙編程式:涉及資料定義、指令編寫以及控制結構的使用等方面。例如定義資料的儲存型別和初始值,使用各種指令對資料進行操作,以及透過條件判斷、迴圈等控制結構實現程式的邏輯流程。
- 彙編和連結過程:彙編過程是將組合語言程式轉換為機器語言的過程,由彙編器完成。連結過程則是將多個目標檔案(包括彙編生成的目標檔案和其他庫檔案)組合成一個可執行程式的過程。
4. 虛擬碼: - 定義:一種非正式的、介於自然語言和程式語言之間的語言,用於描述演算法而不依賴於特定程式語言的語法。
- 用途:可在程式設計之前用於規劃演算法,作為程式的文件,方便其他程式設計師理解程式的邏輯和功能,也可作為教學工具,幫助初學者理解演算法的設計思路。
5. 從虛擬碼到程式語言: - 轉換過程:將虛擬碼轉換為特定程式語言的程式碼時,需要根據程式語言的語法規則和特性對虛擬碼進行翻譯和細化。例如,將虛擬碼中的條件判斷、迴圈等控制結構轉換為程式語言中的相應語句。
- 程式碼最佳化:在轉換過程中,可以根據程式的效能需求和程式語言的特點進行最佳化,如提高程式碼的執行效率、增強程式碼的可讀性等。
6. 低階語言與高階語言的比較: - 抽象級別:低階語言接近計算機硬體,抽象級別低,程式設計師需要對硬體細節有較多瞭解;高階語言抽象級別高,更貼近人類的思維方式,程式設計師可以更關注問題的邏輯解決,而不必過多關注硬體實現。
- 效能:低階語言由於直接操作硬體,在效能上可能更有優勢,特別是對於一些對效能要求極高的應用場景,如嵌入式系統、實時控制系統等。但高階語言在開發效率和程式碼的可維護性方面更勝一籌。
- 可讀性和可維護性:高階語言的語法更接近自然語言,程式碼的可讀性和可維護性更好,便於程式設計師之間的交流和程式碼的後期維護。低階語言的程式碼相對較為晦澀難懂,維護難度較大。
7. 實際應用: - 嵌入式系統:在嵌入式系統中,由於對硬體的控制要求較高,且系統資源有限,低階語言和虛擬碼常用於編寫底層的驅動程式和控制系統程式,以實現對硬體的精確控制。
- 效能關鍵型應用:在一些對效能要求非常嚴格的應用場景,如遊戲開發、高效能運算等,低階語言可以幫助程式設計師實現對硬體的精細控制,提高程式的效能。
教材學習中的問題和解決過程(先問 AI)
(一個模板:我看了這一段文字 (引用文字),有這個問題 (提出問題)。 我查了資料,有這些說法(引用說法),根據我的實踐,我得到這些經驗(描述自己的經驗)。 但是我還是不太懂,我的困惑是(說明困惑)。【或者】我反對作者的觀點(提出作者的觀點,自己的觀點,以及理由)。 )
- 問題1:組合語言為何與硬體互動
- 問題1解決方案:
1. 貼近硬體底層:組合語言是一種低階程式設計語言,相比高階語言,它更接近計算機硬體的底層操作。它的指令直接對應著計算機硬體能執行的基本操作,如資料的傳送、算術運算、邏輯運算等,這些操作是透過對硬體中的暫存器、記憶體單元等進行具體的讀寫和控制來實現的。
2. 暫存器操作:組合語言可以直接對CPU中的暫存器進行操作。暫存器是CPU內部用於暫存資料和指令的高速儲存單元,不同的暫存器有不同的用途,比如存放運算元、運算結果、指令地址等。透過彙編指令能精確地設定暫存器的值,從而控制硬體完成相應任務,實現與硬體的緊密互動。
3. 定址模式:組合語言具備多種定址模式,像直接定址、間接定址等。這些定址模式能準確地定位資料在記憶體中的儲存位置,使得可以按照硬體的儲存架構去訪問和處理資料,進而實現與硬體儲存系統等的互動。
4. 指令集對應硬體功能:組合語言基於特定計算機的指令集,而指令集是該計算機硬體所能執行的所有操作的集合。每條彙編指令都對應著指令集中的一個具體操作,這些操作是為了驅動硬體完成諸如輸入輸出、資料處理等各項功能而設計的,所以能透過編寫彙編指令來讓硬體執行相應動作,達成與硬體的互動。
- 問題2:連結過程具體是什麼
- 問題2解決方案:
- 目標檔案生成
首先,經過彙編等步驟會生成目標檔案(.obj檔案等,不同系統可能有不同字尾)。這些目標檔案包含了組合語言程式轉換而來的機器語言程式碼,但它們還不能直接執行,因為可能存在對外部符號(比如其他模組中的函式、變數等)的引用等情況。
- 連結器工作原理
接著由連結器來處理這些目標檔案,其主要任務是將多個目標檔案以及可能需要的庫檔案組合成一個完整的可執行程式。
- 符號解析
在連結過程中,連結器會進行符號解析。它要確定各個目標檔案中引用的外部符號(如函式名、變數名等)的實際地址。比如一個目標檔案中呼叫了另一個目標檔案裡定義的函式,連結器就要找到那個函式在其所在目標檔案中的具體位置(也就是地址),以便在程式執行時能正確跳轉過去執行該函式。
- 地址重定位
當把多個目標檔案整合到一起時,每個目標檔案原本內部的相對地址可能會發生變化。連結器要對這些地址進行重定位操作,確保程式中的指令和資料在最終的可執行程式裡能有正確的絕對地址,使得程式在執行時能按照正確的地址去訪問指令和資料。
- 庫檔案處理
如果程式還依賴一些庫檔案(如標準庫等),連結器也會把相關的庫檔案內容整合進來。庫檔案裡包含了很多常用的函式、資料結構等資源,透過連結將其融入可執行程式,讓程式可以使用這些庫中的功能。
- 生成可執行程式
經過上述一系列的符號解析、地址重定位以及庫檔案整合等操作後,連結器最終生成一個完整的可執行程式,這個程式就可以在相應的計算機系統上執行了。
- ...
基於AI的學習
問題1:庫檔案有哪些
解答:庫檔案種類繁多,常見的有以下幾類:
標準庫檔案
- C標準庫:如stdio.h(用於輸入輸出操作,像printf、scanf函式就在此庫中定義)、stdlib.h(包含記憶體分配、隨機數生成等函式)、string.h(提供字串處理函式)等。幾乎所有C語言程式都會用到這些標準庫來完成基本的功能操作。
- C++標準庫:除了相容C標準庫部分功能外,還有像iostream(用於輸入輸出流操作,可替代C的stdio.h實現更方便的輸入輸出)、vector(動態陣列容器)、string(對字串進行更高階處理)等,為C++程式開發提供豐富功能。
數學庫檔案
- 例如在很多程式語言中都有的math庫,用於實現各種數學運算功能,像三角函式(sin、cos等)、對數函式(log、ln等)、冪運算函式(pow)等的計算。
圖形庫檔案
- OpenGL:廣泛應用於圖形處理和遊戲開發等領域,可實現二維和三維圖形的繪製、渲染,如建立三角形、四邊形等幾何圖形,設定光照效果、材質等。
- DirectX:主要用於Windows平臺下的遊戲開發和多媒體應用,提供了圖形、聲音、輸入等多方面的功能模組,能實現高質量的圖形顯示和互動。
資料庫連線庫檔案
- ODBC(Open Database Connectivity):是一種標準的資料庫連線介面,透過它可以連線到多種不同型別的資料庫,如MySQL、Oracle、SQL Server等,實現資料的查詢、插入、更新、刪除等操作。
- JDBC(Java Database Connectivity):是Java語言用於連線資料庫的標準庫,同樣可用於連線各類資料庫,在Java應用程式開發中,若涉及資料庫互動,經常會用到它。
網路庫檔案
- Socket庫:在網路程式設計中常用,可實現基於TCP/IP協議的網路連線、資料傳輸等操作。不同程式語言一般都有自己對應的Socket實現,比如Python的socket庫,透過它可以建立伺服器端和客戶端,進行網路通訊。
作業系統相關庫檔案
- 在Windows系統下有Win32 API相關庫,包含大量用於實現Windows特色功能的函式,如視窗建立、訊息處理、檔案管理等。
- 在Linux系統下有glibc庫,它是Linux系統中最基本的標準庫,提供了很多如記憶體管理、執行緒操作、檔案系統訪問等基本功能函式。
問題2:定址模式有哪些:
常見的定址模式有以下幾種:
直接定址
指令中直接包含運算元的真實地址,處理器根據這個地址就能直接從記憶體中獲取運算元。例如在一條指令中明確給出了記憶體地址1000H,那麼執行該指令時就會從記憶體地址1000H處讀取運算元。
間接定址
指令中給出的是運算元地址的存放地址。也就是說,指令中的地址指向的是另一個記憶體單元,而真正的運算元存放在這個被指向的記憶體單元中。比如指令中的地址是2000H,而記憶體地址2000H處存放的內容是3000H,那麼真正的運算元就在3000H這個地址處。
暫存器定址
運算元存放在CPU的暫存器中,指令透過指定暫存器名來獲取運算元。例如在暫存器AX中存放了一個資料,指令透過指明AX就能直接使用該暫存器中的資料進行運算等操作。
暫存器間接定址
運算元的地址存放在暫存器中,先從暫存器中取出地址,再根據這個地址從記憶體中獲取運算元。比如暫存器BX中存放著記憶體地址4000H,那麼先從BX中取出4000H,再從記憶體地址4000H處獲取運算元。
基址定址
以基址暫存器(如BX、BP等)的內容為基準,加上一個偏移量來確定運算元的地址。例如基址暫存器BX的值為5000H,偏移量為100H,那麼運算元的地址就是5000H + 100H = 5100H,就從這個地址處獲取運算元。
變址定址
通常利用變址暫存器(如SI、DI等)的內容,再加上一個固定的偏移量來確定運算元的地址。例如變址暫存器SI的值為6000H,偏移量為200H,那麼運算元的地址就是6000H + 200H = 6200H,進而獲取運算元。
相對定址
常用於程式跳轉指令等情況,它是以當前指令的地址(程式計數器PC的值)為基準,加上一個相對偏移量來確定目標指令的地址。比如當前指令地址為7000H,相對偏移量為300H,那麼目標指令的地址就是7000H + 300H = 7300H,程式就會跳轉到這個地址處的指令繼續執行。
三個原則:
- 切勿原封不動地接受生成式人工智慧工具的輸出;確保對其進行評估、完善和修改(或提示),以適應您的目標。
- 切勿將任何個人資料(自己、同學、老師等)或版權材料納入到你的提示詞中。這個可以說是保護個人隱私的最起碼的舉措。
- 所有人工智慧生成工具都容易產生幻覺,因此會生成不準確或誤導性的資訊,要學會甄別資訊真假
選擇至少2個知識點利用chatgpt等工具進行蘇格拉底挑戰,並提交過程截圖,提示過程參考下面內容
“我在學***X知識點,請你以蘇格拉底的方式對我進行提問,一次一個問題”
核心是要求GPT:“請你以蘇格拉底的方式對我進行提問”
然後GPT就會給你提問,如果不知道問題的答案,可以反問AI:“你的理解(回答)是什麼?”
如果你覺得差不多了,可以先問問GPT:“針對我XXX知識點,我理解了嗎?”
GPT會給出它的判斷,如果你也覺得自己想清楚了,可以最後問GPT:“我的回答結束了,請對我的回答進行評價總結”,讓它幫你總結一下。
程式碼除錯中的問題和解決過程
- 問題1:XXXXXX
- 問題1解決方案:XXXXXX
- 問題2:XXXXXX
- 問題2解決方案:XXXXXX
- ...
程式碼託管
(statistics.sh指令碼的執行結果截圖)
上週考試錯題總結
- 錯題1及原因,理解情況
- 錯題2及原因,理解情況
- ...
其他(感悟、思考等,可選)
xxx
xxx
學習進度條
程式碼行數(新增/累積) | 部落格量(新增/累積) | 學習時間(新增/累積) | 重要成長 | |
---|---|---|---|---|
目標 | 5000行 | 30篇 | 400小時 | |
第一週 | 200/200 | 2/2 | 20/20 | |
第二週 | 300/500 | 2/4 | 18/38 | |
第三週 | 500/1000 | 3/7 | 22/60 | |
第四周 | 300/1300 | 2/9 | 30/90 |
嘗試一下記錄「計劃學習時間」和「實際學習時間」,到期末看看能不能改進自己的計劃能力。這個工作學習中很重要,也很有用。
耗時估計的公式
:Y=X+X/N ,Y=X-X/N,訓練次數多了,X、Y就接近了。
參考:軟體工程軟體的估計為什麼這麼難,軟體工程 估計方法
-
計劃學習時間:XX小時
-
實際學習時間:XX小時
-
改進情況:
(有空多看看現代軟體工程 課件
軟體工程師能力自我評價表)
參考資料
- 《電腦科學概論(第七版)》
- ...