什么是实用的非冯·诺依曼架构?


16

非冯·诺依曼编程模型是否有实际应用?什么是最广泛采用的非冯·诺依曼编程语言?


6
什么是“非冯·诺依曼”编程模型?
Suresh Venkat 2012年

我也不明白这个问题,也许您可​​以为问题添加一些背景知识,以便更轻松地理解您的要求。
卡夫

3
冯·诺依曼架构具有CPU。因此,并行处理体系结构可以说是非冯·诺依曼(Neumann体系结构是在并行处理之前发明的)。但同意这个问题似乎模棱两可或模糊不清。冯·诺依曼(von neumann)指的是计算机体系结构,并不是真正的编程模型。编程模型和cpu /计算机体系结构以某种协同/共生的方式存在,但又彼此独立。...不同的体系结构可以实现不同的编程模型,而无需将编程模型“耦合”到体系结构...
vzn12年

1
什么是非冯·诺依曼编程语言?因此,什么是冯·诺依曼编程语言?(我没有发现Backus的定义-本质上是“命令式语言”-甚至有点引人注目。)
Jeffε2012年

1
@Ronny:Wikipedia页面只是模仿了Backus的文章。
Jeffε

Answers:


12

当我说“冯·诺依曼架构”时,我的意思是受“冯·诺依曼瓶颈”限制的某些硬件-即,它的所有数据都通过狭窄的数据总线传输。

我最常遇到的非von Neumann编程语言是VHDLVerilog。在VHDL和Verilog中,默认情况下,所有操作均同时发生。程序员必须付出额外的努力才能使一系列事件按顺序发生。这与大多数其他编程语言有很大的不同,其他语言暗示默认情况下,“指令指针”默认在任一时刻最多执行一行代码,并且程序员必须付出更多的努力才能使多个事情同时发生时间。

有人会说这是更自然的默认设置。许多刚开始编程的学生都希望在x等于零的瞬间退出“ while(x> 0){...}”循环,他们惊讶地发现计算机没有连续评估该条件。

大多数编写VHDL和Verilog代码的人都将他们的程序编译到FPGA上,从而创建了很少的活动块,这些活动块始终保持全速运行。通常,这样的人会建立一条“流水线”,从输入引脚读取数据,通过一系列模块进行处理,一个模块的输出引脚直接连接到下一个模块的输入引脚,最后一个模块将结果发送出去输出引脚。它使人联想到Unix管道,不同之处在于,每个时钟周期都会传入一个新的数据,并产生一个新的数据。

输入引脚,中间级和输出引脚彼此独立-您不必重复使用在各个数据段之间多路复用的单个数据总线。

您可能还会对此感兴趣:von neumann / turing体系结构之外还有其他计算机体系结构吗?


11

我以非冯·诺伊曼(Von Neumann)来假设,您的意思是按照巴克斯(Backus)的论文“可以从冯·诺伊曼风格中解放编程吗?”绕过“冯·诺伊曼瓶颈”的语言。对于那些感兴趣的人,可以在这里找到副本:http : //www.thocp.net/biographies/papers/backus_turingaward_lecture.pdf

您的问题的答案由于某些原因而必须模棱两可。

首先,哪种语言满足他的论文中的标准?尽管有一些人将函数式编程追溯到了本文,但是由于他的意思是无点编程,因此现在被人们误解了。那么,您是否怀有最初的误解或论文的真实意图?有关他的含义的详细说明,请参见以下内容:http : //en.wikipedia.org/wiki/Function-level_programming

第二,如果您误解了,那么功能如何发挥作用?您拥有纯功能语言,不纯功能语言以及对功能范例相对友好的语言。考虑到您提到流行度,并且它与功能纯度之间存在反比关系,那么应该包括哪些语言?您是要使用最流行的纯功能语言(根本不会流行)还是要满足某些“功能性”最低标准的更流行的语言?如果是后者,这些标准是什么?

因此,根据您的观点:

  1. Haskell是我所知道的最流行的完全纯函数式语言,并且其中编写了一些应用程序。但是,尽管在功能编程社区中占有一席之地,但在大型编程社区中并不流行。另外,使用它后,我觉得它在现实世界中并不实用,并且似乎在理论上很有价值。它确实允许无指向性的样式,因此您可以以此来实现Backus的一些目标。

  2. Clojure,Scala和F#不够纯净,但实用性和流行性更高。F#对无点样式也很友好。

  3. Forth可能是无点语言的原型示例,并且在当时非常流行,尽管现在... Factor是另一种获得关注的无点语言,但是我怀疑它是否与Forth的鼎盛时期相匹配。

  4. Backus在某一时刻(也许不是在他的论文中)提到APL是迈出的一步,但并不完全符合他的目标。当时,它在金融领域非常重要。确保检查出其后代,例如J。

  5. JavaScript不起作用,但是它对高级编程风格非常友好,这可以通过大量使用闭包来证明。鉴于其受欢迎程度,它可能仅符合条件。确保检查使用JavaScript完成的一些有趣的工作,例如currying和combinator实现。

作为一个脚注,为了使您对他的目标有更多的了解,您可以查看他为满足自己的条件而设计的两种语言。它们并不是在所有AFAIK上都不受欢迎,因此这纯粹是出于知识的考虑:

http://en.wikipedia.org/wiki/FP_(programming_language

http://en.wikipedia.org/wiki/FL_(programming_language


1
现在看来,他的意思是像无点编程而不是函数式编程 -是否有一些讨论的指针?听起来不错。
Suresh Venkat

Backus的编程模型称为“功能级编程”,此处有一篇文章:en.wikipedia.org/wiki/Function-level_programming。我不知道任何真正好的链接(很想知道您是否找到了!),但是使用Google搜索“函数级编程”会发现一些有趣的链接,包括视频。
罗尼

1
@SureshVenkat:FP和FL语言是Backus专门为支持他的功能级编程思想而创建的。另请参阅“默认编程”,更具体地讲是J语言,该语言结合了APL和FP / FL来创建实际使用中可能是最隐秘和最具表达力的通用语言。我还记得关于SO在函数式语言中使用默认编程的文章。
CA McCann

顺便说一句,这篇文章中的时间顺序似乎大不相同。函数式编程(在Lisp和ML的传统中)早于Backus的Turing奖演讲,大多数或所有现有编程范例也是如此,包括以组合逻辑形式出现的函数级编程本身,其形式早于Church的lambda微积分和Turing的致力于计算理论!(哦,我愿意将Haskell用于实际的现实目的,而不是像Javascript这样的a弱。)
CA McCann 2013年

@camccann我从未在帖子中设置年表。此外,Lisp的范围太广,无法支持任何主张。例如,并非所有Lisps都起作用,因为并非全部都是尾递归。我喜欢您对组合逻辑的引用,但是我认为Backus的意思是拥有一种语言,可以使用支持该范例的计算机对计算机进行编程。因此,尽管“组合逻辑”阐明了他的观点,但最终并没有影响他的观点。
罗尼

2

我认为Linda和tuplespace编程可以满足要求。具有并发性的关联/模式匹配内存操作意味着(在概念上)消除了Von-Neuman瓶颈。

朝着这个方向发展,一种纯Actor模型语言也可以对通信进行建模,而不是对指令进行排序。尽管它们是形式主义,而不是实际的编程语言,但是像Pi演算,CSP和Petri Nets这样的过程计算都以相关方式对通信进行建模。

请参阅Wikipedia中的链接(我是新用户,并且处于垃圾邮件保护之下),但是对于Linda的名字有些幽默,请阅读http://c2.com/cgi/wiki?LindaEtymology

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.