Встраивание низкопроизводительного языка сценариев в Python

У меня есть веб-приложение. В рамках этого мне нужно, чтобы пользователи приложения могли писать (или копировать и вставлять) очень простые скрипты для работы с их данными.

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

ratio = 1.2345678
minimum = 10

def convert(money)
    return money * ratio
end

if price < minimum
    cost = convert(minimum)
else
    cost = convert(price)
end

где цена и стоимость являются глобальными переменными (что-то, что я могу передать в среду и получить доступ после вычисления).

Я, однако, должен кое-что гарантировать.

  1. Ни один запущенный скрипт не может получить доступ к среде Python. Они не могут импортировать данные, вызывать методы, которые я не раскрываю явно для них, читать или писать файлы, создавать потоки и т. Д. Мне нужна полная блокировка.

  2. Мне нужно установить жесткое ограничение на количество ' циклов, для которых выполняется сценарий. Циклы - это здесь общий термин. могут быть инструкции виртуальной машины, если язык компилируется в байтах. Apply-вызывает цикл Eval / Apply. Или просто итерации через какой-то центральный цикл обработки, который запускает сценарий. Детали не так важны, как моя способность остановить что-то через короткое время и отправить электронное письмо владельцу со словами: «Кажется, ваши сценарии делают больше, чем просто сложение нескольких чисел - разберитесь с ними»

  3. . Он должен работать на ванильном непатентованном CPython.

До сих пор я писал свой собственный DSL для этой задачи. Я могу это сделать. Но мне было интересно, смогу ли я опереться на плечи гигантов. Есть ли для Python мини-язык, который мог бы это сделать?

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

Есть идеи?

17
задан Ian 24 February 2011 в 00:35
поделиться