`
ideage
  • 浏览: 323973 次
社区版块
存档分类
最新评论

D 1.0发布了!

阅读更多
期待已久的D1.0终于发布了! 感谢Walter给我们提供了这么好的工具!

引用
What's New for D 1.00
Jan 2, 2007
New/Changed Features
-v flag now outputs imports
added std.c.linux.pthread
Bugs Fixed
Fixed Bugzilla 552: Internal error: ..\ztc\cg87.c 1327 on in-function modulo of imaginary number
Fixed Bugzilla 553: Assertion failure: '0' on line 609 in file 'constfold.c' on modulo of complex number
Fixed Bugzilla 694: Doc mistake: a == null is not a.opCmp(null)
Fixed Bugzilla 699: long variadic arguments and the "-profile" flag
Fixed Bugzilla 702: inline assembler: "SMSW r32" fails to compile
Fixed Bugzilla 703: SuperExp::scanForNestedRef Assertion
Fixed Bugzilla 728: incorrect initialisation of member arrays if an explicit struct initializer is used
Fixed Bugzilla 731: Positive and negative NaN in template arguments causes link conflict
Fixed Bugzilla 734: Multidimensional arrays use incorrect initializer
Fixed Bugzilla 745: recursive typeof in function declaration crashes cc1d
Fixed Bugzilla 748: internal error with mixed static / dynamic array
Fixed Bugzilla 749: Internal error: toir.c 170 with lazy bool and delegate with default argument
Fixed Bugzilla 750: Recursive typeof in function declaration crashes DMD
Fixed Bugzilla 751: Compiler segfault on template expansion
Fixed Bugzilla 752: Assertion failure: 'e->type->ty != Ttuple' on line 4518 in file 'mtype.c'
Fixed Bugzilla 753: Minor Misspelling in Class Spec Page
Fixed Bugzilla 754: hex strings crash DMD when reporting syntax errors
Fixed Bugzilla 757: Some debug code was not removed from statement.c
Fixed Bugzilla 760: std.c.stdlib does not include system(3)
Fixed Bugzilla 763: Segfault compiling template code on Linux
Fixed Bugzilla 764: (typeof(o)).classinfo causes parser error
Fixed Bugzilla 765: ArrayBoundsError when assigning slice of pointer
Fixed Bugzilla 766: dmd.exe crash
Fixed Bugzilla 770: enums and typecasts
Fixed Bugzilla 771: template func returns delegate w. param list from tuple and type, odd compiler error
Fixed Bugzilla 772: Bogus error using relation operator as static if expression within template
Fixed Bugzilla 773: Redundant "Error: " in std.conv.ConvError
Fixed Bugzilla 775: array literals can't be used as template arguments
Fixed Bugzilla 777: -inline: assert() with a non-constant message causes code to not compile
Fixed Bugzilla 778: -inline: Assertion failure: '!v->csym' on line 450 in file 'glue.c'
Fixed Bugzilla 779: init.c:103: virtual Expression* VoidInitializer::toExpression(): Assertion `0' failed.


GDC也更新到了1.0.
引用
http://sourceforge.net/project/showfiles.php?group_id=154306

   * Updated to DMD 1.00
   * Fixed Bugzilla 695, 696, 737, 738, 739, 742, 743, 745
   * Implemented GCC extended assembler
   * Implemented basic support for GCC attributes

See the included GDC.html and the GCC manual for information about the
GCC extensions.
分享到:
评论
55 楼 colin4k 2007-04-18  
不知道什么时候D能有一个相对可用的web或者gui框架,就像有了rails的ruby,还有我正在用的grails 0.4.2,虽然还没有正式版,但是已经基本可用了。D还有很长的路要走,成熟的orm实现等等。不过好在D和java如此接近,很多java上好的项目可以移植过来。
54 楼 fixopen 2007-03-08  
引用:
string interpolation不是运行时的阿。只要编译器把
"my name is $name"翻译成"my name is " + name就行了。不难啊。

这么说来,似乎真的不难,我想到哪儿去了呢?对,可以这样替换,呵呵,对于D,替换为"my name is " ~ name。

引用:
至于heredoc,你这个多行字符串内部能带双引号么?不是要\"这样吧?
HEREDOC_TAG
....
....
...
HEREDOC_TAG
在这些...里面也不允许出现HEREDOC_TAG吧。不过话说回来,似乎出现自定义的长的分界符的可能性也不大。
53 楼 Elminster 2007-03-07  
唔,时间长了忘了上下文,明天再回吧 ……
52 楼 ajoo 2007-03-06  
fixopen 写道
引用ajoo:
我愤慨的是,D不支持string interploation("my name is $name")和here-doc。

D不支持string interploation可以理解,毕竟那是运行时的玩艺,不适合没有强大运行时支持的D。

here-doc支持呀!

"这不就是所谓的
here-doc吗?
难道我理解的有误?
不会呀"

string interpolation不是运行时的阿。只要编译器把
"my name is $name"翻译成"my name is " + name就行了。不难啊。

至于heredoc,你这个多行字符串内部能带双引号么?不是要\"这样吧?
51 楼 fixopen 2007-03-05  
引用ajoo:
我愤慨的是,D不支持string interploation("my name is $name")和here-doc。

D不支持string interploation可以理解,毕竟那是运行时的玩艺,不适合没有强大运行时支持的D。

here-doc支持呀!

"这不就是所谓的
here-doc吗?
难道我理解的有误?
不会呀"
50 楼 canonical 2007-03-03  
把meta-programming等同于类型计算纯粹是C++的误导
49 楼 oldrev 2007-02-24  
新人报道!
google告诉我这里几乎是唯一有讨论D的中文社区?
48 楼 broodwarfish 2007-02-12  
觉得学要一门语言就好了。不要追求太多。
47 楼 qiezi 2007-02-10  
提供点信息,供你们跳脚之用:

1、成员函数模板是支持的,从某个版本开始。。。时间是记不得了,不过至少已经是2个月以前了吧,大家一起跳脚骂吧。。。

2、new/delete的问题,不算是语言的问题。举个例子,假设一个socket对象不能够多次close,但你有多个对象引用它,谁该来真正close?这个问题换成是delete它就成了语言的问题了?GC自己是可以处理和delete的共存问题,你自己处理不了,不是语言或GC的问题。。另外,你可以自己写new/delete方法,这样就可以和GC完全不相干,具体方法文档中都有。

3、把历史上多继承的讨论都搞到一起,肯定可以印一本大布头了,所以优劣就不用再争了。不支持多继承的语言可以简单地使用聚合来代替,重新引出接口即可。

4、D 1.005新增了mixin表达式和import表达式,这又是个类似动态语言eval的玩意,不过是在编译期进行,要批判不妨连这个也一起。。对于这个玩意,我简单介绍一下,比如我有一个文件user.model:
model User
  has_many posts
  field name, string, null: false, limit: 255
  // ...
end


mixin ImportModel!(import("user.model"));

如果我足够厉害的话,可以把上面的user.model在编译期生成这样的代码:

class User : ActiveRecord.Base{
    public ActiveList!(Post) posts;
    private char[] string name_;
    public void name(char[] s){ name_ = s; }
    public char[] name() { return name_; }
}

然后就可以直接使用它:

mixin ImportModel!(import("user.model"));
void main(){
    // 设置数据库连接
    User u = User.find_first;
    auto users = User.find_all("status = ?", 0);
}


当然这只是我想象的,但目前的语言设施是支持这种变态操作的,只是我还没有足够的实力驾驭它。当然我也在努力学习它使用它,目前只做了个简单地词法分析器,把它分割成token。由于只能使用模板,所以要在一个受限的语言环境下完成这东西还是相当困难的。不过它作为D 1.005的最大更新,应该可以看出D语言的一些方向。

5、关于模板,不完善的部分都是暂时的,D语言在这方面投入了相当大的精力,所以目前的不足可能在后面某个版本被改掉。
46 楼 ajoo 2007-02-08  
Elminster 写道

90%?你还真乐观啊。而且问题是只有剩下的那些情况,hash 才有真的意义,否则的话既然性能不是那么重要,我们要的只不过是一个可以用非整形值索引的集合而已,放一个平衡二叉树都要好得多了,至少不用提供 hash 函数。为了这种需求去改核心语言,说句鸡肋,不过分吧?

性能重要啊。所以采用hash啊。(恩。据你说这个hash要求类似java的hashCode和equals乐?觉得不是很好,应该能够自动判断,如果实现了Hashable接口,就用hash,否则如果实现了Comparable,就用tree)

另外,内置的hash的语法可是太有意义了。对简化代码大有帮助阿。



Elminster 写道

PS: 你为啥说字符串也不单纯?有 GC 支持的情况下,选择 immutable 的字符串基本上不用考虑吧?

话说java的string也有内存泄漏问题的(substring造成的),也有cache问题的,有人还叫板写了一个FastString,号称比Sun的快很多。
更甭说std::string乐。

嗯,还有new/delete,你说这俩东西单纯么?貌似底下的实现细节很重要的。

Elminster 写道

容我不厚道地问一句,你写的这些程序里面,有多少东西是用完之后必须尽快关闭的?
不论对象所有权,不论对象生存期,不论某个对象使用的资源怎么传进来的,如果我希望这个对象 close 的时候对所有它引用的资源执行 close ,那么这个簿记负担就冒出来了。

我怎么从来没这么“希望”过?我都是严格遵循谁allocate就是谁deallocate的。

Elminster 写道

那它到底是怎么做的?通盘都用 new/delete 是说这个程序里面 GC 就废了吗?不可能吧?

或者可以,new/delete用一个heap,gc用另外一个。

Elminster 写道

别扯开话题,D 既然废了和 C/C++ 的源码兼容,那这个问题就应该要尽快而且妥善的解决。而且这不是什么很困难的火箭科技吧?貌似你这厮当年在 abp 上不是也鼓吹自己找到了一个更好的方案么?

我只是说和C的兼容,可不是和c++。D不是也是和C兼容?

Elminster 写道

直接写两个版本的函数不就退回 C++ 的解法了?我对 C++ 的 TMP 最不满的就是这个类型计算了,每次想要表达“根据输入的若干类型,输出某个特定类型”这种概念,都要重载特化折腾半天,可读性 N 差。

另,俺去看了 D 网站上的介绍,一个类不能拥有函数模板做为成员,和我一起跳脚骂吧。

那你就用static_if,可见static_if的作用了。
另,c++也不是从第一版就支持成员模板的八?



Elminster 写道

偏偏我这个远方堂叔挺喜欢多继承带来的语言表达能力,凭啥就让我用限制多多的替代品?


社会不是公平的。总有少数人的利益受到侵害。我很同情你。
45 楼 Elminster 2007-02-07  
ajoo 写道
Elminster 写道


因为 hash 不像数组和字符串那么单纯,这东西有一些内部实现上的考量。散列区的大小,冲突如何解决,诸如此类。在性能比较重要的情况下,hash 一般还是要自己来设计和调整的。所以我乐于见到内置的数组和字符串,但是对于内置的 hash ,就会觉得比较鸡肋,有点多此一举。

字符串好像也不单纯来着。:-)
万一内置的hash不合适,你自己写一个合适的不就完了?问题是可能90%的情况内置的hash够用了。


90%?你还真乐观啊。而且问题是只有剩下的那些情况,hash 才有真的意义,否则的话既然性能不是那么重要,我们要的只不过是一个可以用非整形值索引的集合而已,放一个平衡二叉树都要好得多了,至少不用提供 hash 函数。为了这种需求去改核心语言,说句鸡肋,不过分吧?

PS: 你为啥说字符串也不单纯?有 GC 支持的情况下,选择 immutable 的字符串基本上不用考虑吧?


ajoo 写道
Elminster 写道

你就爱扯这个设计风格,其实这里的问题和对象所有权根本就不相干。递归调用是个方便的工具,当我对一个对象执行 close 动作的时候,释放所有它所引用的资源是很正常的举动,支持递归调用在这里可以减轻程序员的簿记负担。

风格当然有关系了。在java里面,用依赖注入的风格写程序也这么长时间了,怎么我就从来没发现有这个传说中的“簿记”负担的?


容我不厚道地问一句,你写的这些程序里面,有多少东西是用完之后必须尽快关闭的?
不论对象所有权,不论对象生存期,不论某个对象使用的资源怎么传进来的,如果我希望这个对象 close 的时候对所有它引用的资源执行 close ,那么这个簿记负担就冒出来了。


ajoo 写道
Elminster 写道

被 delete 的那个变量几乎不可能是问题,问题在于如果有多个变量指向同一个对象,一个 delete 了,其他的怎么办?用其他变量访问那个对象会是什么结果?难道 D 的运行时还能把所有指向那个对象的变量都置成 null?

另一方面,手工 delete 对 gc 的干扰是很明显的。D 里面手工 delete 对象之后,那块内存可以在后续的 new 里面直接使用而不需要先经过一次 gc 么?如果不行,那这个手工 delete 实际上毫无意义,如果行,那么这里就需要内存分配器与之配合,而且此时将很难采用基于节点复制算法或是支持缩并的 gc 机制。虽然这并不意味着我们无法找到较好的解决方案,但这个手工 delete 对 gc 的实现是一种干扰则是确定无疑的。

要让 gc 是可选的,正确的做法是提供一个传统的、手工分配释放内存的堆,而不是让 gc 堆支持 delete。

嗯。不清楚。我想可能是如果用new/delete就通盘都用new/delete吧?毕竟对这种特殊需要自己控制内存的应用,gc根本就不受欢迎的。


那它到底是怎么做的?通盘都用 new/delete 是说这个程序里面 GC 就废了吗?不可能吧?

ajoo 写道
Elminster 写道

这个再用 1.0 盾牌就不像话了。D 既然把目标放在系统编程领域,又废掉了和 C\C++ 的源代码兼容,那解决这个问题绝对应该放在相当高的优先级上。话说 D 虽然刚刚 1.0,可是 0.9x 了不是一年两年了吧?

是慢了一点。我等这个1.0也等了很心焦了。话说当年B教主写c++,1.0是花多长时间推出的妮?


别扯开话题,D 既然废了和 C/C++ 的源码兼容,那这个问题就应该要尽快而且妥善的解决。而且这不是什么很困难的火箭科技吧?貌似你这厮当年在 abp 上不是也鼓吹自己找到了一个更好的方案么?

ajoo 写道
Elminster 写道

问题在于 D 引了一大堆 static_if 之类的东西进来,对 meta-programming 里面最有价值的部分,也就是对类型的计算,却没看出来有什么帮助,我还是不能用干净清楚的语法来书写一个函数,以一个类型为参数,返回另外一个类型。最基本的例子,我有一个函数模板,希望当用来实例化的类型是 int 的时候,调用一个函数,对于其他类型,调用另一个函数。那么在 D 语言里面,我可以这样写么:

static if (T==int)
    foo();
static else
    bar();


还是和在 C++ 里面一样,我需要写一个类模板再加上几个特化版本做 traits 才能实现这个东西?

除此之外还有一个问题,是关于 Expression Template 的。貌似 D 语言里面 operator overload 都是做为类的成员实现的,同时貌似 D 语言里面不支持成员函数模板,那么 C++ 里面玩儿 ET 最基本的东西,下面这样的 operator overload ,如何实现?

template<typename L, typename R>
expr<L,R> operator+(const L& lhs, const R& rhs)
{
   ... ...
   ... ... 
}


对int的特化我怎么不觉得static_if有什么好?直接写两个版本的函数不是很好?当然,似乎你这个static_if版本也是合法的。

你说D不支持成员魔板?确有此事么?那我也要和你一起跳脚大骂了。


直接写两个版本的函数不就退回 C++ 的解法了?我对 C++ 的 TMP 最不满的就是这个类型计算了,每次想要表达“根据输入的若干类型,输出某个特定类型”这种概念,都要重载特化折腾半天,可读性 N 差。

另,俺去看了 D 网站上的介绍,一个类不能拥有函数模板做为成员,和我一起跳脚骂吧。

ajoo 写道
Elminster 写道

ajoo 写道
引用
不支持多继承。话说不支持这个倒也不是多大的毛病,然则废了多继承之后,却没有相应的语言机制来补上表达能力的缺陷,就让人不太爽了。

d支持mixin吧?


D 的 mixin 限制很大吧?我怎么记得要用专门的语法来声明哪些东西是可以被 mixin 的?

多继承本来就姥姥不疼舅舅不爱,替代品有点限制你就将就吧。


偏偏我这个远方堂叔挺喜欢多继承带来的语言表达能力,凭啥就让我用限制多多的替代品?
44 楼 ajoo 2007-01-31  
Elminster 写道


因为 hash 不像数组和字符串那么单纯,这东西有一些内部实现上的考量。散列区的大小,冲突如何解决,诸如此类。在性能比较重要的情况下,hash 一般还是要自己来设计和调整的。所以我乐于见到内置的数组和字符串,但是对于内置的 hash ,就会觉得比较鸡肋,有点多此一举。

字符串好像也不单纯来着。:-)
万一内置的hash不合适,你自己写一个合适的不就完了?问题是可能90%的情况内置的hash够用了。




Elminster 写道

你就爱扯这个设计风格,其实这里的问题和对象所有权根本就不相干。递归调用是个方便的工具,当我对一个对象执行 close 动作的时候,释放所有它所引用的资源是很正常的举动,支持递归调用在这里可以减轻程序员的簿记负担。

风格当然有关系了。在java里面,用依赖注入的风格写程序也这么长时间了,怎么我就从来没发现有这个传说中的“簿记”负担的?


Elminster 写道

被 delete 的那个变量几乎不可能是问题,问题在于如果有多个变量指向同一个对象,一个 delete 了,其他的怎么办?用其他变量访问那个对象会是什么结果?难道 D 的运行时还能把所有指向那个对象的变量都置成 null?

另一方面,手工 delete 对 gc 的干扰是很明显的。D 里面手工 delete 对象之后,那块内存可以在后续的 new 里面直接使用而不需要先经过一次 gc 么?如果不行,那这个手工 delete 实际上毫无意义,如果行,那么这里就需要内存分配器与之配合,而且此时将很难采用基于节点复制算法或是支持缩并的 gc 机制。虽然这并不意味着我们无法找到较好的解决方案,但这个手工 delete 对 gc 的实现是一种干扰则是确定无疑的。

要让 gc 是可选的,正确的做法是提供一个传统的、手工分配释放内存的堆,而不是让 gc 堆支持 delete。

嗯。不清楚。我想可能是如果用new/delete就通盘都用new/delete吧?毕竟对这种特殊需要自己控制内存的应用,gc根本就不受欢迎的。


Elminster 写道


这个再用 1.0 盾牌就不像话了。D 既然把目标放在系统编程领域,又废掉了和 C\C++ 的源代码兼容,那解决这个问题绝对应该放在相当高的优先级上。话说 D 虽然刚刚 1.0,可是 0.9x 了不是一年两年了吧?

是慢了一点。我等这个1.0也等了很心焦了。话说当年B教主写c++,1.0是花多长时间推出的妮?


Elminster 写道

问题在于 D 引了一大堆 static_if 之类的东西进来,对 meta-programming 里面最有价值的部分,也就是对类型的计算,却没看出来有什么帮助,我还是不能用干净清楚的语法来书写一个函数,以一个类型为参数,返回另外一个类型。最基本的例子,我有一个函数模板,希望当用来实例化的类型是 int 的时候,调用一个函数,对于其他类型,调用另一个函数。那么在 D 语言里面,我可以这样写么:

static if (T==int)
    foo();
static else
    bar();


还是和在 C++ 里面一样,我需要写一个类模板再加上几个特化版本做 traits 才能实现这个东西?

除此之外还有一个问题,是关于 Expression Template 的。貌似 D 语言里面 operator overload 都是做为类的成员实现的,同时貌似 D 语言里面不支持成员函数模板,那么 C++ 里面玩儿 ET 最基本的东西,下面这样的 operator overload ,如何实现?

template<typename L, typename R>
expr<L,R> operator+(const L& lhs, const R& rhs)
{
   ... ...
   ... ... 
}


对int的特化我怎么不觉得static_if有什么好?直接写两个版本的函数不是很好?当然,似乎你这个static_if版本也是合法的。

你说D不支持成员魔板?确有此事么?那我也要和你一起跳脚大骂了。


Elminster 写道

ajoo 写道
引用
不支持多继承。话说不支持这个倒也不是多大的毛病,然则废了多继承之后,却没有相应的语言机制来补上表达能力的缺陷,就让人不太爽了。

d支持mixin吧?



D 的 mixin 限制很大吧?我怎么记得要用专门的语法来声明哪些东西是可以被 mixin 的?

多继承本来就姥姥不疼舅舅不爱,替代品有点限制你就将就吧。
43 楼 Elminster 2007-01-29  
老规矩,我先放过自己也感觉比较复杂,并不是特别确定的东西,把火力集中在我明确觉得不爽的东西上面。

ajoo 写道
引用
内置的 hash ,有点多此一举。

hash很常用阿。既然数组,字符串都有内置的方便语法,为什么hash就不可以?D看起来明显是以实用为目标,不是死抱着“用库实现一切”的教条。


因为 hash 不像数组和字符串那么单纯,这东西有一些内部实现上的考量。散列区的大小,冲突如何解决,诸如此类。在性能比较重要的情况下,hash 一般还是要自己来设计和调整的。所以我乐于见到内置的数组和字符串,但是对于内置的 hash ,就会觉得比较鸡肋,有点多此一举。

ajoo 写道
引用
scope 关键字代替 dtor 实现 RAII,不爽,和 using 之类的东西一样只把眼睛盯在 lexical scope 上,没有对成员递归调用的能力。

看一些关于D的讨论,递归调用的能力似乎曾经被人提议过,就是把scope关键字用在类成员变量上。不知道Walter有什么考虑,为什么没有加。也许是认为用处不大。这个还要真正用D写些东西才能发现是否重要。
另外一点,因为废除了copy-ctor,似乎对象所有权就不能象c++里面那样由类代码静态地写死了,而是更适合由用户根据当前上下文灵活决定。面向接口+依赖注射的设计风格也和c++的那种某个对象被一个父对象独家拥有的设计方法格格不入——一个对象被几个对象引用是注射代码决定的。


你就爱扯这个设计风格,其实这里的问题和对象所有权根本就不相干。递归调用是个方便的工具,当我对一个对象执行 close 动作的时候,释放所有它所引用的资源是很正常的举动,支持递归调用在这里可以减轻程序员的簿记负担。

ajoo 写道
引用
支持手工内存管理,在支持 gc 的情况下,有点多此一举,对 gc 的实现是个干扰 —— 顺便问一句,D 里面访问已经被 delete 的对象是什么结果?

被delete的变量会被置成null。对gc的实现干扰大么?c++程序员不是一直希望gc是可选的么?这个手工delete不是正好满足要求?


被 delete 的那个变量几乎不可能是问题,问题在于如果有多个变量指向同一个对象,一个 delete 了,其他的怎么办?用其他变量访问那个对象会是什么结果?难道 D 的运行时还能把所有指向那个对象的变量都置成 null?

另一方面,手工 delete 对 gc 的干扰是很明显的。D 里面手工 delete 对象之后,那块内存可以在后续的 new 里面直接使用而不需要先经过一次 gc 么?如果不行,那这个手工 delete 实际上毫无意义,如果行,那么这里就需要内存分配器与之配合,而且此时将很难采用基于节点复制算法或是支持缩并的 gc 机制。虽然这并不意味着我们无法找到较好的解决方案,但这个手工 delete 对 gc 的实现是一种干扰则是确定无疑的。

要让 gc 是可选的,正确的做法是提供一个传统的、手工分配释放内存的堆,而不是让 gc 堆支持 delete。


ajoo 写道
引用
分离编译,既然已经不再保持和 C/C++ 的源码兼容,其实可以尝试一下引进全局优化的。

是spec规定这样做么?其实D才1.0,不排除以后更智能的编译器搞全局优化吧?


1.0 的盾牌都出现了呀 …… 好吧,这个就放过好了,毕竟只是一个优化的问题。

ajoo 写道
引用
和 C 的兼容,工具支持不好。从 C 的 .h 文件转到 D 的 module,需要程序员手工转换,而且似乎比 C# 的 DllImport 还麻烦。

1.0版。


这个再用 1.0 盾牌就不像话了。D 既然把目标放在系统编程领域,又废掉了和 C\C++ 的源代码兼容,那解决这个问题绝对应该放在相当高的优先级上。话说 D 虽然刚刚 1.0,可是 0.9x 了不是一年两年了吧?

ajoo 写道
引用
meta-programming,这个东东 D 搞得不伦不类。语法方面可能有个人喜好关系,我就不说了,可是为什么要引那么多 static_if 之类的关键字进来另搞一套呢,为什么不尝试直接允许满足特定条件的函数在编译时运行?而且,不知道是不是我掌握的资料不够,我看到的 D 的 meta-programming 的例子大多集中在对数值的编译时计算上,可是 meta-programming 真正的价值在于对类型的计算,这点 D 做了些什么改进?很可惜我没有看见,有谁了解的话来说说?

比如说,什么c++能做的类型抽象D不能做呢?type list?似乎用tuple实现起来很简单阿。
至于static_if,不错。要是能使用if然后让编译器自动分析这个if是不是static的,会更好。不过,编译器实现的难度会加大把?至少,static_if比c++里面的对应东西好太多了,就算不完美,也不错了。


问题在于 D 引了一大堆 static_if 之类的东西进来,对 meta-programming 里面最有价值的部分,也就是对类型的计算,却没看出来有什么帮助,我还是不能用干净清楚的语法来书写一个函数,以一个类型为参数,返回另外一个类型。最基本的例子,我有一个函数模板,希望当用来实例化的类型是 int 的时候,调用一个函数,对于其他类型,调用另一个函数。那么在 D 语言里面,我可以这样写么:

static if (T==int)
    foo();
static else
    bar();


还是和在 C++ 里面一样,我需要写一个类模板再加上几个特化版本做 traits 才能实现这个东西?

除此之外还有一个问题,是关于 Expression Template 的。貌似 D 语言里面 operator overload 都是做为类的成员实现的,同时貌似 D 语言里面不支持成员函数模板,那么 C++ 里面玩儿 ET 最基本的东西,下面这样的 operator overload ,如何实现?

template<typename L, typename R>
expr<L,R> operator+(const L& lhs, const R& rhs)
{
   ... ...
   ... ... 
}


ajoo 写道
引用
不支持多继承。话说不支持这个倒也不是多大的毛病,然则废了多继承之后,却没有相应的语言机制来补上表达能力的缺陷,就让人不太爽了。

d支持mixin吧?


D 的 mixin 限制很大吧?我怎么记得要用专门的语法来声明哪些东西是可以被 mixin 的?
42 楼 ajoo 2007-01-26  
引用
对 gc 的支持。这是好东西,但是对于 D 号称要支持的系统编程领域,是不是合适还有点难说。

所以它才支持了额外的手工分配内存阿。而且据walter说,真正的实时系统,都不用动态分配内存的,不管是gc还是malloc都不成。


引用
对 copy-ctor 的放弃。这个确实去掉了很多麻烦事情,不过我比较担心这一条对语言能力的影响。

我不担心。反而很鼓舞。这东西的思想跟我当年鼓捣cg颇有点一致。Walter说了,除了操作内存,基本上copy-ctor没用。哈哈,那啥所见略同阿。
:D


引用
内置的 hash ,有点多此一举。

hash很常用阿。既然数组,字符串都有内置的方便语法,为什么hash就不可以?D看起来明显是以实用为目标,不是死抱着“用库实现一切”的教条。

引用

scope 关键字代替 dtor 实现 RAII,不爽,和 using 之类的东西一样只把眼睛盯在 lexical scope 上,没有对成员递归调用的能力。

看一些关于D的讨论,递归调用的能力似乎曾经被人提议过,就是把scope关键字用在类成员变量上。不知道Walter有什么考虑,为什么没有加。也许是认为用处不大。这个还要真正用D写些东西才能发现是否重要。
另外一点,因为废除了copy-ctor,似乎对象所有权就不能象c++里面那样由类代码静态地写死了,而是更适合由用户根据当前上下文灵活决定。面向接口+依赖注射的设计风格也和c++的那种某个对象被一个父对象独家拥有的设计方法格格不入——一个对象被几个对象引用是注射代码决定的。


引用

支持手工内存管理,在支持 gc 的情况下,有点多此一举,对 gc 的实现是个干扰 —— 顺便问一句,D 里面访问已经被 delete 的对象是什么结果?

被delete的变量会被置成null。对gc的实现干扰大么?c++程序员不是一直希望gc是可选的么?这个手工delete不是正好满足要求?
引用

分离编译,既然已经不再保持和 C/C++ 的源码兼容,其实可以尝试一下引进全局优化的。

是spec规定这样做么?其实D才1.0,不排除以后更智能的编译器搞全局优化吧?

引用

和 C 的兼容,工具支持不好。从 C 的 .h 文件转到 D 的 module,需要程序员手工转换,而且似乎比 C# 的 DllImport 还麻烦。

1.0版。

引用
meta-programming,这个东东 D 搞得不伦不类。语法方面可能有个人喜好关系,我就不说了,可是为什么要引那么多 static_if 之类的关键字进来另搞一套呢,为什么不尝试直接允许满足特定条件的函数在编译时运行?而且,不知道是不是我掌握的资料不够,我看到的 D 的 meta-programming 的例子大多集中在对数值的编译时计算上,可是 meta-programming 真正的价值在于对类型的计算,这点 D 做了些什么改进?很可惜我没有看见,有谁了解的话来说说?

比如说,什么c++能做的类型抽象D不能做呢?type list?似乎用tuple实现起来很简单阿。
至于static_if,不错。要是能使用if然后让编译器自动分析这个if是不是static的,会更好。不过,编译器实现的难度会加大把?至少,static_if比c++里面的对应东西好太多了,就算不完美,也不错了。

引用

不支持多继承。话说不支持这个倒也不是多大的毛病,然则废了多继承之后,却没有相应的语言机制来补上表达能力的缺陷,就让人不太爽了。

d支持mixin吧?
41 楼 Elminster 2007-01-25  
一如既往,我们两个共同点不多 …………

我比较喜欢的 D 语言特征:

引用
typeof 和 type inference 这两个 C++ 社区叫了多年,并且肯定会被加入到下一个标准里面的特征。
内置的 string 类型,特别是这个 string 可以当作编译时常量处理。
函数可以内嵌函数和类,也有基本的 lambda 表达式支持。


感觉比较复杂犹豫的:

引用
对 gc 的支持。这是好东西,但是对于 D 号称要支持的系统编程领域,是不是合适还有点难说。
对 copy-ctor 的放弃。这个确实去掉了很多麻烦事情,不过我比较担心这一条对语言能力的影响。


看着不太顺眼的:

引用
内置的 hash ,有点多此一举。

scope 关键字代替 dtor 实现 RAII,不爽,和 using 之类的东西一样只把眼睛盯在 lexical scope 上,没有对成员递归调用的能力。

支持手工内存管理,在支持 gc 的情况下,有点多此一举,对 gc 的实现是个干扰 —— 顺便问一句,D 里面访问已经被 delete 的对象是什么结果?

分离编译,既然已经不再保持和 C/C++ 的源码兼容,其实可以尝试一下引进全局优化的。

和 C 的兼容,工具支持不好。从 C 的 .h 文件转到 D 的 module,需要程序员手工转换,而且似乎比 C# 的 DllImport 还麻烦。

meta-programming,这个东东 D 搞得不伦不类。语法方面可能有个人喜好关系,我就不说了,可是为什么要引那么多 static_if 之类的关键字进来另搞一套呢,为什么不尝试直接允许满足特定条件的函数在编译时运行?而且,不知道是不是我掌握的资料不够,我看到的 D 的 meta-programming 的例子大多集中在对数值的编译时计算上,可是 meta-programming 真正的价值在于对类型的计算,这点 D 做了些什么改进?很可惜我没有看见,有谁了解的话来说说?

不支持多继承。话说不支持这个倒也不是多大的毛病,然则废了多继承之后,却没有相应的语言机制来补上表达能力的缺陷,就让人不太爽了。


嗯,总的来说,感觉 D 这门语言里面缺乏创造力,只是根据 C++ 社区里面抱怨的声音头痛医头脚痛医脚,给出的解决方案老套而且效果不理想。
40 楼 ajoo 2007-01-20  
我愤慨的是,D不支持string interploation("my name is $name")和here-doc。
对D坚持C/c++/java的switch的fall-through语义也表示不满。


赞赏D的:
built-in string (c++ std::string没得比)
built-in hash
scope关键字 (就是我以前设想的auto关键字,而且更强)
gc
支持手工内存管理
漂亮得多简单得多的template-programming
type inference
typeof
对拷贝的认识(除了bit-copy,手工的copy-ctor基本没用)
放弃和C++兼容这个历史包袱。让c++代码就地臭掉。保证了D的纯洁性,简单性,使得编译器以及相关工具相比于c++容易几个数量级。

39 楼 ajoo 2007-01-20  
Elminster 写道
ajoo 写道
c++的罪行是罄竹难书阿。B教主弄的这叫啥破玩意儿。

语言之争其实挺有意思的。成天干活干累了,也是不错的消遣。想当年和elm大战上千回合,虽然结果是必然的毫无结果,但是过程倒是挺让人怀念的亚。


然则俺最近确实也有点手痒了呀,不如咱哥俩开个贴再来战上一把?我正看 D 语言不怎么顺眼呢 ……
你开一个贴吧。先列出来不顺眼的那些咚咚。
38 楼 Elminster 2007-01-19  
ajoo 写道
c++的罪行是罄竹难书阿。B教主弄的这叫啥破玩意儿。

语言之争其实挺有意思的。成天干活干累了,也是不错的消遣。想当年和elm大战上千回合,虽然结果是必然的毫无结果,但是过程倒是挺让人怀念的亚。


然则俺最近确实也有点手痒了呀,不如咱哥俩开个贴再来战上一把?我正看 D 语言不怎么顺眼呢 ……
37 楼 ajoo 2007-01-19  
c++的罪行是罄竹难书阿。B教主弄的这叫啥破玩意儿。

语言之争其实挺有意思的。成天干活干累了,也是不错的消遣。想当年和elm大战上千回合,虽然结果是必然的毫无结果,但是过程倒是挺让人怀念的亚。
36 楼 hyf 2007-01-18  
我都不觉得这是一点好处都没有的争论,

我觉得D的元编程和C++是不一样了,他不是紧扣“对类型抽象”这一宗旨的。
还是让时间证明这样是好还是不好吧。



其实我对你说“稍大点的C++项目”和“内存管理机制”的关系才真正感兴趣。
如果你真不愿意再跟贴的话,可否把相关资料的链接发站内信息告诉我,以得解惑。

相关推荐

    MIPI D-PHY 1.0

    MIPI D-PHY 1.0(Mobile Industry Processor Interface Display Port Physical Layer)是MIPI Alliance在2009年5月14日发布的一项重要的移动设备接口技术标准。它主要应用于移动设备内部,如智能手机和平板电脑中的...

    Ventoy 1.0.95 全能 U 盘启动制作工具 Windows 版

    Ventoy-1.0.95 是一款功能强大的 U 盘启动制作工具(支持 EFI ...本资源为 Ventoy-1.0.95 的 Windows 版本(2023年 8月发布),可满足您在系统安装、救援、工具使用等场景下的需求。立即下载并享受便捷的 U 盘启动体验!

    [上传下载]『幻γ野D风』PHP文件上传 v1.0_28_130116_dphp1.0.zip

    这个版本号(v1.0_28_130116)表明该软件可能是在2013年1月16日发布的第28次更新的1.0版本。"dphp1.0"可能是开发者的特定标记或者项目代号,暗示了该系统可能基于或与名为"DPHP"的框架或库有关。 【描述】中提供的...

    XHTML1.0

    - **第二版修订**:为了修正第一版中的错误,并根据社区反馈进行调整,XHTML 1.0 的第二版修订版于 2002 年 8 月 1 日发布。这一版本整合了所有已知的错误修正,但并未对 XHTML 1.0 进行实质性的更新或增加新功能。 ...

    mipi_D-PHY_v1.0.pdf

    根据提供的文件信息,本文将围绕MIPI联盟发布的D-PHY v1.0规格标准进行详细的知识点解析。D-PHY是移动行业处理器接口(Mobile Industry Processor Interface)联盟,简称MIPI联盟,制定的一种串行接口标准。它主要...

    ApWiFi1.0.4.3正式绿色版

    ApWiFi1.0.4.3正式绿色版! 1.0.4.3[2011.06.03] 改进部份电脑上开启无响应 优化算法 1.0.4.2[2011.06.02] 修复部份电脑上的“服务器正在运行,切换到”情况 修复一处特殊条件下的内存异常 ...ApWiFi第一版发布

    usb 1.0 协议

    USB 1.0协议是通用串行总线(Universal Serial Bus)的第一个版本,于1996年发布,为个人计算机和其他电子设备提供了一种高效、便捷的数据传输标准。这个协议定义了数据传输的速率、连接器、电缆规格以及设备类规范...

    贝尔金F5D7050无线网卡驱动V1.0

    **贝尔金F5D7050无线网卡驱动V1.0详解** 贝尔金F5D7050是一款适用于家庭和小型办公室环境的无线网络适配器,它允许用户通过Wi-Fi连接到互联网,享受无线网络带来的便利。这款设备的驱动程序是确保其在各种操作系统...

    解决jar发布时的出现D:/export-0.0.1-SNAPSHOT.jar!/BOOT-INF/classes!/static

    springboot获取根目录及资源路径及解决jar发布时的出现D:/export-0.0.1-SNAPSHOT.jar!/BOOT-INF/classes!/static,采用该工具类可在发布成jar时访问到资源文件路径地址

    html5引擎LayaAir1.0

    它支持3D图形处理,可以创建出具有立体感的游戏场景,同时兼容2D游戏开发,满足了不同类型的项目需求。LayaAir1.0还提供了资源管理和打包工具,帮助开发者有效地管理游戏资源,减小包体大小,提高加载速度。 此外,...

    OA 100BASE-T1 system implementation specification_D1.0_final

    通过文档的部分内容,可以知道该规范书在制定过程中经过了多次修订,并最终于2017年12月8日发布了最终版(FINAL)。版本历史记录显示了不同作者参与了该规范书的编制,并考虑了来自Delphi的反馈意见。规范书的版本...

    SACPV1.0D135 开放接口MML命令集

    【SACPV1.0D135 开放接口MML命令集】是华为公司针对其通信设备SACP(可能代表Softswitch Access Control Platform,即软交换接入控制平台)发布的一份技术文档,用于详细说明如何通过MML(Maintenance and ...

    2D游戏开发模板 Game Kit Beta v1.0.zip

    这个资源包的名称为"2D Game Kit Beta v1.0(Dec 22, 2017).unitypackage",表明它是2017年12月22日发布的,处于Beta测试阶段的2D游戏开发套件。Unitypackage是Unity引擎中用于分享和导入资源的打包格式,包含了各种...

    D语言编程参考手册1.0

    - **论坛、博客和期刊**:活跃的社区论坛和博客,定期发布关于D语言的文章和技术分享。 - **咨询服务**:提供专业的D语言咨询服务和技术支持。 - **国际资源**:支持多种语言版本的文档和资料。 D语言是一种高度...

    新闻文章小虫新闻管理系统V1.0-xcnewsv1.0.zip

    "新闻文章小虫新闻管理系统V1.0-xcnewsv1.0.zip"是一个压缩包文件,其中包含了一个名为"新闻文章"的小虫新闻管理系统的版本1.0,即"xcnewsv1.0"。这个系统可能是一个专门用于管理和发布新闻内容的应用程序,旨在帮助...

    三星NP305V4A-Petronas-D-14I REV1.0 bios

    三星NP305V4A-Petronas-D-14I REV1.0 BIOS的发布,可能是为了修复之前版本中存在的问题,提高系统的稳定性,增强硬件兼容性,或者引入新的功能。例如,新版本可能解决了某些硬件驱动的兼容性问题,提高了处理器或...

    WNDR3800-V1.0.0.44.zip

    这个文件是固件更新的发布说明,详细列出了新版本固件的所有改变、新增功能、已知问题以及解决的问题。用户在升级前应仔细阅读这份文档,了解更新内容,以便做出决策。 5. "WNDR3800-V1.0.0.44.img": 这是一个...

    齐博知道系统 v1.0

    - 开发者应定期发布更新,修复已知问题,增强系统稳定性和安全性。 - 用户可以通过官方渠道获取技术支持和社区资源,如论坛、文档等。 通过上述分析,我们可以看出齐博知道系统 v1.0 是一个完整的问答解决方案,...

Global site tag (gtag.js) - Google Analytics