計算機程式 Computer Programming Language

計算機程式
Computer Programming Language
Lecture 9 編譯器進階使用
郭修伯 助理教授 (5488)
• Compiler (編譯器)
– 將程式轉碼為目的檔 (*.obj) 或執行檔 (*.exe)。
• Link (連結器)
– 將compiler 所產生的目的檔 (*.obj) 連結成最後的可執行
檔 (*.exe),或是程式庫 (*.lib,*.dll)。
– 可以把不同語言程式碼產生的 obj 檔連結成一個執行檔。
• Library (程式庫)
– 寫作程式時所用的庫存函式,存在 *.lib 的程式庫中。
– DF98\LIB\*.lib
– IMSL
• Debug (除錯工具)
– 找程式碼的錯誤。
• Profile (分析工具)
– 分析各函式的執行時間,以找出執行效率最差的部分。
Debug 模式與 Release 模式
Debug 模式下產生的檔案:C:\my document\fortran\debug
Release 模式下產生的檔案:C:\my document\fortran\release
Release 模式下編譯出的檔案經最佳化處理,執行較有效率,但是...
靜態程式庫
Fortran Static Library 編譯出來的是 *.lib 的程式庫,不是可執行的 *.exe檔
• 加程式碼於project
• 重新開一project
加入*.f90 檔案
加入*.lib 檔案
或是:tool/options:
新增的
不要刪除
同樣地,module會編譯出相對應的 *.mod 檔。
*.mod 沒辦法直接加入 project 中,需放在tools/options/directories
下的 include files 中。
將程式庫拿給別人使用時,記得用 release 模式編輯!
動態程式庫 dll
• 靜態程式庫:
– 事先將程式所需使用的函式編譯成機械碼,儲存在
*.lib 檔中。
– 編譯器會去 *.lib 中找出需要的函式,複製一份,放
在執行檔中。
• 動態程式庫:
– 事先將程式所需使用的函式編譯成機械碼,儲存在
*.dll 檔中。
– 編譯器不會將機械碼複製到執行檔中,而是在執行
檔中說明函式放在哪一個 *.dll 檔中。
– Unix/Linux 動態程式庫: *.a
和一般的程式的差異:需說明哪些函式可以被外界呼叫
說明函式sub可以被外界
呼叫。
沒有這指令的函式只能
被 DLL檔案中的函式呼
叫,不能被外界呼叫。
編譯:
產生:
開新project:
加入主程式和 *.lib
可以compile 和 build,但是...
看不見?
• 將 *.dll 放到與 Usedll.exe 同一個目錄下
• 或是放在 windows作業系統目錄下,就能執行
一般的 Fortran 程式大多自行使用,不太需要編譯成 *.dll 檔。
與其他程式語言(如 Visual Basic, Delphi) 連結時,建議使用 DLL.
• 執行檔的除錯 debug:
– toolbars: tool/customize
加入(移除)中斷點
終止除錯
其他的除錯功能
一行一行除錯,深入函式
一行一行除錯,跳過函式
用debug 模式編輯:
build/start debug/go
程式停在這
輸入想查看的變數名稱
手工除錯
• 不使用編譯器的除錯功能,直接在程式
碼中輸出一些額外的資訊
Fortran 呼叫 C
讓 Fortran 認識 C 的函式
兩個檔案同時加入 project 中,Fortran 檔案
會使用 VF編譯,C 檔案會使用VB編譯。
• 要讓 Fortran 看見 C 語言的函式
說明為 C 語言函式
函式用 C 語言寫的
哪一個 C 的函式
在Fortran中的名字
溝通編譯器
傳遞的是參數的位址
傳遞的是參數的值
從 Fortran 傳遞整數或浮點數變數到 C 語言很容易,只要兩邊型
態一致即可。但傳遞字串、複數、自訂型態需注意,此略。