百科问答小站 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 之流「善于并发」之类的说法,完全可以一笑置之。



  

相关话题

  编程那么难,为什么不弄一个大众一学就会的计算机语言呢? 
  程序员中的单个方法的行数极限是几行?80?200?500? 
  为什么编程语言都是上下文无关文法,不能采用上下文有关文法吗? 
  有不少人鼓吹中文编程,这些人都是骗子吧? 
  如何评价C# 6的新特性? 
  为什么微软不出一门像 Go 或者 Rust 的跨平台系统级语言? 
  编程语言会影响程序员的性格吗? 
  如何评价Apache(Apache Software Foundation)? 
  你什么时候对 Java 感到绝望? 
  编程语言发展史上有哪些趣事? 

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





© 2024-09-19 - tinynew.org. All Rights Reserved.
© 2024-09-19 - tinynew.org. 保留所有权利