Je travaille sur un système embarqué tournant sous Linux sur un DSP. Maintenant, nous voulons en rendre certaines parties scriptables et nous recherchons un joli langage de script embarquable. Ces scripts devraient s'intégrer parfaitement à notre base de code C++ existante, être petits et rapides.
Je comprends que Lua est le choix de l'industrie pour des problèmes comme celui-ci. Nous irons probablement avec Lua car il a fait ses preuves et s'est avéré stable, etc. Cependant, en tant que langage de programmation, il présente des coins plutôt originaux.
Alors, quelles alternatives existe-t-il pour les langues intégrables?
MODIFIER:
C'est environ un an plus tard.
Nous avons en fait utilisé Lua sur notre système embarqué et il fonctionne à merveille. Au fil du temps, nous avons ajouté de plus en plus de prise en charge des scripts à de plus en plus de parties du projet et cela a vraiment aidé à l'avancer.
La performance est vraiment exceptionnelle. Même les opérations assez complexes qui impliquent la recherche à travers de longs tableaux ou des opérations de chaînes fantaisies fonctionnent étonnamment bien. Nous n'avons pratiquement jamais rencontré de problèmes de performances liés à Lua.
L'interfaçage avec les fonctions C est très simple et fonctionne très bien. Cela nous a permis de développer le système de script sans douleur.
Enfin, nous avons été stupéfaits par la flexibilité de Lua. Notre interprète Lua doit fonctionner sur un système avec un allocateur de mémoire non standard et sans prise en charge du type de données double. Il y a deux endroits bien documentés dans un fichier d'en-tête que nous avons dû modifier pour que Lua fonctionne sur ce système. Il est vraiment bien adapté à l'intégration!
Puisque vous dites "système embarqué" et "petit et rapide" et "s'intègre bien", je dirais que vous avez raison de dire que Lua est le numéro un, sinon le seul choix. Mais je ne suis plus d'accord pour dire que le langage de programmation a des "coins décalés". Premièrement, le livre Programming in Lua est tout simplement splendide, l'un des meilleurs livres que j'ai jamais lu. Deuxièmement, certains des "coins décalés" proviennent du fait que la langue est très orthogonale et propre, ce qui à long terme est un atout, pas un inconvénient. Je trouve par exemple JavaScript bien pire. Si vous lisez "Javascript les bonnes parties", l'auteur explique longuement pourquoi certaines constructions dans le langage sont des erreurs de conception et pourquoi il faut éviter le nouvel opérateur. Ce n'est pas le cas dans Lua, les mauvaises parties ont été supprimées, par exemple, les éléments de valeur positive excentriques ont été remplacés par une portée syntaxique standard dans la version 5.x.
Mon point de vue est en fait que Lua est une langue avec loin moins coins excentriques que la plupart des autres langues! Nous l'utilisons dans un projet commercial et nous en sommes plus que satisfaits.
Je recommande de tout cœur Lua pour votre cas d'utilisation. Cependant, Forth est une alternative - en particulier pour les appareils embarqués à ressources limitées - qui n'a pas encore été mentionnée.
Il y a toujours LISP. :) Mais cela souligne le fait que Lua est en fait moins "décalé" que la plupart des langues. Il a été conçu pour les non-programmeurs et se lit comme un pseudocode. Il a une sémantique propre et uniforme (fonctions imbriquées de première classe avec portée lexicale; affectation multiple; plusieurs valeurs de retour; un mécanisme de structuration des données unique et flexible avec une syntaxe de constructeur propre; etc.) qui le rendent très facile à apprendre, lire, écrire, etc. Il s'avère également être d'une puissance et d'une expressivité inattendues (appels de queue appropriés, continuations, métaprogrammation, etc.)
Le seul aspect vraiment "original" de Lua est que les tableaux indexent à partir de 1, et le fait qu'il n'emprunte pas les conventions de C comme tout le monde (~=
plutôt que !=
, --
plutôt que //
, etc.), mais ils sont pour la plupart décalés aux yeux des programmeurs habitués aux langages de type C.
Une alternative pourrait être Squirrel, qui est inspiré par Lua, a des objectifs similaires, mais une syntaxe de type C. Je ne l'ai pas utilisé cependant, donc je ne sais pas bien s'il atteint ses objectifs.
Avec vos exigences (faible encombrement, petites bizarreries et intégration avec C++), la seule option à laquelle je peux penser est Common LISP .
Certaines personnes dans cette autre SO recommandent CFFI pour l'intégrer à C.
Mais je resterais avec Lua si j'étais là.
Tcl a été conçu dès le départ pour être un langage intégré et existe depuis des décennies. De plus, c'est un choix parfait pour développer un langage spécifique au domaine en raison de sa nature hautement extensible.
Je ne connais pas grand-chose au monde DSP, mais quand vous google "dsp lua" et "dsp tcl" vous obtenez deux fois plus de hits pour Tcl.
Avez-vous pensé à Python ? Il y a un bon guide d'extension et d'intégration disponible. Si vous utilisez Boost , Boost Python est une bibliothèque pour une intégration apparente entre C++ et Python.
Je comprends que Lua est le choix de l'industrie pour des problèmes comme celui-ci.
Une affirmation audacieuse! Je dirais que si vous utilisez déjà Linux, le choix est grand ouvert. Linux lui-même n'est en aucun cas le "choix de l'industrie" pour les systèmes embarqués; "l'industrie" est beaucoup plus fragmentée que cela.
Un langage qui est implémentable sur pratiquement n'importe quel système indépendamment des performances, de la taille et du système d'exploitation (ou même pas de système d'exploitation), est Forth. Pas le langage le plus à la mode peut-être, mais facilement implémentable et extensible.
Un autre candidat pourrait être ch , qui est un interpréteur C/C++ incorporable, vous pouvez donc utiliser le même langage pour le code compilé et scripté.