Quand utiliser un langage de script dans un programme plus important serait-il utile?

70

J'ai entendu parler de plusieurs situations dans lesquelles des personnes utilisent, par exemple, JavaScript ou Python (ou quelque chose du genre), dans un programme écrit en C #. Quand utiliser un langage comme JavaScript pour faire quelque chose dans un programme C # serait-il préférable à le faire simplement en C #?

Toby Person
la source
1
Pourquoi quelqu'un baisserait-il cette question? IMHO c'est une bonne question.
KK.
28
C'est très utile pour créer des logiciels absurdement complexes qui nécessitent une maintenance coûteuse par de coûteux consultants, en particulier lorsque le langage de script est redoutable.
Whatsisname
2
Je n'ai pas de "réponse", par exemple, mais le programmeur pragmatique a un chapitre à ce sujet (n ° 12 - Langages de domaine). Pourrait vous donner un aperçu.
Craige
1
Il existe quelques bonnes réponses à une question similaire sur le développement de jeux: gamedev.stackexchange.com/questions/2913/…
celion
6
Parfois, il est même préférable d’avoir un système volumineux dans un langage de scriptage: c’est ce qu’on appelle "la manière Unix ". Vous pouvez coller de nombreux sous-systèmes distincts en utilisant une petite couche de script. Cette architecture est connue pour être très robuste et évolutive.
SK-logic

Réponses:

66

Lorsque vous avez un comportement que vous ne voulez pas avoir à recompiler le programme pour le changer. C’est exactement pourquoi tant de jeux utilisent Lua comme langage de script / modding.

utilisateur16764
la source
42
Et c'est aussi pour que les utilisateurs puissent ajouter des fonctionnalités eux-mêmes. Vous l'avez en quelque sorte laissé entendre, mais je pense que c'est assez important pour mériter d'être davantage souligné.
2
Aussi sandboxing. Regardez l'intégration de Python par Blender.
Meawoppl
@meawoppl ... ou pour ajouter des fonctionnalités à un programme. Regardez l'intégration de Python par l'IDA (baptisée IDAPython)
Cole Johnson
Pourquoi ne pas faire en sorte que vous n’ayez besoin que de recompiler une bibliothèque (par exemple avec des composants de logique de jeu spécifiques)?
Den
Si vous examinez d’autres outils, tels que AutoCAD, Sparx Enterprise Architect, MS Word, vous n’avez pas à les recompiler pour les scripter en C #.
Pete Kirkham
28

Cette technique peut être utilisée pour implémenter une logique centrale facilement portable entre différents environnements linguistiques. Par exemple, j'ai un simulateur de calculatrice dans lequel toute la logique de calculatrice interne est implémentée en JavaScript à 100%. Le code de l'interface utilisateur est bien sûr différent pour chaque plate-forme:

  • Navigateur Web (JavaScript)
  • iOS (Objective-C)
  • Windows (C ++ avec Qt)
  • Mac OS X (C ++ avec Qt)
  • Java Swing (Java)

Avec cet arrangement, créer des versions de mon programme pour différents environnements d’exploitation, et en particulier les maintenir à jour, est beaucoup plus simple.

Greg Hewgill
la source
18

De manière très générale, il existe deux situations dans lesquelles vous appliqueriez ce modèle:

  1. Ceci est utilisé en interne pour tirer parti de la qualité du langage incorporé.
  2. Ceci est utilisé pour fournir une programmabilité externe.

Intérieurement

  • En règle générale, le langage incorporé est interprété, ce qui permet d'effectuer des modifications et de le tester rapidement sans recompiler.
  • Le langage intégré peut être plus expressif que le langage dans lequel votre application principale est écrite, ce qui permet également un développement plus rapide.
  • La langue peut être un meilleur ajustement pour un domaine particulier par rapport à une langue à usage général.
  • Le langage est utilisé par les utilisateurs internes qui ont besoin d’un langage / environnement de programmation "plus simple". Les programmes courts sont écrits par des personnes qui ne sont pas des développeurs de logiciels et utilisant une syntaxe / API relativement simple.

Un exemple ici serait Lua utilisé dans Adobe Lightroom.

Donc, ce que nous faisons avec Lua, c'est essentiellement toute la logique de l'application, de l'exécution de l'interface utilisateur à la gestion de ce que nous faisons réellement dans la base de données. Pratiquement chaque élément de code de l'application pouvant être décrit comme prenant des décisions ou implémentant des fonctionnalités est en Lua jusqu'à ce que vous abordiez le traitement brut, qui est en C ++. ( Entretien avec Mark Hamburg: Adobe Photoshop Lightroom )

Extérieurement

  • Autorisez les utilisateurs à étendre le comportement de votre application sans requérir d'outils spéciaux et / ou de bibliothèques et / ou d'accéder à votre code source.
  • Fournissez à ces utilisateurs une API bien définie et un environnement de type bac à sable. Cela pourrait également être fait dans la langue de l'application, mais l'intégration d'un interprète peut faciliter la tâche.

IBM a utilisé les langages de script avec beaucoup de succès dans son système d’exploitation central, VM-CMS . EXEC , EXEC / 2 et plus tard, Rexx ont été utilisés dans tout le système, à la fois en interne et en externe. Différentes applications (par exemple, XEDIT ) étaient scriptables en utilisant ces mêmes langages et des applications / utilitaires internes (par exemple, des courriers électroniques) ont été écrits dans le langage de script et ont permis une intégration étroite avec le système d'exploitation et d'autres outils. Les clients ont créé et partagé de nombreux outils et applications scriptés. DEC a également fourni DCL . Plus tard, Microsoft a pris en charge VBscript en tant que langage de script dans la plupart de leurs applications et plus récemment, PowerShell(aussi fichiers batch MS / DOS ). Les shells Unix ont également un script .

La tendance actuelle semble exposer les API d’une certaine manière et laisser le choix du langage de script aux utilisateurs qui peuvent utiliser différentes liaisons ou d’autres moyens d’accéder à l’API.

Guy Sirton
la source
9

Les exemples du monde réel incluent: -

  • La plupart des navigateurs Web qui prendront en charge le JavaScript incorporé.

  • Suite Microsoft Office - Excel Word, etc., prennent en charge les scripts VBA intégrés.

  • De nombreux routeurs de réseau incluent des API de script, dans une variété de langages TCL, Perl et Lua.

De nombreux périphériques intégrés sont implémentés à l’aide d’un très petit ensemble de fonctions C centrales, qui sont collées à l’aide d’un langage de script tel que Lua. Vous disposez donc d’un ensemble de petites fonctions C rapides qui interagissent avec le matériel, ainsi que d’une grande partie de la logique de contrôle dans un langage de script flexible et facile à modifier.

James Anderson
la source
@ antony.trupe. Le nom communément utilisé pour désigner ECMAscript - fr.wikipedia.org/wiki/ECMAScript
James Anderson
4

Parfois, les scripts sont intégrés dans une application, car ils permettent à d'autres développeurs d'étendre l'application hôte. Afin de capturer un éventail de compétences en langage de programmation le plus large possible, l'hôte peut prendre en charge plusieurs langages de script. Par exemple, sur la machine virtuelle Java, vous pouvez intégrer toute une série de langages compatibles JSR-223 , notamment Python, Ruby, JavaScript, etc.

Une autre raison non déjà mentionnée est que le langage incorporé possède une ou plusieurs fonctionnalités hors du commun que le langage hôte ne pourrait pas dupliquer facilement. Un exemple de ceci serait la fonctionnalité Parse ou la création DSL (langage / dialecte spécifique à un domaine) sans effort qui peut être trouvée dans une langue comme Rebol.

Adrian
la source
3

Il existe un moyen intéressant d’utiliser un langage de script dans une application qui n’a pas encore été mentionné par les autres.

Si votre langage hôte a une exécution riche et réfléchissante, il est souvent utile d'intégrer un langage simple avec REPL dans vos applications, de le brancher sur un socket et de lui donner un accès à l'ensemble du système.

Il peut être utilisé pour un débogage interactif (et il est naturellement beaucoup plus puissant que votre débogueur habituel), des correctifs de code à chaud, diverses fonctions de surveillance, même des portes dérobées (si rien ne sert à rien).

SK-logic
la source
Naturellement beaucoup plus puissant que votre débogueur habituel? De quelle manière? Comment un "langage de script externe simple" sans connaissance intrinsèque des idiomes, du modèle de mémoire, du modèle d'objet, des types de données de base, etc. de votre langage hôte peut-il fournir des fonctionnalités utiles qu'un débogueur conçu pour fonctionner avec le langage ne pourrait pas?
Mason Wheeler
@MasonWheeler, pouvez-vous échanger le code avec un débogueur habituel? Pouvez-vous effectuer des requêtes programmables complexes arbitraires sur l'état de votre exécution? Pouvez-vous effectuer des expériences contrôlées complexes? Et vous avez tort de supposer qu'un langage de script n'a pas de "connaissance intrinsèque des idiomes du langage hôte, ...". Si l'hôte et le langage de script s'exécutent sur la même machine virtuelle (.NET, JVM, V8 ou autre), vous disposez d'un accès complet à tous les instants de votre langage de script.
SK-logic
1

Ma situation spécifique, lorsque j'utilise un langage de script interprété dans une application majeure:

Il existe un périphérique externe qui remplit plusieurs fonctions. Mesures, contrôle, lectures. C'est assez "stupide" lui-même et nécessite un contrôle précis, étape par étape, incluant de nombreux états d'attente et une prise de décision ad-hoc du côté du mécanisme de contrôle.

Diverses fonctionnalités de l'appareil sont requises à différents moments de l'application principale, à différents moments, souvent à la demande. L'application principale ne permet pas les états d'attente en tant que tels, tout doit être fait avec des machines à états finis.

Maintenant, quiconque a écrit une machine à états finis sait que la mise en œuvre d'un état d'attente correspond effectivement à au moins deux, souvent trois ou quatre états internes de la machine. Mettre en œuvre vingt états d’attente pour diverses fonctions (et attendre leurs réponses et réagir en conséquence) du périphérique externe serait une expérience extrêmement frustrante.

Ainsi, à la place, il existe des états "exécuter une fonction non attendue", "exécuter une fonction de blocage", "exécuter un branchement / conditionnel / saut" dans la machine à états finis, peut-être six états au total. Et il existe des scripts de contrôle dont l'exécution est planifiée, puis exécutée par l'interpréteur contrôlant le périphérique externe, et leurs résultats placés là où ils sont requis.

En résumé, l’application: dans un RTOS, l’utilisation d’un langage de script interprété interne peut considérablement réduire la complexité d’exécution de tâches abondantes dans des états d’attente (fonctions de blocage).

SF.
la source
1

D'après mon expérience, nous avons une fois développé une grande application qui réécrit le code source d'une langue "ancienne" pour la rendre compatible avec Unicode. Le a été fait en C #. J'ai fini par écrire uniquement le moteur (qui crée un modèle de données et fournit les moyens d'effectuer les étapes nécessaires au processus de réécriture) en C # - le "code collant" permettant d'exécuter réellement les tâches est créé dans IronPython.

Le point le plus important pour l'IronPython intégré: supposons que vous ayez chargé un modèle Big Data (temps de chargement d'environ une heure). Ensuite, vous souhaitez collecter manuellement les informations et rechercher des éléments. Faire cela avec un script Python à partir d'une console interactive est bien mieux que de cliquer sur le modèle de données avec le débogueur (en plus, il est rejouable).

utilisateur82229
la source
-2

Il y a quelques raisons.

  • Courbe d'apprentissage. Pratiquement tout le monde peut apprendre et écrire en javascript.
  • Sécurité. Il est difficile de contrôler le contexte de sécurité du code de script en C # ou en Java. Javascript est parfait pour ça. Les auteurs de scripts ne peuvent jamais accéder au disque ou à n’importe où s’ils ne le permettent pas. Le moteur JavaScript de base est juste une calculatrice avancée.
  • Qualité. Vous mettez une limite très épaisse au code de script. Les niveaux de "code spaghetti" sont très différents pour Javascript ou C # / Java. (Ce qui vous empêche d'ouvrir les portes de l'enfer)
  • Type de sécurité. C # / Java sont des environnements sécurisés, vous ne le préférez généralement pas dans un environnement de script. Une expression comme "12" + 3 donne "123" en javascript mais C # / Java ne sera même pas compilé. Les auteurs de script ne la plupart du temps même pas ce qui est "type"
  • Dynamique. Tout objet peut contenir n’importe quelle propriété / méthode et peut changer de type dans le temps. Par exemple, je pourrais fournir à un environnement de script un objet proxy C # exposant les nœuds XML en tant que propriétés.
  • Productivité. L'écriture de script est généralement beaucoup plus facile que C # / Java. Aucune compilation ou "enregistrement de plugin" requis. Vous pouvez directement modifier le contenu du script dans l'application avec des résultats immédiats.
  • Gérant. L'utilisation de C # / Java nécessite un SDK pour être un lien sur les plugins qui expose les classes internes au monde. Cette architecture de plug-in nécessite la "compatibilité ascendante" pour les anciennes versions du SDK. Cette architecture vous oblige à créer des objets de domaine "virtuels" qui fournissent un mécanisme interne d'application dans le contexte du domaine. C'est plus maniable / flexible que d'exposer une API.
ertan
la source
3
Cela passe à côté de la question de l’intégration de scripts dans un programme plus vaste. Par exemple, pourquoi un développeur aurait-il choisi d'ajouter un script-fu à gimp? Ou modifiez Civ V avec lua - pourquoi un développeur aurait-il choisi d'ajouter des scripts à une application?
-3

Quand? Entre 1948 et 2008, la compilation et la liaison des langages initialement compilés ont pris beaucoup de temps. Il était donc courant de créer un langage de script permettant la personnalisation et la configuration des utilisateurs. Si vous examinez l'historique d'AutoLisp, la réponse est initialement fournie avec un langage de script intégré à AutoCAD, mais cette solution a été progressivement supprimée au profit de l'exposition d'une interface scriptable à VBA, puis à .net.

Avec CLR, l'activation d'un programme C # ou d'un appel de programme Lua dans un système existant ne présente pas de coûts de développement très différents, et le runtime .net est livré avec les outils pour générer et compiler à la volée.

Vous n'avez plus besoin de disposer d'un langage de script dans le programme plus volumineux, mais d'exposez-le plutôt aux fonctions de script du moteur d'exécution.

Dans les environnements qui n'offrent pas la génération et la compilation de code à la volée, et qu'il est jugé souhaitable de proposer un langage d'automatisation à usage général plutôt que spécifique à un domaine, vous obtiendrez toujours un script Lua ou Python. Pour les outils offrant une interface COM, ce langage de script sera alors C # ou VB.net (MS Office, Sparx Enterprise Architect). Donc, avoir un langage de script pour un programme écrit dans un langage qui est lui-même assez simple pour être un langage de script est un inutile.

Pete Kirkham
la source
Une recherche sur Google pour les jeux XNA Lua-scriptables ne donne aucun résultat.
user16764
@ user16764 et une recherche google sur les bicyclettes en meringue représentent six millions.
Pete Kirkham