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



  

相关话题

  以下十种编程语言能在未来替代 Java 和 C 语言么? 
  腾讯开源的 libco 号称千万级协程支持,那个共享栈模式原理是什么? 
  有什么你相见恨晚的轮子? 
  Java设计出checked exception有必要吗? 
  如何看待博客园的整改公告? 
  使用 Visual Studio 开发的情况下 C# 的编程效率能否和 Python、Ruby 媲美? 
  Python3.10的新特性match关键字为什么不会和当前作用域的变量名称match冲突? 
  搜索引擎是怎么知道「羣」是「群」的? 
  各个编程语言都有哪些「亮点」? 
  现在(2021年)OSGi的发展前景如何? 

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





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