Опции для динамической генерации кода

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

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

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

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

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

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

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

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

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


person Bernard    schedule 04.09.2014    source источник
comment
Почему это помечено как javascript? Вы хотите написать интерпретатор байт-кода или компилятор Java/C# в javascript? Какова ваша реальная среда — ваше приложение выполняется в браузере или как исполняемый файл ОС? Вы действительно хотите сгенерировать читаемый код на (каком?) языке по вашему выбору для вывода пользователю, или единственная цель - вычислить это выражение математической суммы?   -  person Bergi    schedule 04.09.2014
comment
Простое решение: Обратиться в сеть :-)   -  person Bergi    schedule 04.09.2014
comment
Спасибо за комментарий; Я понял, что не ясно выразился. Моим первоначальным намерением было написать мобильное приложение, чтобы я мог встроить элемент управления веб-браузером в мобильное приложение и заставить его отображать страницу. Я распространяю вопрос и на рабочий стол, чтобы посмотреть, есть ли лучшие решения. Единственная цель состоит в том, чтобы получить числовой ответ как можно быстрее.   -  person Bernard    schedule 05.09.2014
comment
Wolfram Alpha работает всегда, но это проект, которым я собираюсь заниматься в свободное время для развлечения, поэтому я предпочитаю делать расчеты самостоятельно (:   -  person Bernard    schedule 05.09.2014
comment
Это для клиентского JavaScript/т.е. веб-приложения?   -  person Wylie Kulik    schedule 08.09.2015
comment
Я думал о настольных программах и мобильных приложениях, которые можно загрузить из магазина приложений, и приложению не требуется подключение к Интернету для работы. JavaScript, который я упомянул в вопросе, скорее всего, будет встроен в приложение, поэтому я не ограничиваюсь только использованием вещей, которые будут работать в браузере.   -  person Bernard    schedule 08.09.2015


Ответы (1)


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

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

сумма от x = 1 до N для x^k

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

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

person Mike    schedule 04.09.2014
comment
Это работает, но ограничено только полиномами. Я надеялся на что-то, что будет работать для любого математического выражения (всего, что сможет сделать научный калькулятор). Извините, я не указал это прямо в своем вопросе; Я отредактирую это. - person Bernard; 05.09.2014
comment
Произвольные выражения, как научный калькулятор? Я не думаю, что вы хотите написать свою собственную CAS, лучше попытайтесь найти программное обеспечение, которое вы можете встроить в свое приложение. - person Bergi; 05.09.2014
comment
Хм, я не рассматривал CAS, но это интересная идея для рассмотрения. Когда я упомянул научный калькулятор, я имел в виду тупой калькулятор, который оценивает выражения в числовом виде (он не занимается алгеброй), поэтому я не хотел смотреть на более умные алгоритмы, выполняющие алгебраический анализ. Но я думаю, что ваше предложение интересно, поэтому я проголосую! - person Bernard; 05.09.2014