Question

Quelqu'un at-il une expérience dans ce domaine? Je travaille actuellement sur un décompilateur Java en C ++, mais j'aimerais un langage de niveau supérieur pour effectuer les transformations réelles des arbres internes. Je suis curieux de savoir si les frais généraux de marshaling entre les langues valent l’avantage d’un langage plus expressif et d’un langage permettant de mieux articuler ce que j’essaie d’accomplir (comme Haskell). Est-ce réellement fait dans le "monde réel" ou est-ce généralement choisir une langue au début d'un projet et s'en tenir à cela? Des conseils de ceux qui l'ont essayé?

Était-ce utile?

La solution

Je suis un ardent défenseur de toujours choisir le bon langage de programmation pour chaque défi. S'il y a une autre langue qui gère facilement une tâche autrement difficile, je dirais: allez-y.

Cela se produit-il dans le monde réel? Oui. Je travaille actuellement sur un projet composé à la fois de code PHP et de code objectif-c.

Comme vous l'avez souligné, le truc est la communication entre les deux langues. Si possible, laissez chaque langue s'en tenir à son propre domaine et faites en sorte que les deux sections communiquent de la manière la plus simple possible. Dans mon cas, il s’agissait de documents XML envoyés via http. Dans votre cas, un type de fichier texte formaté pourrait être la solution.

Autres conseils

Les coûts de planification dépendent des langues et de l'architecture avec lesquelles vous travaillez. Par exemple, si vous utilisez le CLR ou la JVM, des solutions d’interopérabilité à faible coût sont disponibles, même si je sais que vous utilisez probablement du C ++ non géré.

Une autre avenue est un langage incorporé spécifique à un domaine. Les transformations d’arbres peuvent souvent être exprimées via un filtrage et l’application d’un nombre relativement petit de fonctions. Vous pouvez envisager d’écrire un simple motif d’arbre - par exemple. quelque chose qui ressemble à Lisp s-exprs mais utilise des espaces réservés pour capturer des variables - avec des actions associées qui sont des fonctions qui transforment le sous-arbre correspondant.

John Ousterhout , l'inventeur de Tcl / Tk était un ardent défenseur de la programmation multilingue et il en a beaucoup écrit. Pour ce faire, vous avez besoin d'un mécanisme d'interface propre entre les langues que vous utilisez pour cela. Il existe plusieurs mécanismes pour cela. Voici des exemples de mécanismes pour ce faire:

  • SWIG (Wrapper simplifié et Générateur d'interface peut prendre un c ou c ++ (ou plusieurs autres langages) fichier d'en-tête et générer un interface pour un langage de haut niveau tels que perl ou python qui permet vous pour accéder à l'API. Il y a d'autres systèmes qui utilisent cette approche.

  • Java prend en charge JNI , ainsi que divers d'autres systèmes tels que Python ctypes , VisualWorks DLL / C connect sont des mécanismes natifs qui vous permettent de explicitement construire l'appel au bas sous-système de niveau.

  • Tcl / Tk a été conçu explicitement pour être intégrée et possède une API native . pour une bibliothèque C pour ajouter des crochets dans la langue. Les constructions pour cela ressemble à argv [] structures dans C, et ont été conçus pour le rendre relativement facile à interfacer un programme C basé sur la ligne de commande dans Tcl. Ceci est similaire à ce qui précède exemple, mais venant de l'opposé direction. Beaucoup de langages de script comme le support Python, Lua et Tcl ce type de mécanisme.

  • Mécanismes de collage explicites tels que Pyrex , qui sont similaires à un générateur de wrapper, mais ont leur propre langue pour définir le interface. Pyrex est en fait un langage de programmation complet. Middleware tel que COM ou CORBA autoriser un générique définition de l'interface à construire à l'extérieur de l'application dans un langage de définition d'interface et des reliures de langue pour le langues concernées pour utiliser le mécanisme d'interface commun.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top