Я начал щедрость для этого вопроса
... потому что я действительно хочу сообщества. Я могу (и иметь) посмотрел на несколько языков/ и подумать "хорошо, это будет вероятно, хорошо работает", но я бы действительно ценят советы, основанные исключительно на проблема, с которой я сталкиваюсь, и особенно от любой, у кого есть опыт интеграции/ используя то, что вы рекомендуете.
Я работаю над программным обеспечением для научного анализа. Он предоставляет множество инструментов для математической трансформации данных. Один инструмент позволяет пользователю вводить свое собственное уравнение, которое выполняется по набору данных (большая двумерная или трехмерная матрица значений) и оценивается.
Этот инструмент имеет редактор графических уравнений, который внутренне создает дерево объектно-ориентированного выражения с другим объектом для каждой операции (например, будет экземпляр класса Logarithm, который является node в дереве для добавления вычисления логарифма значения к базе, у него есть двое детей, которые являются его входами.) Снимок экрана его части:
Вы можете увидеть дерево, которое он строит слева, и несколько из многих (пятьдесят?) потенциальных операций в меню справа.
У этого есть несколько недостатков:
- Графический редактор становится неуклюжим для сложных уравнений
- Есть некоторые операции, которые трудно представить графически, например создание больших матриц (например, ядро для свертки n x n)
- Он разрешает только уравнения: нет ветвления или другой логики
Это было аккуратно, когда это было намного проще, но не более того, для тех вещей, которые наши пользователи хотят иметь с этим делать. Если бы я написал это сейчас, я бы сделал это совсем по-другому - и это мой шанс:)
Я хотел бы дать пользователю что-то более мощное и позволить им писать код - script или скомпилированный - который может выполнять гораздо более сложные операции. Я ищу SO совета для того, какую технологию он должен использовать или лучший подход к ней.
Остальная часть этого вопроса довольно длинная - извините. Я попытался подробно описать проблему. Заранее благодарим за чтение:)
Важные ограничения:
-
Наша математика работает с большими матрицами. В приведенном выше уравнении V1 представляет собой вход (один из потенциально многих) и представляет собой 2D или 3D, и каждое измерение может быть большим: порядка тысяч или сотен тысяч. (Мы редко вычисляем все это сразу, только фрагменты/сегменты. Но если ответ включает в себя что-то, что требует сортировки данных, обратите внимание на размер и скорость этого рассмотрения.)
-
Операции, которые мы предоставляем, позволяют писать, скажем,
2 x V
, который умножает каждый элемент вV
на 2. Результат - это другая матрица того же размера. Другими словами, язык сценариев или программирования, который включает стандартные примитивы математики, недостаточно: нам нужно иметь возможность контролировать, какие примитивы доступны или как они реализованы.Эти операции могут быть сложными: ввод может быть таким же простым, как число (2, 5.3, pi) или сложным, как 1, 2 или 3-мерная матрица, которая содержит число boolean или complex (парные значения). Мое современное мышление - это язык, достаточно мощный, чтобы мы могли раскрывать наши типы данных как классы и реализовывать стандартные операторы. Простой оценщик будет недостаточным.
- Вместо того, чтобы просто писать операции, которые оцениваются итеративно на одном или нескольких входах для предоставления вывода, как и в настоящее время (который легко реализуется с помощью оценщика выражений), я хотел бы, чтобы пользователь мог: предоставлять выходы разных размеры к входам; для вызова других функций; и т.д. Для хост-программы было бы полезно спросить код пользователя, какая часть или фрагмент входов потребуется для оценки фрагмента или части вывода. Я думаю, что разоблачение некоторой части наших классов и использование языка OO, вероятно, лучший способ достичь этих целей.
-
Наша аудитория - это прежде всего ученые-исследователи, которые либо не используются для кодирования, либо, вероятно, используются для языка, такого как Matlab или R.
-
Мы используем Embarcadero С++ Builder 2010для разработки, с небольшим количеством Delphi. Это может ограничивать то, что мы можем использовать - просто потому, что что-то С++, скажем, не означает, что оно будет работать, если оно будет кодироваться только против VС++ или GCC. Он также должен быть подходящим для использования с коммерческим программным обеспечением.
-
Наше программное обеспечение в настоящее время имеет COM-интерфейс, и часть приложения может быть автоматизирована с нашим приложением, являющимся COM-сервером вне процесса. Мы могли бы добавить COM-интерфейсы к некоторым внутренним объектам или, если потребуется, сделать вторую COM-инфраструктуру.
-
"Инструменты", включая этот, переносятся в многопоточную среду. Конечное решение должно быть выполнено в любом потоке, а несколько экземпляров его во многих потоках одновременно. Это может повлиять на время выполнения размещенного языка - Python 2.x, например, имеет глобальную блокировку.
-
Было бы здорово использовать язык, который поставляется с библиотеками для математического или научного использования.
-
Обратная совместимость со старым инструментом выражения не важна. Это версия 2: чистый сланец!
Текущие идеи:
- RemObjects Pascal Script и DWScript - языки, легко связываемые с
TObject
-уложенными классами. Я не знаю, можно ли обеспечить перегрузку оператора. - Хостинг .Net runtime и загрузка С# (скажем) основанных DLL в качестве плагинов. Мне нравится эта идея: я видел, как это делается там, где хост-программа предоставляет синтаксический ярлык, отладку и т.д. Я понимаю, что это было огромное количество кодирования. Это позволило бы использовать IronPython и F #.
- RemObjects Hydra выглядит интересным способом достижения этого. К сожалению, он рекламирует себя для Delphi, а не С++ Builder; Я изучаю совместимость.
- Хостинг что-то вроде Python, который можно выполнить из RAD Studio
- Предоставление BPL-интерфейса и предоставление пользователям кода непосредственно против нашей программы, если они купят копию RAD Studio (т.е. предоставить интерфейс плагина и разоблачить классы через интерфейсы; возможно, потребуется, чтобы плагины были скомпилированы с бинарно-совместимой версией наша IDE)
- ...
Спасибо за ваш вклад! Я ценю все ответы, даже если они не совсем идеальны - я могу исследовать, я просто после указаний о том, куда идти, и мнениях (пожалуйста, мнения по причинам, включенным в ответ: p) о том, как подойти к нему или что может быть пригодным. Каждый ответ, каким бы коротким он ни был, будет оценен. Но если вы рекомендуете что-то подробно, а не просто "используете язык X", мне будет очень интересно его прочитать:)
Приветствия,
Дэвид
Обновление:
До сих пор было рекомендовано следующее:
-
Python: 2.6 имеет глобальную блокировку, которая звучит как игровой убийца. 3 (по-видимому) еще не имеет широкой поддержки от полезных библиотек. Это звучит для меня (и я знаю, что я сторонник сообщества Python), как будто он фрагментирует бит - действительно ли это безопасно?
-
Lua: кажется, не является прямым OO, но предоставляет "мета-механизмы для реализации функций, а не предоставляет множество функций прямо на языке" . Это звучит очень круто с точки зрения программиста, но это не нацелено на программистов, которым нужно поиграть с крутыми вещами. Я не уверен, насколько хорошо это будет работать с целевой аудиторией - я думаю, что язык, который обеспечивает более основанные основы, будет лучше.
-
MS script/ActiveScript. Мы уже предоставляем внешний COM-интерфейс, который наши пользователи используют для автоматизации нашего программного обеспечения, как правило, в VBScript. Тем не менее, мне нужен более мощный (и, откровенно говоря, лучше разработанный) язык, чем VBS, и я не думаю, что подходит JScript. Я также не уверен, какие проблемы могут быть связаны с данными по COM - у нас есть много данных, которые часто очень точно печатаются, поэтому важны скорость и сохранение этих типов.
-
Lisp: Я даже не думал об этом языке, но я знаю, что у него много поклонников.
-
Хостинг. Чистые плагины: никто не упоминается. Разве это не хорошая идея? Вы получаете С#, F #, Python... Есть ли у него такие же проблемы с сортировкой COM? (Ходит ли CLR работать через COM?)
Несколько пояснений:по "матрице", я имею в виду матрицу в смысле переменной Matlab, т.е. огромную таблицу значений - не, скажем, матрицу преобразования 4x4, как вы могли бы использовать для программного обеспечения 3D. Эти данные собирались с течением времени, тысячи и тысячи значений часто много раз в секунду. Мы также не после системы компьютерной алгебры, но что-то, где пользователи могут писать полные плагины и писать свою собственную математику - хотя система, обладающая способностью обрабатывать сложную математику, как система компьютерной алгебры, может быть полезна. Я бы взял "полный язык" над "алгеброй", хотя, если они не смешиваются, чтобы разрешить сложные ветки/пути в коде пользователя, а также интерфейс OO.