论坛首页 编程语言技术论坛

D 1.0发布了!

浏览 43979 次
锁定老帖子 主题:D 1.0发布了!
该帖已经被评为精华帖
作者 正文
   发表时间:2007-01-17  
目前最混乱的语言当属C++,指针、引用、栈上对象并存,宏、模板什么都用,连个ABI标准也没有。如果你用C++写过程序,你会明白经常考虑的是容器里到底是该放对象本身,还是放指针?如果放对象会不会增加拷贝成本、影响执行效率甚至引起某些不可重入资源出错?如果放指针该在什么位置析构对象以释放内存?这些在java/d/c#中都不成问题。

D和C++基本上没多少关联,很多实现都大相径庭,你可以认为它是一个没有jvm的java更像一些,哪里来的一块一块地补起来这种说法?虽然说是要改进C++,但它和C++完全不同,仅有一个很小的子集兼容C++的一个很小的部分(实际上是COM二进制兼容子集),设计思想也有相当大的差异。我不明白它到底杂在哪里,混乱在哪里,那些杂七杂八的东西是什么?实际上大部分东西都是一种现代语言的标准装备,你只要用它写个几千行的程序,就会发现大部分特性都会很自然地使用到了。

其它就不多说了,如果有兴趣就学吧,为了一门你不想学的语言去浪费时间不值得。
0 请登录后投票
   发表时间:2007-01-17  

我不明白C++混乱在那里,
指针、引用怎么使用有清晰的含义,
T const& 表示不可写不为空
T * 表示可写可能为空
T & 表示可写不为空
...

栈对象就是有确定生存域的,
{ object a; int i; }
上面两个变量(对象)意义一至,有什么混乱的地方?

至于容器里面是放对象还是放指针,
一般几乎不会考虑这种问题,
默认情况下放对象,如果可以一次分配后再不变动的,就先resize,分配后的对象,能复用的就复用。
只有在真的遇到复制有麻烦的对象才考虑使用指针。

很明显,对于一般不怎么大的对象,当分配数量很大的时候,你逐个调用系统的内存分配函数本身就非常耗时间,
而且,除非你写在一些关键算法的时候才有必要考虑这个问题,比如是GUI,一次界面事件处理,你省个0.1秒,谁会感谢你?

D语言,我看他象是 c++、一些对c++的建议、c#、一些脚本语言特性 的混合物。
反正不知道该怎么定义这种语言

0 请登录后投票
   发表时间:2007-01-17  
qiezi 写道
如果放指针该在什么位置析构对象以释放内存?


一般在本对象析构时 析构其子对象。一般地,子对象的生存域是随从其父对象的。
不知道你怎么使用c++,一般我会考虑“这个对象什么时候没用了”而不考虑“这个对象什么时候可以没用了”,对于生命域控制粗一些有什么问题?
但我确实还没有遇到“不知道该什么时候析构”这个问题。
0 请登录后投票
   发表时间:2007-01-17  
hyf 写道

我不明白C++混乱在那里,
指针、引用怎么使用有清晰的含义,
T const& 表示不可写不为空
T * 表示可写可能为空
T & 表示可写不为空
...

这还不够杂?
hyf 写道

栈对象就是有确定生存域的,
{ object a; int i; }
上面两个变量(对象)意义一至,有什么混乱的地方?

实际上虽然很杂,但我从没认为有什么混乱的,只是因为你把D说得比较混乱,我想比起来D来说,以上这些内容要杂得多,混乱得多,很多学习C++几个月的人都在这些类型之间拿不定主意,其它语言一般不需要这么费力。如果连D都嫌混乱,这些都不知道该怎么说了。C++/CLI增加的东西也非常有限,而且泾渭分明,却也被扣上个混乱的帽子,我没办法认为你前面的评论是清醒的,中立的。如果这引起都觉得乱,找几本C++大部头看看吧,肯定比D文档要多,而且会有一大堆书来告诉你如何避免各种陷阱。后面还有个c++0x等着呢。

D并不是像C++/CLI一样,在C++的基础上另加了一整套东西,它仅仅和C二进制兼容,连源代码兼容都不支持,其它部分都比较干净。
hyf 写道

至于容器里面是放对象还是放指针,
一般几乎不会考虑这种问题,
默认情况下放对象,如果可以一次分配后再不变动的,就先resize,分配后的对象,能复用的就复用。
只有在真的遇到复制有麻烦的对象才考虑使用指针。

很明显,对于一般不怎么大的对象,当分配数量很大的时候,你逐个调用系统的内存分配函数本身就非常耗时间,
而且,除非你写在一些关键算法的时候才有必要考虑这个问题,比如是GUI,一次界面事件处理,你省个0.1秒,谁会感谢你?

效率只是其中之一。对于某些系统资源来说,多数时候拷贝都带来意想不到的灾难,而C++最擅长的也是系统层面,所以C++项目稍大点的都会到处充斥着指针(找几个GUI库看看吧,或是游戏引擎),甚至自己实现gc或类似的内存管理机制,栈对象的使用仅限于工具类。其它的特性比如无虚表的类,应用范围也非常有限,对于今天的机器来说效率提高更是有限,所以很多现代的语言都不提供这个特性,而是所有方便都做成虚方法;而具有虚函数的类,在使用时通常也是通过指针,所以一个上点规模的C++项目,基本上你能看到的部分都是指针了。
hyf 写道

D语言,我看他象是 c++、一些对c++的建议、c#、一些脚本语言特性 的混合物。
反正不知道该怎么定义这种语言

脚本语言的特性我很难看到,当然D本身可以作为一个脚本来运行,而且“脚本语言”也并不是界定语言特性的一种标准称谓,如果你说的脚本语言指的是动态类型语言或是弱类型语言,D和它们更不像了。它像C++仅仅是语法上吧,这种似乎叫作C-like语法。像C#?如果也仅是指语法方面,那么C-like语言彼此之间都会比较像,而且语法方面的像不足以判定语言特性,其它方面它和C#并不像。

我给它个简单的定义吧,只是个人见解:

它与C二进制兼容(不完全,去掉了一些C早期的为了低性能机器加入的特性);无需VM,编译为本地码;支持内联汇编(底层语言必须的);支持条件编译;内置同步原语;有垃圾回收机制;OO方面,有接口语法,支持单实现继承,多接口继承;有模板支持的,支持mixin(相当于有语法检查的宏);支持契约编程;内置单元测试支持;支持文档注释;支持unicode编码;内置动态数组、关联数组。

hyf 写道
qiezi 写道
如果放指针该在什么位置析构对象以释放内存?


一般在本对象析构时 析构其子对象。一般地,子对象的生存域是随从其父对象的。
不知道你怎么使用c++,一般我会考虑“这个对象什么时候没用了”而不考虑“这个对象什么时候可以没用了”,对于生命域控制粗一些有什么问题?
但我确实还没有遇到“不知道该什么时候析构”这个问题。

如何判断这个对象什么时候没用了,就发展出了各种内存管理方式,比如引用计数、垃圾回收等,没有使用这些技术的项目中,程序员耗费了大部分时间在处理这个问题,除非是很小的项目,稍稍上点规模的项目都会有完善的内存管理机制。
0 请登录后投票
   发表时间:2007-01-17  
qiezi 写道

C++/CLI增加的东西也非常有限,而且泾渭分明,却也被扣上个混乱的帽子,我没办法认为你前面的评论是清醒的,中立的。如果这引起都觉得乱,找几本C++大部头看看吧,肯定比D文档要多,而且会有一大堆书来告诉你如何避免各种陷阱。后面还有个c++0x等着呢。

你才刚说完C++混乱,又说我说C++/CLI混乱是扣帽子,是不清醒。
那你的意思是C++/CLI都不如C++乱?

C++/CLI增加的东西也非常有限?他不只单纯引入gcnew,而是把整个托管语言引入进来,
语言都是泾渭分明的两套东西,我用那个好,哪个为主?不如轮流吧,写闷了就切换过去最公平了。
说实在,我管理项目就不会优选他了,我宁可用C#,需要的时候用c++,然后P/Invoke,或者用C++/CLI写衔接层,
除此之外还真想不到他在那里还可以有大用场。


qiezi 写道

我给它个简单的定义吧,只是个人见解:

它与C二进制兼容(不完全,去掉了一些C早期的为了低性能机器加入的特性);无需VM,编译为本地码;支持内联汇编(底层语言必须的);支持条件编译;内置同步原语;有垃圾回收机制;OO方面,有接口语法,支持单实现继承,多接口继承;有模板支持的,支持mixin(相当于有语法检查的宏);支持契约编程;内置单元测试支持;支持文档注释;支持unicode编码;内置动态数组、关联数组。

不是一种脚本语言却把单元测试,文档注释这些放到语言里面。
明明这些用工具可以很好地支持。
内置高级数据结构,同时又支持指针,内嵌汇编。

你说了很多,但没是没有看出D的核心思想是什么,
也许不至于冲突的好东西都拿来,目标是做个通杀语言。


下面扯点玩笑,
我看D的template Metaprogramming,不如再添上一个static for就更方便。
然后加上一个static compiler function call 就更象解析型语言了,开发一个支持编译时调试跟踪技术的IDE,这样是不是能编译出东西来都不重要了,看编译时的输出就OK。
一个语言顶两个语言,写起程序更有劲,人也精神多了。


说实在,我感觉D 对Metaprogramming支持得有些过分,不知道是不是在你的定义里面再加一个"内置代码生成器支持"。



qiezi 写道

效率只是其中之一。对于某些系统资源来说,多数时候拷贝都带来意想不到的灾难,而C++最擅长的也是系统层面,所以C++项目稍大点的都会到处充斥着指针(找几个GUI库看看吧,或是游戏引擎),甚至自己实现gc或类似的内存管理机制,栈对象的使用仅限于工具类。其它的特性比如无虚表的类,应用范围也非常有限,对于今天的机器来说效率提高更是有限,所以很多现代的语言都不提供这个特性,而是所有方便都做成虚方法;而具有虚函数的类,在使用时通常也是通过指针,所以一个上点规模的C++项目,基本上你能看到的部分都是指针了。

qiezi 写道

如何判断这个对象什么时候没用了,就发展出了各种内存管理方式,比如引用计数、垃圾回收等,没有使用这些技术的项目中,程序员耗费了大部分时间在处理这个问题,除非是很小的项目,稍稍上点规模的项目都会有完善的内存管理机制。


说起来是设计问题,对于拷贝不安全的对象,就禁止他拷贝得了。
在代码中充斥指针是很正常的事,要不我怎么引用同一个实例,你Java代码不也是充斥着对象引用?问题是你认为指针就是不好的,指针就是有问题的。
至于说怎么管理内存,我认为是风格的问题,和项目规模无关。
小项目也需要完善的内存管理,但不见得一遇到规模大的系统,这种方法就出问题。
你有什么证据证明?

0 请登录后投票
   发表时间:2007-01-18  
hyf 写道
你才刚说完C++混乱,又说我说C++/CLI混乱是扣帽子,是不清醒。
那你的意思是C++/CLI都不如C++乱?

我已经说了,我认为C++混乱的前提,是你把D都说得很混乱,D除了GC以外,其它特性并没有比C++多,反而削减了许多,当然你把一些很小的特性例如函数直接量也算进去的话,那的确是不少。这些东西对我这IQ值仅122的大脑来说(通过某网上程序自测,见笑了),还不至于混乱到不可接受,相信其他人更不在话下了。
hyf 写道

C++/CLI增加的东西也非常有限?他不只单纯引入gcnew,而是把整个托管语言引入进来,
语言都是泾渭分明的两套东西,我用那个好,哪个为主?不如轮流吧,写闷了就切换过去最公平了。
说实在,我管理项目就不会优选他了,我宁可用C#,需要的时候用c++,然后P/Invoke,或者用C++/CLI写衔接层,
除此之外还真想不到他在那里还可以有大用场。

这就看你的驾驭能力,托管本身看起来很大,却是个比较容易掌控的东西,看看学习C#入门平均需要多少时间吧,和C++比一下,是不是个小部头。C++/CLI的东西就不争这么多了,我不是它的支持者,不过我也不认为它那么难以使用。

hyf 写道

不是一种脚本语言却把单元测试,文档注释这些放到语言里面。
明明这些用工具可以很好地支持。

哪些语言不支持文档注释?这些文档就是用工具来处理的,只不过这个工具和编译器放在同一个可执行文件里,非要分开2个文件就合理了?

D的单元测试可以和代码放在同一个文件里,因为它本身就支持多个类在同一个文件里,它的module和java的package相似,难道java不支持在同一个package里面放上实现代码和单元测试代码?

hyf 写道

内置高级数据结构,同时又支持指针,内嵌汇编。

支持指针、内嵌汇编是一种底层的语言必备的,别忘了C++在这方面和它相似。java也有JNI可以和底层接合,各种语言开放程度不同而已。提供了这个特性,不是强制你要使用,自己混乱了,怪不着人家。

hyf 写道

下面扯点玩笑,
我看D的template Metaprogramming,不如再添上一个static for就更方便。
然后加上一个static compiler function call 就更象解析型语言了,开发一个支持编译时调试跟踪技术的IDE,这样是不是能编译出东西来都不重要了,看编译时的输出就OK。
一个语言顶两个语言,写起程序更有劲,人也精神多了。

这方面就不好意思跟你争了,这些东西都是在C++中实践过了并且取得了比较好的效果,才会出现在D语言里面,模板这东西,java/c#也都不同程度地接纳了。至于你说的static for,我认真地回答你,这个东西不必要,通过递归模板可以达到一样效果,现有的模板已经是图灵完备的了。static if是为了解决C++模板中那些繁琐的代码而加上的,并没有那么好笑,要笑也先看看boost再笑,D也没有必要一切向C++看齐,它不是为了复制C++而作的。

hyf 写道

说实在,我感觉D 对Metaprogramming支持得有些过分,不知道是不是在你的定义里面再加一个"内置代码生成器支持"。

这些东西并没有比C++过分,目前看来这是静态语言最有效的代码复用机制之一。也可以说是代码生成器,刚好有这样一本书叫“产生式编程”,有兴趣可以看看,如果对C++有好感的话。

后面就不讨论了,这些都是讨论过的。经过这么多年,新语言殊途同归地都选择了GC,有意见地话把这些语言都鄙视一遍就可以了。

语言是用来抽象基础设施的,汇编之于机器码,C之于汇编,C++/D之于C/汇编,java/.net和ruby等动态语言则对平台进行抽象,c#对.net,。所有语言都是尽量隐藏底层信息,开放高层接口。设计理念不同,实现方式不同,开放/隐藏底层方式不同,但作为编程语言,对低层进行抽象的思想是不可能变化的。

发现自己总是很容易陷入语言之争呢,其实我并不想去比较这些语言,设计思想决定了语言的适用范围。除了FP以外,其它常见的语言基本上都在项目中多多少少使用了,比如action script/asm/c/c++/d/java/c#/c++_cli/ruby/python/java script/vbscript/apple script等,使用时间和编写代码行数最多的是c++,其次是java,再次是ruby,D代码写了不超过5千行吧,除了vbscript和apple script以外,就数它写得最少了。虽然尽力想做到中立,但在维护一种语言的同时,几乎不可避免地要伤害另一种语言,而且越讨论越长,难怪这里的人都反对语言之争。以前没有经验,以后还是少参与为好。学学robbin,说一句“巴不得你们都不用”,调整好心态,自个儿偷着乐。

不再回帖讨论这个问题了,都发在论坛上了,白挣了许多分,愧疚得很,抱歉了各位。。。看不下去就投点1星警告我一下吧
0 请登录后投票
   发表时间:2007-01-18  
我都不觉得这是一点好处都没有的争论,

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



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

0 请登录后投票
   发表时间:2007-01-19  
c++的罪行是罄竹难书阿。B教主弄的这叫啥破玩意儿。

语言之争其实挺有意思的。成天干活干累了,也是不错的消遣。想当年和elm大战上千回合,虽然结果是必然的毫无结果,但是过程倒是挺让人怀念的亚。
0 请登录后投票
   发表时间:2007-01-19  
ajoo 写道
c++的罪行是罄竹难书阿。B教主弄的这叫啥破玩意儿。

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


然则俺最近确实也有点手痒了呀,不如咱哥俩开个贴再来战上一把?我正看 D 语言不怎么顺眼呢 ……
0 请登录后投票
   发表时间:2007-01-20  
Elminster 写道
ajoo 写道
c++的罪行是罄竹难书阿。B教主弄的这叫啥破玩意儿。

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


然则俺最近确实也有点手痒了呀,不如咱哥俩开个贴再来战上一把?我正看 D 语言不怎么顺眼呢 ……
你开一个贴吧。先列出来不顺眼的那些咚咚。
0 请登录后投票
论坛首页 编程语言技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics