百科问答小站 logo
百科问答小站 font logo



多核和分布式的编程环境促使产生了并发编程语言,那么它和传统的编程语言有什么本质的不同? 第1页

  

user avatar   chen-fu-zhou 网友的相关建议: 
      

谢谢邀请。

当谈到并发和并行时,不同的应用领域对这两个词的定义很不一样。服务端编程中,很少说「并行」的概念,而「并发」则有,指的是服务器处理同时到来的请求的能力。客户端编程中,并发和并行同时存在。此时「并发」主要指的是单 CPU 处理下的分时多进程/多线程;而「并行」则指的是多 CPU(或 GPU) 情况下的「真实」多进程/多线程处理。另外,在大数据领域,将输入数据分片切割分配到不同机器上同时处理,也被说成「并行」,可算是服务器场景中的一种。

从上面这个定义看,如今我们没有对所谓「并发编程语言」或「并行编程语言」的明确定义,自然也谈不上说哪一种语言可以被标上这种名字。如果非要说有,Erlang 大概算是唯一的一个:它是把多进程(当然它的进程和操作系统的进程概念还有差别)的构造和通讯内建在语言设施里的。其他语言多半将多进程或多线程的管理以函数库的形式存在。

很难说 Erlang 这种做法是好是坏。计算机程序设计语言的发展历史上,对功能的实现方式一直有两种争论:一种提倡在语言级别实现尽量少的实际功能,把它们推到库函数里面实现,比如 C++;一种则倾向于在语言级别实现各种常见功能,比如 Perl。两种做法各有利弊:内建于语言实现的好处是写法更简洁,但缺点是一旦实现有缺陷则无法替代;库函数方案正好相反,带来了功能上的灵活,却会导致语言复杂化。所以事实上,多数语言的设计者都做了权衡,只将某些确实常用的功能设施内建于语言。并行/并发作为一种功能也不例外,但像 Erlang 这样的处理,比较少见。

所谓「本质」不同,我倒是要反过来问一句——请问汇编到C,有什么「本质」不同?C 到 C++,有什么「本质」不同?说到底,我们还是在冯・诺伊曼的体系里,做的还是程序存储和程序执行,即使是目下号称的所谓无状态的「纯函数」语言,也不得不偷偷地用各种概念保留程序存储,只是让自己看上去似乎是无状态而已。我看不到从那时到现在,程序设计语言上有什么「本质」的变化,即使有,也不是程序设计语言能够反映出来的。

最后纠正题目中的几个错误:

  1. 传统的函数式语言不是由 lambda 演算发展而来——是的,lambda 演算不是程序设计概念,而是形式系统的一部分,属于数学概念。Scheme 之所以将匿名函数命名为 lambda,只是因为当年 Scheme 的设计者们曾经是数学家,一个历史的巧合。我们用匿名函数实现的程序,也不是在做 lambda 演算。
  2. 解释器/编译器级别的表达式乱序求值优化和并行或并发编程不是一回事。把两者混为一谈,是对编译一知半解的计算机「科学家」们最容易犯下的错误之一(我还见过把 NFA 的正则表达式求值称作「并发」的,槽都不知道怎么吐)。所以,指称 Haskell 之流「善于并发」之类的说法,完全可以一笑置之。



  

相关话题

  我该放弃.NET吗? 
  Node.js、Scala、Clojure 等声称适合高并发的语言,分别具体适用于什么情景,何种任务? 
  是不是后置类型语言的函数一定要加关键字,不加关键字编译器识别不出吗? 
  对同一个套接字,在两个线程中都对其调用recv函数,需要对其互斥保护吗? 
  对于初入职场的程序员, 读书 读好的代码 造轮子 哪个更重要? 
  我在编程时给变量命名总觉得困难,有没有什么实用技巧? 
  Java 和 C# 最大的不同是什么? 
  为什么大多数程序员不看好图形化编程? 
  如何通俗易懂解释 Java 语言所谓「一次编写,到处运行」的特性? 
  如何评价 Golang 1.5 更新? 

前一个讨论
在海外的台、港、陆的华人怎样看待彼此?
下一个讨论
创业和做生意的区别是什么?





© 2025-01-18 - tinynew.org. All Rights Reserved.
© 2025-01-18 - tinynew.org. 保留所有权利