Erlang进程与Java线程

Erlang进程与Java线程,第1张

Erlang进程与Java线程

在我之后重复: “这些是不同的范例”

大声说20次左右-这是我们目前的口头禅。

如果我们 真的 必须比较苹果和橙子,那么至少要考虑一下“成为水果”的共同方面在哪里相交。

Java“对象”是Java程序员的基本计算单位。也就是说, 对象 (基本上是具有臂和腿的结构,比C
++更严格地执行了
封装)是建模世界的主要工具。您认为“此对象知道/拥有

Data{X,Y,Z}
并执行
Functions{A(),B(),C()}
它,
Data
随处携带它,并且可以通过调用定义为其公共接口一部分的函数/方法来与其他对象进行通信。它是一个名词,而名词
确实
也就是说,您将思考过程围绕这些计算单元进行。默认情况是,对象之间发生的事情是按顺序发生的,而崩溃会中断该顺序。它们被称为“对象”,因此被称为“对象”。
(如果不考虑艾伦·凯的本义),我们得到“面向对象”。

Erlang“过程”是Erlang程序员的基本计算单位。甲 过程
(基本上在它自己的时间和空间中运行的自包含顺序程序)是主要的工具,利用该模型厄兰格世界(1)。与Java对象定义封装级别相似,Erlang进程也定义了封装级别,但是对于Erlang而言,计算单位是
完全
彼此切断。您不能在另一个进程上调用方法或函数,也不能访问其中包含的任何数据,甚至一个进程都不能在与任何其他进程相同的定时上下文中运行,并且不能保证消息接收相对于其的顺序。到可能正在发送消息的其他进程。它们也可能完全在不同的行星上(并且想起来,这实际上是合理的)。它们可以彼此独立崩溃,而其他过程只有在故意选择要受到影响的情况下才会受到影响(甚至涉及消息传递:本质上是注册以接收来自死进程的自杀记录,而死进程本身并不能保证以任何形式到达相对于整个系统的顺序,您可能会选择也可能不会选择对此做出反应)。

Java用复合算法直接处理复杂性:对象如何协同工作以解决问题。它旨在在单个执行上下文中执行此 *** 作,并且Java中的默认情况是顺序执行。Java中的多个线程表示多个正在运行的上下文,这是一个非常复杂的主题,因为不同时序上下文中的影响活动会相互影响(整个系统也是如此:因此,防御性编程,异常方案等)。用Java说“多线程”
意味着
与Erlang有所不同,事实上,这在Erlang中甚至从未提及,因为它始终是基本情况。请注意,Java线程暗示的是与时间有关的隔离,而不是与内存或可见引用有关的隔离-
Java中的可见性是通过选择私有和公开来手动控制的;系统的通用访问元素必须设计为“线程安全”和可重入的,通过排队机制进行排序,或者采用锁定机制。简而言之:调度是线程/并行Java程序中的手动管理问题。

Erlang在执行时间(调度),内存访问和引用可见性方面将每个进程的运行上下文分开,并通过 完全 隔离算法来简化算法的每个组件 __。
这不仅是默认情况,而且是此计算模型下唯一可用的情况。一旦您的处理序列的一部分超过了消息壁垒,就以永远不知道任何给定 *** 作的顺序为代价,这是因为消息本质上都是网络协议,无法保证可以在给定的时间内执行任何方法调用上下文。这类似于为每个对象创建一个JVM实例,并且仅允许它们跨套接字进行通信-
这在Java中非常麻烦,但这是Erlang设计工作的方式(顺便说一句,这也是该概念的基础如果人们不赞成使用面向Web的包writing,那么编写“
Java微服务”一词便会引起这种流行语-默认情况下,Erlang程序是大量微服务)。所有关于权衡。

这些是不同的范例。我们可以找到的最接近的共性是,从程序员的角度来看,Erlang进程类似于Java对象。如果我们必须找到某种东西来将Java线程与之进行比较……那么,我们根本就不会在Erlang中找到类似的东西,因为Erlang中没有这样的可比概念。打败一匹死马:
这是不同的范例 。如果您使用Erlang编写一些非平凡的程序,这将变得显而易见。

请注意,我说的是“这些是不同的范式”,但还没有涉及OOP与FP的话题。“ Java思维”和“ Erlang思维”之间的区别比OOP与FP更为根本。

尽管Erlang的“面向并发”或“面向过程”的基础确实与Alan
Kay在创造“面向对象”一词时所想到的更接近(2),但这并不是重点。Kay的回答是,通过将Computron切成离散的块,可以降低系统的认知复杂性,因此必须进行隔离。Java做到这一点的方式从本质上讲仍然使它在本质上仍然是过程性的,但是围绕特殊语法在称为“类定义”的高阶调度闭包上构造代码。Erlang通过将每个对象的运行上下文分开来实现此目的。这意味着Erlang东西不能互相调用方法,而Java东西可以。这意味着Erlang东西可以独立崩溃,而Java东西则不能。这种基本差异产生了许多含义,因此就是“不同的范式”。权衡。


脚注:

  1. 顺便说一句,Erlang实现了“ 参与者模型 ”的一个版本,但是由于Erlang早于该模型的普及,因此我们不使用该术语。乔在设计Erlang并撰写论文时并没有意识到。
  2. 艾伦·凯(Alan Kay)在创造 “面向对象” 一词时曾说过很多意思,最有趣的是他对消息传递(从一个具有自己的时间和内存的独立进程进行单向通知)到VS调用(在具有共享内存的顺序执行上下文中调用函数或方法)-以及这些行如何使编程语言所表示的编程接口与下面的实现之间的位模糊。


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5615521.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-15
下一篇 2022-12-15

发表评论

登录后才能评论

评论列表(0条)

保存