本文共 7625 字,大约阅读时间需要 25 分钟。
编程语言开发编程语言
是一种静态类型的通用编程语言,具有类似于C的语法,可编译为本机代码。 由于许多原因,它非常适合开源软件开发; 这里是其中的一些。
在某种情况下发现自己并想完全按照自己的想法在代码中实现它的情况并不少见。 但是,有时您必须折衷该想法以使其适合代码,而不是对代码进行建模以使其适合该想法。 D支持几种 ,包括功能样式,命令式,面向对象,元编程和并发(演员模型),所有这些范例都和谐地集成在一起。 您可以选择适合于建模代码以适合您的想法的任何范式。
通过使用 (生成附加D代码并在编译期间进行编织的功能),您可以将代码描述为编译器生成代码的模式。 这对于设计算法而不将其绑定到特定类型特别有用。 使用模板的通用特性,与平台无关的代码变得容易。 通过将模板与相结合,跨平台应用程序变得更易于实现,并且更有可能从使用不同操作系统的开发人员那里获得收益。 有了这个,一个程序员就可以用更少的代码和有限的时间来取得很多成就。
深入集成到D中的抽象了如何访问容器元素(例如,数组,关联数组,链表等),而不是实际的实现。 这种抽象允许在大量容器类型上设计和使用大量算法,而无需将它们绑定到特定的数据结构。 D的是范围的实现。 最后,您可以在更少的时间内编写更少的代码,并降低维护成本。
开源软件的大多数代码贡献者都是在有限的时间内自愿工作的。 D可让您提高工作效率,因为您可以在更短的时间内完成更多工作。 D中的模板和范围使程序员在编写通用和可重用的代码时提高了工作效率,但就生产力而言,这只是D的优势之一。 D的另一个主要吸引力是,D的编译速度感觉就像是Python,JavaScript,Ruby和PHP之类的解释语言,这使D非常适合快速原型制作。
D可以轻松地与遗留代码交互,从而减轻了移植的需要。 它旨在使自然而然:毕竟,C是旧版,编写良好且经过测试的代码,库和低级系统调用(尤其是Linux)的大师。 C ++代码更大程度上也可以 。 实际上, , , 和是在D技术上可用的一些语言,并且在这些领域中有许多第三方努力将D推向市场。 这使得大量开放源代码库可用于D代码,这与开放源代码软件开发的约定保持一致。
import std. stdio ; // import standard I/O module void main ( ) { writeln ( "Hello, World!" ) ; }
D中的HelloWorld演示
熟悉C类编程语言的任何人都容易理解D代码。 而且,即使对于复杂的代码,D还是很易读的,这使得漏洞很容易发现。 可读性对于吸引贡献者也至关重要,这对开源软件的增长至关重要。
D中一个简单但非常有用的就是支持使用下划线分隔数字,从而使数字更具可读性。 这对于数学特别有用:
int count = 100 _000_000 ; double price = 20 _220.00 + 10.00 ; int number = 0x7FFF _FFFF ; // in hexadecimal system
是一个内置工具,可以轻松地从代码注释中自动生成文档,而无需外部工具。 与代码并存时,文档的编写,改进和更新变得越来越容易。
是经过检查的位置,以确保D代码的行为完全符合预期。 就像签署合法合同以确保各方都在协议中发挥作用一样,D中的合同编程可确保函数,类等的实现始终产生期望的结果或表现出预期的行为。 此类功能实际上对于错误检查很有用,尤其是在开源软件中,其中有几个人在一个项目上进行协作。 合同可以成为大型项目的救命稻草。 D强大的合同编程功能是内置的,而不是事后才添加的。 合同不仅增加了使用D的便利性,而且使编写正确且可维护的代码变得轻而易举。
协作开发可能具有挑战性,因为代码经常更改,并且包含许多活动部分。 D支持在范围内本地导入模块,从而缓解了其中一些问题:
// returns even numbers int [ ] evenNumbers ( int [ ] numbers ) { // "filter" and "array" are only accessible locally import std. algorithm : filter ; import std. array : array ; return numbers. filter ! ( n => n % 2 == 0 ) . array ; }
“!” 与filter一起使用的运算符是的语法。
由于上面的函数不依赖任何全局导入的模块,因此可以在不破坏代码的情况下使用它。 像这样实现的任何功能都可以在以后不破坏代码的情况下进行增强,这对于协作开发是一件好事。
(UFCS)是D中的一种语法糖,它允许调用常规函数,例如对象的成员函数。 函数定义为:
void cook ( string food , int quantity ) { import std. stdio : writeln ; writeln ( food , " in quantity of " , quantity ) ; }
可以按通常的方式调用它,例如:
string food = "rice" ; int quantity = 3 ; cook ( food , quantity ) ;
使用UFCS,可以像cook是成员函数那样调用相同的函数:
string food = "rice" ; int quantity = 3 ; food. cook ( quantity ) ;
在编译期间,编译器自动将food作为函数cook的第一个参数。 UFCS使链接常规函数成为可能,从而使您的代码具有自然的功能样式编程感觉。 UFCS在D中大量使用,就像上面的evenNumbers函数中使用的过滤器和数组函数一样 。 将模板,范围,条件编译和UFCS组合在一起,可以在不牺牲便利性的情况下为您提供强大的功能。
可以使用auto关键字代替类型。 编译器将在编译过程中静态推断类型。 这样可以避免使用长类型名称,并使编写D代码感觉像是一种动态类型的语言。
// Nope. Do you? VeryLongTypeHere variable = new VeryLongTypeHere ( ) ; // using auto keyword auto variable = new VeryLongTypeHere ( ) ; auto name = "John Doe" ; auto age = 12 ; auto letter = 'e' ; auto anArray = [ 1 , 2.0 , 3 , 0 , 1.5 ] ; // type of double[] auto dictionary = [ "one" : 1 , "two" : 2 , "three" : 3 ] ; // type of int[string] auto cook ( string food ) { ... } // auto for a function return type
D的循环允许循环遍历各种下划线数据类型的集合和范围:
foreach ( name ; [ "John" , "Yaw" , "Paul" , "Kofi" , "Ama" ] ) { writeln ( name ) ; } foreach ( number ; [ 1 , 2 , 3 , 4 , 4 , 6 ] ) { ... } foreach ( number ; 0 .. 10 ) { ... } // 0..10 is the syntax for number range class Student { ... } Student [ ] students = [ new Student ( ) , new Student ( ) ] ; foreach ( student ; students ) { ... }
D中内置的支持不仅减轻了对外部工具的需求,还使程序员可以方便地在其代码中实现测试。 所有测试用例都位于可定制的unittest {}块中:
int [ ] evenNumbers ( int [ ] numbers ) { import std. algorithm : filter ; import std. array : array ; return numbers. filter ! ( n => n % 2 == 0 ) . array ; } unittest { assert ( evenNumbers ( [ 1 , 2 , 3 , 4 ] ) == [ 2 , 4 ] ) ; }
使用D的参考编译器DMD,可以通过添加-unittest编译器标志将所有测试编译为最终的可执行文件。
是D的内置软件包管理器和构建工具,可轻松使用越来越多的第三方软件包(库)。 Dub负责在编译过程中下载,编译和链接这些软件包,以及升级到将来的版本。
除了提供几种编程范例和功能之外,D还提供其他选择。 目前,它具有三个编译器,全部都是开源的。 参考编译器DMD带有自己的后端,而其他两个GDC和LDC分别使用GCC和LLVM后端。 DMD以其快速编译速度而著称,而LDC和GDC以产生快速机器代码而著称,而编译时间却很少。 您可以自由选择适合您的用例的。
D的某些部分在使用时默认情况下会被 。 如果愿意,您还可以选择手动内存管理甚至引用计数。 选择全由您决定。
在这个简短的讨论中,我没有涉及D中的几种糖。 我强烈建议您查看 , 隐藏的宝藏以及以了解人们在更多信息。 许多组织已经 最后,如果您准备开始学习D,请阅读《 》一书。
翻译自:
编程语言开发编程语言
转载地址:http://bfjzd.baihongyu.com/