Существует ли язык, в котором используется система компьютерной алгебры для дополнительных функций и оптимизации?
Например, представьте себе такую функцию:
int solveSomeEquation(int y)
{
y = (int x) * 2;
return x;
}
Используя символьную алгебру, компилятор определит, что x = y / 2. Более того, он будет жаловаться на то, что int недостаточно для сохранения результата y / 2. Представьте, что эта функциональность распространяется на решение ODE с ограничениями и / или граничными условиями, и интеграция с использованием символических или числовых методов (во время выполнения), где это необходимо. Я, например, хотел бы увидеть что-то вроде этого:
int areaOfUnitSemiCircle()
{
auto semiCircleFunc = [](double x){ return abs((1 - x^2)^0.5); };
semiCircleFunc = (auto semiCircleIntegralFunc)'; // single quote means derivative
return semiCircleIntegralFunc(1) - semiCircleIntegralFunc(-1);
}
упрощено до:
int areaOfUnitSemiCircle()
{
return Pi/2;
}
Кроме того, он сможет не только упростить выражения локально внутри функции, но и выполнить целую оптимизацию программы. Он может переставлять выражения, чтобы улучшить числовую стабильность (уменьшить влияние ошибки с плавающей запятой) или даже полностью исключить их, используя другое представление. BigInt, число с плавающей запятой IEEE1394, задает предикат, интегрирует по кусочным функциям. Вероятно, можно сделать еще больше.
Такое возможно, нет? Я знаю, что вы можете выполнять такие вещи, используя функции языка программирования Mathematica или MatLab, но они называются ПО исходным кодом. Я хочу, чтобы он применял компилятор к исходному коду. (У этих языков есть такие вещи? Я не знаю.) Мне нравится использовать Mathematica на работе, когда у меня есть оправдание, но потом я получаю магически выглядящие функции в C++, которые не имеют смысла, не обращаясь к внешней Тетрадь Mathematica. Я бы хотел быть математиком и программистом на одном языке, в одной среде. Существует ли такая вещь?
1 ответ
Что ж, Maxima [1], безусловно, способен создавать выражения и манипулировать ими, а также создавать из них функции. Функции также являются просто выражениями, поэтому довольно просто взять какое-либо выражение, манипулировать им, создать функцию и вызвать функцию и выполнять все эти вещи с переменными вместо конкретных значений. Например, вот ваша функция площади круга:
(%i1) display2d : false $
(%i2) a(r) := ''(4 * integrate (sqrt (r^2 - x^2), x, 0, r));
Is r positive, negative or zero?
p;
(%o2) a(r):=%pi*r^2
(%i3) a(10);
(%o3) 100*%pi
(%i4) a(h);
(%o4) %pi*h^2
Общая идея о том, что язык программирования способен работать над собой, возник в Lisp, который до сих пор является хорошим языком для таких упражнений. Максима реализована в Лиспе. Я рекомендую изучать Lisp, вы можете многое узнать о программировании в целом, даже если вы в конечном итоге будете работать с другими языками.