Est-il possible de combiner des langages de programmation?

27

Je programme depuis un certain temps, j'ai écrit des programmes rudimentaires et je veux continuer à apprendre. J'ai atteint ce point où vous ne savez pas quoi apprendre ensuite, et je voudrais poser une question pour ma propre curiosité.

La question, en un mot, est de savoir si vous pouvez combiner plusieurs langages de programmation en 1 résultat? Par exemple, ce code peut-il être possible?

<html>
cout << "Hello world!";
</html>

ou

import java.util.Scanner;
cout << "Insert a number from 1 to 10";
Scanner n = new Scanner(System.in);
System.out.println("The value you entered was" +n.newLine());

Cela ressemble à une question stupide, mais je ne peux pas savoir si c'est possible ou non, c'est pourquoi je le pose. Dans cette question, je remarque qu'il utilise du code Python en code html, si mon exemple ci-dessus n'est pas possible, qu'a-t-il fait?

Bugster
la source
12
Pour que cela fonctionne (sans rendre les gens fous), il faut au moins des règles strictes concernant la façon dont ils interagissent et quelles parties doivent être traitées dans quelle langue.
6
Il faudrait un lexer / analyseur hellova.
Chad Harrison
2
@Brian Lua est intégré dans le fait que l'interpréteur est lié à du code C ou C ++ et utilisé pour exécuter du code Lua stocké dans des chaînes ou des fichiers externes, exposant éventuellement des objets C / C ++ au code Lua. Lua n'est pas (pas souvent, voire pas du tout) "intégré" au sens de cette question.
2
C'est comme créer cinq alphabets avec chacun des symboles différents pour les 26 lettres et les mélanger dans un seul livre: inutile, irritant et redondant.
ThomasX
7
Je pense que les gens oublient clairement le cas d'utilisation le plus courant (et le seul valable dans la vie réelle auquel je puisse penser) de "combinaison de langages" - des fragments ASM dans des programmes C / C ++ , généralement pour des raisons de performances.
TC1

Réponses:

43

Votre premier exemple est en quelque sorte possible. Habituellement, de telles choses se produisent en PHP (et dans d'autres langages de programmation Web associés) comme ceci:

<HTML>
<?PHP
call_some_php_function(1,2,"a","b"); /* This is may return nothing, a text string, or actual HTML markup code */
?>
</HTML>

Quelques points importants à noter sur cet exemple:

  • Le HTML n'est PAS un langage de programmation, c'est un langage de balisage.
  • PHP et HTML et non exécutés / interprétés au même endroit: le code PHP est exécuté par un interpréteur PHP fonctionnant sur le serveur et le résultat est "injecté" dans le HTML environnant. Ensuite, tout cet objet blob est envoyé au client / navigateur qui affiche le code HTML complet.

Votre deuxième exemple ressemble à une sorte de mash-up de C ++ et Java. Il est possible que des modules compilés écrits dans différents langages se parlent, mais combiner Java et C ++ dans le même fichier source serait extrêmement déroutant et difficile: comment le compilateur pourrait-il savoir quelles instructions sont Java et lesquelles sont C ++?

Je suppose qu'en théorie, vous pourriez écrire un compilateur / pré-processeur spécial avec des indicateurs de "langage" tels que:

Java
{
    import java.util.Scanner;
}
C++
{
   cout << "Insert a number from 1 to 10";
}
Java
{
    Scanner n = new Scanner(System.in); //Actually, this line *could* be a C++ line - it's hard for me to tell just by looking at it.
    System.out.println("The value you entered was" +n.newLine());
}

Mais je ne suis honnêtement pas sûr que vous gagneriez quelque chose d'utile en faisant cela.

De plus, comment cet environnement de langage hybride gérerait-il des fonctionnalités de langage incompatibles entre les deux?

FrustratedWithFormsDesigner
la source
Un exemple tout le monde a oublié (moi y compris), alors s'il vous plaît ne hésitez pas à ajouter à votre réponse: CUDA. C'est un mélange de deux langages C très différents, avec certaines fonctions compilées pour un périphérique (GPU), et certaines restant sur un hôte, avec une couche de communication déduite.
SK-logic
7
Il n'est pas rare d'avoir JavaScript ainsi que HTML et PHP sur une seule page. Horrible, mais pas rare.
Michael Borgwardt
1
Pas si familier avec PHP, mais le code ASP.NET (que ce soit C # ou VB.NET) génère du HTML et du JavaScript - et le JavaScript est souvent intégré directement dans la page .aspx. La séparation totale est souvent citée comme un idéal, mais un bref aperçu des questions sur ASP.NET étiqueté SO vous donnera une idée de la complexité de cela.
sq33G
@ sq33G - ASP.NET génère du code HTML. Vous pouvez inclure javascript si vous le souhaitez. ASP.NET n'est certainement PAS ce que l'auteur décrit comme voulant faire.
Ramhound
J'allais faire apparaître PHP / HTML / JS dans un document si personne d'autre ne l'avait fait.
Ben Brocka
19

Réponse courte

Pas vraiment.


Longue réponse

Incorporation

Généralement, un seul fichier source contient du code pour exactement un langage de programmation. Il est rare que plusieurs langues soient combinées dans un seul fichier pour plusieurs raisons:

  • L'analyse simultanée de plusieurs langages syntaxiquement différents est extrêmement difficile (sinon carrément impossible).
  • Différents langages traitent la programmation différemment . La notion de fonction de Haskell est différente de celle de C ++.

Mise en relation

Différents langages de programmation qui partagent une interface binaire d'application commune peuvent être combinés pour former un seul exécutable ou bibliothèque. Obtenir les signatures des deux langues l'une dans l'autre prend souvent un peu de travail, mais des outils existent pour faciliter le processus.

Polyglottes

Le code polyglotte est valide et équivalent dans plusieurs langues. La page 404 de Stack Overflow propose un de ces programmes:

Stack Overflow 404 polyglot

Cela imprime "404" en Python, Perl, Ruby, C, Brainfuck et Befunge.

Conclusion

Les langues sont rarement mélangées dans les fichiers, et quand elles le sont, c'est pour rire . Les gens essaient même d'éviter de mélanger les langues au sein des projets en raison des tracas supplémentaires qu'il introduit. Ainsi, bien que cela soit techniquement possible, le mélange de différentes langues n'est ni courant ni pragmatique.

inconnu
la source
Je ne vois pas de Ruby ici ...
Jason Lewis
@JasonLewis Je ne connais pas Ruby, mais ce post dit qu'il évalue la ligne # 4.
Maxpm
9
Les langues ne sont pas toujours mélangées pour rire. La plupart des compilateurs C vous permettent de mélanger Assembly et C, tout comme de nombreux Forths. Dans les années 80, l'un des meilleurs dialectes BASIC du jeu, le BBC Basic d'Acorn, vous permettait de mélanger l'assemblage 6502 et c'était une fonctionnalité très souhaitable à l'époque. Cela a certainement fait rire les utilisateurs de la BBC, mais à peu près tout le monde a pleuré, en particulier ceux qui ont dû assembler le code machine 6502 à la main et coller des opcodes bruts dans leurs programmes dans des DATAdéclarations. Pas que je sois amer ou quoi que ce soit. Noooo.
Alexios
1
@ SK-logic SQL est un langage de requête structuré, pas un langage de programmation.
Maxpm
1
L'une des choses les plus tristes du développement de logiciels modernes est que les applications multilingues sont beaucoup plus difficiles maintenant. À l'époque DOS, presque tout était compilé dans le même fichier objet et utilisait les mêmes conventions de transmission de paramètres. Il était vraiment facile de simplement les relier entre eux. De nos jours, pas tellement ...
Brian Knoblauch
7

Oui, c'est possible en effet. Pas comme vous l'avez imaginé, bien sûr. Il existe des langues spécialement conçues à cet effet.

En pratique, il peut être très utile de mélanger un certain nombre de langues spécifiques au domaine dans une seule langue hôte. Il est rarement nécessaire de mélanger deux ou plusieurs langages également "à usage général" dans un seul fichier de code source, bien que vous trouverez souvent des projets écrits dans les deux, disons, VB.NET et C #, avec différents composants de langage compilés séparément.

Quant au HTML, c'est juste un langage de balisage. Vous pouvez souvent trouver un code côté serveur (par exemple, dans VB.NET), du balisage HTML et du code Javascript côté client mélangés dans un seul fichier source, bien qu'il soit considéré comme une mauvaise pratique par beaucoup.

SK-logic
la source
7

Ceci est souvent appelé code polyglotte - il existe des exemples amusants / fous si vous suivez le lien ou à divers autres endroits sur le Web. La plupart d'entre eux sont juste pour le plaisir / pour prouver que c'est possible.

Plus sérieusement, il existe divers exemples concrets où deux ou plusieurs langues différentes peuvent être utilement combinées:

  • Modèles Web - des langages tels que les fichiers PHP ou JSP mélangent le code en HTML. Les opinions divergent largement quant à savoir si c'est une bonne idée ou non.
  • Langages de macro - souvent un langage de macro est mélangé dans le fichier source tel que les macros de préprocesseur C / C ++. Il existe également des cas intéressants comme Lisp où le langage de macro est lui-même Lisp (la seule différence est de savoir si le code est exécuté au moment de la compilation ou à l'exécution)
  • DSL - souvent un langage spécifique au domaine est défini pour aider à résoudre efficacement un problème particulier, qui est intégré dans le code source d'une autre langue. Voici un exemple d'une belle DSL pour SQL qui peut être incorporée dans du code Clojure.
  • Scripting - certains langages dynamiques sont particulièrement utiles pour les scripts courts et sont conçus pour être intégrés dans un logiciel écrit dans une autre langue. Les scripts Groovy par exemple sont très faciles à intégrer dans une application Java.
  • Projets polyglottes - il est parfois judicieux d'utiliser plusieurs langues uniquement pour exploiter les différentes capacités de chacune. Par exemple, la JVM prend en charge plusieurs langages qui peuvent interagir de manière assez transparente, vous pouvez donc mélanger Java (pour la vitesse et la POO de type statique) avec Clojure (pour le développement interactif, la concurrence et la programmation fonctionnelle). De tels projets séparent toujours les différentes langues dans des fichiers / dossiers source distincts, mais ils sont compilés en même temps pour produire une seule application.
mikera
la source
6

Il est possible de faire une combinaison de langages en utilisant Perl Inline qui permet d'écrire un script Perl et d'insérer des sections de code écrites dans un autre langage:

Inline prend en charge C, C ++, Java, Python, Ruby, Tcl, Assembler, Basic, Guile, Befunge, Octave, Awk, BC, TT (Template Toolkit), WebChat et même PERL

JohnTESlade
la source
Je n'avais jamais entendu parler de Perl Inline. C'est une idée intéressante, mais donne-t-elle un avantage sur quelle est probablement l'approche habituelle d'avoir des modules séparés pour le code non PERL?
FrustratedWithFormsDesigner
1
@FrustratedWithFormsDesigner: Inline Perl est un excellent module, mais il a quelques défauts. Cela fonctionne bien, mais uniquement dans la mesure où le code est assez basique. Bien qu'il ait été travaillé pendant un certain temps, je ne l'utiliserais dans aucun type de production.
Dynamic
3

Embedded SQL était un moyen courant d'incorporer des instructions SQL dans des programmes d'autres langages.

De nos jours, il a été remplacé presque entièrement par un accès à la base de données basé sur l'API plus facile à compiler qui n'a pas besoin de modifier le langage hôte, mais utilise plutôt ses capacités normales.

Joachim Sauer
la source
1
Ces jours-ci, un SQL embarqué a fait son retour sous la forme de LINQ, et il est là pour rester.
SK-logic
@ SK-logic: en quoi LINQ ressemble-t-il à du SQL embarqué? Ce n'est pas un langage différent, c'est simplement l'application de constructions de langage supplémentaires dans le langage hôte.
Joachim Sauer
LINQ est un DSL intégré très typique, sémantiquement étranger à son langage hôte. Et, dans le cas de LINQ2SQL, il se comporte exactement de la même manière que l'ancien SQL embarqué, il est traduit littéralement en SQL.
SK-logic
Mais le SQL embarqué n'est pas "traduit en SQL". Vous écrivez le SQL littéral dans votre code C (et généralement pas dans les constantes de chaîne non plus). Même si LINQ utilise des fonctionnalités de langage qui ont été (pour autant que je sache) développées spécifiquement pour LINQ, c'est "juste" une API dans son langage hôte.
Joachim Sauer
1
Pro C et Pro Fortran ont un peu traduit les instructions SQL. Et LINQ n'est pas "juste" une API, c'est une API avec du sucre de syntaxe et un tas de back-ends de compilateur interchangeables. Ce qui en fait un parfait exemple de DSL embarqué à part entière.
SK-logic
2

Plusieurs langages de programmation peuvent être utilisés pour former 1 exe. Une façon consiste à utiliser des DLL. Bien sûr, il existe diverses préoccupations à ce sujet. Par exemple, la compatibilité des paramètres, la compatibilité COM et autres. En fait, si vous pensez à la façon dont vous appelez un système de base de données pour travailler, vous pourriez constater que le SGBD n'est pas toujours écrit dans une langue que vous connaissez. Vous ne vous en souciez probablement même pas tant que l'interface est connue.

Ce concept est poussé plus loin lorsque votre solution utilise des services Web, ce qui est encore plus propre de combiner plusieurs composants logiciels.

Dans le monde .NET, tout ce qui précède s'applique, plus au niveau de l'interface, les interfaces XAML et HTML peuvent cohabiter dans Silverlight.

Dans le monde UNIX, à un moment donné, nous avons utilisé des scripts KShell pour lancer des programmes C ++ et COBOL afin que la solution puisse fonctionner.

Aucune chance
la source
2

Je pense qu'il vaut la peine de mentionner Cython ici. C'est un surensemble de Python pour écrire des extensions C et bien qu'il s'agisse vraiment d'un langage unique en soi, il vous permet d'utiliser le code C dans du code Python, si vous vous conformez à la syntaxe de style Python de Cython

Magnus
la source
0

Exemples de combinaison de langages: Jython (python en Java), Cog (python utilisé comme générateur de code intégré dans à peu près n'importe quoi). J'ai souvent utilisé du code Perl pour générer du C ++, si vous comptez la génération de code.

Michael Kohne
la source
0

Le framework .NET est conçu pour permettre à plusieurs langues de participer à une seule solution. Cela fonctionne tant que le langage peut produire un code d'octet compatible CLR.

http://www.geekinterview.com/question_details/1047

Jalayn
la source
Je ne pense pas que ce soit le sens de l'affiche originale. Le bytecode résultant a très peu à voir avec la façon dont il a été écrit dans la langue à partir de laquelle il a été compilé.
perdian
Je ne pense pas que vous ayez compris la question. L'auteur parle de combiner plusieurs langues dans un fichier obscur.
Craige
0

Il est très difficile, très moche et souvent inutile de combiner plusieurs langages de programmation en un seul fichier.

Il est cependant possible d'avoir un gros projet écrit en plus d'une langue. Par exemple, Mozilla Firefox et MySQL contiennent du code C et C ++. Quand il s'agit de gros projets, cette pratique est souvent utilisée car un langage particulier fournit des fonctionnalités qu'un autre ne propose pas. En PHP, par exemple, vous pouvez demander l'exécution d'un exécutable binaire, prendre son résultat et l'utiliser dans votre code PHP à partir de là.

Si vous êtes curieux de savoir quelles langues sont utilisées pour certains des projets open source les plus importants au monde, vous pouvez vérifier Ohloh.net. Des statistiques sur le code source de nombreux projets peuvent être trouvées ici.

Radu Murzea
la source
-1

Vous pouvez "mélanger" des langues en HTML. Il est en fait important pour le fonctionnement de nombreux sites Web que vous puissiez incorporer du javascript en html. Mais bien sûr, HTML est un balisage, pas un langage de programmation.

Je pense que faire ce que vous proposez impliquerait de toute façon d'écrire une nouvelle langue. Soit vous devrez créer un interprète / compilateur qui parle toutes ces langues et pourrait les encadrer de manière cohérente, soit vous aurez besoin d'un moyen d'évaluer explicitement ligne par ligne dans ce qui serait une méta-langue. Ces deux options sont fondamentalement les mêmes, à l'exception de ce que le programmeur doit faire pour que les langages fonctionnent ensemble.

Markw
la source
+1 sur le mélange des langues en HTML, mais je pense personnellement qu'il est plus propre de garder le HTML / CSS et le JS séparés. Les concepteurs de sites Web peuvent faire leur travail sans essayer de parcourir le JavaScript strict qui est intégré à l'ensemble du site.
jmort253
Vous pouvez mélanger des langages en HTML, mais peu d'entre eux sont des langages de programmation , ce qui est le sujet à portée de main.
Alexios
Eh? Javascript n'est pas un langage de programmation? PHP? J'ai également vu des injections perl et python bien que ce soit avec des modules Apache.
markw
-1

La langue est un outil. Avant de choisir un outil (en plus, faire une combinaison bizarre hummer-PC-spectroscope), il faut se demander - qu'est-ce que je veux faire exactement ?? Une fois la réponse donnée, vous découvrirez qu'un tel mélange de langues est rarement nécessaire.

Hamo
la source
-3

Oui, il est possible de mélanger les langages de programmation tant que votre interprète / compilateur peut le comprendre. Par exemple, mélanger javascript, PHP, python en HTML ou C ++ en C #.

Cependant, le mélange des langues peut rendre plus difficile la lecture et la modification du code, il faut donc le faire avec prudence. Une solution consiste à créer des fichiers séparés pour le code dans la langue que vous devez appeler et à l'importer plutôt que de l'intégrer.

Garrett Hall
la source