[哪种编程语言可以即时更新任何类?

问题描述 投票:13回答:15

我想知道,是否有任何语言允许您在不重新加载整个应用程序的情况下即时添加/删除/更新任何类? (前提是我可以接受一些不便,例如确保当前没有任何方法在运行,还要付出额外的努力来“迁移”类数据成员)。

您替换1个文件并用于下一个客户端请求的Web应用程序不是我所需要的(例如Perl,PHP)。应用程序必须连续运行,并且具有某些内部状态。

其他要求是

  1. 没有GIL或类似问题阻止使用SMP
  2. 最好-存在类似JIT的VM(即,性能接近本机代码)。理想的解决方案是能够使用CLang或任何其他基于LLVM的语言重新加载模块。那就太完美了。

关于已经做出的答案:

  • 。NET / Java不适合-它们都具有太大的VM,并且应用程序的很大一部分将在Linux上运行。
  • [Erlang-看起来是可能的,但是这对我的肉眼来说是可怕的,我只是不能平静地看待if,case和字符串。另外,我宁愿避免将裸露的资源转移到客户端,编译后的字节码会更好。
programming-languages language-features
15个回答
5
投票

Objective-C可能符合要求。您可以使用here中记录的功能在运行时添加新类和交换方法实现,并且如果需要其他实现,则可以在现有类中加载具有其他类或类别的新NSBundle。 GNUStep并未实现Apple最近对该语言的所有新增功能,但确实声称实现了这些功能(请参阅[1][2])。


1
投票

取决于项目的具体细节-Java可能是通过Node.js(nodejs.com)的答案,它允许您使用由V8引擎解释的JavaScript编程基于事件的服务器。


1
投票

Dart VM具有出色的热代码重载支持这大大改善了Flutter的开发经验。


0
投票

Smalltalk可以自然地做到这一点,Common Lisp(CLOS)有几个技巧。


0
投票

您可以浏览https://github.com/dart-lang/sdk/wiki/Hot-reload处的列表。我还没有在这里提到的Lua是Lua,与其他动态语言相比,它享有很高的声誉。


0
投票

您应该为此使用php,我也有一个linux服务器,它可以很好地更改文件,例如我拥有此php代码来打开一个带有可编辑站点文件的文本框,


0
投票

Objective-C允许您热插拔代码,并且有一个允许这样做的插件。我回答了有关Objective-C <?php $fn = "test.txt"; //the path to any file if (isset($_POST['content'])) { $content = stripslashes($_POST['content']); $fp = fopen($fn,"w") or die ("Error opening file in write mode!"); fputs($fp,$content); fclose($fp) or die ("Error closing file!"); } ?> <h4>You are editing <?php echo $fn ?> </h4> <form action="<?php echo $_SERVER["PHP_SELF"] ?>" method="post"> <textarea rows="25" cols="40" name="content"><?php readfile($fn); ?></textarea> <br/> <input type="submit" value="Save"> </form> ]的类似问题


15
投票

Erlang被设计为支持热代码交换,这是其高可用性功能之一。



3
投票

您尝试编写哪种类型的应用程序?在什么平台上?

GUI与服务器的问题可能排除了Linux与Windows的冲突。

以下语言是动态的:

  • Smalltalk
  • Perl
  • JavaScript
  • VBScript
  • Ruby

现代JavaScript目前正在尽可能快地进行军备竞赛,因此在任何平台上都应该非常快。


3
投票

Python可以做到这一点。请注意以下内容:

  • multiprocessing模块。
  • GIL特定于multiprocessing,它是Python固有的not
  • GIL不是您的问题CPython,而是它。它不会影响大量的IO使用,think或C库(如果为doesn't apply to C code)。如果您要进行大量计算工作,则无论如何都应使用C(无论如何都是这些部分)。

3
投票

最近,我对零停机服务迁移进行了一些研究。我的解决方案不是相对于语言的解决方案。这是一个想法,我们可以转储当前服务的状态,创建另一个进程,将连接状态描述转移到新进程,最后终止旧进程。如下图所示:

<< img src =“ https://image.soinside.com/eyJ1cmwiOiAiaHR0cHM6Ly9pLnN0YWNrLmltZ3VyLmNvbS91U0NXMy5wbmcifQ==” alt =“在此处输入图像说明”>“ >>

通过定义良好的抽象服务描述格式和迁移协议,您可以将任何类型的服务从一个进程迁移到另一个进程,这意味着您可以使用C ++编写服务器,然后将该服务迁移到用Python编写的新进程,而无需任何断开连接。当然,您可以将服务从旧版本迁移到新版本。添加/删除/更新类不会有问题。有关更多详细信息,您可以参考我的文章

wrapped correctly

这种技术的困难在于,您必须转储正在运行的服务的所有状态,并将它们加载到另一个进程上。对于您可以找到的大多数库,很难获得这些类的内部状态,这意味着您可能需要对它们进行一些修改或编写自己的库。为复杂的服务转移服务状态将是一场噩梦,但是对于简单的服务来说,这没什么大不了的。


3
投票

我们通过在免费版本的Gemstone上运行的Seaside smalltalk Web应用程序来执行此操作。在过去的20多年中,Gemstone一直在这样做,因此他们拥有您需要的一切。一些高可用性功能不是免费的。


2
投票

看一下Scheme。您可以使用非常简单的扩展(例如Zero-downtime service migration)在Scheme中进行面向对象的编程。只需扩展代码以允许替换方法(应该非常简单),就可以根据需要热交换它们-语法仍然保持简单,因为,这是Scheme。 :)


1
投票

Java可以通过其调试界面来做到这一点

© www.soinside.com 2019 - 2024. All rights reserved.