说是改良,不过C++的死忠份子可能认为是对C++的亵渎,随便怎么说,就说是不一样的地方吧。
最近D语言没什么大动作,我又参与到xruby的builtin开发中,圈子里有点冷清。有留言说这里没什么人关注,的确是这样,抽点时间来写个简单的比较。
这里有一份各种语言的比较,大致可以了解D语言要对C++改些什么。
http://digitalmars.com/d/comparison.html
下面没什么顺序,想到什么就先列出来,可能随时扩充。
1、内存管理。
内存管理在C++中非常难以掌握,大多数C++程序员没有写过内存管理程序,多数C++程序中存在内存问题,C++程序员终其一生都在与内存管理做斗争(有点过了。。)。
内存管理这么困难和重要,为何不彻底解决呢?垃圾收集是许多语言支持的一种内存管理方式,从语言级别上支持垃圾收集,你只需要分配,不需要释放。多数java程序员终其一生无法搞挂java虚拟机,对C++程序员来说把自己的程序搞挂是小儿科。
D语言也支持垃圾回收,不过为了照顾C++程序员对在堆栈上分配对象的喜好,它也支持这种方式。
import std.stdio;
class Test{
public:
this(){writefln("constructor");}
~this(){writefln("destructor");}
}
void main(){
writefln("start");
{
auto Test t = new Test; # LINE A
}
writefln("end");
}
上面这段代码,在#LINE A处分配了一个Test对象,当退出它的作用域后,它的析构函数将被调用。注意这一行的auto关键字。
你也可以定义一个普通的对象,在退出作用域时调用delete来显示析构它。当然在复杂逻辑中,这个不太好控制,比如下面这段代码:
void foo(boolean flag){
Test t = new Test;
if (flag) return;
delete t;
}
如果flag值为true,直接return了,可能与你的期望并不一致。D语言支持另一个关键字:
void foo(boolean flag){
Test t = new Test;
scope(exit) delete t;
if (flag) return;
}
scope(exit)声明了退出此作用域时要执行的代码,现在没有这个问题了,无论你后面有多少个可能return的分支。scope有更精细的控制,scope(success)和scope(failure)分别在正常退出作用域和出现异常时执行。
scope guard准确说是为了资源管理(RAII)而实现的,并不只是为了内存管理。对RAII的支持还可以使用auto关键字,把一个类声明为auto,就只能使用auto方式定义变量。
2、委托。
委托也不是新东西,在脚本语言中应该是早就出现了吧,C#也支持委托。C++并不支持委托,仅仅从C那里借了个函数指针,稍稍做了点修改做成成员函数指针。不过这个东东并不好用,除了要面对怪异的语法以外,使用它也不方便。
委托的本质是一个对象指针和一个函数指针的绑定,为什么在C++中实现却如何艰难?原因就是C++支持的多继承,以及各种编译器实现上的差异,有兴趣的搜索一下“成员函数指针与高性能的C++委托”。
D语言分别实现了函数指针类型和委托类型,全局函数和声明为extern(C)的函数的指针就是这种类型;委托类型则是D对象的成员函数指针,注意是对象的不是类的,类方法取指针依旧是函数指针类型,因为它没有绑定对象;内嵌函数的指针也是委托类型。
D语言的委托是对象指针和函数指针的简单结合,你可以使用hack手段来增强它。(见这一篇: http://dlang.iteye.com/group/blog/26618 )
3、单元测试
单元测试最好是写在实现代码附近,方便及时修改对照,D语言使用unittest关键字来支持它。
你可以在代码的任意位置使用unittest来标明单元测试代码,并使用assert来编写测试代码,在编译器命令行上加-unittest就可以编译出含有单元测试代码的程序。正式的应用可能不会这么简陋,要实现出单元测试类,捕获AssertError异常,否则每一个异常就中断了测试可没什么价值。
4、契约编程
D语言的方法不仅有函数体,还可以加入2个附加的in和out代码块,这时原来的函数体要用body来标识:
int foo(int bar)
in{
assert(bar >= 0);
assert(bar <= 255);
}
out(result){
assert(result == 0);
}
body{
return bar % 2;
}
void main(){
foo(30);
foo(-2);
foo(256);
foo(31);
}
代码应该不难看懂,in和out分别是分别标明前置条件(preconditions)检查和后置条件(postconditions)检查,还有一个不变量检查,只能用在结构、联合、类中:
import std.stdio;
class Foo{
private:
int value = 0;
invariant{
writefln("check");
assert(value == 0);
}
public:
void foo(){
writefln("in");
value = 1;
writefln("out");
}
}
void main(){
Foo foo = new Foo;
foo.foo();
}
invariant会在每个public方法调用前后执行,输出如下:
check
in
out
check
Error: AssertError Failure tt(8)
D目前不能打印出异常堆栈,提示信息有点差。
5、同步原语
这在D语言里就是synchronized关键字:
import std.stdio;
import std.thread;
import std.c.time;
class PrintThread : Thread {
public:
int run(){
synchronized {
writefln("Thread start");
usleep(100000);
writefln("Thread end");
}
return 0;
}
}
void main(){
PrintThread[] threads = new PrintThread[10];
for (int i=0; i<10; ++i){
threads[i] = new PrintThread;
threads[i].start();
}
usleep(1100000);
}
也可以synchronized(object),和java差不多。
6、COM接口兼容
通过使用extern(Windows)声明,D接口可以和COM接口二进制兼容。不多说了,看这篇: http://qiezi.iteye.com/admin/show/26681
-----------
先整这么多,有时间补充,毛糙了点,多多包涵。
分享到:
相关推荐
【简述C和C++的学习历程】 学习C和C++是一个逐步进阶的过程,适合希望成为熟练解决问题的程序员。肖舸老师的建议是首先从C语言入手,因为C语言能够帮助初学者建立基础的编程思维和解决问题的能力。C语言是面向过程...
C++是一种高效、灵活且功能强大的编程语言,是C语言的扩展。在C++中编写程序,主函数(main function)是程序执行的入口点。在本节内容中,我们将详细解释C++小程序的结构和相关知识点。 首先,C++程序的主函数格式...
例如第一章:1-1 简述计算机程序设计语言的发展历程。 解: 迄今为止计算机程序设计语言的发展经历了机器语言、汇编语言、高级语言等阶段,C++语言是一种面向对象的编程语言,也属于高级语言。 1-2 面向对象的编程...
Dev C++ 是一款轻量级的C++集成开发环境(IDE),特别适合初学者学习C++编程语言。它集成了编译器、编辑器、调试器等开发工具,为程序员提供了一个简洁而高效的开发环境。 **一、Dev C++安装与界面** 1. **安装...
1、简述 C++语言的特点 • C++在 C 语言的基础上引入了面向对象的机制,同时兼容 C 语言; • C++面向对象包括了封装、继承、多态三大特性; • C++语言生成的代码质量高,运行效率高; • C++增加了 const ...
与C++等需要手动管理内存的语言不同,Java通过内置的垃圾回收器(Garbage Collector, GC)自动管理对象的生命周期,简化了内存管理的同时也提高了程序的安全性和稳定性。 #### 二、垃圾回收的基本概念 1. **什么是...
6. 设计的可验证性:VHDL语言允许设计者在硬件物理实现之前对设计进行充分的仿真和验证,这种预实现阶段的仿真能够发现设计的逻辑错误,提高设计的成功率。 7. 硬件与软件的结合:VHDL的设计不仅限于硬件描述,它还...
数据挖掘简述及R语言基础数据挖掘简述及R语言基础数据挖掘简述及R语言基础
程序设计语言简述 程序设计语言是计算机科学和软件工程中最基础的概念之一。它是计算机能够为人工作的基础,因为计算机只能根据机器语言指令来执行程序,高级语言程序必须通过翻译变成机器语言程序,这个工作一般是...
在教授面向对象编程时,可以简述程序设计语言原理中的相关概念,帮助学生理解C++的类和对象设计。 通过这样的整合化教学,可以克服学生在学习C++时遇到的知识断层,提高教学效率,使学生在掌握C++语法的同时,也能...
### C++期末考试知识点解析 #### 一、实体与函数调用问题 **题目描述**: 此题涉及到了两个实体“矩形”和“旗杆”,以及对应的...通过这些知识点的学习,可以帮助学生更好地理解和掌握C++语言的基础与高级特性。
**2.1 C++的历史简述** C++ 是由 Bjarne Stroustrup 在 1979 年开始设计的一种面向对象的编程语言,它是 C 语言的一个超集。C++ 的设计初衷是提供一种更高效、更安全、更具表达力的语言,它在继承了 C 语言的高效性...
C++的三大特性:封装、继承与多态,是该语言设计的核心概念,它们共同构成了面向对象编程(Object-Oriented Programming,OOP)的基础。下面我们将深入探讨这三种特性,以及它们之间的相互关系。 ### 封装 封装是...
变更记录是C++编码规范中的一个重要方面,它规定了变更记录的格式和内容,包括变更的日期、章节号、变更简述等。 C++编码规范是软件开发过程中非常重要的一环,它规定了C++语言编程的标准和要求,直接影响着软件的...
这份资料旨在帮助学生更好地理解和掌握C++语言的基础知识以及编程技巧,通过解答课后习题来深化对课程内容的理解。 C++是一种强大的、面向对象的编程语言,它在系统编程、游戏开发、嵌入式系统和高性能计算等领域...
虚函数表(Virtual Table),简称vtable,是C++语言中用于支持虚函数功能的一种数据结构。它实际上是一个指针数组,每个元素指向一个虚函数的地址。每个包含虚函数的类都会有一个对应的虚函数表,用于存储该类的所有...
1. **C++编程语言**:这个游戏的实现是基于C++语言的,这是一种静态类型、编译式的通用编程语言,以其高效性、灵活性和强大的功能而受到程序员的喜爱。C++支持面向对象编程,允许创建类、对象和封装方法,这在实现...
预备知识部分为读者提供了C和C++的基础介绍,包括两种语言的简述以及一些基本概念的循序渐进。预备知识中还讨论了类型系统,这在C和C++中是一个核心概念,强调了类型安全以及如何通过引用、运算符重载、new和delete...
C++从C语言发展而来,而C语言又源自B语言,B语言基于BCPL,BCPL则源于CPL,这展示了编程语言之间的传承和创新。 总之,C++的发展史是一部关于编程语言进化的生动教材,它展示了如何通过不断的标准化和改进,来适应...
第一章C++语言概述中,首先介绍了计算机语言的发展历程,从机器语言、汇编语言到高级语言的演变,强调了C++作为一种面向过程和面向对象兼备的高级语言,它的特点在于继承了C语言的高效性,并引入了面向对象编程的...