Рекомендации по языку сценариев или плагинов для пользовательского кодирования, сильно зависящего от математики? [закрыто]

Я объявил вознаграждение за этот вопрос

... потому что я действительно хочу вклад сообщества. Я могу (и имею) посмотрел на нескольких языках / фреймворков и подумайте: "Что ж, это будет наверное, сработает нормально »- но я бы очень признателен за совет, основанный именно на проблема, с которой я сталкиваюсь, и особенно от любой, у кого есть опыт интеграции / используя то, что вы рекомендуете.


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

Этот инструмент имеет графический редактор уравнений,который внутренне строит объектно-ориентированное дерево выражений с разными объектами для каждой операции (например, может быть экземпляр класса Logarithm, который является узлом в дереве для добавления вычисления логарифма значения к основанию; он имеет два дочерних элемента, которые являются его входами.) Снимок экрана с его частью:

enter image description here

Вы можете увидеть дерево, которое оно строит слева, и несколько из многих (пятидесяти?) возможных операций в меню справа.

У этого есть несколько недостатков:

  • Графический редактор становится неудобным для сложных уравнений
  • Есть некоторые операции, которые трудно представить графически, например, создание больших матриц (ядро для x n свертка, например)
  • Он допускает только уравнения: нет ветвления или другой логики

Это было здорово, когда это было намного проще, но не сейчас, для тех вещей, с которыми наши пользователи хотят иметь возможность Это. Если бы я написал это сейчас, я бы сделал это совсем по-другому - и это мой шанс :)

Я хотел бы дать пользователю что-то более мощное, и позволить ему написать код - скриптовый или скомпилированный - который может выполнять гораздо более сложные операции . Мне нужен совет SO по поводу того, какую технологию он должен использовать или как лучше всего подходить к этому.

Остальная часть этого вопроса довольно длинная - извините. Я постарался подробно описать проблему. Заранее благодарим за чтение :)

Важные ограничения:

  • Наша математика работает с большими матрицами. В приведенном выше уравнении V1 представляет вход (один из потенциально многих) и может быть двухмерным или трехмерным, и каждое измерение может быть большим: порядка тысяч или сотен тысяч. (Мы редко вычисляем все это сразу, просто срезы / сегменты. Но если ответ включает в себя что-то, что требует упорядочивания данных, имейте в виду, что размер и скорость этого являются важными.)

  • Предоставляемые нами операции позволяют вам писать скажем, 2 x V , который умножает каждый элемент в V на 2. В результате получается другая матрица того же размера. Другими словами, языка сценариев или программирования, который включает стандартные математические примитивы, недостаточно: нам нужно иметь возможность контролировать , какие примитивы доступны, или , как они реализованы.

    Эти операции могут быть сложными: входные данные могут быть такими простыми, как число (2, 5,3, пи), или такими сложными, как 1, 2 или 3-мерная матрица, которая содержит числовые , ] логические или комплексные (парные значения) данные. В настоящее время я считаю, что язык достаточно мощный, для которого мы можем предоставлять наши типы данных как классы и реализовывать стандартные операторы. Простого оценщика будет недостаточно.

    • Вместо того, чтобы просто писать операции, которые итеративно оцениваются на одном или нескольких входах для обеспечения вывода, как в настоящее время (что легко реализуемо с помощью оценщика выражений), я бы хотел, чтобы пользователь уметь: предоставлять выходы разных размеров входам; для вызова других функций; и т. д. Для основной программы было бы полезно иметь возможность спрашивать код пользователя, какая часть или часть входных данных потребуется для оценки среза или части вывода. Я думаю, что раскрытие некоторой части наших классов и использование объектно-ориентированного языка , вероятно, лучший способ достичь этих целей.
  • Наша аудитория - это в основном ученые-исследователи, которые либо не привыкли к программированию, либо, вероятно, используются на такой язык, как Matlab или R.

  • Мы используем Embarcadero C ++ Builder 2010 для разработки с небольшим количеством Delphi. Это может ограничить то, что мы можем использовать - просто потому, что что-то, скажем, на C ++, не означает, что оно будет работать, если оно было написано только на VC ++ или GCC. Оно также должно быть подходящим для использования с коммерческим программным обеспечением.

  • В настоящее время наше программное обеспечение имеет интерфейс COM, и часть приложения может быть автоматизирована с помощью нашего приложения, являющегося внепроцессным COM-сервером. Мы могли бы добавить COM-интерфейсы к некоторым внутренним объектам или создать вторую платформу COM специально для этого, если потребуется.

  • «Инструменты», включая этот, переносятся на многопоточную структуру. Конечное решение должно быть способно выполняться в любом потоке и его несколько экземпляров одновременно во многих потоках . Это может повлиять на исполняемую среду размещенного языка - Python 2.x, например, имеет глобальную блокировку.

  • Было бы здорово использовать язык, который поставляется с библиотеками для математических или научных целей.

  • Обратная совместимость со старым средство выражения не важно. Это версия 2: чистый лист!

Текущие идеи:

  • RemObjects Pascal Script и DWScript - это языки, легко связываемые с классами, производными от TObject . Я не знаю, можно ли обеспечить перегрузку оператора.
  • Размещение среды выполнения .Net и загрузка библиотек DLL на основе C # (скажем) в качестве подключаемых модулей. Мне очень нравится эта идея: я видел, как это было сделано, когда основная программа предоставляет подсветку синтаксиса, отладку и т. Д.Я так понимаю, что это было огромное количество кода. Это также позволило бы использовать IronPython и F #.
    • RemObjects Hydra выглядит интересным способом достижения этой цели. К сожалению, он рекламирует себя Delphi, а не C ++ Builder; Я занимаюсь исследованием совместимости.
  • Размещение чего-то вроде Python, что можно сделать из RAD Studio
  • Предоставление интерфейса BPL и предоставление пользователям возможности кодировать непосредственно для нашей программы, если они покупают копию RAD Studio (т. Е. предоставлять интерфейс плагина и предоставлять классы через интерфейсы; возможно, потребуется, чтобы плагины были скомпилированы с бинарно-совместимой версией нашей IDE)
  • ...

Спасибо за ваш вклад! Я ценю все ответы, даже если они не совсем идеальны - я могу исследовать, я просто ищу указатели, куда идти, и мнения (пожалуйста, мнения с причинами, включенными в ответ: p) о том, как подойти к этому или что может быть пригодным. Мы будем благодарны за каждый ответ, даже самый короткий. Но если вы порекомендуете что-то в деталях, а не просто "используйте язык X", мне будет очень интересно это прочитать:)

Ура,

Дэвид

Обновления:

На данный момент рекомендовано следующее :

  • Python: 2.6 имеет глобальную блокировку, что звучит как убийца игр. 3 (по-видимому) еще не получил широкой поддержки со стороны полезных библиотек. Для меня (и я знаю, что я посторонний в сообществе Python) это звучит немного фрагментировано - действительно ли его безопасно использовать?

  • Lua: не похоже на объектно-ориентированный объект, но предоставляет «мета-механизмы для реализации функций вместо предоставления множества функций непосредственно в языке» . Это звучит очень круто с точки зрения программиста, но не нацелено на программистов, которые хотят поиграть с классными вещами. Я не уверен, насколько хорошо это будет работать с учетом целевой аудитории - я думаю, что язык, который предоставляет больше встроенных основ, был бы лучше.

  • MS script / ActiveScript. Мы уже предоставляем внешний COM-интерфейс, который наши пользователи используют для автоматизации нашего программного обеспечения, обычно на VBScript. Однако мне бы хотелось иметь более мощный (и, честно говоря, лучше спроектированный) язык, чем VBS, и я не думаю, что подходит JScript. Я также не уверен, какие проблемы могут возникнуть при маршалинге данных через COM - у нас много данных, часто очень специфически типизированных, поэтому важны скорость и сохранение этих типов.

  • Лисп: Я даже не думал об этом языке , но я знаю, что у него много поклонников.

  • Плагины для хостинга .Net: никем не упомянуты. Разве это не хорошая идея? Вы получаете C #, F #, Python ... Есть ли у него те же проблемы с сортировкой, что и у COM? (Работает ли хостинг CLR через COM?)

Несколько пояснений: под «матрицей» я подразумеваю матрицу в смысле переменных Matlab, то есть огромную таблицу значений - не, скажем, матрицу преобразования 4x4. как вы могли бы использовать для программного обеспечения 3D. Это данные, собираемые с течением времени, тысячи и тысячи значений часто много раз в секунду. Мы также не стремимся к системе компьютерной алгебры, а к чему-то, где пользователи могут писать полные плагины и писать свою собственную математику - хотя система, способная обрабатывать сложную математику, как система компьютерной алгебры, может быть полезна. Я бы предпочел «полный язык» «алгебру», хотя, если они не смешиваются, чтобы разрешить сложные ветки / пути в пользовательском коде, а также объектно-ориентированный интерфейс.

48
задан Community 23 May 2017 в 10:27
поделиться