麻豆传媒视频在线,国产91精品不卡视频,欧美jizz19性欧美,污视频网站在线观看,91涩漫在线观看,伊人发布在线,九色porny丨首页在线,福利视频一区,久久av网址,久久人人视频

當前位置:首頁 > 網站舊欄目 > 學習園地 > 設計軟件教程 > Dmd編譯器學習筆記

Dmd編譯器學習筆記
2010-01-13 22:54:03  作者:  來源:
Dmd編譯器學習筆記

英文原文在這里:
http://digitalmars.com/d/dcompiler.html
在這里有一篇翻譯文章:
http://sofire.javaeye.com/blog/111667
不過,主要是關于windows的;我更關心Linux下的使用。
順便看看兩者有啥區別。

相關文件
注意:

Linux的dmd配置文件是dmd.conf
Windows的配置文件是sc.ini


  • /dmd/bin/dmd     D 編譯器的可執行文件
     
  • /dmd/bin/dumpobj     Elf file dumper
     
  • /dmd/bin/obj2asm     Elf文件反匯編器
     
  • /dmd/bin/dmd.conf     全局配置文件(復制到 /etc/dmd.conf)
     
  • /dmd/lib/libphobos.a     D運行庫(復制到 /usr/lib/libphobos.a)
     


DMD的安裝
[list=1]
  • 下載dmd程序:http://ftp.digitalmars.com/dmd.zip,解壓到~/dmd目錄
  • 復制dmd.conf文件到/etc目錄
    Java代碼 復制代碼
    1. cp ~/dmd/bin/dmd.conf /etc  
  • 給下面的文件添加執行權限
    Java代碼 復制代碼
    1. chmod u+x ~/dmd/bin/{dmd,dumpobj,obj2asm,rdmd}  
  • 把~/dmd/bin添加到PATH環境變量;或者把它們復制到/usr/local/bin目錄下(不要只復制可執行程序)
  • 復制庫文件到/usr/lib目錄
    Java代碼 復制代碼
    1. cp ~/dmd/lib/libphobos.a /usr/lib  

    [/list]

    以上安裝過程比較簡單,只有PATH環境變量設置正確了,就應該沒有什么問題

    編譯參數和開關
    命令的格式:
    Java代碼 復制代碼
    1. dmd   files...  -switches...   

    [Windows]支持以下類型的文件:
    Java代碼 復制代碼
    1. Extension      File Type     
    2. none           D source files     
    3. .d             D source files     
    4. .di            D interface files     
    5. .obj           Object files to link in     
    6. .lib           Object code libraries to search     
    7. .exe           Name output executable file     
    8. .def           module definition file     
    9. .res           resource file    

    [Linux]支持以下類型的文件:
    Java代碼 復制代碼
    1. Extension      File Type   
    2. none           D source files   
    3. .d             D source files   
    4. .di            D interface files   
    5. .o             Object files to link in   
    6. .a             Library files to link in  

    好像不支持.so文件--這一點不肯定

    編譯開關之一
    Java代碼 復制代碼
    1. -debug   
    2.     編譯調試代碼   
    3.   
    4. -debug=level   
    5.     編譯調試代碼:code <= level   
    6.   
    7. -debug=ident   
    8.     編譯調試代碼:標識符為ident   
    9.   
    10. -version=level   
    11.     生成版本代碼:>=level   
    12.   
    13. -version=ident   
    14.     生成版本代碼:==ident   
    15.        
    16. -unittest   
    17.     編譯單元測試代碼(還有斷言)   
    18.   
    19. -cov   
    20.     添加覆蓋率分析指令;運行程序后,會生成.lst文件   
    21.   
    22. -release   
    23.     生成發行版本;會去掉契約和斷言等信息  


    -debug / -version
    debug、version的使用方法很相似
    Java代碼 復制代碼
    1. //debug.d   
    2. import std.stdio;   
    3.   
    4. void main()   
    5. {   
    6.     debug    { writefln("debug"); }   
    7.     debug(1) { writefln("debug(1)"); }   
    8.     debug(2) { writefln("debug(2)"); }   
    9.   
    10.     debug(ERROR) { writefln("debug(ERROR)"); }   
    11.     debug(WARN)  { writefln("debug(WARN)"); }   
    12.   
    13.     version(HOME)      { writefln("version(HOME)"); }   
    14.     version(BUSINESS)  { writefln("version(BUSINESS)"); }   
    15.   
    16.     version(WINDOWS) {} else { writefln("version(!WINDOWS)"); }   
    17. }  

    編譯并運行之:
    Java代碼 復制代碼
    1. # dmd -debug -run debug.d   
    2. debug   
    3. debug(1)   
    4. version(!WINDOWS)   
    5.   
    6. # dmd -debug=1 -run debug.d   
    7. debug   
    8. debug(1)   
    9. version(!WINDOWS)   
    10.   
    11. # dmd -debug=2 -run debug.d   
    12. debug   
    13. debug(1)   
    14. debug(2)   
    15. version(!WINDOWS)   
    16.   
    17. # dmd -debug=ERROR -run debug.d   
    18. debug(ERROR)   
    19. version(!WINDOWS)   
    20.   
    21. # dmd -debug=WARN -run debug.d   
    22. debug(WARN)   
    23. version(!WINDOWS)   
    24.   
    25. # dmd -version=HOME -run debug.d   
    26. version(HOME)   
    27. version(!WINDOWS)   
    28.   
    29. # dmd -version=BUSINESS -version=WINDOWS -run debug.d   
    30. version(BUSINESS)  


    -unittest
    Java代碼 復制代碼
    1. //unittest.d   
    2. import std.stdio;   
    3.   
    4. class A   
    5. {   
    6.     int i;   
    7.     this(int v) {   
    8.         i = v;   
    9.     }      
    10.   
    11.     unittest {   
    12.         A a = new A(1);   
    13.         assert(a.i == 1);    
    14.         assert(a.i != 0);    
    15.     }      
    16. }   
    17.   
    18. int add(int a, int b)   
    19. {   
    20.     return a - b;   
    21.     // 這里沒有unittest   
    22. }   
    23.   
    24. void main()   
    25. {   
    26.     // 這里沒有unittest   
    27. }   
    28.   
    29. unittest {   
    30.     assert(add(12) == 3);    
    31. }  

    先正常編譯,沒有語法錯誤:
    Java代碼 復制代碼
    1. # dmd -run unittest.d  

    再編譯單元測試代碼
    Java代碼 復制代碼
    1. # dmd -unittest -run unittest.d    
    2. Error: AssertError Failure unittest(30)  

    30行有錯誤?add函數寫錯了:(

    -cov
    看看覆蓋率分析選項:
    Java代碼 復制代碼
    1. //cov.d   
    2. import std.stdio;   
    3.   
    4. void main()   
    5. {   
    6.     for (int i; i < 2; i++)   
    7.     {   
    8.         if (i < 5)   
    9.             writefln("i < 5");   
    10.         else  
    11.             writefln("i >= 5");   
    12.     }   
    13. }  

    編譯并運行:
    Java代碼 復制代碼
    1. # dmd -cov -run cov.d   
    2. i < 5  
    3. i < 5  

    得到覆蓋率分析文件:cov.lst:(注意:編譯完并不會有這個文件;運行程序后才會生成)
    Java代碼 復制代碼
    1.        |//cov.d   
    2.        |import std.stdio;   
    3.        |   
    4.        |void main()   
    5.        |{   
    6.       6|    for (int i; i < 2; i++)   
    7.        |    {   
    8.       2|        if (i < 5)   
    9.       2|            writefln("i < 5");   
    10.        |        else  
    11. 0000000|            writefln("i >= 5");   
    12.        |    }   
    13.        |}   
    14. cov.d is 75% covered  

    第6行運行了6次--自己算算是不是;
    第11行運行了0次--搜索000000字符串,就能輕松找到沒有覆蓋到地方;
    更多詳情參考:http://digitalmars.com/d/code_coverage.html

    -release
    用法很簡單,不舉例了

    編譯開關之二
    Java代碼 復制代碼
    1. -D   
    2.     生成文檔   
    3.   
    4. -Dddocdir   
    5.     把文檔生成到docdir目錄;注意是 -Dd   
    6.        
    7. -Dffilename   
    8.     指定文檔的文件名;  

    編譯命令很簡單:
    Java代碼 復制代碼
    1. dmd -D debug.d  

    關于文檔的更多信息參考:http://sofire.javaeye.com/blog/111881

    編譯開關之三
    Java代碼 復制代碼
    1. -H   
    2.     生成.di接口文件   
    3.   
    4. -Hddir   
    5.     把接口文件生成到dir目錄;注意是 -Hd   
    6.   
    7. -Hffilename   
    8.     指定接口文件名;注意是 -Hf  

    關于接口,看一段翻譯:
    當處理源文件中的import聲明時,編譯器會搜索import對應的源文件,從中提取出需要的信息。
    編譯器同時也會搜索D接口文件,D接口文件中只包含模塊中需要導入的內容,而不是整個模塊。
    使用D接口文件的好處是:

      D接口文件更小,和D源文件相比處理起來更快。
      可以隱藏源代碼。比如以接口文件和object庫的方式提供源程序,而不是提供全部源代碼。

    D接口文件可以在編譯D源文件時用-H開關創建,D接口文件的后綴是.di。
    當編譯器分解import聲明時,搜索尋找.di形式的D接口文件,再尋找D源文件。
    D接口文件有點和C++頭文件相似,但這不是必需的,它不屬于D語言,只是編譯器的一個功能,只是用來優化程序的構建。

    dmd -H生成的接口文件包括了源代碼;只是去掉了注釋,斷言等信息;具體怎么回事,待弄明白了再來改這里(TODO)



    編譯開關之四
    Java代碼 復制代碼
    1. -c   
    2.     只編譯,不鏈接;簡單點說就是只生成.o文件,不生成可執行文件   
    3.   
    4. -Ipath   
    5.     指定import路徑;多個路徑之間用分號(;)分割;允許有多個-I,并按照-I指定的路徑順序進行搜索   
    6.   
    7. -Jpath   
    8.     指定D源程序中import表達式的搜索路徑;多個路徑之間用分號(;)分割;   
    9.     允許有多個-J,并按照-J指定的路徑順序進行搜索   
    10.   
    11. -Llinkerflag   
    12.      把linkerflag傳遞給連接程序(linker),比如: -L-L/usr/lib   
    13.   
    14. -o-   
    15.     不生成.o文件,一般和-H、-D一起使用   
    16.   
    17. -offilename   
    18.     指定輸出文件名;可以是可執行程序,也可以是其他文件;注意是:-of   
    19.   
    20. -odobjdir   
    21.     把.o文件生成到objdir目錄;默認是生成到當前目錄;注意是:-od   
    22.   
    23. -op   
    24.     默認生成的object文件(.o)會在當前目錄;添加-op參數則會生成到源文件所在目錄  


    -c
    Java代碼 復制代碼
    1. dmd debug.d     # 生成debug可執行文件   
    2. dmd -c debug.d  # 生成debug.o文件  

    dmd編譯器默認是編譯成.o文件后,再和其他庫連接成可執行文件;
    某些情況下不需要編譯成可執行文件,比如沒有main函數--也編譯不成
    這時就可以只編譯成.o文件

    bud等程序build工具,可以自動判斷文件是否有main函數,并生成相應的文件;
    但dmd編譯器不是這樣的;所以,熟悉了dmd編譯器后,可以只使用bud等工具來編譯程序

    -I / -J
    Java代碼 復制代碼
    1. import std.stdio;               // -I   
    2. void main()   
    3. {   
    4.     auto b = import("x.d");     // -J   
    5. }  


    自己體會它們的用途吧:)
    注意:如果在搜索路徑下有同名文件的話,可能出現奇怪的問題;避免出現這種情況,或者改變參數的順序

    -Llinkerflag
    一般是-L-L 和 -L-l參數,指定lib路徑和庫文件
    比如:-L-L/usr/local/lib  -L-lsqlite3
    對linker不熟悉,回頭在詳細寫這塊

    -o-
    如果只想生成文檔,連.o文件都不想要;則-o- 就是你想要的了

    -offilename
    默認情況下,是根據源文件名來確定后續文件的文件名;
    比如foo.d 會生成 foo.ofoo 文件;
    通過-of參數可以改變輸出文件的名字:
    dmd -ofbar.exe foo.d

    它不會自動添加后綴:
    dmd -c -ofbar foo.d
    生成文件是 bar,而不是bar.o,這可能不是你想要的

    -odobjdir -op
    .o文件默認生成在當前目錄下;
    -od 是指定生成目錄,-od.和默認相同
    -op 是把.o生成到源文件所在目錄
    具體生成到什么目錄下,就看自己的愛好了;
    喜歡干凈,就用-od吧;對了,-run參數能生成更干凈的代碼;)

    編譯開關之五
    Java代碼 復制代碼
    1. -O   
    2.     優化生成的代碼,使程序運行得更快   
    3.   
    4. -g   
    5.     添加調試信息   
    6.   
    7. -gc   
    8.     添加C風格的調試信息(為舊的gdb)   
    9.   
    10. -inline   
    11.     用內聯函數的方式進行優化;相當于C的inline   
    12.   
    13. -fPIC   
    14.     生成位置無關代碼   
    15.   
    16. -d   
    17.     允許廢棄的特征   
    18.   
    19. -profile   
    20.     profile the runtime performance of the generated code    
    21.     參見:http://www.digitalmars.com/ctg/trace.html  


    這幾個參數,要么很簡單,要么不懂含義;也懶得去研究具體的意思了。
    其中的-g參數涉及到使用調試器;我喜歡用writefln調試;唉,回頭再研究吧。


    編譯開關之六
    Java代碼 復制代碼
    1. --help   
    2.     打印幫助   
    3.   
    4. -quiet   
    5.     安靜模式,不輸出無關緊要的信息   
    6.   
    7. -v   
    8.     顯示編譯細節   
    9.   
    10. -w   
    11.     顯示編譯警告  


    編譯開關之七
    Java代碼 復制代碼
    1. -run srcfile args...   
    2.     編譯,鏈接,然后運行程序srcfile;args...(到命令行結束)都是程序的參數;   
    3.     它不會保留.o和可執行程序(No .o or executable file is left behind)  


    文章開始就有怎么使用的例子
    需要注意的是參數的順序,因為很多寫法都是錯誤的,正確的是:
    Java代碼 復制代碼
    1. dmd 相關文件 編譯開關 -run 含main的源文件 程序參數1 程序參數2  

    各種參數放在-run前面,然后是含有main的源程序,再后面的內容會全部傳遞給運行程序,作為參數

    鏈接Linking
    在dmd編譯成功后,它會再調用連接程序;用-c參數可以不進行連接
    連接的實際處理程序其實是gcc;這樣能保證和gcc編譯的模塊兼容


    環境變量
    CC
    默認是用gcc進行連接,可以通過設置CC環境變量,使用其他連接器

    DFLAGS
    The value of DFLAGS is treated as if it were appended to the command line to dmd.
    沒有弄明白它是怎么回事;(

    dmd.conf初始化文件
    dmd會按照下面的目錄順序查找
    1. 當前工作目錄
    2. 環境變量HOME指定的目錄
    3. dmd命令所在目錄,即bin目錄
    4. /etc目錄


    dmd.conf的內容看起來像這樣:
    Java代碼 復制代碼
    1. ; dmd.conf 是dmd的配置文件   
    2. ; 分號是注釋符號   
    3. ; %%包含的名字會用相應的環境變量替換   
    4. ; %@P%會被本文件的路徑替換,即dmd.conf文件所在路徑   
    5. [Environment]   
    6. DFLAGS="-I%@P%/../src/phobos"  
    7. DDOCFILE=candydoc/proj.ddoc  


    格式是 NAME=value;NAME即使是小寫,也會被處理成大寫;
    里面的DFLAGS的值會覆蓋環境變量指定的值

    和Windows版本的區別
    • 字符串文章量是只讀的;對它寫會導致段錯誤
    • 配置文件是dmd.conf,而不是sc.ini
    • Windows有一個@cmdfile開關
    • Windows有一個-nofloat開關
    • 環境變量上有些不一樣


    總結:
    和gcc比起來,參數少多了 ;)
    雖然可以用bud進行編譯,但理解dmd還是必要的。
    反正也不復雜,花點時間學習一下還算值得。
     

安徽新華電腦學校專業職業規劃師為你提供更多幫助【在線咨詢
相關熱詞搜索:編譯器 筆記 學習
91丨九色丨尤物| 亚洲精品中文字幕女同| 欧美激情18p| 欧美日本三区| 性网站在线免费观看| 最新精品国产| 精品国产一区二区三区在线观看| 激情都市亚洲| 日韩精品成人一区二区在线| 日韩久久精品电影| 一本久久青青| www555久久| 日韩三区在线| 黄页网址大全在线观看| 青青草在线免费视频| 午夜视频在线观看韩国| 青青青手机在线视频观看| 欧美一区二区少妇| 免费观看性欧美大片无片| 欧美精品一区二区三区在线| 你懂的国产精品| 美女免费免费看网站| 欧美日韩免费一区| 综合伊思人在钱三区| 国产精品男人的天堂| 国产精品成av人在线视午夜片 | 国产亚洲va综合人人澡精品| 久久影院午夜片一区| 久久精品一级爱片| 亚洲欧美一区二区视频| 亚洲天天做日日做天天谢日日欢| 亚洲国产日韩精品| 6080国产精品一区二区| 亚洲精品一区二区网址| 精品中文字幕视频| 国产欧美日韩亚洲精品| 青青青草原在线| 99爱在线观看| 色妞ww精品视频7777| 欧美视频免费| 国语精品一区| 国产精品69久久久久水密桃| 中文字幕乱码一区二区免费| 日韩欧美精品网址| 欧美日韩午夜精品| 亚洲欧美日韩网| 2019最新中文字幕| 有码在线播放| 性感女国产在线| 欧美日韩导航| 亚洲一区二区毛片| 不卡电影一区二区三区| 亚洲国产精品久久久男人的天堂 | 亚洲一区二区精品视频| 精品视频在线视频| xvideos亚洲| 国产精品欧美风情| 国产一区电影| 爱情岛亚洲播放路线| 成人资源在线| 噜噜噜躁狠狠躁狠狠精品视频| 老司机深夜福利在线观看| 国产欧美高清视频在线| 国产一区二区三区日韩| 色狠狠色狠狠综合| 欧美激情视频在线观看| 国产三区在线观看| 欧美mv日韩| 国产精品家庭影院| 日韩一区二区三区在线播放| 触手亚洲一区二区三区| 精品国产日韩欧美| 欧美激情中文不卡| 色老头一区二区三区| 成人精品福利| 国产成人一区| 国产精品久久久久久久久免费桃花| 亚洲欧美日韩视频一区| 青青草视频在线免费观看| 台湾佬综合网| 中文在线免费一区三区高中清不卡| 亚洲精品自拍第一页| 第九色区av在线| 综合久久十次| 欧美视频在线免费看| 国产精品麻豆va在线播放| 黄色精品视频网站| 粉嫩欧美一区二区三区高清影视| 亚洲精品久久7777777| 国产免费av高清在线| 亚洲a在线视频| 欧美午夜视频一区二区| 2019一级黄色毛片免费看网| 超碰地址久久| 欧美激情一区三区| 精品中文字幕在线观看| 亚洲欧洲高清| 福利一区在线观看| 色777狠狠综合秋免鲁丝| 黄色在线看片| 日本特黄久久久高潮| 亚洲国产又黄又爽女人高潮的| av在线播放网| 日韩电影网1区2区| 国产丝袜高跟一区| 电影在线观看一区| 成人深夜在线观看| 久久精品国产精品亚洲| 伊人久久视频| 91免费看片在线观看| 欧美老少做受xxxx高潮| 精品乱码一区二区三区四区| 久久久精品黄色| 日韩av免费看| 国产中文精品久高清在线不| 同产精品九九九| 中文字幕在线第一页| 一区二区三区国产精华| 欧美一区二区三区在线视频 | 天堂中文在线资| 亚洲天堂久久| 亚洲成人动漫在线播放| 牛牛精品在线| 成人午夜视频福利| 久久久久久久av| 婷婷国产精品| 欧美午夜电影一区| 麻豆传媒在线免费| 成人小视频在线| 欧美一区二区三区免费观看 | 国产精品一区二区av交换| 欧美日韩中文字幕日韩欧美| 神马久久精品| 日韩国产欧美视频| 久久影院中文字幕| 中文字幕日韩在线| 日韩欧美亚洲一二三区| fc2在线中文字幕| 国产精品综合网| 2019中文字幕在线| 91精品电影| 欧美一区二区三区四区五区 | 女仆av观看一区| 在线这里只有精品| 麻豆av在线导航| proumb性欧美在线观看| 国产美女精彩久久| 国产精品日韩精品欧美精品| 日韩在线免费视频观看| 欧美人妖在线观看| 欧美日本韩国一区二区三区视频| 污视频免费在线观看| 国产欧美一区在线| 小水嫩精品福利视频导航| 韩国av一区二区三区在线观看| 91精品国产高清自在线看超| 自拍偷拍欧美专区| 久久精品国产一区| 日韩精品一卡| 在线视频欧美日韩| 精品国产乱码久久久久久果冻传媒| 欧美精品一区二区三区一线天视频| 视频欧美精品| 欧美欧美欧美欧美| 久久亚洲资源中文字| 欧日韩精品视频| 国产69精品久久| 欧美日韩免费在线视频| 久久天堂影院| 欧美一级二级在线观看| 久久久久亚洲精品中文字幕| 777亚洲妇女| 亚洲精品成a人ⅴ香蕉片| 欧美日韩成人在线| 香蕉久久久久久| 91精选在线观看| 在线日韩成人| 亚洲精品黄网在线观看| 亚洲人成精品久久久| 亚洲欧美激情另类校园| 欧美三级伦理在线| 日韩视频在线免费| 欧美视频亚洲视频| 91国产精品电影| 日韩极品在线观看| 成片免费观看视频| 91在线观看免费视频| 日本综合在线| 狠狠色狠色综合曰曰| 伊人久久大香线蕉综合影院首页| 日韩三级视频在线观看| 国产va免费精品观看精品视频 | 中文字幕亚洲图片| 欧美激情91| 国产精品电影一区| 国产黄色精品视频| aaa在线免费观看| 一本色道亚洲精品aⅴ| 九九九九九九精品任你躁| 亚洲欧美日韩在线高清直播|