web-dev-qa-db-fra.com

Est-il possible de combiner des langages de programmation?

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 tout simplement 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 Python code en code html, si mon exemple ci-dessus n'est pas possible, qu'a-t-il fait?

27
Bugster

Votre premier exemple est en quelque sorte possible. Habituellement, de telles choses se produisent dans PHP (et 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.
  • Le code PHP et HTML et non exécuté/interprété au même endroit: PHP est exécuté par un interpréteur PHP exécutant sur le serveur et le résultat est "injecté" dans le HTML environnant. Ensuite, tout ce blob est envoyé au client/navigateur qui rend le 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 quels 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?

43

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:

  • Analyser plusieurs langues syntaxiquement différentes à la fois 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 partageant une interface application binaire commune peuvent être combinés pour former un seul exécutable ou bibliothèque. Obtenir les signatures des deux langues à l'intérieur l'une de l'autre demande souvent un peu de travail, mais des outils existent pour faciliter le processus.

Polyglottes

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

Stack Overflow 404 polyglot

Ceci 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, mélanger différentes langues n'est ni courant ni pragmatique.

19
Maxpm

Oui, c'est possible en effet. Pas comme vous l'avez imaginé, bien sûr. Il y a quelques langues là-bas construits spécifiquement à cet effet.

En pratique, il pourrait ê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.

7
SK-logic

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 PHP ou les fichiers JSP mélangent le code en HTML. Les opinions divergent largement sur la bonne idée ou pas.
  • 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'un magnifique DSL pour SQL qui peut être intégré dans le code Clojure.
  • Script - 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. Groovy les scripts par exemple sont très faciles à intégrer dans une application Java.
  • Projets polyglottes - il est parfois judicieux d'utiliser plusieurs langues juste pour exploiter les différentes capacités de chacun. Par exemple, le JVM prend en charge plusieurs langues qui peuvent interagir de manière assez transparente, vous pouvez donc mélanger Java (pour la vitesse et de façon statique) typé OOP) 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.
7
mikera

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

6
JohnTESlade

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.

3
Joachim Sauer

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

2
Magnus

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 les 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.

2
NoChance

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.

0
Michael Kohne

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

0
Damian

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 dans plus d'une langue. Par exemple, Mozilla Firefox et MySQL contiennent du code C et C++. Quand il s'agit de grands projets, cette pratique est souvent utilisée car un langage particulier fournit certaines 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 ce moment).

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

0
Radu Murzea