У меня была идея, которую я обдумывал с некоторыми коллегами. Никто из нас не знал, существует он в настоящее время или нет. Основная предпосылка состоит в том, чтобы иметь систему, которая имеет 100% время безотказной работы, но может стать более эффективной динамически.
Here is the scenario:
* So we hash out a system quickly to a specified set of interfaces, it has zero optimizations, yet we are confident that it is 100% stable though (dubious, but for the sake of this scenario please play along)
* We then profile the original classes, and start to program replacements for the bottlenecks.
* The original and the replacement are initiated simultaneously and synchronized.
* An original is allowed to run to completion: if a replacement hasn´t completed it is vetoed by the system as a replacement for the original.
* A replacement must always return the same value as the original, for a specified number of times, and for a specific range of values, before it is adopted as a replacement for the original.
* If exception occurs after a replacement is adopted, the system automatically tries the same operation with a class which was superseded by it.
Вы видели подобную концепцию на практике?Критика, пожалуйста ...
Below are comments written after the initial question in regards to posts:
* The system demonstrates a Darwinian approach to system evolution.
* The original and replacement would run in parallel not in series.
* Race-conditions are an inherent issue to multi-threaded apps and I acknowledge them.





Система, которая выполняет тесты производительности во время работы, будет медленнее, чем та, которая этого не делает. Если целью является оптимизация скорости, почему бы вам не провести независимый бенчмарк-тест и импортировать самые быстрые процедуры, если окажется, что они быстрее?
И ваша идея одновременного запуска подпрограмм может ввести условия гонки.
Кроме того, если целью является обеспечение 100% безотказной работы, вы не захотите вводить непроверенные процедуры, поскольку они могут генерировать неуловимые исключения.
Возможно, ваши идеи заслуживают того, чтобы они служили средством для тестирования, а не операционной системой?
Видел ли я подобную концепцию на практике? Нет. Но я все равно предложу подход.
Похоже, что большинство ваших целей будет достигнуто с помощью какой-то супер-системы управления исходным кодом, которая может быть реализована с помощью Круиз-контроль.
CruiseControl может запускать модульные тесты для проверки правильности новой версии.
Вам нужно будет написать построитель CruiseControl плагин, который будет запускать новую версию вашей системы по ряду существующих тестов, чтобы гарантировать, что новая версия является улучшением.
Если цикл сборки CruiseControl пройден, новая версия будет принята. Для реализации такого процесса потребуются значительные усилия, но я думаю, что это выполнимо. Модульные тесты и построитель тестов должны быть довольно хорошими.
Я думаю, что инверсия контейнера управления, такая как OSGi или Spring, могла бы сделать большую часть того, о чем вы говорите. (динамическая загрузка по имени)
Вы можете построить на их основе. Затем внедрите свой код в
Если модули выполняют свою работу путем передачи сообщений, вы можете сохранить сообщение до тех пор, пока операция не завершится успешно, и повторить с другим модулем, если возникнет исключение.
Я считаю эту идею интересной теоретической дискуссией, но не очень практичной по следующим причинам:
Единственная «среда», в которой это звучит полезно и на самом деле «обязательно», - это «генетическая» система, которая сама генерирует новые версии кода, но это совсем другая история и не очень широко применима ...
Идеи дизайна для систем высокой доступности можно найти в Erlang.
Я не думаю, что код научится быть лучше сам по себе. Однако некоторые параметры времени выполнения можно легко настроить на оптимальные значения, но это было бы обычное программирование, не так ли?
Что касается изменения на лету, я поделился своим вопросом и буду создавать его на основе Lua или аналогичного динамического языка. Могут быть части, которые загружены, и если они будут заменены, повторно загружены в работу. Никакого ракетостроения в этом тоже нет. Если «старый код» все еще работает, все в порядке, поскольку, в отличие от DLL, файл нужен только при его чтении, а не при выполнении кода, пришедшего оттуда.
Полезность? Неа ...