D语言(Dlang)简介
fmms
13年前
<p><a href="/misc/goto?guid=4959517456516661940"><img id="logo" border="0" alt="D语言(Dlang)简介" src="https://simg.open-open.com/show/16c815a0c2df5a1cfd607b1145ce1192.png" width="125" height="95" /></a><br /> D语言(Dlang)是由Digital Mars公司开发的编程语言,起因是为了改进C++。它与C二进制兼容(不完全),可编译为本地码,有GC也可手动管理内存,语法上借鉴多种语言,模板则 在C++的基础上做了相当大的扩充。D 语言既有 C 语言的强大威力,又有 Python 和 Ruby 的开发效率。它是一种集垃圾回收、手工内存操作、契约式设计、高级模板技术、内嵌汇编、内置单元测试、Mixin 风格多继承、类 Java 包管理机制、内置同步机制、内建基本运行时信息的系统级编程语言。</p> <p>D语言是一种通用的系统和应用编程语言。它是比 C++ 更高级的语言,同时还保持了生成高效代码以及直接访问操作系统API和硬件的能力。D 很适合于编写从中等规模到那些由团队合作完成、数百万行代码规模的各种程序。D 易于学习,为编程者提供了很多便利,并且适用各种野心勃勃的编译器优化技术。</p> <p>D 不是脚本语言,也不是一种解释型语言。它不需要虚拟机、宗教、或者高于一切的哲学。它是给实际的编程者使用的实际的语言,它帮助编程者快速、可靠的完成易于维护、易于理解的代码。</p> <p>D 是数十年来实现多种语言编译器的经验的积累,是用那些语言构造大型工程的尝试的积累。D 从那些语言(主要是 C++ )那里获得了灵感,并使用经验和现实世界中的实用性来驯服它。</p> <p>为什么是 D ?</p> <p>确实,为什么?有谁需要另一种编程语言?</p> <p>自从 C 语言被发明以来,软件工业走过了一段很长的路。许多新的概念被加入了 C++ 中,但同时维护了同 C 的向后兼容性,包括兼容了原始设计中的所有的弱点。有很多修正这些弱点的尝试,但是兼容性是最大的困扰。同时,C 和 C++ 都在不断引入新的特性。这些新特性必须被小心的加入到现有的结构中,以免重写旧的代码。最终的结果十分复杂—— C 标准将近 500 页,C++ 标准大概有 750 页!C++ 实现起来既困难又代价高昂,造成的结果就是各种实现之间都有差别,因此很难写出完全可以移植的 C++ 代码。</p> <p>C++ 程序员倾向于使用语言中的孤岛来编程,也就是说,他们倾向于十分精通语言中的某个特性而避免使用其他特性。尽管代码通常在编译器之间是可移植的,但在程序 员之间移植就不那么容易了。C++ 的一个长处是它支持很多根本上不同的编程风格——但从长远来看,互相重复和互相冲突的风格会给开发带来妨碍。</p> <p>C++ 在标准库而不是语言核心中实现了可改变大小的数组和字符串拼接等。不在语言核心中实现这些功能造成了几种不太理想的结果。</p> <p>是否能把 C++ 的能力释放、重新设计并重铸到一门简单、正交并实用的语言中呢? 这种语言是否能做到易于正确实现,并使编译器有能力有效地生成高度优化的代码呢?</p> <p>现代编译器技术已经取得了很大的进步,有些原来用作原始编译技术的补充的语言特性已经可以被忽 略了(一个这样的例子是 C 语言中的‘register’关键字,一个更为微妙的例子是 C 中的宏预处理程序)。我们可以依赖现代编译器的优化技术而不是使用语言特性(如同原始的编译器所做的那样)来获得可以接受的代码质量。</p> <p>下面是一段D语言的代码示例。</p> <pre class="d_code">#!/usr/bin/dmd -run<span style="color:green;">/* sh style script syntax is supported */</span> <span style="color:green;">/* Hello World in D To compile: dmd hello.d or to optimize: dmd -O -inline -release hello.d */</span> <span style="color:blue;">import</span> std.stdio;<span style="color:blue;">void</span> main(<span style="color:blue;">char</span>[][] args) { writefln(<span style="color:red;">"Hello World, Reloaded"</span>); <span style="color:green;">// auto type inference and built-in foreach</span> <span style="color:blue;">foreach</span> (argc, argv; args) { <span style="color:green;">// Object Oriented Programming</span> CmdLin cl = <span style="color:blue;">new</span> CmdLin(argc, argv); <span style="color:green;">// Improved typesafe printf</span> writefln(cl.argnum, cl.suffix, <span style="color:red;">" arg: %s"</span>, cl.argv); <span style="color:green;">// Automatic or explicit memory management</span> <span style="color:blue;">delete</span> cl; } <span style="color:green;">// Nested structs and classes</span> <span style="color:blue;">struct</span> specs { <span style="color:green;">// all members automatically initialized</span> <span style="color:blue;">int</span> count, allocated; } <span style="color:green;">// Nested functions can refer to outer</span> <span style="color:green;">// variables like args</span> specs argspecs() { specs* s = <span style="color:blue;">new</span> specs; <span style="color:green;">// no need for '->'</span> s.count = args.length; <span style="color:green;">// get length of array with .length</span> s.allocated = <span style="color:blue;">typeof</span>(args).sizeof; <span style="color:green;">// built-in native type properties</span> <span style="color:blue;">foreach</span> (argv; args) s.allocated += argv.length * <span style="color:blue;">typeof</span>(argv[0]).sizeof; <span style="color:blue;">return</span> *s; } <span style="color:green;">// built-in string and common string operations</span> writefln(<span style="color:red;">"argc = %d, "</span> ~ <span style="color:red;">"allocated = %d"</span>, argspecs().count, argspecs().allocated); }<span style="color:blue;">class</span> CmdLin { <span style="color:blue;">private</span> <span style="color:blue;">int</span> _argc; <span style="color:blue;">private</span> <span style="color:blue;">char</span>[] _argv;<span style="color:blue;">public</span>: <span style="color:blue;">this</span>(<span style="color:blue;">int</span> argc, <span style="color:blue;">char</span>[] argv) <span style="color:green;">// constructor</span> { _argc = argc; _argv = argv; } <span style="color:blue;">int</span> argnum() { <span style="color:blue;">return</span> _argc + 1; } <span style="color:blue;">char</span>[] argv() { <span style="color:blue;">return</span> _argv; } <span style="color:blue;">char</span>[] suffix() { <span style="color:blue;">char</span>[] suffix = <span style="color:red;">"th"</span>; <span style="color:blue;">switch</span> (_argc) { <span style="color:blue;">case</span> 0: suffix = <span style="color:red;">"st"</span>; <span style="color:blue;">break</span>; <span style="color:blue;">case</span> 1: suffix = <span style="color:red;">"nd"</span>; <span style="color:blue;">break</span>; <span style="color:blue;">case</span> 2: suffix = <span style="color:red;">"rd"</span>; <span style="color:blue;">break</span>; <span style="color:blue;">default</span>: <span style="color:blue;">break</span>; } <span style="color:blue;">return</span> suffix; } }</pre> <p><strong>项目主页:</strong><a href="http://www.open-open.com/lib/view/home/1326978342530" target="_blank">http://www.open-open.com/lib/view/home/1326978342530</a></p>