J'ai lancé une prime pour cette question
...parce que je veux vraiment que la l'avis de la communauté. Je peux (et j'ai) regarder plusieurs langages / frameworks et me dire "bon, ça va probablement fonctionnera probablement bien" - mais j'aimerais mais j'apprécierais vraiment des conseils basés spécifiquement sur le problème auquel je suis confronté, et en particulier de la part de quelqu'un qui a de l'expérience dans l'intégration / l'utilisation de ce que vous recommandez. l'utilisation de ce que vous recommandez.
Je travaille sur des logiciels d'analyse scientifique. Il fournit de nombreux outils pour la transformation mathématique des données. L'un de ces outils permet à l'utilisateur de saisir sa propre équation, qui est exécutée sur l'ensemble des données (une grande matrice de valeurs en 2D ou en 3D) et évaluée.
Cet outil dispose d'un éditeur graphique d'équations, qui construit en interne un arbre d'expression orienté objet avec un objet différent pour chaque opération (il y aurait une instance de la classe Logarithme, par exemple, qui est le nœud dans l'arbre pour ajouter le calcul du logarithme d'une valeur à une base ; il a deux enfants qui sont ses entrées). Une capture d'écran d'une partie de l'arbre :
Vous pouvez voir l'arbre qu'il construit à gauche, et quelques-unes des nombreuses (cinquante ?) opérations potentielles dans le menu de droite.
Cela présente quelques inconvénients :
- Un éditeur graphique devient gênant pour les équations complexes
- Certaines opérations sont difficiles à représenter graphiquement, comme la création de grandes matrices (le noyau pour a n x n convolution par exemple)
- Il n'autorise que les équations : il n'y a pas d'embranchement ou d'autre logique.
C'était bien quand c'était beaucoup plus simple, mais ce n'est plus le cas pour le genre de choses que nos utilisateurs veulent pouvoir faire avec. Si je l'écrivais maintenant, je le ferais différemment - et c'est l'occasion :)
J'aimerais donner à l'utilisateur quelque chose de plus puissant, et lui permettre d'écrire du code - script ou compilé - qui peut effectuer des opérations beaucoup plus avancées. Je demande l'avis de SO sur la technologie à utiliser ou sur la meilleure approche à adopter.
La suite de cette question est assez longue - je suis désolé. J'ai essayé de décrire le problème en détail. Merci d'avance pour votre lecture :)
Des contraintes importantes :
-
Nos mathématiques opèrent sur de grandes matrices. Dans l'équation ci-dessus, V1 représente l'entrée (une parmi d'autres) et est en 2D ou en 3D, et chaque dimension peut être grande : de l'ordre de milliers ou de centaines de milliers. (Nous calculons rarement tout cela en même temps, seulement des tranches ou des segments. Mais si la réponse implique quelque chose qui nécessite de rassembler les données, sachez que la taille et la vitesse de cette opération sont à prendre en considération).
-
Les opérations que nous fournissons vous permettent d'écrire, de dire,
2 x V
qui multiplie chaque élément deV
Le résultat est une autre matrice de la même taille. En d'autres termes, un langage de script ou de programmation comprenant des primitives mathématiques standard ne suffit pas : nous devons être en mesure de contrôler ce que 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 o complexe (valeurs appariées). Je pense actuellement à un langage suffisamment puissant pour que nous puissions exposer nos types de données sous forme de classes et mettre en œuvre des opérateurs standard. Un simple évaluateur ne suffira pas.
- Plutôt que d'écrire des opérations qui sont évaluées itérativement sur une ou plusieurs entrées pour fournir une sortie, comme c'est le cas actuellement (ce qui est facilement réalisable par le biais d'un évaluateur d'expressions), j'aimerais que l'utilisateur puisse : fournir des sorties de tailles différentes des entrées ; 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 nécessaire pour évaluer une tranche ou une partie de la sortie. Je pense que exposer une partie de nos classes et utiliser un langage OO est probablement le meilleur moyen d'atteindre ces objectifs.
-
Notre public est principalement constitué de chercheurs scientifiques qui n'ont pas l'habitude de coder ou qui sont probablement habitués à un langage comme Matlab ou R.
-
Nous utilisons Embarcadero C++ Builder 2010 pour le développement, avec un peu de Delphi. Cela peut limiter ce que nous pouvons utiliser - ce n'est pas parce que quelque chose est en C++, par exemple, qu'il fonctionnera s'il a été codé uniquement avec VC++ ou GCC. Le logiciel doit également pouvoir être utilisé avec des logiciels commerciaux.
-
Notre logiciel possède actuellement une interface COM, et une partie de l'application peut être automatisée, notre application étant le serveur COM hors processus. Nous pourrions ajouter des interfaces COM à certains objets internes, ou créer un second framework COM spécifiquement pour cela, si nécessaire.
-
Les "outils", y compris celui-ci, sont en cours de migration vers un cadre multithread. La solution finale doit pouvoir être exécuté dans n'importe quel thread et plusieurs instances dans plusieurs threads à la fois . Cela peut affecter l'exécution d'un langage hébergé - Python 2.x, par exemple, dispose d'un verrou global.
-
Il serait formidable d'utiliser un langage qui s'accompagne de bibliothèques pour les mathématiques ou les sciences.
-
La rétrocompatibilité avec l'ancien outil d'expression n'est pas importante. Il s'agit de la version 2 : table rase !
Idées actuelles :
- RemObjects Pascal script y DWScript sont des langues qui peuvent être facilement liées à
TObject
-classes dérivées. Je ne sais pas s'il est possible de fournir une surcharge des opérateurs. - Héberger le runtime .Net, et charger des DLL basées sur C# (disons) en tant que plugins. J'aime bien cette idée : j'ai vu que le programme hôte fournissait un surligneur de syntaxe, un débogage, etc. J'ai cru comprendre qu'il s'agissait d'un énorme de codage, cependant. Il permettrait également d'utiliser IronPython et F#.
- RemObjects Hydra semble être un moyen intéressant d'y parvenir. Malheureusement, il est annoncé pour Delphi, et non pour C++ Builder ; je suis en train d'étudier la compatibilité.
- Accueillir quelque chose comme Python, ce qui est possible à partir de RAD Studio
- Fournir une interface BPL et permettre aux utilisateurs de coder directement avec notre programme s'ils achètent une copie de RAD Studio (c'est-à-dire fournir une interface de plugin et exposer les classes par le biais d'interfaces ; peut-être exiger que les plugins soient compilés avec une version de notre IDE compatible avec les binaires).
- ...
Merci pour votre contribution ! J'apprécie toutes les réponses même si elles ne sont pas parfaites - je peux faire des recherches, je cherche juste des indications sur les endroits où aller, et des opinions (s'il vous plaît, des opinions avec des raisons incluses dans la réponse :p) sur la façon d'aborder le sujet ou sur ce qui pourrait convenir. Toute réponse, même courte, sera appréciée. Mais si vous recommandez quelque chose en détail plutôt que de dire simplement "utilisez la langue X", je serai très intéressé de le lire :)
Santé,
David
Mises à jour :
Jusqu'à présent, les recommandations suivantes ont été formulées :
-
Python : 2.6 a un verrou global, ce qui semble être un tueur de jeu. 3 (apparemment) ne bénéficie pas encore d'un large soutien de la part de bibliothèques utiles. Il me semble (et je sais que je suis un étranger à la communauté Python) qu'il se fragmente un peu - est-il vraiment sûr d'être utilisé ?
-
Lua : ne semble pas être directement OO, mais fournit des "méta-mécanismes pour la mise en œuvre des fonctionnalités, au lieu de fournir une multitude de fonctionnalités directement dans le langage" . Cela semble très intéressant du point de vue d'un programmeur, mais ce n'est pas destiné aux programmeurs qui veulent des trucs sympas pour jouer avec. Je ne suis pas sûr que cela fonctionnerait bien compte tenu du public visé - je pense qu'un langage qui fournit plus de bases intégrées serait préférable.
-
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, j'aimerais un langage plus puissant (et, franchement, mieux conçu) que VBS, et je ne pense pas que JScript soit adapté non plus. Je ne sais pas non plus quels sont les problèmes qui pourraient survenir lors de l'acheminement des données via COM - nous avons beaucoup de données, souvent typées de manière très spécifique, de sorte que la rapidité et la conservation de ces types sont importantes.
-
Lisp : je n'avais jamais pensé à ce langage, mais je sais qu'il a de nombreux adeptes.
-
Hébergement de plugins .Net : personne ne l'a mentionné. N'est-ce pas une bonne idée ? Vous avez C#, F#, Python... Ont-ils les mêmes problèmes de marshalling que COM ? (L'hébergement du CLR fonctionne-t-il via COM ?)
Quelques précisions : par "matrice", j'entends matrice au sens des variables Matlab, c'est-à-dire un énorme tableau de valeurs - et non, par exemple, une matrice de transformation 4x4 telle que vous pourriez l'utiliser pour un logiciel 3D. Il s'agit de données collectées au fil du temps, des milliers et des milliers de valeurs, souvent plusieurs fois par seconde. Nous ne recherchons pas non plus 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 qu'il serait utile que le système ait la capacité de traiter des mathématiques complexes, comme le fait un système d'algèbre informatique. Je préférerais un "langage complet" à un "algèbre" si les deux ne se mélangent pas, pour permettre des branches / chemins complexes dans le code de l'utilisateur, ainsi qu'une interface OO.