【问题标题】:Whats the difference between 'Eventual Distributed Programming' and 'Functional Programming'“最终分布式编程”和“函数式编程”有什么区别
【发布时间】:2019-08-04 08:32:33
【问题描述】:

我阅读了 Douglas Crockford 的《Javascript 工作原理》一书。他以写作结束这本书

我认为现在应该很明显下一个范式是分布式最终编程。这不是一个新的想法。它至少可以追溯到演员模型的发现(1973 年)-(位置 1608)。

我不明白分布式最终编程范式与函数式编程范式有何不同。它们是重叠的概念吗?

【问题讨论】:

  • 我也想澄清一下,特别是关于他的评论,即 javascript “专门为进行分布式最终编程而创建”。我的猜测是早期对事件监听器的引用。但它是如何分布的呢?

标签: javascript functional-programming eventual-consistency


【解决方案1】:

区别在于控制流。在一个非常简化的视图中:

  • 在命令式编程中,程序语句的顺序决定了控制流:语句按照您编写它们的顺序一个接一个地执行 - 显式控制流语句(if/else、for、while 等)除外。
  • 在函数式编程中,函数调用的嵌套决定了控制流:如果一个函数f依赖于函数g的结果,f 将在 g 之后执行,无论它们在源代码中出现的顺序。
  • 在最终的编程模型中,函数按照它们在队列中出现的顺序执行。如果您的函数 f 将函数 g 和 h 排入队列,那么 g 和 h 将按照它们在队列中出现的顺序执行。排队顺序不一定是你的源码中出现g和h的顺序;它可能取决于一些外部事件,例如超时或按键。

最终模型适用于命令式和函数式范式 - 如 JavaScript 所示,它允许您编写命令式和函数式代码。自 Unix 早期以来,操作系统本身就一直在使用事件队列,甚至第一个 Windows GUI(在单进程 DOS 之上)也有一个事件队列。我想 Crockford 所指的是将事件队列作为程序运行时系统的基本部分,而不是操作系统;也就是说,单个程序的控制流从根本上是由其事件队列决定的,而不是您通过排序语句(命令式范式)或嵌套函数调用(函数式范式)构建的控制流。

分布式部分呢?最终编程可以是单线程的,就像在任何 JS 运行时一样:有一个线程轮询事件队列并一个接一个地执行入队的函数。在幕后,通常有一些机制可以将程序外部生成的事件排入队列,例如鼠标单击或网络上的传入请求。这种机制可能是硬件级别的中断,也可能是更高级别的操作系统服务(如 Node 的 V8 运行时或任何浏览器运行时)。

分布式现在意味着您可以拥有多个通过消息进行通信的最终程序(也称为 Actor 模型)。如果事件队列物理分布在多台机器上,或者它们只是在本地的不同进程中运行(您的 JS 运行时为每个浏览器选项卡或窗口都有一个单独的事件队列),则无关紧要。

因此,函数式编程和分布式最终编程是不同但互补的范例。我理解 Crockford 说我们应该使用最终编程和异步消息传递来编排高度交互的计算并且涉及托管在 Internet 上的服务,而不是运行通过同步远程通信的非最终(即顺序并因此阻塞)程序过程调用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-09-06
    • 1970-01-01
    • 2013-07-23
    • 2012-01-02
    • 2015-08-21
    • 2010-12-09
    • 2018-05-06
    相关资源
    最近更新 更多