`
qiezi
  • 浏览: 497807 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

简述D语言对C++的改良

阅读更多
说是改良,不过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++简述小程序

    C++是一种高效、灵活且功能强大的编程语言,是C语言的扩展。在C++中编写程序,主函数(main function)是程序执行的入口点。在本节内容中,我们将详细解释C++小程序的结构和相关知识点。 首先,C++程序的主函数格式...

    c++语言课程设计(第四版)课后习题

    例如第一章:1-1 简述计算机程序设计语言的发展历程。 解: 迄今为止计算机程序设计语言的发展经历了机器语言、汇编语言、高级语言等阶段,C++语言是一种面向对象的编程语言,也属于高级语言。 1-2 面向对象的编程...

    dev C++ 的使用简述

    Dev C++ 是一款轻量级的C++集成开发环境(IDE),特别适合初学者学习C++编程语言。它集成了编译器、编辑器、调试器等开发工具,为程序员提供了一个简洁而高效的开发环境。 **一、Dev C++安装与界面** 1. **安装...

    C++复试和面试题汇总

    1、简述 C++语言的特点 • C++在 C 语言的基础上引入了面向对象的机制,同时兼容 C 语言; • C++面向对象包括了封装、继承、多态三大特性; • C++语言生成的代码质量高,运行效率高; • C++增加了 const ...

    Java入门--简述Java语言回收机制

    与C++等需要手动管理内存的语言不同,Java通过内置的垃圾回收器(Garbage Collector, GC)自动管理对象的生命周期,简化了内存管理的同时也提高了程序的安全性和稳定性。 #### 二、垃圾回收的基本概念 1. **什么是...

    简述vhdl语言的特征

    6. 设计的可验证性:VHDL语言允许设计者在硬件物理实现之前对设计进行充分的仿真和验证,这种预实现阶段的仿真能够发现设计的逻辑错误,提高设计的成功率。 7. 硬件与软件的结合:VHDL的设计不仅限于硬件描述,它还...

    数据挖掘简述及R语言基础

    数据挖掘简述及R语言基础数据挖掘简述及R语言基础数据挖掘简述及R语言基础

    程序设计语言简述程序设计语言简述.doc

    程序设计语言简述 程序设计语言是计算机科学和软件工程中最基础的概念之一。它是计算机能够为人工作的基础,因为计算机只能根据机器语言指令来执行程序,高级语言程序必须通过翻译变成机器语言程序,这个工作一般是...

    C++语言教学思考c加加语言程序设计视频教学1.pdf

    在教授面向对象编程时,可以简述程序设计语言原理中的相关概念,帮助学生理解C++的类和对象设计。 通过这样的整合化教学,可以克服学生在学习C++时遇到的知识断层,提高教学效率,使学生在掌握C++语法的同时,也能...

    C++期末考试试题及答案

    ### C++期末考试知识点解析 #### 一、实体与函数调用问题 **题目描述**: 此题涉及到了两个实体“矩形”和“旗杆”,以及对应的...通过这些知识点的学习,可以帮助学生更好地理解和掌握C++语言的基础与高级特性。

    C++ for quantitative finance

    **2.1 C++的历史简述** C++ 是由 Bjarne Stroustrup 在 1979 年开始设计的一种面向对象的编程语言,它是 C 语言的一个超集。C++ 的设计初衷是提供一种更高效、更安全、更具表达力的语言,它在继承了 C 语言的高效性...

    c++的三特点

    C++的三大特性:封装、继承与多态,是该语言设计的核心概念,它们共同构成了面向对象编程(Object-Oriented Programming,OOP)的基础。下面我们将深入探讨这三种特性,以及它们之间的相互关系。 ### 封装 封装是...

    C++编码规范 word 版本

    变更记录是C++编码规范中的一个重要方面,它规定了变更记录的格式和内容,包括变更的日期、章节号、变更简述等。 C++编码规范是软件开发过程中非常重要的一环,它规定了C++语言编程的标准和要求,直接影响着软件的...

    C++语言程序设计课后答案(清华大学郑莉版)

    这份资料旨在帮助学生更好地理解和掌握C++语言的基础知识以及编程技巧,通过解答课后习题来深化对课程内容的理解。 C++是一种强大的、面向对象的编程语言,它在系统编程、游戏开发、嵌入式系统和高性能计算等领域...

    C++虚函数实现原理

    虚函数表(Virtual Table),简称vtable,是C++语言中用于支持虚函数功能的一种数据结构。它实际上是一个指针数组,每个元素指向一个虚函数的地址。每个包含虚函数的类都会有一个对应的虚函数表,用于存储该类的所有...

    c++小游戏-汉诺塔

    1. **C++编程语言**:这个游戏的实现是基于C++语言的,这是一种静态类型、编译式的通用编程语言,以其高效性、灵活性和强大的功能而受到程序员的喜爱。C++支持面向对象编程,允许创建类、对象和封装方法,这在实现...

    经典C和C++代码精粹

    预备知识部分为读者提供了C和C++的基础介绍,包括两种语言的简述以及一些基本概念的循序渐进。预备知识中还讨论了类型系统,这在C和C++中是一个核心概念,强调了类型安全以及如何通过引用、运算符重载、new和delete...

    简述c++ 发展史

    C++从C语言发展而来,而C语言又源自B语言,B语言基于BCPL,BCPL则源于CPL,这展示了编程语言之间的传承和创新。 总之,C++的发展史是一部关于编程语言进化的生动教材,它展示了如何通过不断的标准化和改进,来适应...

    C++语言程序设计完整版ppt全套电子教案整套教学教程.ppt

    第一章C++语言概述中,首先介绍了计算机语言的发展历程,从机器语言、汇编语言到高级语言的演变,强调了C++作为一种面向过程和面向对象兼备的高级语言,它的特点在于继承了C语言的高效性,并引入了面向对象编程的...

Global site tag (gtag.js) - Google Analytics