Варианты динамической генерации кода
У меня есть (гипотетический) вопрос, и я думаю, что решение будет динамически генерировать код.
Я хочу быстро оценить произвольную математическую функцию, которую ввел пользователь, скажем, найти сумму 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 - использовать необработанную математику вместо повторного суммирования.
Вот формула для расчета каждого отдельного элемента в выражении, выполните это для всех элементов в выражении, и все готово:
H[n] - это n-е гармоническое число.
Существует несколько подходов к вычислению H[n]. Некоторые вычисляют наибольшее требуемое число и генерируют все до этого числа, сохраняя любые другие требуемые значения... Поочередно сохраняйте каждый 10-тысячный элемент в серии в файле и вычисляйте H[n] из ближайшей записи.