“最终分布式编程”和“功能编程”之间有什么区别

时间:2019-08-04 08:32:33

标签: javascript functional-programming eventual-consistency

我读了Douglas Crockford的书“ Javascript如何工作”。他通过撰写

总结了这本书
  

我认为到现在为止,下一个范例是分布式最终编程应该是显而易见的。这不是一个新的想法。至少可以追溯到Actor Model(1973)-(位置1608)的发现。

我不理解分布式最终编程范例与功能编程范例有何不同。它们是重叠的概念吗?

1 个答案:

答案 0 :(得分:0)

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

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

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

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

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

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