Вверх ↑
Разработчик
Ответов: 4697
Рейтинг: 426
#1: 2014-06-09 01:35:51 ЛС | профиль | цитата
[offtop]Давным-давно я хотел сделать свой парсер математики с возможностью записи нескольких формул в одном компоненте (например, чтоб все корни квадратного уравнения считать ), но так руки и не дошли, появились дела и идея заглохла. Вчера голову посетила навязчивая идея: уже же есть навороченный и медленный парсер математики и простой и быстрый компилятор математики. Так почему бы не попытаться совместить два этих компонента? Так родился MathParserEx. (Кстати, изначально он планировался как полная замена MathParser, но пока этого делать нельзя. Почему - далее).[/offtop]

Итак, MathParserEx, в чем его особенности:

  • Полностью копирует функционал MathParser
  • Построен на технологии компиляции в байт-код и его последующего исполнения своей стековой ВМ, что делает его в разы быстрее MathParser.
  Как это работает?
  Сначала компоненту подается на вход строка - выражение, которое он будет считать. Парсер разбирает это выражение и компилирует его в опкоды. После этого входная строка в общем-то и не нужна, программа уже есть в памяти.
В чем отличие от FastMathParser?
В FastMathParser происходит компиляция напрямую в коды процессора, что делает компонент непереносимым на другие архитектуры. Байт-код, который использует MathParserEx, не привязан к архитектуре процессора, поэтому компонент гораздо легче протируем на другие процессоры. Но, конечно же, за это приходится платить небольшим ухудшением производительности.
Когда дергаем точку doCalc, происходит выполнение этой программы, т.е. еще раз парсить выражение не надо. За счет этого и происходит значительный прирост производительности.

  Что еще не реализовано?
  На данный момент нет возможности при возникновении вычислительной ошибки узнать, в каком месте исходного выражения она произошла. Реализация этого может привести к падению производительности за счет того, что придется увеличить объем получаемого байт-кода (из-за вставки отладочной инфы), скорее всего будет сделано два режима работы компонента: debug (доступен просмотр позиций ошибок вычисления) и release (недоступен просмотр).
UPD: уже реализовано

  Что я предлагаю?
  Предлагаю вам потестировать этот компонент и проверить на ошибки (у меня он заработал сразу же после первой компиляции, что меня очень удивило Так что скорее всего какие-то подводные камни, которые я не заметил, есть). После тестов и доработки обработки ошибок заменить этим компонентом штатный MathParser (можно даже без смены названия, т.к. совместимость обещана полная). Другой вариант - оставить его отдельным компонентом и развивать далее.

Кстати, заметил одну интересную особенность: есть свойство ResultType, определяющее, будет ли целым результат. Но когда мы повторно используем результат через %0 в выражении, подставляется вещественный результат, что в итоге может привести к неожиданным результатам вычислений. Может, стоит пофиксить такое поведение?

P.S.: тестовая схема выдает у меня двукратный прирост производительности на компиляторе Delphi 4 и трехкратный на FPC 1.9.6.
P.P.S.: Компонент и тестовая схема приложены в архиве вот здесь внизу:
||
||
/
карма: 10
7
файлы: 2mathparseex.rar [12.3KB] [398], mathparseex_v1.3.rar [13.5KB] [406]
Голосовали:nesco, ser_davkin, foksov, sla8a, MAV, Dseren, Konst