『壹』 解析命令行參數的函數
1.全局變數解釋:
optarg: 如果選項帶參數,參數保存在optarg中。如果選項帶可選參數,而實際無參數時,optarg為NULL。
optind:argv數組中下一次需要處理的元素的下標,系統默認初始化此值為1. 0是沒有意義的,argv[0]為程序名,在解析命令行參數中是沒有意義的。getopt正常解析完畢後,optind設置為argv數組中第一個不是選項的元素的下標(一般為0)。
opterr:存儲錯誤耐猛納選項字元.
2. GNU/Linux的命令行選項有兩種類型: 短選項和長選項昌沒 ,前者以 '-' 作為前導符,後者以 '--' 作為前導符。 -n 表示是一個不帶參數的短選項。 --n 表示是一個不帶參數的長選項。現在有一個帶有參數的短選項比如說 -w foo ,那麼它和長選項 --foo 是等價的。
函數聲明:
函數參數:
1.argc:主函數傳遞過來的實參
2.argv:主函數傳遞過來的實參
3.optstring:一個包含選項字元的字元串。 一組短選項組成的字元串
函數調用結果
1.該函數每解析完一個選項,就返回該選項字元。選項字元解析完畢後,調用getopt函數將會返回-1,然後optind設置為argv數組中第一個不是選項的元素的下標。
2. 當調用getopt函數檢測到錯誤時(比如說檢測到的選項字元不在optstring實參中),默認情況下函數返回'?'。 為什麼說是默認呢?因為如果通過optstring實參指明選項帶參數,而實際命令行沒有參數時,getopt返回 ':' 而不是 '?'
關於optstring,還有幾點說明:
1.如果選項帶參數,該選項後接冒號,比如optstring這個實參值為"a:b",指示a帶參數,b沒有參數;
2.如果選項帶可選參數,該選項後接兩個冒號,比如"a::b",表明a可能有參數,也可能沒有;
3.如果optstring的開頭字元為':',表明如果指明選項帶參數,而實際命令行沒有參數時,getopt返回':'而不是'?'(默認情況下返回 '?' ,和無法識別的參數返回一樣);
4.如果optstring的開頭字元為'+',表明一但遇到一個非選項參數,馬上停止掃描,隨後的部分當作參數來解釋;
5.如果optstring的開頭字元為'-',表明如知賀果遇到無選項參數,則把它當作選項1(不是字元Ƈ')的參數
示例:(來源於man文檔)
運行示例:
函數聲明:
函數參數:
longops:指向一個option結構體數組的第一個元素。
longindex:getopt_long的最後一個參數longindex在函數返回時指向被搜索到的選項在longopts數組中的下標。
關於option struct如下:
注意在初始化option struct時: The last element of the array has to be filled with zeros.
函數返回值:
1.如果flag這個實參為null,那麼這個函數返回val的值。 這樣短選項字元解析和長選項解析搭建了橋梁。
2.如果flag這個實參不為null,那麼這個函數返回0
3.選項字元解析完畢後,調用getopt_long函數將會返回-1
4.當調用getopt_long函數檢測到錯誤時(比如說檢測到的選項字元不在longops實參中),默認情況下函數返回'?'
示例:(來源於man 文檔)
運行示例如下:
getopt_long_only類似於getopt_long,但是它把 '-' 開頭的選項當作長選項來處理。如果該選項與長選項不匹配,而與短選項匹配,則可以作為短選項解析。
『貳』 python筆記:命令行參數解析
有些時候我們需要通過命令行將參數傳遞給腳本,C語言中有個getopt()方法,python中也有個類似的命令行參數解析方法getopt()。python也提供了比getopt()更簡潔的argparse方法。另外,sys模塊也可以實現簡單的參數解析,本文將對這3種命令行參數解析方法簡要介紹。
sys.argv是傳入的參數列表,sys.argv[0]是當前python腳本的名稱,sys.argv[1]表示第一個參數,以此類推。
命令行運行:
可以看到傳入的參數通過sys.argv來獲取,它就是一個參數列表。
python的getopt與C語言的的getopt()函數類似。相比於sys模塊,支持長參數和短參數,並對參數解析賦值。但它需要結合sys模塊進行參數解析,語法格式如下:
短參數為單個英文字母,如果必須賦值需要在後面加英文冒號( : ),長參數一般為字元串(相比短參數,更能說明參數含義),如果必須賦值需要在後面加等號( = )。
命令行運行:
注意:短參數(options)和長參數(long_options)不需要一一對應,可以任意順序,也可以只有短參數或者只有長參數。
argparse模塊提供了很多可以設置的參數,例如參數的默認值,幫助消息,參數的數據類型等。argparse類主要包括ArgumentParser、add_argument和parse_args三個方法。
下面介紹這三個函數的使用方法。
argparse默認提供了 -h | --help 參數:
命令行運行:
下面列出部分參數:
下面來添加參數:
命令行運行:
parse_args() 方法用於解析參數,在前面的示例代碼中使用parse_args方法來提取參數值,對於無效或者錯誤的參數會列印錯誤信息和幫助信息:
命令行運行:
本文介紹了Python的三種命令行參數解析方法sys.argv、getopt和argparse,可以根據自己的需要進行選擇,getopt和argparse兩種方法相比來說,建議選擇argparse,代碼量更少更簡潔。更詳細的使用方法參考官方文檔:
--THE END--
『叄』 指令調度與命令行參數解析
編譯器優化:指令調度
指令調度是指對程序塊或過程中的操作進行排序以有效利用處理器資源的任務。其目的是通過重排指令提高指令級並行性,使得程序在具有指令流水線的CPU上更高效運行。指令調度優化的前提是CPU硬體支持指令並行。根據指令調度發生的階段,可以分為靜態調度和動態調度。靜態調度發生在程序編譯時期,由編譯器完成,通過指令調度優化在生成可執行文件前完成指令重排。動態調度則發生在程序運行時期,需要提供硬體支持,比如亂序執行(OoOE)。現代計算機的指令並行方案有流水線、超標量和多核。其中,流水線和超標量與指令調度相關性更強,通過將指令執行過程分解為多個階段以實現多條指令的執行時間重疊。指令調度與寄存器分配之間具有相互約束、相互作用的關系。指令調度通過降低指令間依賴提高程序並行度,改變指令執行時機會影響寄存器的生命周期。寄存器分配則通過縮短寄存器生命周期,盡量減少訪存指令,影響指令調度。兩者相互約束,聯合求解可以得到更優的解決方案。在LLVM編譯器中,寄存器分配前後都會執行指令調度。表調度是一種貪心+啟發式方法,用於調度基本塊中的指令,主要考慮數據依賴、硬體資源等信息。表調度的基本思想是維護ready列表和active列表,通過計算指令節點的優先順序並在周期內調度指令以執行。數據型冒險、結構性冒險和控制型冒險是指令調度面臨的主要約束,編譯器通過插入NOP指令來化解冒險。表調度方法不能保證得到最優調度結果,但接近最優解。LLVM的命令行參數解析提供了一種方便的方法,簡化了解析命令行參數、列印help信息等操作。通過引入LLVM Support庫的cl::ParseCommandLineOptions函數,一行代碼即可完成命令行參數解析功能。