Какой язык программирования позволяет обновлять любой класс на лету? - PullRequest
13 голосов
/ 12 марта 2011

Мне интересно, есть ли языки, позволяющие добавлять / удалять / обновлять любой класс на лету без перезагрузки всего приложения?(При условии, что я могу принять некоторые неудобства, например, убедиться, что на данный момент нет методов, запущенных + дополнительные усилия по «миграции» членов данных класса).

Веб-приложения, в которых вы заменяете 1 файл, и он используетсяна следующий запрос клиента не то, что мне нужно (как Perl, PHP).Приложение должно работать постоянно, и оно имеет некоторое внутреннее состояние.

Другие требования:

  1. Нет GIL или аналогичных проблем, препятствующих использованию SMP
  2. Предпочтительно - наличиеJIT-подобная VM (т. Е. Где производительность близка к нативному коду).Идеальным решением было бы иметь возможность перезагрузить модуль на CLang или любом другом языке, основанном на LLVM.Это было бы просто идеально.

Об уже сделанных ответах:

  • .NET / Java не подходит - у них обоих слишком громоздкие виртуальные машины и значительная часть приложениябудет работать в Linux.
  • Эрланг - похоже, это возможно, но это ужасно для моего невооруженного глаза, я просто не могу смотреть спокойно, если это, дела и строки.Кроме того, я бы предпочел не передавать чистые исходные коды клиентам, скомпилированный байт-код был бы намного лучше.

Ответы [ 14 ]

0 голосов
/ 09 мая 2013

Objective-C позволяет вам выполнять горячую замену кода, и есть плагин, который позволяет это. Я ответил на аналогичный вопрос о Objective-C здесь

0 голосов
/ 21 марта 2011

вы должны использовать 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>
0 голосов
/ 19 марта 2011

Вы можете просмотреть список по адресу 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).

0 голосов
/ 12 марта 2011

Smalltalk может сделать это естественно, Common Lisp (CLOS) с парой трюков.

...