Варианты динамической генерации кода

У меня есть (гипотетический) вопрос, и я думаю, что решение будет динамически генерировать код.

Я хочу быстро оценить произвольную математическую функцию, которую ввел пользователь, скажем, найти сумму i=1 к N из i^3+2i^2+6i+1. N произвольно, а i^3+2i^2+6i+1 тоже произвольно (он не обязательно должен быть полиномом и может содержать тригонометрические функции и другие функции). Предположим, что N может быть очень большим. Я хочу знать, как я могу быстро оценить ответ, предполагая, что я уже проанализировал введенный пользователем какой-либо байт-код или что-то еще, что моя программа может понять.

Если возможно, я бы также хотел, чтобы мой код легко компилировался и выполнялся на разных операционных системах (включая мобильные).

Я подумал о нескольких способах:

1) Напишите интерпретатор, который интерпретирует и выполняет каждую команду в моем байт-коде. Это делает меня свободным в использовании любого языка, но это медленно.

2) Пишите в Java/C# и используйте динамическое генерирование кода (например, возможно ли динамически компилировать и выполнять фрагменты кода C#?). Это будет выполняться так же быстро, как если бы я написал функцию непосредственно в исходном коде, с небольшим замедлением, поскольку C#/Java оба JIT-скомпилированы в машинный код. Ограничением является то, что Java не поддерживается широко на мобильных устройствах, а C# - только для Windows.

3) Встраивать компилятор / компилятор / компилятор C++ для любого скомпилированного языка, который я использую. Ограничением является то, что он не будет работать на мобильных устройствах - он не позволит мне выполнить файл данных.

4) Напишите HTML/Javascript, затем вставьте его в элемент управления веб-браузера и поместите в приложение (я думаю, что именно так некоторые люди используют для создания универсального приложения, которое будет работать где угодно). Но это тоже медленно, и написание реальных приложений на Javascript - это боль.

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

1 ответ

Самый быстрый и простой способ выполнить эти вычисления для больших значений N - использовать необработанную математику вместо повторного суммирования.

Вот формула для расчета каждого отдельного элемента в выражении, выполните это для всех элементов в выражении, и все готово:

сумма х = 1 к N для х ^ к

H[n] - это n-е гармоническое число.

Существует несколько подходов к вычислению H[n]. Некоторые вычисляют наибольшее требуемое число и генерируют все до этого числа, сохраняя любые другие требуемые значения... Поочередно сохраняйте каждый 10-тысячный элемент в серии в файле и вычисляйте H[n] из ближайшей записи.

Другие вопросы по тегам