Ищем язык на основе LLVM, который позволяет перезагружать часть двоичного файла на лету - PullRequest
6 голосов
/ 25 августа 2010

Существуют ли какие-либо языки на основе LLVM без GIL, предназначенные главным образом для выполнения JIT, что позволяет перезагрузить часть кода на лету?

Как перекомпилировать 1 класс и перезагрузить его, не останавливая всю программу.

Кто-нибудь пробовал это?

Есть ли шанс сделать это с помощью clang (конечно, с большой осторожностью разработчиков, ограничениями и обработкой состояний вручную)?

Ответы [ 3 ]

2 голосов
/ 31 августа 2010

Я думаю, что это идея динамита и особенность, которую я хотел бы иметь! Задумывались ли вы о том, как бы вы хотели взаимодействовать с этой функцией?

obj1 = Foo()
compiler.Recompile(Foo, '/some/path/myapp/newsrc/foo.blah');
obj2 = Foo()
// Would this be True?
type(obj1) == type(obj2)

Я предполагаю, что вы ожидаете, что существующие экземпляры останутся неизменными после перекомпиляции? Кажется, что с функциями было бы проще, если бы они сохраняли один и тот же прототип, но делать это с классами, похоже, было бы грязно.

Кроме того, что делать с потоками?

Thread.start(wait 1; bar(););  // bar is a function
compiler.Recompile(bar, '/some/path/myapp/newsrc/bar.blah');

Допустим, в нашем потоке мы начинаем вызывать "bar" во время перекомпиляции. Блокирует ли вызов, пока не будет выполнена перекомпиляция, а затем вызовет новую функцию? Старая функция все еще существует до завершения компиляции? Что если после перекомпиляции у нас есть указатель на функцию, куда он указывает? К исходной функции или к новой?

У кого-нибудь есть мысли о том, как это можно осуществить прямым путем?

0 голосов
/ 29 августа 2010

Видимо, его пока нет.

0 голосов
/ 25 августа 2010

Хм, не могу думать ни о чем с моей головы.Единственный крупный продукт, о котором я могу подумать, это JRebel , но это для Java.

...