- 浏览: 327481 次
最新评论
-
riki:
D 语言学习交流群 264617728, 欢迎加入
D语言真相 The Case for D(1-5) -
exploder:
请教,如果使用D2进行wxD编译呢?
编译WxD0.16 -
blue_halo:
那如何解决呢????????
不能每次都用别的打开存成utf- ...
pyDev 中输入中文问题 -
funxue:
请教楼主
Error: undefined identifie ...
D语言版本的华容道 -
litsen:
在配置ms sqlserver的过程中遇到些问题,从Googl ...
安全第一,在sql server和client之间配置ssl连接
期待已久的D1.0终于发布了! 感谢Walter给我们提供了这么好的工具!
GDC也更新到了1.0.
string interpolation不是运行时的阿。只要编译器把
"my name is $name"翻译成"my name is " + name就行了。不难啊。
至于heredoc,你这个多行字符串内部能带双引号么?不是要\"这样吧?
90%?你还真乐观啊。而且问题是只有剩下的那些情况,hash 才有真的意义,否则的话既然性能不是那么重要,我们要的只不过是一个可以用非整形值索引的集合而已,放一个平衡二叉树都要好得多了,至少不用提供 hash 函数。为了这种需求去改核心语言,说句鸡肋,不过分吧?
性能重要啊。所以采用hash啊。(恩。据你说这个hash要求类似java的hashCode和equals乐?觉得不是很好,应该能够自动判断,如果实现了Hashable接口,就用hash,否则如果实现了Comparable,就用tree)
另外,内置的hash的语法可是太有意义了。对简化代码大有帮助阿。
PS: 你为啥说字符串也不单纯?有 GC 支持的情况下,选择 immutable 的字符串基本上不用考虑吧?
话说java的string也有内存泄漏问题的(substring造成的),也有cache问题的,有人还叫板写了一个FastString,号称比Sun的快很多。
更甭说std::string乐。
嗯,还有new/delete,你说这俩东西单纯么?貌似底下的实现细节很重要的。
容我不厚道地问一句,你写的这些程序里面,有多少东西是用完之后必须尽快关闭的?
不论对象所有权,不论对象生存期,不论某个对象使用的资源怎么传进来的,如果我希望这个对象 close 的时候对所有它引用的资源执行 close ,那么这个簿记负担就冒出来了。
我怎么从来没这么“希望”过?我都是严格遵循谁allocate就是谁deallocate的。
那它到底是怎么做的?通盘都用 new/delete 是说这个程序里面 GC 就废了吗?不可能吧?
或者可以,new/delete用一个heap,gc用另外一个。
别扯开话题,D 既然废了和 C/C++ 的源码兼容,那这个问题就应该要尽快而且妥善的解决。而且这不是什么很困难的火箭科技吧?貌似你这厮当年在 abp 上不是也鼓吹自己找到了一个更好的方案么?
我只是说和C的兼容,可不是和c++。D不是也是和C兼容?
直接写两个版本的函数不就退回 C++ 的解法了?我对 C++ 的 TMP 最不满的就是这个类型计算了,每次想要表达“根据输入的若干类型,输出某个特定类型”这种概念,都要重载特化折腾半天,可读性 N 差。
另,俺去看了 D 网站上的介绍,一个类不能拥有函数模板做为成员,和我一起跳脚骂吧。
那你就用static_if,可见static_if的作用了。
另,c++也不是从第一版就支持成员模板的八?
偏偏我这个远方堂叔挺喜欢多继承带来的语言表达能力,凭啥就让我用限制多多的替代品?
社会不是公平的。总有少数人的利益受到侵害。我很同情你。
因为 hash 不像数组和字符串那么单纯,这东西有一些内部实现上的考量。散列区的大小,冲突如何解决,诸如此类。在性能比较重要的情况下,hash 一般还是要自己来设计和调整的。所以我乐于见到内置的数组和字符串,但是对于内置的 hash ,就会觉得比较鸡肋,有点多此一举。
字符串好像也不单纯来着。:-)
万一内置的hash不合适,你自己写一个合适的不就完了?问题是可能90%的情况内置的hash够用了。
90%?你还真乐观啊。而且问题是只有剩下的那些情况,hash 才有真的意义,否则的话既然性能不是那么重要,我们要的只不过是一个可以用非整形值索引的集合而已,放一个平衡二叉树都要好得多了,至少不用提供 hash 函数。为了这种需求去改核心语言,说句鸡肋,不过分吧?
PS: 你为啥说字符串也不单纯?有 GC 支持的情况下,选择 immutable 的字符串基本上不用考虑吧?
你就爱扯这个设计风格,其实这里的问题和对象所有权根本就不相干。递归调用是个方便的工具,当我对一个对象执行 close 动作的时候,释放所有它所引用的资源是很正常的举动,支持递归调用在这里可以减轻程序员的簿记负担。
风格当然有关系了。在java里面,用依赖注入的风格写程序也这么长时间了,怎么我就从来没发现有这个传说中的“簿记”负担的?
容我不厚道地问一句,你写的这些程序里面,有多少东西是用完之后必须尽快关闭的?
不论对象所有权,不论对象生存期,不论某个对象使用的资源怎么传进来的,如果我希望这个对象 close 的时候对所有它引用的资源执行 close ,那么这个簿记负担就冒出来了。
被 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 就废了吗?不可能吧?
这个再用 1.0 盾牌就不像话了。D 既然把目标放在系统编程领域,又废掉了和 C\C++ 的源代码兼容,那解决这个问题绝对应该放在相当高的优先级上。话说 D 虽然刚刚 1.0,可是 0.9x 了不是一年两年了吧?
是慢了一点。我等这个1.0也等了很心焦了。话说当年B教主写c++,1.0是花多长时间推出的妮?
别扯开话题,D 既然废了和 C/C++ 的源码兼容,那这个问题就应该要尽快而且妥善的解决。而且这不是什么很困难的火箭科技吧?貌似你这厮当年在 abp 上不是也鼓吹自己找到了一个更好的方案么?
问题在于 D 引了一大堆 static_if 之类的东西进来,对 meta-programming 里面最有价值的部分,也就是对类型的计算,却没看出来有什么帮助,我还是不能用干净清楚的语法来书写一个函数,以一个类型为参数,返回另外一个类型。最基本的例子,我有一个函数模板,希望当用来实例化的类型是 int 的时候,调用一个函数,对于其他类型,调用另一个函数。那么在 D 语言里面,我可以这样写么:
还是和在 C++ 里面一样,我需要写一个类模板再加上几个特化版本做 traits 才能实现这个东西?
除此之外还有一个问题,是关于 Expression Template 的。貌似 D 语言里面 operator overload 都是做为类的成员实现的,同时貌似 D 语言里面不支持成员函数模板,那么 C++ 里面玩儿 ET 最基本的东西,下面这样的 operator overload ,如何实现?
对int的特化我怎么不觉得static_if有什么好?直接写两个版本的函数不是很好?当然,似乎你这个static_if版本也是合法的。
你说D不支持成员魔板?确有此事么?那我也要和你一起跳脚大骂了。
直接写两个版本的函数不就退回 C++ 的解法了?我对 C++ 的 TMP 最不满的就是这个类型计算了,每次想要表达“根据输入的若干类型,输出某个特定类型”这种概念,都要重载特化折腾半天,可读性 N 差。
另,俺去看了 D 网站上的介绍,一个类不能拥有函数模板做为成员,和我一起跳脚骂吧。
d支持mixin吧?
D 的 mixin 限制很大吧?我怎么记得要用专门的语法来声明哪些东西是可以被 mixin 的?
多继承本来就姥姥不疼舅舅不爱,替代品有点限制你就将就吧。
偏偏我这个远方堂叔挺喜欢多继承带来的语言表达能力,凭啥就让我用限制多多的替代品?
因为 hash 不像数组和字符串那么单纯,这东西有一些内部实现上的考量。散列区的大小,冲突如何解决,诸如此类。在性能比较重要的情况下,hash 一般还是要自己来设计和调整的。所以我乐于见到内置的数组和字符串,但是对于内置的 hash ,就会觉得比较鸡肋,有点多此一举。
字符串好像也不单纯来着。:-)
万一内置的hash不合适,你自己写一个合适的不就完了?问题是可能90%的情况内置的hash够用了。
你就爱扯这个设计风格,其实这里的问题和对象所有权根本就不相干。递归调用是个方便的工具,当我对一个对象执行 close 动作的时候,释放所有它所引用的资源是很正常的举动,支持递归调用在这里可以减轻程序员的簿记负担。
风格当然有关系了。在java里面,用依赖注入的风格写程序也这么长时间了,怎么我就从来没发现有这个传说中的“簿记”负担的?
被 delete 的那个变量几乎不可能是问题,问题在于如果有多个变量指向同一个对象,一个 delete 了,其他的怎么办?用其他变量访问那个对象会是什么结果?难道 D 的运行时还能把所有指向那个对象的变量都置成 null?
另一方面,手工 delete 对 gc 的干扰是很明显的。D 里面手工 delete 对象之后,那块内存可以在后续的 new 里面直接使用而不需要先经过一次 gc 么?如果不行,那这个手工 delete 实际上毫无意义,如果行,那么这里就需要内存分配器与之配合,而且此时将很难采用基于节点复制算法或是支持缩并的 gc 机制。虽然这并不意味着我们无法找到较好的解决方案,但这个手工 delete 对 gc 的实现是一种干扰则是确定无疑的。
要让 gc 是可选的,正确的做法是提供一个传统的、手工分配释放内存的堆,而不是让 gc 堆支持 delete。
嗯。不清楚。我想可能是如果用new/delete就通盘都用new/delete吧?毕竟对这种特殊需要自己控制内存的应用,gc根本就不受欢迎的。
这个再用 1.0 盾牌就不像话了。D 既然把目标放在系统编程领域,又废掉了和 C\C++ 的源代码兼容,那解决这个问题绝对应该放在相当高的优先级上。话说 D 虽然刚刚 1.0,可是 0.9x 了不是一年两年了吧?
是慢了一点。我等这个1.0也等了很心焦了。话说当年B教主写c++,1.0是花多长时间推出的妮?
问题在于 D 引了一大堆 static_if 之类的东西进来,对 meta-programming 里面最有价值的部分,也就是对类型的计算,却没看出来有什么帮助,我还是不能用干净清楚的语法来书写一个函数,以一个类型为参数,返回另外一个类型。最基本的例子,我有一个函数模板,希望当用来实例化的类型是 int 的时候,调用一个函数,对于其他类型,调用另一个函数。那么在 D 语言里面,我可以这样写么:
还是和在 C++ 里面一样,我需要写一个类模板再加上几个特化版本做 traits 才能实现这个东西?
除此之外还有一个问题,是关于 Expression Template 的。貌似 D 语言里面 operator overload 都是做为类的成员实现的,同时貌似 D 语言里面不支持成员函数模板,那么 C++ 里面玩儿 ET 最基本的东西,下面这样的 operator overload ,如何实现?
对int的特化我怎么不觉得static_if有什么好?直接写两个版本的函数不是很好?当然,似乎你这个static_if版本也是合法的。
你说D不支持成员魔板?确有此事么?那我也要和你一起跳脚大骂了。
d支持mixin吧?
D 的 mixin 限制很大吧?我怎么记得要用专门的语法来声明哪些东西是可以被 mixin 的?
多继承本来就姥姥不疼舅舅不爱,替代品有点限制你就将就吧。
所以它才支持了额外的手工分配内存阿。而且据walter说,真正的实时系统,都不用动态分配内存的,不管是gc还是malloc都不成。
我不担心。反而很鼓舞。这东西的思想跟我当年鼓捣cg颇有点一致。Walter说了,除了操作内存,基本上copy-ctor没用。哈哈,那啥所见略同阿。
:D
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版。
比如说,什么c++能做的类型抽象D不能做呢?type list?似乎用tuple实现起来很简单阿。
至于static_if,不错。要是能使用if然后让编译器自动分析这个if是不是static的,会更好。不过,编译器实现的难度会加大把?至少,static_if比c++里面的对应东西好太多了,就算不完美,也不错了。
不支持多继承。话说不支持这个倒也不是多大的毛病,然则废了多继承之后,却没有相应的语言机制来补上表达能力的缺陷,就让人不太爽了。
d支持mixin吧?
然则俺最近确实也有点手痒了呀,不如咱哥俩开个贴再来战上一把?我正看 D 语言不怎么顺眼呢 ……你开一个贴吧。先列出来不顺眼的那些咚咚。
然则俺最近确实也有点手痒了呀,不如咱哥俩开个贴再来战上一把?我正看 D 语言不怎么顺眼呢 ……
引用
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.
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.
* 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吧。不过话说回来,似乎出现自定义的长的分界符的可能性也不大。
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吗?
难道我理解的有误?
不会呀"
我愤慨的是,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吗?
难道我理解的有误?
不会呀"
我愤慨的是,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的中文社区?
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:
如果我足够厉害的话,可以把上面的user.model在编译期生成这样的代码:
然后就可以直接使用它:
当然这只是我想象的,但目前的语言设施是支持这种变态操作的,只是我还没有足够的实力驾驭它。当然我也在努力学习它使用它,目前只做了个简单地词法分析器,把它分割成token。由于只能使用模板,所以要在一个受限的语言环境下完成这东西还是相当困难的。不过它作为D 1.005的最大更新,应该可以看出D语言的一些方向。
5、关于模板,不完善的部分都是暂时的,D语言在这方面投入了相当大的精力,所以目前的不足可能在后面某个版本被改掉。
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
老规矩,我先放过自己也感觉比较复杂,并不是特别确定的东西,把火力集中在我明确觉得不爽的东西上面。
hash很常用阿。既然数组,字符串都有内置的方便语法,为什么hash就不可以?D看起来明显是以实用为目标,不是死抱着“用库实现一切”的教条。
因为 hash 不像数组和字符串那么单纯,这东西有一些内部实现上的考量。散列区的大小,冲突如何解决,诸如此类。在性能比较重要的情况下,hash 一般还是要自己来设计和调整的。所以我乐于见到内置的数组和字符串,但是对于内置的 hash ,就会觉得比较鸡肋,有点多此一举。
看一些关于D的讨论,递归调用的能力似乎曾经被人提议过,就是把scope关键字用在类成员变量上。不知道Walter有什么考虑,为什么没有加。也许是认为用处不大。这个还要真正用D写些东西才能发现是否重要。
另外一点,因为废除了copy-ctor,似乎对象所有权就不能象c++里面那样由类代码静态地写死了,而是更适合由用户根据当前上下文灵活决定。面向接口+依赖注射的设计风格也和c++的那种某个对象被一个父对象独家拥有的设计方法格格不入——一个对象被几个对象引用是注射代码决定的。
你就爱扯这个设计风格,其实这里的问题和对象所有权根本就不相干。递归调用是个方便的工具,当我对一个对象执行 close 动作的时候,释放所有它所引用的资源是很正常的举动,支持递归调用在这里可以减轻程序员的簿记负担。
被delete的变量会被置成null。对gc的实现干扰大么?c++程序员不是一直希望gc是可选的么?这个手工delete不是正好满足要求?
被 delete 的那个变量几乎不可能是问题,问题在于如果有多个变量指向同一个对象,一个 delete 了,其他的怎么办?用其他变量访问那个对象会是什么结果?难道 D 的运行时还能把所有指向那个对象的变量都置成 null?
另一方面,手工 delete 对 gc 的干扰是很明显的。D 里面手工 delete 对象之后,那块内存可以在后续的 new 里面直接使用而不需要先经过一次 gc 么?如果不行,那这个手工 delete 实际上毫无意义,如果行,那么这里就需要内存分配器与之配合,而且此时将很难采用基于节点复制算法或是支持缩并的 gc 机制。虽然这并不意味着我们无法找到较好的解决方案,但这个手工 delete 对 gc 的实现是一种干扰则是确定无疑的。
要让 gc 是可选的,正确的做法是提供一个传统的、手工分配释放内存的堆,而不是让 gc 堆支持 delete。
是spec规定这样做么?其实D才1.0,不排除以后更智能的编译器搞全局优化吧?
1.0 的盾牌都出现了呀 …… 好吧,这个就放过好了,毕竟只是一个优化的问题。
1.0版。
这个再用 1.0 盾牌就不像话了。D 既然把目标放在系统编程领域,又废掉了和 C\C++ 的源代码兼容,那解决这个问题绝对应该放在相当高的优先级上。话说 D 虽然刚刚 1.0,可是 0.9x 了不是一年两年了吧?
比如说,什么c++能做的类型抽象D不能做呢?type list?似乎用tuple实现起来很简单阿。
至于static_if,不错。要是能使用if然后让编译器自动分析这个if是不是static的,会更好。不过,编译器实现的难度会加大把?至少,static_if比c++里面的对应东西好太多了,就算不完美,也不错了。
问题在于 D 引了一大堆 static_if 之类的东西进来,对 meta-programming 里面最有价值的部分,也就是对类型的计算,却没看出来有什么帮助,我还是不能用干净清楚的语法来书写一个函数,以一个类型为参数,返回另外一个类型。最基本的例子,我有一个函数模板,希望当用来实例化的类型是 int 的时候,调用一个函数,对于其他类型,调用另一个函数。那么在 D 语言里面,我可以这样写么:
还是和在 C++ 里面一样,我需要写一个类模板再加上几个特化版本做 traits 才能实现这个东西?
除此之外还有一个问题,是关于 Expression Template 的。貌似 D 语言里面 operator overload 都是做为类的成员实现的,同时貌似 D 语言里面不支持成员函数模板,那么 C++ 里面玩儿 ET 最基本的东西,下面这样的 operator overload ,如何实现?
d支持mixin吧?
D 的 mixin 限制很大吧?我怎么记得要用专门的语法来声明哪些东西是可以被 mixin 的?
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 语言特征:
感觉比较复杂犹豫的:
看着不太顺眼的:
嗯,总的来说,感觉 D 这门语言里面缺乏创造力,只是根据 C++ 社区里面抱怨的声音头痛医头脚痛医脚,给出的解决方案老套而且效果不理想。
我比较喜欢的 D 语言特征:
引用
typeof 和 type inference 这两个 C++ 社区叫了多年,并且肯定会被加入到下一个标准里面的特征。
内置的 string 类型,特别是这个 string 可以当作编译时常量处理。
函数可以内嵌函数和类,也有基本的 lambda 表达式支持。
内置的 string 类型,特别是这个 string 可以当作编译时常量处理。
函数可以内嵌函数和类,也有基本的 lambda 表达式支持。
感觉比较复杂犹豫的:
引用
对 gc 的支持。这是好东西,但是对于 D 号称要支持的系统编程领域,是不是合适还有点难说。
对 copy-ctor 的放弃。这个确实去掉了很多麻烦事情,不过我比较担心这一条对语言能力的影响。
对 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 做了些什么改进?很可惜我没有看见,有谁了解的话来说说?
不支持多继承。话说不支持这个倒也不是多大的毛病,然则废了多继承之后,却没有相应的语言机制来补上表达能力的缺陷,就让人不太爽了。
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++容易几个数量级。
对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大战上千回合,虽然结果是必然的毫无结果,但是过程倒是挺让人怀念的亚。
语言之争其实挺有意思的。成天干活干累了,也是不错的消遣。想当年和elm大战上千回合,虽然结果是必然的毫无结果,但是过程倒是挺让人怀念的亚。
然则俺最近确实也有点手痒了呀,不如咱哥俩开个贴再来战上一把?我正看 D 语言不怎么顺眼呢 ……
38 楼
Elminster
2007-01-19
ajoo 写道
c++的罪行是罄竹难书阿。B教主弄的这叫啥破玩意儿。
语言之争其实挺有意思的。成天干活干累了,也是不错的消遣。想当年和elm大战上千回合,虽然结果是必然的毫无结果,但是过程倒是挺让人怀念的亚。
语言之争其实挺有意思的。成天干活干累了,也是不错的消遣。想当年和elm大战上千回合,虽然结果是必然的毫无结果,但是过程倒是挺让人怀念的亚。
然则俺最近确实也有点手痒了呀,不如咱哥俩开个贴再来战上一把?我正看 D 语言不怎么顺眼呢 ……
37 楼
ajoo
2007-01-19
c++的罪行是罄竹难书阿。B教主弄的这叫啥破玩意儿。
语言之争其实挺有意思的。成天干活干累了,也是不错的消遣。想当年和elm大战上千回合,虽然结果是必然的毫无结果,但是过程倒是挺让人怀念的亚。
语言之争其实挺有意思的。成天干活干累了,也是不错的消遣。想当年和elm大战上千回合,虽然结果是必然的毫无结果,但是过程倒是挺让人怀念的亚。
36 楼
hyf
2007-01-18
我都不觉得这是一点好处都没有的争论,
我觉得D的元编程和C++是不一样了,他不是紧扣“对类型抽象”这一宗旨的。
还是让时间证明这样是好还是不好吧。
其实我对你说“稍大点的C++项目”和“内存管理机制”的关系才真正感兴趣。
如果你真不愿意再跟贴的话,可否把相关资料的链接发站内信息告诉我,以得解惑。
我觉得D的元编程和C++是不一样了,他不是紧扣“对类型抽象”这一宗旨的。
还是让时间证明这样是好还是不好吧。
其实我对你说“稍大点的C++项目”和“内存管理机制”的关系才真正感兴趣。
如果你真不愿意再跟贴的话,可否把相关资料的链接发站内信息告诉我,以得解惑。
发表评论
-
最近抽空翻译了D语言实用入门教程
2018-04-20 10:42 901最近抽空翻译了D语言实用入门教程 地址在Github,供初 ... -
编译WxD0.16
2011-09-27 18:09 1726wx我在Python环境下用了 ... -
简单看了下DGui
2011-09-26 10:39 2282很久没有写代码了。。。。 怀念往日不如今天行动。生疏了 ... -
支持中文录入的harmonia
2010-08-16 22:40 1046harmonia界面很方便,发现不能录入中文.Patch一下. ... -
控制台得到密码不回显
2009-09-18 22:37 1271看到坛子有人问“在D或C下如何实现输入单个字符不回显?可能的应 ... -
D资源文件调用
2009-08-09 01:36 1058终于成功了。 资源文件太可爱,竟然可以如此。按名称进行 ... -
The Case for D中英文版PDF下载
2009-06-19 10:27 1410The Case for D 在网站上浏览不方便的,有了PD ... -
D语言真相 The Case for D(1-5)
2009-06-17 09:52 4919D语言真相 Andrei Alexandre ... -
The Case for D
2009-06-16 22:50 2315The Case for D Andrei Alexan ... -
Python嵌入D
2009-06-12 11:37 1986所有的嵌入都研究了一个遍。发现嵌入Python挺好,试试。 ... -
实用的DFL注册表
2009-05-27 09:09 1030应用中要用到注册表.DFL里面有. 参照了文档,写了一 ... -
DFL 2.027,1.041,2,3编译
2009-04-07 17:59 1604注:DFL已经更新,http://www.dprogrammi ... -
D2.0的字符串
2009-04-07 08:28 1390D2.0的字符串增加了常量,不变量和变量.在很大程度上增加了语 ... -
D语言编译器DMD开源了!
2009-03-05 19:56 3499自从1999年12月,Walter设计开发D语言以来,D语 ... -
D语言现状From2007
2009-03-02 15:32 1074I'm sure this was brought up in ... -
D语言GUI库简单比较
2009-02-20 15:25 3256通过对一些D语言可以使用的GUI进行比较,对初学者有个借 ... -
D语言脚本引擎简单比较
2009-02-19 14:38 1833经过长期的测试,使用,扩展代码编写,比较了D中可以使用的几种脚 ... -
D语言编译器开始支持Mac OSX
2009-02-15 18:25 1173D语言编译器开始支持Mac OSX。 D语言历经10年的发 ... -
触发DFL中的ComboBox控件的键盘事件
2009-02-06 12:04 1204class ComboxKeyDownFilter:IMess ... -
DFL分析(四)伟大的结构
2008-12-25 00:08 1429每个程序都有很多的代码编织而成.为了获得最大的兼容性,你要从容 ...
相关推荐
v1.0发布! 该工具箱正在积极开发中。 请随时关注更新和新闻。 它是什么 理想理想隐蔽搜索器是一种搜索添加到场景中的图像的新方法。 隐蔽搜索性能受潜在目标位置上的先验概率(位置不确定性)以及所有潜在目标...
MIPI D-PHY 1.0(Mobile Industry Processor Interface Display Port Physical Layer)是MIPI Alliance在2009年5月14日发布的一项重要的移动设备接口技术标准。它主要应用于移动设备内部,如智能手机和平板电脑中的...
Ventoy-1.0.95 是一款功能强大的 U 盘启动制作工具(支持 EFI ...本资源为 Ventoy-1.0.95 的 Windows 版本(2023年 8月发布),可满足您在系统安装、救援、工具使用等场景下的需求。立即下载并享受便捷的 U 盘启动体验!
这个版本号(v1.0_28_130116)表明该软件可能是在2013年1月16日发布的第28次更新的1.0版本。"dphp1.0"可能是开发者的特定标记或者项目代号,暗示了该系统可能基于或与名为"DPHP"的框架或库有关。 【描述】中提供的...
- **第二版修订**:为了修正第一版中的错误,并根据社区反馈进行调整,XHTML 1.0 的第二版修订版于 2002 年 8 月 1 日发布。这一版本整合了所有已知的错误修正,但并未对 XHTML 1.0 进行实质性的更新或增加新功能。 ...
根据提供的文件信息,本文将围绕MIPI联盟发布的D-PHY v1.0规格标准进行详细的知识点解析。D-PHY是移动行业处理器接口(Mobile Industry Processor Interface)联盟,简称MIPI联盟,制定的一种串行接口标准。它主要...
ApWiFi1.0.4.3正式绿色版! 1.0.4.3[2011.06.03] 改进部份电脑上开启无响应 优化算法 1.0.4.2[2011.06.02] 修复部份电脑上的“服务器正在运行,切换到”情况 修复一处特殊条件下的内存异常 ...ApWiFi第一版发布
USB 1.0协议是通用串行总线(Universal Serial Bus)的第一个版本,于1996年发布,为个人计算机和其他电子设备提供了一种高效、便捷的数据传输标准。这个协议定义了数据传输的速率、连接器、电缆规格以及设备类规范...
它支持3D图形处理,可以创建出具有立体感的游戏场景,同时兼容2D游戏开发,满足了不同类型的项目需求。LayaAir1.0还提供了资源管理和打包工具,帮助开发者有效地管理游戏资源,减小包体大小,提高加载速度。 此外,...
**贝尔金F5D7050无线网卡驱动V1.0详解** 贝尔金F5D7050是一款适用于家庭和小型办公室环境的无线网络适配器,它允许用户通过Wi-Fi连接到互联网,享受无线网络带来的便利。这款设备的驱动程序是确保其在各种操作系统...
【SACPV1.0D135 开放接口MML命令集】是华为公司针对其通信设备SACP(可能代表Softswitch Access Control Platform,即软交换接入控制平台)发布的一份技术文档,用于详细说明如何通过MML(Maintenance and ...
springboot获取根目录及资源路径及解决jar发布时的出现D:/export-0.0.1-SNAPSHOT.jar!/BOOT-INF/classes!/static,采用该工具类可在发布成jar时访问到资源文件路径地址
这个资源包的名称为"2D Game Kit Beta v1.0(Dec 22, 2017).unitypackage",表明它是2017年12月22日发布的,处于Beta测试阶段的2D游戏开发套件。Unitypackage是Unity引擎中用于分享和导入资源的打包格式,包含了各种...
通过文档的部分内容,可以知道该规范书在制定过程中经过了多次修订,并最终于2017年12月8日发布了最终版(FINAL)。版本历史记录显示了不同作者参与了该规范书的编制,并考虑了来自Delphi的反馈意见。规范书的版本...
- **论坛、博客和期刊**:活跃的社区论坛和博客,定期发布关于D语言的文章和技术分享。 - **咨询服务**:提供专业的D语言咨询服务和技术支持。 - **国际资源**:支持多种语言版本的文档和资料。 D语言是一种高度...
"新闻文章小虫新闻管理系统V1.0-xcnewsv1.0.zip"是一个压缩包文件,其中包含了一个名为"新闻文章"的小虫新闻管理系统的版本1.0,即"xcnewsv1.0"。这个系统可能是一个专门用于管理和发布新闻内容的应用程序,旨在帮助...
三星NP305V4A-Petronas-D-14I REV1.0 BIOS的发布,可能是为了修复之前版本中存在的问题,提高系统的稳定性,增强硬件兼容性,或者引入新的功能。例如,新版本可能解决了某些硬件驱动的兼容性问题,提高了处理器或...
这个文件是固件更新的发布说明,详细列出了新版本固件的所有改变、新增功能、已知问题以及解决的问题。用户在升级前应仔细阅读这份文档,了解更新内容,以便做出决策。 5. "WNDR3800-V1.0.0.44.img": 这是一个...