Мне со школьных времен был интересен алгоритм вывода аналитических производных и упрощения выражений. Данная задача была актуальна впоследствии и в вузе. Тогда-то я реализовал ее, только получилось все не так, как хотелось: вместо кода IL у меня просто генерировался C# код в текстовом виде, сборки не выгружались, ну и к тому же не было возможности вывода производных в аналитическом виде. Однако потом я решил все-таки реализовать такую библиотеку, так как интерес остался. Стоит отметить, что таких библиотек в интернете большое количество, но нигде я не нашел именно этапа компиляции выражений в IL код, т.е. по сути везде выполняется интерпретация, которая не столь эффективна, в отличие от компиляции. Ну и к тому же я это разрабатывал чисто для себя, для изучения новых технологий, особо не надеясь, что результат моих трудов может где-нибудь потребоваться. Для нетерпеливых: исходники, программа.
Этапы, на которые я разбил весь процесс:
Используемые программы и библиотеки
- GOLD Parsing System — IDE для написания грамматик и генерации кода лексеров и парсеров под различные языки (C, C#, Java, JavaScript, Objective-C, Perl, Python, Ruby и др.). Основана на LALR парсинге.
- Visual Studio 2010
- GOLD.Engine — сборка под .NET, подключаемая для взаимодействия со сгенерированными таблицами.
- NUnit — Открытая среда юнит-тестирования приложений для .NET.
- ILSpy — OpenSource дизассемблер под .NET.
Этапы, на которые я разбил весь процесс:
- Построение дерева выражения
- Вычисление аналитической производной
- Упрощение (симплификация) выражения
- Обработка рациональных дробей
- Компиляция выражения