Recommandations pour un langage de script ou de plugin pour un codage utilisateur dépendant fortement des mathématiques? [fermé]

j'ai commencé une prime pour cette question

...parce que je veux vraiment l' apport de la communauté. Je peux (et ont) regardé plusieurs langues / les cadres et penser ' bien, ce sera probablement ok, mais je voudrais vraiment apprécier conseils basés spécifiquement sur l' problème que je rencontre, et en particulier de toute personne ayant de l'expérience en intégration / utilisez ce que vous recommandez.


je travaille sur un logiciel d'analyse scientifique. Il fournit une multitude d'outils pour la transformation mathématique des données. Un outil permet à l'utilisateur d'entrer dans sa propre équation, qui est exécutée sur le jeu de données (une grande matrice 2D ou 3D de valeurs) et évaluée.

cet outil a un éditeur d'équation graphique, qui construit en interne un arbre d'expression orienté objet avec un objet différent pour chaque opération (il y aurait une instance du Classe logarithmique, par exemple, qui est le noeud dans l'arbre pour ajouter calculant un logarithme d'une valeur à une base; il a deux enfants qui sont ses entrées.) Une capture d'écran d'une partie de celui-ci:

enter image description here

vous pouvez voir l'arbre qu'il construit sur la gauche, et quelques-uns de beaucoup (cinquante?) opérations potentielles dans le menu à droite.

il y a quelques inconvénients:

  • A l'éditeur graphique devient maladroit pour les équations complexes
  • il y a certaines opérations qui sont difficiles à représenter graphiquement, comme la création de grandes matrices (le noyau pour un n x n convolution par exemple)
  • il permet seulement des équations: il n'y a pas de ramification ou d'autre logique

Il a été soigné quand il était beaucoup plus simple, mais pas plus, pour le genre de trucs que nos utilisateurs veulent être en mesure à faire avec elle. Si je l'écrivais maintenant, je le ferais tout à fait différemment - et c'est ma chance :)

je voudrais donner à l'utilisateur quelque chose de plus puissant, et les laisser écrire le code - script ou compilé - qui peut effectuer des opérations beaucoup plus avancées. je suis à la recherche DONC des conseils pour que cette technologie doit utiliser ou la meilleure approche à adopter vis à vis d'elle.

le reste de cette question est assez longue - je suis désolé. J'ai essayé de décrire l' problème en détail. Merci d'avance pour la lecture :)

contraintes importantes:

  • nos mathématiques fonctionnent sur de grandes matrices. Dans l'équation ci-dessus, V1 représente l'entrée (une parmi plusieurs potentiellement) et est 2D ou 3D, et chaque dimension peut être grande: de l'ordre de milliers ou de centaines de milliers. (Nous calculons rarement tout cela à la fois, juste des tranches / segments. Mais si la réponse implique quelque chose qui nécessite la mise en commun des données, la taille et la vitesse sont des facteurs à prendre en considération.)

  • les opérations que nous fournissons vous permettent d'écrire, dire, 2 x V , qui multiplie chaque élément dans V par 2. Le résultat est une autre matrice de même taille. En d'autres termes, un langage de script ou de programmation qui inclut des primitives mathématiques standard n'est pas suffisant: nous devons être en mesure de contrôler ce que primitives sont disponibles, ou comment ils sont mis en œuvre.

    ces opérations peuvent être complexes: l'entrée peut être aussi simple qu'un nombre (2, 5.3, pi) ou aussi complexe qu'une matrice 1, 2 ou 3 dimensions, qui contient numérique , booléen ou complexe (valeurs pairées) données. Ma pensée actuelle est un langage assez puissant à laquelle nous pouvons exposer nos types de données en tant que classes et peut mettre en œuvre des opérateurs standard. Un simple évaluateur ne suffira pas.

    • plutôt que de simplement écrire des opérations qui sont évaluées itérativement sur un ou plusieurs inputs pour fournir un output, comme actuellement (qui peut être implémenté facilement par un évaluateur d'expressions), je voudrais que l'utilisateur soit capable de: fournir des outputs de différentes tailles aux inputs; appeler d'autres fonctions; etc. Pour le programme hôte, il serait utile de pouvoir demander au code de l'utilisateur quelle partie ou tranche des entrées sera requises pour évaluer une tranche ou partie de la sortie. Je pense que exposer une partie de nos cours et en utilisant un langage OO est probablement la meilleure façon d'atteindre ces points.
  • notre public est principalement constitué de chercheurs qui soit ne sont pas habitués au codage, soit sont probablement habitués à un langage comme Matlab ou R.

  • nous utilisons Amarcadero C++ Builder 2010 pour le développement, avec de petites quantités de Delphi. Cela peut restreindre ce que nous pouvons utiliser - juste parce que quelque chose est C++, disons, ne veut pas dire qu'il fonctionnera s'il n'a été codé que contre VC++ ou GCC. Il doit également être adapté pour une utilisation avec les logiciels commerciaux.

  • notre logiciel dispose actuellement d'une interface COM, et une partie de l'application peut être automatisée avec notre application étant le serveur COM out-of-process. Nous pourrions ajouter COM interfaces vers certains objets internes, ou créer un second framework COM spécifiquement pour cela, si nécessaire.

  • les "outils", y compris celui-ci, sont migrés vers un cadre multithread. La solution finale doit pouvoir être exécuté dans n'importe quel thread , et instances multiples de celui-ci dans de nombreux threads à la fois . Cela peut affecter un langage hébergé runtime-Python 2.x, par exemple, a une verrouillage.

  • l'idéal serait d'utiliser une langue qui est livré avec des bibliothèques de mathématiques ou scientifiques.

  • la compatibilité avec L'ancien outil d'expression N'est pas importante. C'est la version 2: la table rase!

idées Actuelles:

  • RemObjects Pascal Script et Les DWScript sont des langages facilement liables aux classes dérivées de TObject . Je ne sais pas s'il est possible de fournir la surcharge de l'opérateur.
  • héberge le .net runtime, et charge des DLLs basés sur C# (say) comme plugins. J'aime plutôt cette idée: j'ai vu Cela fait où le programme hôte fournit un surligneur de syntaxe, débogage, etc. Apparemment, c'était un énorme quantité de codage. Il permettrait L'utilisation D'IronPython et F# too.
    • RemObjects Hydra ressemble à une manière intéressante d'atteindre ce. Malheureusement, il s'affiche pour Delphi, pas pour C++ Builder; j'enquête sur la compatibilité.
  • hébergement quelque chose comme Python, qui est faisable à partir de RAD Studio
  • fournissant une interface BPL, et permettant aux utilisateurs code directement contre notre programme s'ils achètent une copie de RAD Studio (c'est-à-dire fournir une interface plugin, et exposer les classes à travers des interfaces; peut-être exiger que les plugins soient compilés avec une version compatible binaire de notre IDE)
  • ...

Merci pour votre contribution! J'apprécie toutes les réponses même si elles ne sont pas tout à fait parfait - je suis à la recherche, je suis juste après conseils sur où aller, et les opinions (s'il vous plaît, opinions avec les raisons inclus dans la réponse :p) sur la façon de l'aborder, ou de ce qui pourrait être adapté. Chaque réponse, aussi courte soit-elle, sera appréciée. Mais si vous recommandez quelque chose en détail plutôt que juste "use language X" je serais très intéressé à le lire:)

Cheers,

David

Mises à jour:

les recommandations suivantes ont été formulées à ce jour:

  • Python: 2.6 a une serrure globale, qui sonne comme un tueur de jeu. 3 (apparemment) pas encore ont un large soutien des bibliothèques utiles. Il me semble (et je sais que je suis un outsider de la communauté Python) qu'il se fragmente un peu - est-il vraiment sûr à utiliser?

  • Lua: ne semble pas être directement OO, mais offre "méta-mécanismes de mise en œuvre de fonctionnalités, au lieu de fournir une foule de fonctionnalités directement dans la langue" . Cela semble très cool du point de vue du programmeur, mais ce n'est pas ciblé sur les programmeurs veulent des trucs cools pour s'amuser. Je ne suis pas sûr que cela fonctionnerait bien étant donné le public cible - je pense qu'un langage qui fournit plus de bases intégrées serait mieux.

  • MS script / ActiveScript. Nous fournissons déjà une interface COM externe que nos utilisateurs utilisent pour automatiser notre logiciel, généralement en VBScript. Cependant, je voudrais un langage plus puissant (et, franchement, mieux conçu) que VBS, et je ne pense pas JScript est adapté. Je ne suis pas certain non plus des problèmes que pourrait poser la collecte de données par le biais de COM - nous disposons de beaucoup de données, souvent dactylographiées de manière très spécifique, de sorte que la rapidité et le maintien de ces types de données sont importants.

  • Lisp: Je n'avais même pas pensé à ce langage, mais je sais qu'il a beaucoup de fans.

  • Hébergement de plugins .Net: non mentionné par personne. N'est-ce pas une bonne idée? Vous obtenez C#, F#, Python... A-t-elle les mêmes problèmes de composition pourraient? (L'hébergement du CLR se fait-il par L'intermédiaire du COM?)

quelques clarifications: par "matrice", je veux dire matrice au sens de la variable Matlab, c'est - à-dire une énorme table de valeurs-pas, disons, une matrice de transformation 4x4 comme vous pourriez utiliser pour les logiciels 3D. Ce sont des données recueillies au fil du temps, des milliers et des milliers de valeurs souvent plusieurs fois par seconde. Nous ne sommes pas non plus après un système d'algèbre informatique, mais quelque chose où les utilisateurs peuvent écrire des plugins complets et écrire leurs propres mathématiques - bien que le système ayant la capacité de gérer les mathématiques complexes, comme un système d'algèbre informatique peut, serait utile. Je prendrais "full language" plutôt que "algebra" cependant si les deux ne se mélangent pas, pour permettre des branches / chemins complexes dans le code d'utilisateur, aussi bien qu'une interface OO.

48
demandé sur Community 2011-06-01 11:53:43
la source

12 ответов

selon vos besoins, voici quelques lignes directrices:

  • faire une distinction entre la langue et la bibliothèque - vous pouvez avoir des langues mathématiques (comme MATLAB) ou des bibliothèques mathématiques appelées à partir d'un langage de haut niveau (comme Python);
  • la langue (ou la bibliothèque) doit être conçue par des mathématiciens, pour des mathématiciens;
  • La langue utilisée doit être un existant (ne pas réinventer la roue);
  • vous devriez pouvoir partager le contenu du script avec un logiciel existant;""
  • vous ne devriez pas commencer un projet aussi grand complexe (écriture mathématique) à partir de zéro.

donc je suppose qu'il pourrait réduire la liste des candidats:

  • JavaScript n'a pas été conçu (pas utilisé) pour une telle utilisation;
  • Delphi scripts (DWS ou PascalScript) ont été faites principalement pour l'automatisation, pas de calcul (et ne sont pas largement utilisés);
  • Je ne sais pas pourquoi vous parlez D'utiliser Delphi IDE dans l'application client, mais vous ne devriez pas utiliser Delphi IDE pour un tel développement propriétaire: un IDE personnalisé primitif sera plus productif qu'un RAD complet;
  • Lua devrait peut - être être considéré: Vous pouvez faire ce que vous voulez avec ce moteur de script-mais il n'y a pas une communauté énorme de mathématiciens utilisant Lua, contrairement à Python...

dans le monde Open Source, vous pourriez trouver beaucoup de solutions très intéressantes. Voir http://blog.interlinked.org/science/open_source_math_programs.html

je suppose que Octave pourrait être considéré. C'est simple, puissant, mature, bien connu, utilisé par beaucoup de logiciels, et multiplateformes.

autant que je sache, vous pouvez appeler la bibliothèque Octave du code C / C++. Il pourrait être fait à partir de Delphi IMHO, après la traduction de l'associé .h fichiers.

mais soyez conscient de la licence GPL. Si votre logiciel est propriétaire, il pourrait être impossible de distribuer Octave en tant que partie de votre logiciel. Mais vous pouvez appeler la bibliothèque Octave ou tout autre truc GPL (comme Python) de votre logiciel, si vous faites une distinction claire entre votre logiciel et le logiciel GPL .

Intégration de Python pourrait être une bonne solution. Ce langage peut être appelé à partir de Delphi, et vous devriez avoir une bonne architecture, sans avoir besoin d'appeler directement certaines bibliothèques C comme Octave. Python pourrait être votre porte principale pour toutes les autres bibliothèques de calcul, à partir de votre application Delphi. Par exemple, Octave peut être appelé à partir de certaines bibliothèques Python. Et vous pouvez également utiliser des scripts Python pour automatiser votre propre application. Et vous avez du IDE Python à Delphes autour de. La licence Open Source de chaque composant étant sûr, bien sûr. Plus j'y pense, plus je l'aime cette dernière solution...

juste mes deux cents. :)

18
répondu Arnaud Bouchez 2014-11-13 14:43:04
la source

Pas de réponse définitive, mais quelques autres suggestions:-

  • Avoir un regard sur le LMD Innovantes ScriptPack , qui prend en charge native de Pascal script, et aussi ActiveScripting à base de langues. Avertissement: j'utilise beaucoup d'outils et de composants LMD, mais je n'ai pas personnellement utilisé Scriptpack.

  • LMD ont également am IDE-Tools package , qui peut vraiment simplifier la tâche de faire un outil Rad personnalisé simple si vous avez besoin d'aller cette route

  • un autre vote pour Lua. J'ai utilisé Lua comme langage de script dans les applications C++Builder2010, et cela fonctionne bien. Vous pouvez utiliser le C++Builder/Delphi RTTI pour faciliter l'intégration entre le script Lua et votre code C++.

Re. Lua: nous avons un produit qui pendant de nombreuses années avait un système de script "homebrew" à ultrasimple. Pas de boucles, conditions ou procédures-juste une séquence de commandes paramétrées. Nous voulions étendre cela à quelque chose de plus puissant, et choisir une solution tierce semblait beaucoup moins pénible que de réinventer la roue. Les principales raisons pour lesquelles Lua a été choisie sont les suivantes:"

  • Rapide
  • livres publiés disponibles ( programmation en Lua )
  • écrit en C
  • directement incorporé dans notre projet via la liaison statique
  • MIT License
  • Code C++ peut appeler appeler du code Lua et l'accès Lua variables
  • le code Lua peut appeler des fonctions C++
  • Petit déploiement de l'empreinte. Lua et ses bibliothèques standards ont ajouté moins de 200K à nos.EXE, avant la compression.

je suis sûr que d'autres langues auraient pu être tout aussi bonnes, mais C'était la nature "légère" de Lua qui a basculé c'est pour moi.

7
répondu Roddy 2011-06-06 13:40:10
la source

j'aime beaucoup les réponses là-bas et, bien, je suis un nerd Delphi biaisé :) mais je vous suggérerais d'utiliser une combinaison: Script ro Pascal+ ESBPCS pour VCL.

Je ne sais pas si cela vous ressemble - mais je voudrais essayer.

à partir du site web, j'ai extrait ce lien à propos de la partie non visuelle matrice de la bibliothèque. Il y en a beaucoup d'autres, vous devriez essayer!

5
répondu Andrea Raimondi 2011-06-03 21:55:59
la source

avec Python, vous obtenez NumPy et SciPy gratuitement". Oui, il y a GIL, mais il n'est actif que lorsque votre interpréteur Python exécute plusieurs threads. Je crois que vous pouvez exécuter plusieurs hôtes Python dans des threads séparés sans problème (je n'ai pas essayé, pensé).

il y a aussi des choses comme multiprocessing .

Python 3 est toujours en cours de développement, num Python a commencé à prendre en charge Python 3 dans la version 1.5.0, et SciPy ont démarré le support dans la version 0.9.0 . De plus, le GIL est toujours avec Python 3, bien qu'il ait été refait, donc il devrait être mieux. Aussi NumPy libère la serrure pendant les opérations.

5
répondu Harriv 2017-05-23 13:27:23
la source

nous avons utilisé le Microsoft script automation (active scripting) avec beaucoup de succès. Fondamentalement, vous devez implémenter un hôte qui exécutera les scripts. Les Scripts peuvent être écrits dans n'importe quelle langue qui sont installés sur la machine. Nous utilisons JavaScript pour nos scripts, mais vous n'êtes pas limité à cela. Il y a beaucoup d'implémentation de script là-bas (même python).

de votre côté, vous devrez fournir un cadre pour le script à exécuter. Pas simple mais avec COM compréhension de base il n'est pas difficile non plus. Il y a des implémentations faites pour Delphi. Il y a des ressources ici: http://www.torry.net/pages.php?id=280 mais vous pouvez trouver des ressources partout sur le web.

bonne chance!

4
répondu r4w8173 2011-06-01 12:42:28
la source

je suggère Lua. C'est l'un des langages de script les plus utilisés, il y a beaucoup d'outils tels que des débogueurs, des éditeurs avec mise en avant de la syntaxe, etc., beaucoup de gens l'ont utilisé, c'est l'un des langages de script les plus rapides que vous pouvez facilement brancher dans un MOTEUR c/c++. Il est très facile d'y étendre les fonctions C (en particulier si vous utilisez LuaJIT plus FFI). Il n'y a pas vraiment de bonne façon de multithreading dans lua, mais vous pouvez facilement exécuter plusieurs instances de lua séparément. threads afin d'exécuter plusieurs scripts.

4
répondu Simon 2011-06-04 03:05:23
la source

parce que vous avez besoin d'un langage de script ciblé en mathématiques, puis-je vous recommander de jeter un oeil à Lisp commune . C'est un dialecte du LISP, qui a été initialement développé comme une notation mathématique conventionnelle pour les programmes informatiques. Les systèmes informatiques d'algèbre comme Maxima et axiome sont écrits en Lisp commun. La mise en œuvre la plus notable de la liste commune est ECL , qui est libéré sous licence LGPL. Bien sûr, il existe de nombreuses autres implémentations open source.

il y a aussi GNU Guile interprète pour Langage de programmation Scheme (un dialecte de Lisp). Leur site indique que

Guile est une machine virtuelle efficace qui exécute un jeu d'instructions portable généré par son compilateur d'optimisation, et s'intègre très facilement avec le code d'application C et C++. Outre pour Scheme, Guile inclut les front-ends du compilateur pour ECMAScript et Emacs Lisp (support pour Lua est en cours)...

cependant, je n'ai jamais utilisé cette bibliothèque moi-même, donc je ne peux pas garantir à quel point il serait facile de l'intégrer dans votre application.

4
répondu ezpresso 2011-06-08 19:53:23
la source

personne n'a mentionné PaxCompiler qui peut compiler Pascal, Javascript et Basic en code natif et peut facilement être configuré pour accéder aux objets dans vos projets Delphi. Il présente de nombreux avantages:

  1. le code compilé s'exécute plus rapidement qu'un code interprété
  2. il fournit 3 langages de programmation différents de sorte que presque n'importe quel développeur peut se sentir à la maison
  3. en tant que développeur Delphi, vous avez accès au code source et il est étroitement intégré à votre projet
  4. le prix est très intéressant

Les inconvénients et les défis pour un projet populaire:

  1. assurez-vous que les 3 langues sont traitées de la même manière: d'après mes tests, il semble que JavaScript est en retard en termes de paquets d'échantillons
  2. si vous choisissez de regrouper tous les 3 langages de programmation, vous pourriez vouloir fournir presque tous vos échantillons dans toutes les langues et vous aurez à être à l'aise avec le soutien de tous les trois
4
répondu jonjbar 2011-06-14 15:58:40
la source

je suggère que vous examiniez l'interface graphique basée sur WX (C++) autour du programme de mathématiques open source classique appelé Maxima, qui est appelé wxMaxima sur Windows. Il est sous licence GPL, cependant, et non LGPL, de sorte que les travaux dérivés devraient également être source ouverte.

vous devriez être en mesure d'utiliser cette application et son moteur d'algèbre, et peut-être que vous pourriez écrire votre propre emballage Delphi pour ce C++ UI autour du moteur MACSYMA/MAXIMA (LISP). Le code source de leur le système comprend quelques choses que vous pourriez également vouloir envelopper et fournir comme un service:

  1. une façon d'encoder les équations mathématiques dans un format d'affichage, à partir du format saisi par l'utilisateur, qui est bien défini et qui peut ensuite être documenté.

  2. une spécification de" langage "simple que vous pourriez utiliser pour composer vos outils" d'équation de WYSIWYG".

Maxima peut manipuler des parcelles, matrices, algèbre linéaire et calculs de base, et le moteur est solide.

puisque vous faites déjà beaucoup de choses en C++, j'envisagerais de faire toute votre APPLICATION en utilisant wxWidgets, avec wxMaxima comme base. Je ne suis pas sûr que vous puissiez faire des hybrides wx + VCL dans C++Builder, mais vous devriez certainement l'essayer. Si vous ne pouvez pas, alors je dirais faire L'application principale en VC++ avec wxWidgets et faire des plugins en Delphi pour elle (comme DLLs).

enter image description here

3
répondu Warren P 2011-06-09 18:17:32
la source

mes idées:

  1. appelez Mathematica via son API (C, Java, C#), mais je crains que ce soit trop lent pour vous http://reference.wolfram.com/mathematica/guide/MathLinkAPI.html

  2. Generate F# with http://fsharppowerpack.codeplex.com / et son fslex, fsyacc. Voir aussi: comment évaluer une expression stockée sous forme de chaîne dans F# , Tim Robinson la construction d'un compilateur LISP en F#

3
répondu oleschri 2017-05-23 15:18:30
la source

vous avez mentionné que votre public est probablement utilisé pour R. Vous devriez envisager l'intégration de votre produit avec R, soit en tant qu'Extension R ou en appelant R à partir de votre produit. Voir L'Écriture D'Extensions De R . De cette façon, vous pouvez tirer parti de la puissance de R et vos utilisateurs familiarité avec R.

3
répondu crefird 2011-06-10 06:07:42
la source

GIL sur python ne doit pas être un showstopper car son existence ne signifie pas que votre application ne peut pas faire de thread multiple. Il est vrai que vous ne pouvez pas utiliser tout le noyau CPU disponible sur le système, mais encore une fois, cela n'affecterait que si la plupart de votre code était écrit en python. Votre application hôte code python droit? et ce script appellerait intensivement routines mathématiques disponibles dans l'application hôte. Cela signifie qu'il y avait encore beaucoup d'issue pour libérer et tenir le GIL sur votre demande afin de minimiser ses effets secondaires et vous serez amende.

3
répondu Jaimy Azle 2011-06-10 11:57:47
la source

Autres questions sur