Безопасное выполнение ненадежного кода Haskell
Я ищу способ безопасного запуска произвольного кода Haskell (или отказаться от запуска небезопасного кода).
Должно быть:
- список функций/функций
- время ожидания при выполнении
- ограничение использования памяти
Возможности, которые я хотел бы видеть:
- способность убивать поток
- компиляция модулей в собственный код
- кэширование скомпилированного кода
- одновременное выполнение нескольких интерпретаторов
- сложный тип данных для ошибок компилятора (insted из простого сообщения в String)
С такой функциональностью можно было бы реализовать плагин для браузера, способный запускать произвольный код Haskell, что я имею в виду.
EDIT: У меня есть два ответа, оба отличные. Благодарю! Печальная часть состоит в том, что, похоже, нет готовой библиотеки, просто подобная программа. Это полезный ресурс. В любом случае, я думаю, что буду ждать выхода 7.2.1 и попытаться использовать SafeHaskell в своей собственной программе.
Ответы
Ответ 1
Мы делали это примерно 8 лет в lambdabot, который поддерживает:
- контролируемое пространство имен
- Тайм-ауты, связанные с OS
- встроенные модули кода
- кэширование
- параллельные интерактивные верхние уровни
- возвращается сообщение об ошибке.
Эта серия правил документирована, см.:
Подход к безопасности, принятый в lambdabot, вдохновил на расширение языка Safe Haskell.
Для подходов к динамическому расширению скомпилированных приложений Haskell в Haskell см. две статьи:
Ответ 2
GHC 7.2.1, скорее всего, будет иметь новый объект под названием SafeHaskell, который охватывает некоторые из того, что вы хотите. SafeHaskell обеспечивает безопасность типов (такие вещи, как unsafePerformIO
, объявлены вне закона) и устанавливает механизм доверия, чтобы можно было доверять библиотеке с безопасным API, но реализованной с использованием небезопасных функций. Он разработан точно для запуска ненадежного кода.
Для других практических аспектов (тайм-аутов и т.д.), lambdabot, как говорит Дон, будет отличным местом для просмотра.