Этот вопрос связан с моим вопросом о существующих реализациях coroutine в Java. Если, как я подозреваю, выясняется, что в настоящее время на Java нет полной реализации сопрограмм, которые потребуются для их реализации?
Как я уже сказал в этом вопросе, я знаю следующее:
- Вы можете реализовать "сопрограммы" как потоки/потоковые пулы за кулисами.
- Вы можете делать сложные вещи с помощью байт-кода JVM за кулисами, чтобы сделать сопрограммы возможными.
- В реализации JVM "Da Vinci Machine" реализованы примитивы, которые делают сопрограммы выполняемыми без байт-код.
- Существуют также различные подходы JNI к сопрограммам.
В свою очередь я рассмотрю каждый недостаток.
сопрограммы на основе темы
Это "решение" является патологическим. Весь смысл сопрограмм заключается в том, чтобы избежать накладных расходов на потоки, блокировку, планирование ядра и т.д. Coroutines должны быть легкими и быстрыми и выполнять только в пользовательском пространстве. Внедрение их с точки зрения потоков с полным наклоном с жесткими ограничениями избавляет от всех преимуществ.
Обработка байт-кода JVM
Это решение более практично, хотя и немного сложно снять. Это примерно то же самое, что и переход на язык ассемблера для библиотек coroutine на C (сколько их работает) с тем преимуществом, что вам остается только одна архитектура, чтобы беспокоиться и получить право.
Он также связывает вас только с запуском вашего кода на полностью совместимых стеках JVM (что означает, например, без Android), если вы не можете найти способ сделать то же самое в несоответствующем стеке. Однако, если вы нашли способ сделать это, вы теперь удвоили свои сложности и потребности в системе.
Машина Da Vinci
Машина Da Vinci классная для экспериментов, но поскольку она не является стандартной JVM, ее функции не будут доступны повсюду. Действительно, я подозреваю, что большинство производственных условий специально запрещают использование машины Da Vinci. Таким образом, я мог бы использовать это, чтобы сделать классные эксперименты, но не для какого-либо кода, который я ожидаю выпустить в реальном мире.
Это также имеет дополнительную проблему, подобную описанному выше решению для управления байт-кодом JVM: не будет работать на альтернативных стеках (например, Android).
Реализация JNI
Это решение делает все возможное для этого в Java. Каждая комбинация процессора и операционной системы требует независимого тестирования, и каждый из них является потенциально расстраивающим слабый отказ. В качестве альтернативы, конечно, я мог бы привязать себя к одной платформе целиком, но это тоже заставляет делать вещи на Java полностью спорными.
Итак...
Есть ли способ реализовать сопрограммы в Java без использования одного из этих четырех методов? Или я буду вынужден использовать один из тех четырех, который пахнет наименее (манипуляция JVM)?
Отредактировано для добавления:
Просто чтобы убедиться, что путаница содержится, это связанный с этим вопрос мой другой, но не тот же. Этот пользователь ищет существующую существующую реализацию, чтобы избежать необходимости повторно изобретать колесо. Это вопрос, связанный с тем, как можно было бы реализовать сопрограммы на Java, если другой окажется неопровержимым. Цель состоит в том, чтобы задавать разные вопросы по различным темам.