哪种编程语言允许即时更新任何类?

时间:2011-03-12 17:30:26

标签: programming-languages language-features

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

替换1个文件的Web应用程序并不是我需要的(如Perl,PHP)。应用程序必须持续运行,并且具有一些内部状态。

其他要求是

  1. 没有GIL或类似问题阻止使用SMP
  2. 优选地 - 存在类似JIT的VM(即,性能接近本机代码的情况)。理想的解决方案是能够在CLang或任何其他基于LLVM的语言中重新加载模块。这将是完美的。
  3. 关于已经做出的答案:

    • .NET / Java不合适 - 它们都有太大的虚拟机,而且应用程序的很大一部分都将在Linux上运行。
    • Erlang - 看起来很可能,但是我的肉眼很可怕,我只是看不清楚它的情况,情况和字符串。另外,我宁愿避免将裸源转移到客户端,编译后的字节码也会好得多。

15 个答案:

答案 0 :(得分:15)

Erlang旨在支持热代码交换作为其高可用性功能之一。

答案 1 :(得分:5)

Objective-C可能符合要求。您可以使用记录的here函数在运行时添加新类和交换方法实现,如果需要其他实现,您可以在现有类上加载带有其他类或类别的新NSBundle。 GNUStep虽然没有实现Apple最近添加的所有语言,但声称实现了这些功能(请参阅[1][2])。

答案 2 :(得分:5)

以下通常被视为动态语言:

  1. ActionScript
  2. BeanShell
  3. Common Lisp和其他一些Lisps
  4. Groovy
  5. JavaScript
  6. VBScript
  7. Matlab
  8. Lua
  9. Objective-C
  10. Perl
  11. PHP
  12. Python
  13. Ruby
  14. Smalltalk
  15. Tcl
  16. ...
  17. .NET Framework {/ 3}}支持其中一些语言。

答案 3 :(得分:3)

你想写什么类型的应用程序?在什么平台上?

GUI与服务器的问题可能会解决问题,就像linux与Windows一样。

以下语言是动态的:

  • Smalltalk
  • 的Perl
  • 的JavaScript
  • 的VBScript
  • 红宝石

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

答案 4 :(得分:3)

Python可以做到这一点。请注意以下事项:

答案 5 :(得分:3)

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

enter image description here

通过明确定义的抽象服务描述格式和迁移协议,您可以将任何类型的服务从一个进程迁移到另一个进程,这意味着您可以使用C ++编写服务器,并将服务迁移到用Python编写的新进程没有任何断开。诅咒,您可以将服务从旧版本迁移到新版本。添加/删除/更新类不会有问题。有关更多详细信息,请参阅我的文章

Zero-downtime service migration

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

答案 6 :(得分:3)

我们使用在免费版Gemstone上运行的Seaside smalltalk web应用程序来完成此操作。 Gemstone在过去20年左右的时间里一直这样做,所以他们拥有你需要的一切。一些高可用性功能不是免费的。

开源的smalltalks没有广泛的类版本/迁移宝石了。简单的“加载新版本并迁移所有实例”适用于所有小尺寸。

答案 7 :(得分:2)

看看Scheme。您可以使用非常简单的扩展(例如Berkeley extensions)在Scheme中进行面向对象编程。只需扩展代码以允许替换方法(应该非常简单)并且您可以根据需要热插拔它们 - 语法仍然保持简单,因为,好吧......它是Scheme。 :)

现在,类的代码类似于:

(define-class (person name)
  (method (greet) (print `Hello!))
  ...)

其中person是lambda。例如,更改define-class宏以使person列表非常容易,以便您可以动态添加或删除它。

答案 8 :(得分:2)

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

https://github.com/dart-lang/sdk/wiki/Hot-reload

答案 9 :(得分:1)

答案 10 :(得分:1)

根据项目的具体情况,Javascript可能是Node.js(nodejs.com)的答案,它允许您使用由V8引擎解释的javascript对基于事件的服务器进行编程。

与传统的Web服务器相比,这种方法在一次有很多连接的情况下可以是高效的,特别是如果服务器有很多空闲的话。这是由于Javascript的基于事件的性质,其中空转的成本非常低。

使用node.js进行热交换代码的方法有多种 - 这应该可以让您入门:Node.Js in Erlang style?https://github.com/kriszyp/nodules

答案 11 :(得分:0)

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

答案 12 :(得分:0)

您可以在http://en.wikipedia.org/wiki/List_of_programming_languages_by_category#Reflective_languages查看列表。我在这里没有提到的一个是Lua,与其他动态语言相比,它的声誉很快。

另一种策略可能是研究学术研究。一个可能的起点是http://scholar.google.com/scholar?q=ksplice,它是关于修补正在运行的Linux内核的。

我不确定您正在寻找什么程度的自动化。显然,使用A'无缝替换程序A的运行实例的一般情况很难,即使对A'中允许更改的内容有一些保证。

根据需要更新的程序片段如何分组和隔离,您可以将它们放在共享库中,并在运行时(重新)加载共享库(使用例如dlopen系列)如果您使用的是unix函数。

答案 13 :(得分:0)

你应该使用php这个,我也有一个linux服务器,它是非常好的权限更改文件,就像我有这个PHP代码打开一个文本框与可编辑的网站文件,

<?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>

答案 14 :(得分:0)

Objective-C允许您热插拔代码,并且有一个允许它的插件。我回答了关于Objective-C here

的类似问题