我们知道 D 语言能够直接调用 C 函数,看起来好像 D 语言直接构建在 C 语言内存模型上似的。如果我们毫不在乎多核——大规模并行架构所带来的处理能力,或许这还是个好消息,就这样用好了。但如今多核时代已经来临,而 C 语言的那套处理方式则已极端过时和漏洞百出。其他的过程式和面向对象语言仅仅为此做了点点的改善。再就是函数式编程语言的情况,它依赖于不变性优雅的回避了很多并行相关的问题。
作为一个相对新生的语言,D 语言处在一个相当有利的形势。当它进入多线程世界时,可以综合考量、取舍很多东东,而且 D 语言的内存模型在某一方面和很多其他语言完全不同。你可以思考一下,经典的线程是不是如下这样工作:你调用了一个原语来启动一个新线程,然后新线程能够立即看到和访问程序中的任何数据。作为一个可选项,且按照依赖操作系统的晦暗模糊来说,线程也可以获得所谓的线程私有数据来为己所用。总之呢,内存默认是被所有线程所共享的。这种方式昔日已经引起人间腥风血雨无数,直到今天仍然在继续造就新的人间地狱。当初之所以留下这么多人间恨事,主要是因为并发更新的笨拙本质:它很难被正确追踪和同步,以至于不能自始至终的良好保持数据。但是人们仍然趋之若鹜,因为共享内存的观念非常接近于底层硬件的真实模型,而且使用得当的话,效率也非常高。现在是脱离这人间地狱的时候了。今天借助于内存容量的快速增长,需要共享的机会有所减少。关于现代硬件的事实是,处理器之间通讯通过深层分级存储器制度。而这其中每个核心很大一部分保持私有。因此共享内存方式也很难再发挥作用,它快速成为程序变慢的方式之一。因为存储器物理移动的次数和距离也快速增加了。
当传统命令式语言和这些问题缠斗的时候,函数式语言从数学中汲取智慧,另辟其径:命令式傻小子们,我们根本不关心硬件模型,而只关心纯粹的数学模型。因为数学大部分不会变化,而且时间恒定,因此成为并行计算的理想候选人。(想象一下,那些第一批从数学家转程序员的家伙听到并行计算的时候,肯定会直拍自己的前额:“等一下,等一下...”译注:我对 Andrei 老大讲笑话的水平真是不敢恭维)在函数式编程圈子里都知道这样的一个计算模型天生喜爱无序、并行执行,但是它的潜能直到近来才被挖掘出来。今天,越来越清楚地显示函数式的,mutation-free的编程方式至少会成为并行程序设计的一部分。
那么 D 的定位呢。D 对于并行有个基本的必要概念:
内存默认线程私有,按需共享。
在 D 中,所有的内存都是默认线程私有。即使是那些丑陋的全局变量也会被分配给每个线程。如果你想要共享,就需要在对象前面加上 shared 修饰符,这也就是说,该对象可以立即被其他线程可见。更为重要的是,D 语言类型系统了解共享数据,且限制它能够做什么以便确保同步机制能自始至终地被正确使用。这个模型可以很好的避免那些默认线程共享编程语言所带来的诸多同步棘手问题。在那些语言中,类型系统根本无法知道哪一个数据需要共享,哪一个不需要。所以它只能信任程序员,让他们来适当的标明共享数据。但是这样,就会产生很多麻烦,各种各样的场景都需要特别规则说明,比如非共享数据,已标明的共享数据,未标明但实际是共享数据,还有混合情况。Oh,yeah...
多核支持目前是非常活跃的一个研发领域,真正实际的良好模型还没有发现。D 语言把线程私有内存模型作为基础设施,只是为以下这些基础设施做些方便之处:纯函数、lock-free 原语,旧有的基于锁机制的良好编程机制、消息队列(计划中)等等。更高级的特性,比如所有权类型也在讨论中。
译注:基本上第3部分除了“内存默认线程私有,按需共享”这句之外,没多少东西,呵呵。依据业界多年的经验来看,并行这块领域根本没有银弹可言。
分享到:
相关推荐
"Scala for the Impatient" 和 "Programming in Scala" 是两本广受赞誉的Scala学习资源,由该领域的权威专家撰写。 "Scala for the Impatient"(快学Scala)是Cay S. Horstmann的作品,这本书针对那些时间紧迫,...
##### 第3章 解答 - 本章节解答可能涉及流水线设计的基本原理、流水线性能评估等方面的知识点。 ##### 第4章 解答 - 本章节解答可能涵盖高级流水线设计、分支预测技术等更深层次的内容。 ##### 第5章 解答 - 本...
3. **第3章:控制流程语句** - 条件语句(if-else, switch-case) - 循环语句(for, while, do-while) 4. **第4章:面向对象编程基础** - 类与对象的概念 - 封装、继承与多态性 - 构造器与析构器 5. **第5...
第3章 我编写过的最漂亮代码 3.1 我编写过的最漂亮代码 3.2事倍功半 3.3 观点 3.4 本章的中心思想是什么? 3.5 结论 3.6致谢 第4章 查找 4.1. 耗时 4.2. 问题:博客数据 4.3. 问题:时间,人物,以及对象? 4.4. 大...
在这一章,我们将学习如何使用if-else语句、switch-case语句进行条件判断,以及for循环和while循环的运用。此外,还将涉及break和continue语句,以及函数的定义和调用。 第4章:数组与矩阵操作 本章深入讨论数组和...
学习如何使用VB.NET内置的调试工具和第三方单元测试框架(如NUnit),可以帮助确保代码质量,及时发现和修复问题。 通过深入学习以上知识点,开发者可以熟练地运用VB.NET进行各种类型的应用开发,从简单的控制台...
2. 控制流:任务可能涵盖了条件语句(如if-else,switch-case)和循环(如for,while,foreach),这些是程序逻辑的重要组成部分。 3. 函数和方法:函数是代码的可重用模块,C#中的方法允许我们将一组操作封装在...
8. **JVM内存管理**:理解JVM的内存模型和垃圾收集机制对于优化程序性能至关重要。代码可能会涉及内存泄漏检测、性能调优等方面,帮助开发者更好地理解和控制Java应用程序的内存行为。 9. **Spring框架**:Spring是...
3. **控制流语句**:包括条件语句(if-else)、循环语句(for和while)以及开关语句(switch-case),用于实现程序的逻辑控制。 4. **函数定义与调用**:MATLAB允许用户自定义函数,函数可以接受输入参数并返回输出...
手册的第二部分可能更侧重于高级主题和特定应用领域,如模拟与仿真、控制系统设计、金融建模等。学习并掌握这些知识点,将使用户能够熟练地在MATLAB环境中解决实际问题,实现科学计算和工程应用的高效编程。
Go语言通过goroutines和channels提供了简洁而高效的并发模型。 1. Goroutines Goroutines是Go语言中的轻量级线程,它们比操作系统级别的线程更加轻便,启动和销毁的开销小。通过使用`go`关键字,我们可以轻松地启动...
**第三章:基础语法** 在这里,我们将深入学习FORTRAN的基础语法,包括变量声明、数据类型(如实型、整型、字符型等)、控制结构(如IF语句、DO循环、CASE选择结构)以及输入输出操作。这些是编写任何FORTRAN程序的...
Ruby的基础部分涵盖了变量、数据类型、控制结构(如if语句、case语句、循环)、函数和方法。理解这些基础知识是学习任何编程语言的第一步。Ruby的变量分为局部变量、实例变量、类变量和全局变量,每种都有其特定的...
1. **Amdahl/Case规则**: 平衡的计算机系统大约需要1MB的主要内存容量和1兆比特/秒的I/O带宽,每MIPS的CPU性能。 - **解释**: 这个规则提供了一个基本的硬件配置建议,有助于构建一个均衡发展的系统。 2. **90/10...
其独特的进程模型和消息传递机制不仅使得并发编程变得简单直观,而且能够有效地处理大量并发请求,非常适合构建高可用性、高容错性的分布式系统。对于需要处理大规模并发连接的应用来说,Erlang 提供了一个非常优秀...
文档明确指出所有版权属于Accellera Organization, Inc.,并且未经其书面许可,不得以任何形式复制或分发该文档给任何第三方。此外,文档还包含了对使用Accellera标准的声明,强调了使用这些标准是完全自愿的行为,...