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

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

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

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

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

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

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

Ответы [ 14 ]

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

Erlang был разработан для поддержки горячей замены кода как одной из функций высокой доступности.

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

Обычно считаются динамическими языками:

  1. * ActionScript 1005 ** * 1006 BeanShell
  2. Обычный Лисп и некоторые другие Лисп
  3. Groovy
  4. JavaScript
  5. VBScript
  6. Matlab
  7. Lua
  8. Objective-C
  9. Perl
  10. PHP
  11. Python
  12. рубин
  13. Smalltalk
  14. Tcl
  15. ...

Некоторые из этих языков поддерживаются в .NET Framework Microsoft Dynamic Language Runtime .

5 голосов
/ 16 марта 2011

Objective-C может соответствовать всем требованиям. Вы можете использовать документированные функции здесь для добавления новых классов и реализаций методов подкачки во время выполнения, а также можете загружать новые NSBundles с дополнительными классами или категориями в существующие классы, если требуются дополнительные реализации. GNUStep, хотя и не реализует все недавние дополнения Apple к языку, претендует на реализацию этих функций (см. [1] и [2] ).

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

Мы делаем это с помощью приложения Seaside smalltalk, работающего на бесплатной версии Gemstone. Gemstone занимается этим последние 20 лет или около того, поэтому у них есть все, что вам нужно. Некоторые функции высокой доступности не бесплатны.

Smalltalks с открытым исходным кодом не имеют расширенной версии класса / драгоценного камня миграции. Простое «загрузить новую версию и перенести все экземпляры» работает со всеми мелкими предприятиями.

3 голосов
/ 19 марта 2011

Недавно я провел некоторое исследование по миграции сервисов без простоев. И мое решение не является языковым. Идея в том, что мы можем вывести состояние текущего сервиса, создать другой процесс, перенести описание состояния соединения в новый процесс и, наконец, завершить старый процесс. Как показано на следующей диаграмме:

enter image description here

Имея четко определенный формат описания абстрактного сервиса и протокол миграции, вы можете переносить любые виды сервисов из одного процесса в другой, что означает, что вы можете написать сервер на C ++ и перенести сервис на новый процесс, написанный на Python. без какого-либо отключения. Конечно, вы можете перенести свой сервис со старой версии на новую. Добавление / удаление / обновление классов не будет проблемой. Более подробно вы можете сослаться на мою статью

Миграция службы без простоя

Сложность такого рода техники заключается в том, что вам необходимо вывести все состояние работающей службы и загрузить их в другой процесс. Для большинства библиотек, которые вы можете найти, трудно получить внутреннее состояние этих классов, что означает, что вам, возможно, придется взломать их или написать свою собственную библиотеку. Передача состояния сервиса для сложных сервисов была бы кошмаром, но для простых сервисов это не имеет большого значения.

3 голосов
/ 17 марта 2011

Python может сделать это. Обратите внимание на следующее:

  • Модуль multiprocessing.
  • GIL относится к CPython , это , а не , свойственное Python.
  • GIL - это не проблема, которую вы думаете , это так. Это не повлияет на интенсивное использование ввода-вывода, и не применяется к коду C или библиотекам C (если упакован правильно ). Если вы делаете что-то интенсивное в вычислительном отношении, оно должно быть в любом случае в C (эти части в любом случае).
3 голосов
/ 12 марта 2011

Какой тип приложения вы пытаетесь написать?На какой платформе?

Вопрос о графическом интерфейсе и сервере может исключить ситуацию, так же как и Linux или Windows.

Следующие языки являются динамическими:

  • Smalltalk
  • Perl
  • JavaScript
  • VBScript
  • Ruby

Современный JavaScript в настоящее время находится в гонке вооружений так быстро, каквозможно, так должно быть довольно быстро на любой платформе.

2 голосов
/ 18 марта 2011

Взгляните на Схему. Вы можете выполнять объектно-ориентированное программирование в Scheme, используя очень простые расширения, такие как расширения Беркли . Просто расширьте код, чтобы можно было заменять методы (это должно быть очень просто), и вы можете менять их по своему усмотрению - синтаксис все равно останется простым, потому что, ну ... это схема. :)

Прямо сейчас код для классов выглядит примерно так:

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

, где person - лямбда. Например, довольно легко изменить макрос define-class, чтобы сделать person списком, чтобы вы могли динамически добавлять или удалять его.

1 голос
/ 20 марта 2011

В зависимости от специфики вашего проекта - Javascript может быть ответом через Node.js (nodejs.com), который позволяет программировать сервер на основе событий, используя javascript, который интерпретируется механизмом V8.

Этот подход может быть очень эффективным по сравнению с традиционными веб-серверами в условиях, когда одновременно имеется много подключений, и особенно, если для сервера много холостого хода.Это происходит из-за событийного характера Javascript, где стоимость простоя очень низкая.

Существует несколько методов горячей замены кода с использованием node.js - это должно помочь вам начать: Node.Js в стиле Erlang? и https://github.com/kriszyp/nodules

1 голос
/ 12 марта 2011
...