是d语言一个可靠的替代Java和C++?如何成为一个可靠的替代方案?我应该学习它吗?它值得传福音吗?
我问的主要原因是,几乎在这里使用新的C++标准(c ++ 0x),我很清楚,对于任何理解它的人来说,语言已经远远超过了不归路.我知道C/C++永远不会死,但在某些时候我们需要继续前进.即使是COBOL也有它的一天,Java在很多方面都取消了C++.下一个是什么?D填写账单吗?
是否有人使用D进行实际应用?如果是这样,你用它做什么?我似乎无法在用D写的网上找到任何大的东西.
尽管缺乏已知的大用户,D对我来说似乎是一种非常有用的语言,据TIOBE称,它相当受欢迎.
我喜欢D的一些功能,但如果它们带来运行时惩罚会有兴趣吗?
为了比较,我实现了一个简单的程序,用C++和D计算许多短向量的标量积.结果令人惊讶:
C++真的几乎快了五倍,还是我在D程序中犯了错误?
我在一个温和的最近的Linux桌面上用g ++ -O3(gcc-snapshot 2011-02-19)和D和dmd -O(dmd 2.052)编译了C++.结果可在多次运行中重现,标准偏差可忽略不计.
这里的C++程序:
#include <iostream>
#include <random>
#include <chrono>
#include <string>
#include <vector>
#include <array>
typedef std::chrono::duration<long, std::ratio<1, 1000>> millisecs;
template <typename _T>
long time_since(std::chrono::time_point<_T>& time) {
long tm = std::chrono::duration_cast<millisecs>( std::chrono::system_clock::now() - time).count();
time = std::chrono::system_clock::now();
return tm;
}
const long N = 20000;
const int size = 10;
typedef int value_type;
typedef long long result_type;
typedef std::vector<value_type> vector_t;
typedef typename vector_t::size_type size_type;
inline value_type scalar_product(const vector_t& x, const vector_t& …
Run Code Online (Sandbox Code Playgroud) 我想知道C++完整概念提议和模板约束之间的语义差异(例如,Dlang中出现的约束或C++ 1y的新概念 - 精简提议).
什么是能够比模板约束做的完整概念不能做到的?
assert(0.1 + 0.2 != 0.3); // shall be true
Run Code Online (Sandbox Code Playgroud)
是我最喜欢的检查,语言使用本机浮点运算.
#include <cstdio>
int main()
{
printf("%d\n", (0.1 + 0.2 != 0.3));
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出:
1
Run Code Online (Sandbox Code Playgroud)
print(0.1 + 0.2 != 0.3)
Run Code Online (Sandbox Code Playgroud)
输出:
True
Run Code Online (Sandbox Code Playgroud)
为什么D不适用?理解D使用本机浮点数.这是一个错误吗?他们是否使用某些特定的数字代表?别的什么?很混乱.
import std.stdio;
void main()
{
writeln(0.1 + 0.2 != 0.3);
}
Run Code Online (Sandbox Code Playgroud)
输出:
false
Run Code Online (Sandbox Code Playgroud)
码:
import std.stdio;
void main()
{
writeln(0.1 + 0.2 != 0.3); // …
Run Code Online (Sandbox Code Playgroud) 我最近看到两个非常好的和教育性的语言谈话:
Herb Sutter的第一部,介绍了C++ 0x的所有优秀和酷炫功能,为什么C++的未来比以往任何时候都更加明亮,以及M $如何在这场游戏中成为一个好人.该演讲围绕效率展开,如何最大限度地减少堆活动可以提高性能.
这个另一种,安德烈Alexandrescu的,激励一个过渡从C/C++,以他的新的游戏改变d.D的大部分内容似乎都非常有动力和设计.然而,有一件事让我感到惊讶,即D推动垃圾收集,并且所有类都是通过引用创建的.更令人困惑的是,"D编程语言参考手册 "一书特别在关于资源管理的部分中 陈述如下,引用:
垃圾收集消除了C和C++中必需的繁琐,容易出错的内存分配跟踪代码.这不仅意味着更快的开发时间和更低的维护成本,而且最终的程序经常运行得更快!
这与Sutter关于最小化堆活动的不断讨论相冲突.我非常尊重Sutter和Alexandrescou的见解,所以我对这两个关键问题感到有些困惑
不通过引用单独创建类实例会导致很多不必要的堆活动吗?
在哪些情况下我们可以使用垃圾收集而不牺牲运行时性能?
C++中的模板机制只是偶然地对模板元编程有用.另一方面,D's专门设计用于促进这一点.而且显然它更容易理解(或者我听说过).
我没有D的经验,但是我很好奇,你能用D做什么,而你在模板元编程方面不能用C++做什么?
我几个月前在D新闻组上发布了这个,但由于某种原因,答案从未真正说服过我,所以我想我会在这里问.
但是,C++的语法不是(即使没有宏).(请仔细阅读!)
现在被授予,我对编译器,词法分析器和解析器一无所知(正式).我所知道的只是我在网上学到的东西.
以下是(我相信)我对上下文的理解,在非技术术语中:
语言的语法是无上下文的,当且仅当你能够总是理解给定代码片段的含义(尽管不一定是确切的行为)而不需要在任何其他地方"看".
或者,更严格:
如果我需要,语法不能无上下文我只是通过查看它就无法告诉表达式的类型.
因此,例如,C++失败上下文测试,因为意义的confusing<sizeof(x)>::q < 3 > (2)
依赖于值的q
.
到现在为止还挺好.
现在我的问题是:可以对D说同样的话吗?
例如,在D中,可以通过Value[Key]
声明创建哈希表
int[string] peoplesAges; // Maps names to ages
Run Code Online (Sandbox Code Playgroud)
静态数组可以用类似的语法定义:
int[3] ages; // Array of 3 elements
Run Code Online (Sandbox Code Playgroud)
模板可以用来使它们混淆:
template Test1(T...)
{
alias int[T[0]] Test;
}
template Test2(U...)
{
alias int[U] Test2; // LGTM
}
Test1!(5) foo;
Test1!(int) bar;
Test2!(int) baz; // Guess what? It's …
Run Code Online (Sandbox Code Playgroud) 不同D编译器的优缺点是什么?性能和标准合规性/ D2如何支持?调试器的支持程度如何?错误消息有多好,IDE集成是什么?64位支持有多好?到目前为止我的想法:
DMD
GDC
LDC
死了/不工作
我正在考虑针对ARM,我认为GDC是首选工具,但我不确定.
最近我一直很烦,因为我达到了C++(甚至0x)感觉非常有限的程度,所以我开始寻找替代方案.
忘记Java,C#,Python或Ruby.我仍然喜欢C++的低级特性,我不喜欢虚拟机.此外,我是一个游戏引擎开发,所以我必须要发展核心程序必须是非常快,而且最近我已经饿了码表现.C++ 对我来说几乎是一种语言,但是关于如何使用模板有很多例外,而GCC并没有像我希望的那样优化内容.
所以我正在考虑开始学习D.
你认为它足以满足我作为游戏开发者的需求吗?我很谨慎,因为我从来没有听说过D被用于那个.
谢谢!
d ×10
c++ ×6
performance ×2
c ×1
c++-concepts ×1
c++11 ×1
dmd ×1
gdc ×1
grammar ×1
heap-memory ×1
java ×1
popularity ×1
runtime ×1