- 浏览: 146165 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
wokcao:
这里的platforms是linux的版本么?
Android SDK Download List -
zhangtianfeng:
我看了 一些D语言的一些介绍,对于的产生还是有的疑惑.
Dmd编译器学习笔记 -
qiezi:
.so文件是用-L来指定的,比如gcc的-levent是用来链 ...
Dmd编译器学习笔记 -
tomqyp:
...
Ddoc文档注释学习笔记 -
sofire:
转换成其他语言?是说用汉字吗?
Ddoc文档注释学习笔记
Dmd编译器学习笔记
英文原文在这里:
http://digitalmars.com/d/dcompiler.html
在这里有一篇翻译文章:
http://sofire.iteye.com/blog/111667
不过,主要是关于windows的;我更关心Linux下的使用。
顺便看看两者有啥区别。
相关文件
注意:
Linux的dmd配置文件是dmd.conf
Windows的配置文件是sc.ini
DMD的安装
[list=1]下载dmd程序:http://ftp.digitalmars.com/dmd.zip,解压到~/dmd目录
复制dmd.conf文件到/etc目录
给下面的文件添加执行权限
把~/dmd/bin添加到PATH环境变量;或者把它们复制到/usr/local/bin目录下(不要只复制可执行程序)
复制库文件到/usr/lib目录
[/list]
以上安装过程比较简单,只有PATH环境变量设置正确了,就应该没有什么问题
编译参数和开关
命令的格式:
[Windows]支持以下类型的文件:
[Linux]支持以下类型的文件:
好像不支持.so文件--这一点不肯定
编译开关之一
-debug / -version
debug、version的使用方法很相似
编译并运行之:
-unittest
先正常编译,没有语法错误:
再编译单元测试代码
30行有错误?add函数写错了:(
-cov
看看覆盖率分析选项:
编译并运行:
得到覆盖率分析文件:cov.lst:(注意:编译完并不会有这个文件;运行程序后才会生成)
第6行运行了6次--自己算算是不是;
第11行运行了0次--搜索000000字符串,就能轻松找到没有覆盖到地方;
更多详情参考:http://digitalmars.com/d/code_coverage.html
-release
用法很简单,不举例了
编译开关之二
编译命令很简单:
关于文档的更多信息参考:http://sofire.iteye.com/blog/111881
编译开关之三
关于接口,看一段翻译:
当处理源文件中的import声明时,编译器会搜索import对应的源文件,从中提取出需要的信息。
编译器同时也会搜索D接口文件,D接口文件中只包含模块中需要导入的内容,而不是整个模块。
使用D接口文件的好处是:
D接口文件可以在编译D源文件时用-H开关创建,D接口文件的后缀是.di。
当编译器分解import声明时,搜索寻找.di形式的D接口文件,再寻找D源文件。
D接口文件有点和C++头文件相似,但这不是必需的,它不属于D语言,只是编译器的一个功能,只是用来优化程序的构建。
dmd -H生成的接口文件包括了源代码;只是去掉了注释,断言等信息;具体怎么回事,待弄明白了再来改这里(TODO)
编译开关之四
-c
dmd编译器默认是编译成.o文件后,再和其他库连接成可执行文件;
某些情况下不需要编译成可执行文件,比如没有main函数--也编译不成
这时就可以只编译成.o文件
bud等程序build工具,可以自动判断文件是否有main函数,并生成相应的文件;
但dmd编译器不是这样的;所以,熟悉了dmd编译器后,可以只使用bud等工具来编译程序
-I / -J
自己体会它们的用途吧:)
注意:如果在搜索路径下有同名文件的话,可能出现奇怪的问题;避免出现这种情况,或者改变参数的顺序
-Llinkerflag
一般是-L-L 和 -L-l参数,指定lib路径和库文件
比如:-L-L/usr/local/lib -L-lsqlite3
对linker不熟悉,回头在详细写这块
-o-
如果只想生成文档,连.o文件都不想要;则-o- 就是你想要的了
-offilename
默认情况下,是根据源文件名来确定后续文件的文件名;
比如foo.d 会生成 foo.o 与 foo 文件;
通过-of参数可以改变输出文件的名字:
dmd -ofbar.exe foo.d
它不会自动添加后缀:
dmd -c -ofbar foo.d
生成文件是 bar,而不是bar.o,这可能不是你想要的
-odobjdir -op
.o文件默认生成在当前目录下;
-od 是指定生成目录,-od.和默认相同
-op 是把.o生成到源文件所在目录
具体生成到什么目录下,就看自己的爱好了;
喜欢干净,就用-od吧;对了,-run参数能生成更干净的代码;)
编译开关之五
这几个参数,要么很简单,要么不懂含义;也懒得去研究具体的意思了。
其中的-g参数涉及到使用调试器;我喜欢用writefln调试;唉,回头再研究吧。
编译开关之六
编译开关之七
文章开始就有怎么使用的例子
需要注意的是参数的顺序,因为很多写法都是错误的,正确的是:
各种参数放在-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会按照下面的目录顺序查找
dmd.conf的内容看起来像这样:
格式是 NAME=value;NAME即使是小写,也会被处理成大写;
里面的DFLAGS的值会覆盖环境变量指定的值
和Windows版本的区别
总结:
和gcc比起来,参数少多了 ;)
虽然可以用bud进行编译,但理解dmd还是必要的。
反正也不复杂,花点时间学习一下还算值得。
英文原文在这里:
http://digitalmars.com/d/dcompiler.html
在这里有一篇翻译文章:
http://sofire.iteye.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]
cp ~/dmd/bin/dmd.conf /etc
chmod u+x ~/dmd/bin/{dmd,dumpobj,obj2asm,rdmd}
cp ~/dmd/lib/libphobos.a /usr/lib
[/list]
以上安装过程比较简单,只有PATH环境变量设置正确了,就应该没有什么问题
编译参数和开关
命令的格式:
dmd files... -switches...
[Windows]支持以下类型的文件:
Extension File Type none D source files .d D source files .di D interface files .obj Object files to link in .lib Object code libraries to search .exe Name output executable file .def module definition file .res resource file
[Linux]支持以下类型的文件:
Extension File Type none D source files .d D source files .di D interface files .o Object files to link in .a Library files to link in
好像不支持.so文件--这一点不肯定
编译开关之一
-debug 编译调试代码 -debug=level 编译调试代码:code <= level -debug=ident 编译调试代码:标识符为ident -version=level 生成版本代码:>=level -version=ident 生成版本代码:==ident -unittest 编译单元测试代码(还有断言) -cov 添加覆盖率分析指令;运行程序后,会生成.lst文件 -release 生成发行版本;会去掉契约和断言等信息
-debug / -version
debug、version的使用方法很相似
//debug.d import std.stdio; void main() { debug { writefln("debug"); } debug(1) { writefln("debug(1)"); } debug(2) { writefln("debug(2)"); } debug(ERROR) { writefln("debug(ERROR)"); } debug(WARN) { writefln("debug(WARN)"); } version(HOME) { writefln("version(HOME)"); } version(BUSINESS) { writefln("version(BUSINESS)"); } version(WINDOWS) {} else { writefln("version(!WINDOWS)"); } }
编译并运行之:
# dmd -debug -run debug.d debug debug(1) version(!WINDOWS) # dmd -debug=1 -run debug.d debug debug(1) version(!WINDOWS) # dmd -debug=2 -run debug.d debug debug(1) debug(2) version(!WINDOWS) # dmd -debug=ERROR -run debug.d debug(ERROR) version(!WINDOWS) # dmd -debug=WARN -run debug.d debug(WARN) version(!WINDOWS) # dmd -version=HOME -run debug.d version(HOME) version(!WINDOWS) # dmd -version=BUSINESS -version=WINDOWS -run debug.d version(BUSINESS)
-unittest
//unittest.d import std.stdio; class A { int i; this(int v) { i = v; } unittest { A a = new A(1); assert(a.i == 1); assert(a.i != 0); } } int add(int a, int b) { return a - b; // 这里没有unittest } void main() { // 这里没有unittest } unittest { assert(add(1, 2) == 3); }
先正常编译,没有语法错误:
# dmd -run unittest.d
再编译单元测试代码
# dmd -unittest -run unittest.d Error: AssertError Failure unittest(30)
30行有错误?add函数写错了:(
-cov
看看覆盖率分析选项:
//cov.d import std.stdio; void main() { for (int i; i < 2; i++) { if (i < 5) writefln("i < 5"); else writefln("i >= 5"); } }
编译并运行:
# dmd -cov -run cov.d i < 5 i < 5
得到覆盖率分析文件:cov.lst:(注意:编译完并不会有这个文件;运行程序后才会生成)
|//cov.d |import std.stdio; | |void main() |{ 6| for (int i; i < 2; i++) | { 2| if (i < 5) 2| writefln("i < 5"); | else 0000000| writefln("i >= 5"); | } |} cov.d is 75% covered
第6行运行了6次--自己算算是不是;
第11行运行了0次--搜索000000字符串,就能轻松找到没有覆盖到地方;
更多详情参考:http://digitalmars.com/d/code_coverage.html
-release
用法很简单,不举例了
编译开关之二
-D 生成文档 -Dddocdir 把文档生成到docdir目录;注意是 -Dd -Dffilename 指定文档的文件名;
编译命令很简单:
dmd -D debug.d
关于文档的更多信息参考:http://sofire.iteye.com/blog/111881
编译开关之三
-H 生成.di接口文件 -Hddir 把接口文件生成到dir目录;注意是 -Hd -Hffilename 指定接口文件名;注意是 -Hf
关于接口,看一段翻译:
当处理源文件中的import声明时,编译器会搜索import对应的源文件,从中提取出需要的信息。
编译器同时也会搜索D接口文件,D接口文件中只包含模块中需要导入的内容,而不是整个模块。
使用D接口文件的好处是:
D接口文件更小,和D源文件相比处理起来更快。
可以隐藏源代码。比如以接口文件和object库的方式提供源程序,而不是提供全部源代码。
D接口文件可以在编译D源文件时用-H开关创建,D接口文件的后缀是.di。
当编译器分解import声明时,搜索寻找.di形式的D接口文件,再寻找D源文件。
D接口文件有点和C++头文件相似,但这不是必需的,它不属于D语言,只是编译器的一个功能,只是用来优化程序的构建。
dmd -H生成的接口文件包括了源代码;只是去掉了注释,断言等信息;具体怎么回事,待弄明白了再来改这里(TODO)
编译开关之四
-c 只编译,不链接;简单点说就是只生成.o文件,不生成可执行文件 -Ipath 指定import路径;多个路径之间用分号(;)分割;允许有多个-I,并按照-I指定的路径顺序进行搜索 -Jpath 指定D源程序中import表达式的搜索路径;多个路径之间用分号(;)分割; 允许有多个-J,并按照-J指定的路径顺序进行搜索 -Llinkerflag 把linkerflag传递给连接程序(linker),比如: -L-L/usr/lib -o- 不生成.o文件,一般和-H、-D一起使用 -offilename 指定输出文件名;可以是可执行程序,也可以是其他文件;注意是:-of -odobjdir 把.o文件生成到objdir目录;默认是生成到当前目录;注意是:-od -op 默认生成的object文件(.o)会在当前目录;添加-op参数则会生成到源文件所在目录
-c
dmd debug.d # 生成debug可执行文件 dmd -c debug.d # 生成debug.o文件
dmd编译器默认是编译成.o文件后,再和其他库连接成可执行文件;
某些情况下不需要编译成可执行文件,比如没有main函数--也编译不成
这时就可以只编译成.o文件
bud等程序build工具,可以自动判断文件是否有main函数,并生成相应的文件;
但dmd编译器不是这样的;所以,熟悉了dmd编译器后,可以只使用bud等工具来编译程序
-I / -J
import std.stdio; // -I void main() { auto b = import("x.d"); // -J }
自己体会它们的用途吧:)
注意:如果在搜索路径下有同名文件的话,可能出现奇怪的问题;避免出现这种情况,或者改变参数的顺序
-Llinkerflag
一般是-L-L 和 -L-l参数,指定lib路径和库文件
比如:-L-L/usr/local/lib -L-lsqlite3
对linker不熟悉,回头在详细写这块
-o-
如果只想生成文档,连.o文件都不想要;则-o- 就是你想要的了
-offilename
默认情况下,是根据源文件名来确定后续文件的文件名;
比如foo.d 会生成 foo.o 与 foo 文件;
通过-of参数可以改变输出文件的名字:
dmd -ofbar.exe foo.d
它不会自动添加后缀:
dmd -c -ofbar foo.d
生成文件是 bar,而不是bar.o,这可能不是你想要的
-odobjdir -op
.o文件默认生成在当前目录下;
-od 是指定生成目录,-od.和默认相同
-op 是把.o生成到源文件所在目录
具体生成到什么目录下,就看自己的爱好了;
喜欢干净,就用-od吧;对了,-run参数能生成更干净的代码;)
编译开关之五
-O 优化生成的代码,使程序运行得更快 -g 添加调试信息 -gc 添加C风格的调试信息(为旧的gdb) -inline 用内联函数的方式进行优化;相当于C的inline -fPIC 生成位置无关代码 -d 允许废弃的特征 -profile profile the runtime performance of the generated code 参见:http://www.digitalmars.com/ctg/trace.html
这几个参数,要么很简单,要么不懂含义;也懒得去研究具体的意思了。
其中的-g参数涉及到使用调试器;我喜欢用writefln调试;唉,回头再研究吧。
编译开关之六
--help 打印帮助 -quiet 安静模式,不输出无关紧要的信息 -v 显示编译细节 -w 显示编译警告
编译开关之七
-run srcfile args... 编译,链接,然后运行程序srcfile;args...(到命令行结束)都是程序的参数; 它不会保留.o和可执行程序(No .o or executable file is left behind)
文章开始就有怎么使用的例子
需要注意的是参数的顺序,因为很多写法都是错误的,正确的是:
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会按照下面的目录顺序查找
- 当前工作目录
- 环境变量HOME指定的目录
- dmd命令所在目录,即bin目录
- /etc目录
dmd.conf的内容看起来像这样:
; dmd.conf 是dmd的配置文件 ; 分号是注释符号 ; %%包含的名字会用相应的环境变量替换 ; %@P%会被本文件的路径替换,即dmd.conf文件所在路径 [Environment] DFLAGS="-I%@P%/../src/phobos" DDOCFILE=candydoc/proj.ddoc
格式是 NAME=value;NAME即使是小写,也会被处理成大写;
里面的DFLAGS的值会覆盖环境变量指定的值
和Windows版本的区别
- 字符串文章量是只读的;对它写会导致段错误
- 配置文件是dmd.conf,而不是sc.ini
- Windows有一个@cmdfile开关
- Windows有一个-nofloat开关
- 环境变量上有些不一样
总结:
和gcc比起来,参数少多了 ;)
虽然可以用bud进行编译,但理解dmd还是必要的。
反正也不复杂,花点时间学习一下还算值得。
- d_compiler.zip (21.7 KB)
- 描述: 包括:源文件和D语言的英文帮助
- 下载次数: 30
评论
2 楼
zhangtianfeng
2008-01-18
我看了 一些D语言的一些介绍,对于的产生还是有的疑惑.
1 楼
qiezi
2007-08-17
.so文件是用-L来指定的,比如gcc的-levent是用来链接libevent.so,DMD只需要-L-levent就可以了。
发表评论
-
Ddoc文档注释学习笔记
2007-08-14 02:49 4849Ddoc学习笔记 ddoc的英文 ... -
[zt]D语言编译器下载安装和编译参数
2007-08-13 10:53 5531Javaeye的html编辑器用起来不爽。 不知道怎么用UBB ... -
Build编译工具学习笔记:常用命令参数和BRF文件
2007-08-12 23:42 6039build工具的主页在:http://www.dsource. ... -
iconv库函数的学习程序
2007-08-11 23:40 4903以前用php的iconv函数, ... -
用expat 库解析XML的学习例子
2007-08-10 17:20 4675用bcdgen转换的头文件。 对xml不大感兴趣。只是尝试用D ... -
memcached函数的学习程序
2007-08-10 12:26 2730尝试把 libmemcached的示例程序改成D语言的。 源程 ... -
QQWry.datIP地址库的查询程序
2007-08-09 10:13 2254改写了QQIP地址库的查询程序,学习了怎么操作文件。 也学会了 ... -
ip2long和long2ip的学习程序
2007-08-08 13:00 2993这2个是PHP里面的常用函数,用D重新包装了一下。 虽然可以使 ... -
md5函数的学习程序
2007-08-07 15:52 1499前面部分是库文件里面的例子,后面是我改的。 写起来和PHP差不 ... -
writef和printf函数的学习程序
2007-08-07 15:29 2358和C函数的格式相同。 只是printf和writef中的 s ... -
【备忘】D语言编译器的下载地址、安装方法
2007-08-07 00:09 2179在D语言主页上,老是找不到编译器的安装程序。 后来好不容易一个 ... -
base64函数的学习程序
2007-08-06 20:17 3483import std.stdio; import std.b ...
相关推荐
DMD的源代码不仅对于编译器开发者具有学习价值,也为D语言的爱好者和实践者提供了深入研究语言实现的机会。通过阅读和理解DMD的源代码,开发者可以学习到编译原理的实际应用,了解语言特性的底层实现,这对于提升...
- **rdmd**:除了传统的编译器之外,D语言还提供了rdmd工具,这是一个用于实时预览和执行D语言代码的工具,非常适合快速测试代码片段或学习新的语言特性。 #### 四、示例代码分析 D语言中有一段经典的筛法算法示例...
DMD:D编程语言编译器详解 DMD(D Mangle Daemon)是D编程语言的主要官方编译器,由Walter Bright创建并维护。...通过学习和使用DMD,不仅可以掌握D语言,还能深入理解编译器的工作原理,提升软件开发技能。
动态模态分解(Dynamic Mode Decomposition,简称DMD)是一种数据驱动的方法,广泛应用于流体动力学、信号处理和工程领域,用于分析复杂系统的行为。在这个“DMD.zip”压缩包中,包含的是一个关于DMD应用的具体实例...
动态模态分解(Dynamic Mode Decomposition,简称DMD)是一种数据驱动的分析方法,主要用于处理时间序列数据,特别是...通过深入学习和比较这些代码,我们可以更好地理解DMD的原理,并能够根据具体需求进行定制和优化。
并且由于该语言是基于D编程语言构建的,因此您需要最新版本的DMD编译器来编译Vlang源文件。 ESDL与2.081或更高版本的DMD编译器一起使用。 可以从页面下载DMD编译器。 目前,Vlang仅在64位Linux计算机上进行了测试。
【DMD2-master_DMD_】是一个与动态模式分解(DMD, Dynamic Mode Decomposition)相关的源代码库。...通过学习和应用DMD2-master,不仅可以掌握DMD算法的实现细节,还可以进一步提升在动态系统建模和预测方面的能力。
动态模式分解的matlab 代码,有注释
DMD2,全称 Digital Mars D Compiler,是D语言的主要编译器之一,由Walter Bright创建并维护。DMD2源码包含了编译器的...如果你对编译器技术感兴趣,或者想要深入D语言的底层机制,DMD2源码无疑是一个绝佳的学习材料。
通过深入学习这些资料,开发者可以熟练掌握DMD编程技巧,从而在实际项目中发挥DMD的优势,创造出高质量的投影效果。 总的来说,DMD编程涉及多个方面,包括时间积分、帧频和画面大小等关键参数的设定。理解和熟练...
在本资源"POD_DMD-master.zip"中,包含的是一套针对CFD数据进行处理和分析的方法,主要涉及两种关键的技术:主成分分析(PCA,Principal Component Analysis)也称为POD( Proper Orthogonal Decomposition)和动态...
DMD402及DMD402A-B使用手册pdf,DMD402及DMD402A-B使用手册
乐创自动化生产的DMD403及DMD403A步进电机驱动器是一款高性能、价格低廉的产品,适合于驱动两相或四相的混合式步进电机。该驱动器采用了双极性恒流斩波技术,能较其他驱动方式输出更大的功率。同时,它还具有细分...
### 一、DMD15/DMD15L卫星调制解调器概述 **标题**: DMD15/DMD15L **描述**: 该设备为一种卫星调制解调器(Satellite Modem),型号为DMD15/DMD15L,适用于IBS/IDR通用系统。它提供了安装与操作手册(Installation...
在本篇文章中,我们将探讨DFL的最新版本——DFL for DMD2.031,以及它如何与DMD(D语言的官方编译器)的这一特定版本相结合,提升开发体验。 首先,我们需要了解DMD2.031。DMD是D语言的主要编译器,由Walter Bright...
根据提供的文档信息,我们可以提取出以下有关DMD(Digital Micromirror Device)板的相关知识点,主要用于DLP(Digital Light Processing)技术,该技术是由TI(德州仪器)公司开发的。 首先,DMD板是DLP系统中的...
数字微镜装置DMD是由美国德州仪器公司(Texas Instruments,简称TI)于1987年发明的一种利用半导体制造技术的高速数字式光反射开关阵列器件。DMD的核心部件是微镜,微镜片围绕一个固定的轴(轭)旋转,通过改变微...