不同D编译器的优缺点是什么?性能和标准合规性/ D2如何支持?调试器的支持程度如何?错误消息有多好,IDE集成是什么?64位支持有多好?到目前为止我的想法:
DMD
GDC
LDC
死了/不工作
我正在考虑针对ARM,我认为GDC是首选工具,但我不确定.
这个选项对ld意味着什么?
-lrt
我知道在某种程度上它意味着ld正在寻找具有实时扩展的库,但是在广泛搜索之后,我找不到这是指的确切定义(或哪个库).
使用Bionic(android)libc,android NDK文档详细说明了这个(以及pthreads)已经集成.
我问,因为它似乎是隐式的(即当我调用编译器时,直接调用自定义编译的gdc,我得到一条消息说ld找不到-lrt)
编辑
来自仿生概述
Bionic的C库附带了自己的pthread实现.这与其他历史C库不同:
Run Code Online (Sandbox Code Playgroud)- place it in an external library (-lpthread) - play linker tricks with weak symbols at dynamic link time
对实时功能(aka -lrt)的支持也捆绑在C库中.
问题是collect2将选项-lrt(以及-lpthreads)传递给ld.
dan@devbox:~/projects/gdc_test/jni/src$ $DC gdc_test.d -v -mthumb
Using built-in specs.
Target: arm-linux-androideabi
Configured with: /arm/ndk-git/src/build/../gcc/gcc-4.4.3/configure --prefix=/arm/ndk-git/ndk/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86 --target=arm-linux-androideabi --host=x86_64-linux-gnu --build=x86_64-linux-gnu --with-gnu-as --with-gnu-ld --enable-languages=c,c++ --with-gmp=/arm/ndk-git/build_run/temp-install --with-mpfr=/arm/ndk-git/build_run/temp-install --disable-libssp --enable-threads --disable-nls --disable-libmudflap --disable-libgomp --disable-libstdc__-v3 --disable-sjlj-exceptions --disable-shared --disable-tls --enable-languages=c,d,c++ --enable-lto --with-float=soft --with-fpu=vfp --with-arch=armv5te --enable-target-optspace --enable-shared--prefix=/arm/ndk-git/ndk/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86 --enable-initfini-array --disable-nls --prefix=/arm/ndk-git/ndk/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86 --with-sysroot=/arm/ndk-git/ndk/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/sysroot --with-binutils-version=2.19 --with-mpfr-version=2.4.1 --with-gmp-version=4.2.4 --with-gcc-version=4.4.3 --with-gdb-version=6.6 --with-arch=armv5te --enable-libstdc__-v3 …
Run Code Online (Sandbox Code Playgroud) 有一段时间我对D'运算符重载的方向感到困惑,但现在我意识到它是一个漂亮的系统...如果它只适用于核心类型(int,float等).考虑以下代码:
struct Vector {
float X, Y;
void opOpAssign(string op)(Vector vector) {
X.opOpAssign!op(vector.X); // ERROR: no property "opOpAssign" for float
Y.opOpAssign!op(vector.Y); // ERROR: ditto
}
}
Run Code Online (Sandbox Code Playgroud)
这将是漂亮的代码,如果它工作,看到它在一个方法中重载所有+ =, - =,*=等运算符.但是,正如您所看到的,它不是开箱即用的.我用模板创建了一个解决方案(上帝,我爱D):
template Op(string op, T) {
void Assign(ref T a, T b) {
static if (op == "+") a += b;
else if (op == "-") a -= b;
else if (op == "*") a *= b;
else if (op == "/") a /= b;
}
}
struct Vector {
float …
Run Code Online (Sandbox Code Playgroud) 我想尝试D,但我不太确定使用什么编译器.我在这个主题上找到了一些文章和SO问题,但我没有找到任何最新的文章.
每个编译器有什么好处,有什么缺点?现在DMD编译器对我来说似乎是最好的,但我可能会被过时的信息误导.
不久前我买了"D编程语言".好书,很有教育意义.但是,我在编写本书中列出的语言功能时遇到了麻烦:扩展功能.
在书中,Andrei写道任何函数(a,b)都可以调用,如:a.function(b); 所以我应该能够做到这一点:
struct Person {
string name;
}
void foo(Person person, string name) {
person.name = name;
}
void main() {
auto bob = Person();
bob.foo("Bob Dole"); // ERROR: Person does not have method 'foo'
}
Run Code Online (Sandbox Code Playgroud)
正确?这个功能还没有实现,或者我只是遗漏了什么?我注意到导入std.range会向数组添加方法,因此它似乎在某种程度上实现.
我是D新编程的新手.选择DMD(2.061)或GDC(4.6,4.7或4.8,快照)的优缺点是什么.我应该选择哪种GDC版本?我已成功构建了GCC-4.8和GDC-4.8的最新快照,并编译了一个hello world程序.
以下是我对专业人士的看法:
如何通过GDB调试支持 - GDC和DMD之间有什么不同?
我试图用神经网络教自己AI.简而言之,我想创建一个简单的图形,使用ncurses显示我的程序中发生的事情.我正在使用的教程可以在这里找到.
我的印象是D与C兼容,理论上我可以相对容易地调用C函数.
我发现事实并非如此.我是一个相对新手的程序员,所以即使是简单的解释也有点高于我的头脑.我在这里找到了这个.
D旨在与目标系统的C编译器舒适地配合.D通过依赖目标环境的C运行时库来弥补没有自己的VM.尝试移植到D或为大量可用的C API编写D包装器将是毫无意义的.直接调用它们要容易多少.
这是通过匹配C编译器的数据类型,布局和函数调用/返回序列来完成的.
听起来很棒.有点过头了.我测试了一个简单的C程序:
#include <curses.h>
int main(void) {
int ch;
initscr();
noecho();
cbreak();
printw("Hit Ctrl+C to exit ...\n\n");
for (;;) {
ch = getch();
printw("Value of char: %d (%02x)\n", ch, ch);
}
endwin();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
从SO上的另一个问题无耻地复制和粘贴.至少我做了我的作业.
我从一个简单的D程序尝试了基本相同的东西.我收到了这个错误:
Error: module curses is in file 'curses.d' which cannot be read
Run Code Online (Sandbox Code Playgroud)
我绝对肯定我正在尝试一些非常愚蠢的事情.
有一种简单的方法在D程序中使用ncurses吗?
我正在零睡眠和咖啡因,所以请温柔!即使是链接到网站也将非常感谢!
我可能没有包括我应该拥有的所有东西,所以AMA.
随意侮辱我的智慧.
我使用android build-gcc.sh脚本与gcc一起编译了gdc,并在build/core/definitions.mk中包含了一个新的存根来处理D语言文件,作为构建过程的一部分.我知道事情正在编译好,但我的问题是链接:
当我构建项目时,我收到此错误:
ld: crtbegin_so.o: No such file: No such file or directory
Run Code Online (Sandbox Code Playgroud)
对于常规的仅限c的项目也是如此.现在我在构建目录中运行了一个快速查找,发现文件(crtbegin_so.o)确实存在于我编译gcc时指定的sysroot中(或者更确切地说,当build-gcc.sh构建它时).
有什么东西我可以寻找找到这个问题的解决方案?
在本地复制文件并直接链接到它们是一个不错的解决方案吗?
为什么ld(或collect2)会尝试将这些包含在gdc(D语言)链接中?
我正在将我们的统治SDK移植,增强和D-atizing 从C#到D.目前正在处理Vector2数学模块.
以下两种结构之间是否会有任何性能差异?我的基准测试表现出相同的性能,但我想获得一些专家见解:)
struct Vector2(T)
{
T x, y;
@property T u() { return x; }
@property T v() { return y; }
@property void u(T value) { x = value; }
@property void v(T value) { y = value; }
}
struct Vector2(T)
{
union { T x, u; }
union { T y, v; }
}
Run Code Online (Sandbox Code Playgroud)
显然,我想使用工会来实现语法简洁.但使用它们有任何不可预见的陷阱吗?我不熟悉他们的低级细节.
另外,我正在添加类似于HLSL/GLSL的vector属性语法,例如,vec1.yxz + = vec2.xyz; 有......没有..可能的方式与工会而不是@property这样做?
我正在使用https://bitbucket.org/goshawk/gdc/downloads/gcc-4.5.2-tdm-1-gdc-r575-20110723.zip与TDM GCC 4.5.2 in -v2模式来构建DLL.在我做的其中一个模块中import std.stdint
.所以我认为我应该链接libgphobos2来解决这个问题,但它给了我更多的错误:
c:/mingw32/bin/../lib/gcc/mingw32/4.5.2/../../../libgphobos2.a(thread.o): In function `D4core6thread6Thread6__ctorMFZC4core6thread6Thread':
C:\crossdev\gdc\v2\build\mingw32\libphobos/../../../gcc-4.5.2/libphobos/core/thread.d:1363: undefined reference to `__emutls_v._tlsend'
C:\crossdev\gdc\v2\build\mingw32\libphobos/../../../gcc-4.5.2/libphobos/core/thread.d:1363: undefined reference to `__emutls_v._tlsstart'
C:\crossdev\gdc\v2\build\mingw32\libphobos/../../../gcc-4.5.2/libphobos/core/thread.d:1363: undefined reference to `__emutls_v._tlsstart'
C:\crossdev\gdc\v2\build\mingw32\libphobos/../../../gcc-4.5.2/libphobos/core/thread.d:1363: undefined reference to `__emutls_v._tlsend'
C:\crossdev\gdc\v2\build\mingw32\libphobos/../../../gcc-4.5.2/libphobos/core/thread.d:1363: undefined reference to `__emutls_v._tlsstart'
C:\crossdev\gdc\v2\build\mingw32\libphobos/../../../gcc-4.5.2/libphobos/core/thread.d:1363: undefined reference to `__emutls_v._tlsstart'
C:\crossdev\gdc\v2\build\mingw32\libphobos/../../../gcc-4.5.2/libphobos/core/thread.d:1363: undefined reference to `__emutls_v._tlsend'
C:\crossdev\gdc\v2\build\mingw32\libphobos/../../../gcc-4.5.2/libphobos/core/thread.d:1363: undefined reference to `__emutls_v._tlsstart'
C:\crossdev\gdc\v2\build\mingw32\libphobos/../../../gcc-4.5.2/libphobos/core/thread.d:1363: undefined reference to `__emutls_v._tlsstart'
c:/mingw32/bin/../lib/gcc/mingw32/4.5.2/../../../libgphobos2.a(thread.o): In function `thread_entryPoint@4':
C:\crossdev\gdc\v2\build\mingw32\libphobos/../../../gcc-4.5.2/libphobos/core/thread.d:173: undefined reference to `__emutls_v._tlsend'
C:\crossdev\gdc\v2\build\mingw32\libphobos/../../../gcc-4.5.2/libphobos/core/thread.d:173: undefined reference to `__emutls_v._tlsstart'
C:\crossdev\gdc\v2\build\mingw32\libphobos/../../../gcc-4.5.2/libphobos/core/thread.d:173: undefined reference to `__emutls_v._tlsstart'
c:/mingw32/bin/../lib/gcc/mingw32/4.5.2/../../../libgphobos2.a(thread.o): In …
Run Code Online (Sandbox Code Playgroud)