Какой язык программирования позволяет обновлять любой класс "на лету"?
Мне интересно, существуют ли какие-либо языки, позволяющие добавлять/удалять/обновлять любой класс на лету без перезагрузки всего приложения? (При условии, что я могу принять некоторые неудобства, такие как удостовериться, что в настоящий момент нет методов, работающих на данный момент + некоторые дополнительные усилия для "переноса" элементов данных класса).
Веб-приложения, в которых вы заменяете 1 файл, и он используется в следующем запросе клиента, не является тем, что мне нужно (например, Perl, PHP). Приложение должно непрерывно работать и иметь некоторое внутреннее состояние.
Другие требования
- Нет GIL или подобных проблем, препятствующих использованию SMP
- Предпочтительно - существование JIT-подобной виртуальной машины (то есть, когда производительность близка к собственному коду). Идеальное решение было бы иметь возможность перезагрузить модуль в CLang или любом другом языке LLVM. Это было бы просто идеально.
Об уже полученных ответах:
- .NET/Java не подходит - у них обоих слишком громоздкие виртуальные машины, и значительная часть приложения будет работать в Linux.
- Эрланг - похоже, что это возможно, но это ужасно для моего невооруженного глаза, я просто не могу смотреть спокойно, если это, случай и строки. Кроме того, я бы предпочел избегать передачи голых источников клиентам, скомпилированный байт-код будет намного лучше.
Ответы
Ответ 1
Objective-C может соответствовать счету. Вы можете использовать функции, описанные здесь, чтобы добавить новые классы и реализовать методы swap во время выполнения, и вы можете загружать новые NSBundles с дополнительными классами или категориями на существующих классов, если требуются дополнительные реализации. GNUStep, не внедряя все последние дополнения Apple к языку, заявляет о реализации этих функций (см. [1] и [2]).
Ответ 2
Erlang был разработан для поддержки обмена горячим кодом как одной из его возможностей высокой доступности.
Ответ 3
В общем случае считаются динамическими языками:
Некоторые из этих языков поддерживаются в .NET Framework Microsoft Dynamic Language Runtime.
Ответ 4
Какой тип приложения вы пытаетесь написать? На какой платформе?
Вопрос о графическом интерфейсе и сервере может вызывать ошибки, как и linux vs. windows.
Следующие языки являются динамическими:
- Smalltalk
- Perl
- JavaScript
- VBScript
- рубин
Современный JavaScript в настоящее время находится в гонке вооружений, чтобы быть как можно быстрее, поэтому должен быть довольно быстрым на любой платформе.
Ответ 5
Python может это сделать. Обратите внимание на следующее:
- Модуль
multiprocessing
.
- GIL специфичен для CPython не, присущего Python.
- GIL - это не проблема, которую вы думаете. Это не повлияет на интенсивное использование ввода-вывода, а не относится к коду C или к библиотекам C (если завернуто правильно). Если вы делаете что-либо интенсивно с вычислительной точки зрения, оно должно быть в любом случае (эти части в любом случае).
Ответ 6
Недавно я провел некоторое исследование, посвященное миграции услуг с нулевым временем простоя. И мое решение не относится к языку. Вот идея, мы можем сбросить состояние текущей службы, создать другой процесс, передать описание состояния подключения в новый процесс, в конечном итоге прекратить старый процесс. Как показано на следующей диаграмме:
![enter image description here]()
С четко определенным форматом описания абстрактных сервисов и протоколом миграции вы можете перенести любые виды услуг из одного процесса в другой, что означает, что вы можете написать сервер на С++ и перенести службу на новый процесс, написанный на Python без какого-либо отключения. Из проклятия вы можете перенести свой сервис из старой версии в новую. Добавление/удаление/обновление классов не будет проблемой. Для более подробной информации вы можете ссылаться на мою статью
Отмена службы нулевого простоя
Трудность такого метода заключается в том, что вы должны сбросить все состояние запущенной службы и загрузить их в другой процесс. Для большинства библиотек, которые вы можете найти, трудно получить внутреннее состояние этих классов, что означает, что вам, возможно, придется немного взломать их или написать свою собственную библиотеку. Было бы кошмаром переводить состояние обслуживания для сложных услуг, но для простых сервисов это не большая проблема.
Ответ 7
Мы делаем это с помощью приложения Seaside smalltalk, использующего бесплатную версию Gemstone. Gemstone делает это в течение последних 20 лет или около того, поэтому у них есть все, что вам нужно. Некоторые из функций высокой доступности не являются бесплатными.
Маленькие шрифты с открытым исходным кодом не имеют обширной версии класса/переноса gemstone. Простая "загрузка новой версии и перенос всех экземпляров" работает со всеми малыми текстами.
Ответ 8
Взгляните на Схему. Вы можете делать объектно-ориентированное программирование в Scheme с помощью очень простых расширений, таких как Berkeley extensions. Просто расширьте код, чтобы можно было заменить методы (должно быть очень просто), и вы можете их "горячую" замену, но вы хотите - синтаксис все равно останется простым, потому что... ну, это схема.:)
В настоящий момент код для класса выглядит примерно так:
(define-class (person name)
(method (greet) (print `Hello!))
...)
где person
- лямбда. Это может быть довольно легко изменить макрос define-class
, чтобы сделать список person
, например, чтобы вы могли динамически добавлять или удалять его.
Ответ 9
Java может сделать это с помощью интерфейса отладки
http://download.oracle.com/javase/6/docs/platform/jvmti/jvmti.html#RedefineClasses
http://download.oracle.com/javase/6/docs/platform/jvmti/jvmti.html#RetransformClasses
или немного старше:
http://download.oracle.com/javase/1.4.2/docs/guide/jpda/enhancements.html#hotswap
Ответ 10
В зависимости от специфики вашего проекта - Javascript может быть ответом через Node.js(nodejs.com), который позволяет вам программировать сервер на основе событий, используя javascript, который интерпретируется двигателем V8.
Этот подход может быть эффективным по сравнению с традиционными веб-серверами в ситуациях, когда одновременно имеется много соединений, и особенно, если для сервера много свободного времени. Это связано с тем, что Javascript основан на событии, где стоимость простоя очень низкая.
Существует несколько методов для кода "горячей замены" с использованием Node.js - это должно начать: Node.Js в стиле Erlang? и https://github.com/kriszyp/nodules
Ответ 11
Smalltalk может сделать это естественно, Common Lisp (CLOS) с несколькими трюками.
Ответ 12
Вы можете просмотреть список 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
вы должны использовать 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
Objective-C позволяет использовать код горячей замены, и есть плагин, который позволяет это. Я ответил на аналогичный вопрос о Objective-C