48 votes

Recommandations pour un langage de script ou de plugin pour le codage d'utilisateurs dépendant fortement des mathématiques ?

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 :

enter image description here

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 de V 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.

18voto

Arnaud Bouchez Points 25855

En fonction de vos besoins, voici quelques lignes directrices :

  • Faites la distinction entre langage et bibliothèque - vous pouvez avoir des langages mathématiques (comme MATLAB) ou des bibliothèques mathématiques appelées à partir d'un langage de haut niveau (comme Python) ;
  • Le langage (ou la bibliothèque) doit être conçu par des mathématiciens, pour des mathématiciens ;
  • La langue utilisée doit être une langue existante (ne pas réinventer la roue) ;
  • Vous devriez pouvoir partager le contenu du script avec des logiciels existants ;
  • Vous ne devriez pas vous lancer dans un projet aussi complexe (script mathématique) en partant de zéro.

Je suppose donc que cela pourrait réduire la liste des candidats :

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

Dans le monde de l'Open Source, on peut trouver de nombreuses solutions très intéressantes. Voir http://blog.interlinked.org/science/open_source_math_programs.html

Je suppose que Octave pourrait être envisagée. Il est simple, puissant, mature, bien connu, utilisé par de nombreux logiciels et multiplateforme.

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

Mais attention à la licence GPL. Si votre logiciel est propriétaire, il pourrait être impossible de distribuer Octave comme partie intégrante de votre logiciel. Mais vous pouvez appeler la bibliothèque Octave ou tout autre élément sous licence GPL (comme Python) à partir de votre logiciel, si vous faites une distinction claire entre votre logiciel et le logiciel sous licence GPL .

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

Ce n'est que mon avis :)

7voto

Roddy Points 32503

Il n'y a pas de réponse définitive, mais quelques autres suggestions:-

  • Jetez un coup d'œil au LMD Innovative ScriptPack qui prend en charge les scripts Pascal natifs, ainsi que les langages basés sur ActiveScripting. Avertissement : j'utilise beaucoup d'outils et de composants LMD, mais je n'ai pas utilisé personnellement Scriptpack.

  • Le LMD a également des am Paquet d'outils IDE qui peut vraiment simplifier la tâche de création d'un outil "RAD" personnalisé simple si vous devez suivre cette voie.

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

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

  • Rapide
  • Livres publiés disponibles ( Programmation en Lua )
  • Écrit en C
  • Directement intégrable dans notre projet par le biais d'un lien statique
  • Licence MIT
  • Le code C++ peut appeler le code Lua et accéder aux variables Lua.
  • Le code Lua peut appeler des fonctions C++
  • Faible encombrement du déploiement. Lua et ses bibliothèques standard ont ajouté moins de 200K à notre .EXE, avant compression.

Je suis sûr que d'autres langages auraient pu être aussi bons, mais c'est la légèreté de Lua qui a fait pencher la balance en ma faveur.

5voto

Andrea Raimondi Points 339

J'aime beaucoup de réponses et, bien sûr, je suis un nerd de Delphi :) mais je vous suggérerais d'utiliser une combinaison : RO Pascal script+ ESBPCS pour VCL.

Je ne sais pas si cela vous ressemble, mais j'essaierais.

Du site web, j'ai extrait ce lien sur la partie matricielle et non visuelle de la bibliothèque. Il y en a beaucoup d'autres, vous devriez essayer !

4voto

r4w8173 Points 198

Nous avons utilisé avec succès l'automatisation Microsoft script (active scripting). Fondamentalement, vous devez mettre en place un hôte qui exécutera les script. Les script peuvent être écrits dans n'importe quel langage installé sur la machine actuelle. Nous utilisons JavaScript pour nos script mais vous n'êtes pas limité à cela. Il existe de nombreuses implémentations de script (même en python).

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

Bonne chance !

4voto

Simon Points 675

Je suggérerais Lua. C'est l'un des langages de script les plus utilisés, il existe de nombreux outils tels que des débogueurs, des éditeurs avec coloration syntaxique, etc., beaucoup de gens l'ont utilisé, c'est l'un des langages de script les plus rapides que l'on peut facilement intégrer dans un moteur c/c++. Il est très facile d'y étendre des fonctions C (en particulier si vous utilisez LuaJIT et FFI). Il n'y a pas vraiment de bonne façon de faire du multithreading en Lua, mais vous pouvez facilement exécuter plusieurs instances de Lua dans des threads séparés afin d'exécuter plusieurs scripts.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X