web-dev-qa-db-fra.com

Comment plusieurs langues interagissent-elles dans un même projet?

J'ai entendu des gens programmer en plusieurs langues dans un même projet. Je ne peux pas imaginer comment les langues interagissent entre elles.

Je veux dire qu'il n'y a pas de méthode Java comme

myProgram.callCfunction(parameters);

n'arrive jamais ou je me trompe?

58
n00ki3

Avoir plusieurs langues dans un même projet est en fait assez courant, mais les principes ne sont pas toujours simples.

Dans le cas simple, différentes langues sont compilées dans le même code. Par exemple, le code C et C++ est généralement compilé dans l'assembleur de machine ou C # et VB.Net est compilé en IL (le langage compris par le runtime .NET).

Cela devient plus difficile si les langages/compilateurs utilisent un système de type différent. Il peut y avoir de nombreuses façons différentes, les types de données de base tels que les nombres entiers, flottants et doubles sont représentés en interne, et il existe encore plus de façons de représenter les chaînes. Lorsque vous passez des types entre les différentes langues, vous devez vous assurer que les deux côtés interprètent le même type ou - sinon - les types sont correctement mappés. Ce type de mappage de type est également appelé marshalling .

Des exemples classiques d'interopérabilité entre différents langages de programme sont (principalement du monde Windows):

  • Les différentes langues disponibles pour la plate-forme .NET. Cela inclut C #, VB.Net, J #, IronRuby, F #, XSLT et de nombreux autres langages moins populaires.
  • Les composants COM natifs écrits en C++ ou VB peut être utilisé avec une grande variété de langages: VBScript, VB, tous les langages .NET, Java
  • Les fonctions API Win32 peuvent être appelées à partir de .NET ou VB
  • IPC (communication inter-processus)
  • Corba , probablement l'approche la plus complète (et la plus complexe)
  • Services Web et autres architectures orientées services, probablement l'approche la plus moderne
26
Dirk Vollmar

En règle générale, tout projet Web de taille décente utilisera environ cinq langues: HTML, CSS, Javascript, une sorte de langage "faire avancer les choses" côté serveur (ASP, JSP, scripts CGI avec Perl, PHP, etc.), et certaines variantes de SQL pour la connectivité à la base de données.

(Ceci, bien sûr, fait disparaître l'argument de savoir si HTML et CSS comptent ou non comme langages de programmation - je suis le camp "ils le sont, mais pas les langages complets de Turing", mais c'est un tout autre fil. )

Quelques exemples de la façon dont tous ces éléments fonctionnent ensemble:

Si vous suivez la voie des meilleures pratiques, la structure d'une page Web est en HTML, et les instructions pour l'afficher sont en CSS - qui pourrait être dans le même fichier, mais ce n'est pas obligatoire. Le CSS contient un tas de classes, auxquelles le HTML fait référence, et c'est au navigateur de comprendre comment les cliquer ensemble.

Pour aller plus loin, tous les scripts javascript de cette page peuvent modifier n'importe quel code HTML/CSS présent (modifier le contenu des entités HTML, remplacer une classe CSS par une autre, changer le comportement du CSS, etc.). ) Il le fait via quelque chose appelé le modèle d'objet de document, qui est essentiellement une API indépendante du langage et de la plate-forme pour manipuler les pages HTML d'une manière semblable à un objet (auquel point je reculerai lentement et fournirai simplement un lien vers le - article wiki pertinent .)

Mais alors, d'où vient tout le HTML/CSS/Javascript? C’est ce que fait le langage côté serveur. Dans sa forme la plus simple, le langage côté sereur est un programme qui renvoie une chaîne géante contenant une page HTML en sortie. Cela, évidemment, peut devenir beaucoup plus complexe: les formulaires HTML et les paramètres de chaîne de requête peuvent être utilisés comme entrée pour notre programme côté serveur, et vous avez alors l'ensemble AJAX chose où le javascript peut envoyer les données directement dans la langue du serveur également. Vous pouvez également imaginer où la langue du serveur peut personnaliser le HTML, CSS et Javascript qui se crache - essentiellement, vous avez un programme dans une langue écrivant un programme dans une autre langue.

Le langage côté serveur vers la connexion SQL fonctionne de la même manière. Il existe de nombreuses façons de le rendre à la fois plus complexe et plus sûr, mais le plus simple est que le langage de votre serveur crée dynamiquement une chaîne contenant une commande SQL, la transmette à la base de données via une sorte de connecteur et revienne un ensemble de résultats. (Il s'agit d'un cas où vous avez vraiment une fonction qui se résume à someValue = database.executeThisSQLCommand (SQLString).)

Donc, pour conclure, différentes langues dans ce cas communiquent soit en écrivant des programmes entre elles, soit en distribuant des données dans des formats très simples à analyser que tout le monde peut comprendre. (Cordes, principalement.)

14
Electrons_Ahoy

Plusieurs langues utilisées sont appelées "interopérabilité" ou "interop" pour faire court.

Votre exemple est faux. Java peut appeler des fonctions C.

Le langage fournit un mécanisme d'interopérabilité.

Dans le cas de .NET, les langages sont compilés en IL dans le cadre de la CLI. Ainsi, n'importe quel langage .NET peut interopérer (appeler des méthodes définies par) des modules définis dans tout autre langage .NET.

Par exemple:

Je peux définir une méthode en C #

static void Hello(){ Console.WriteLine("Hello World");}

Et je peux l'appeler depuis Python (IronPython)

 Hello()

Et obtenez la sortie attendue.

D'une manière générale, certaines langues interagissent mieux que d'autres, surtout si les auteurs de la langue ont spécifiquement fait de l'interopérabilité une caractéristique de la langue.

8
Alan

Plusieurs langues peuvent interagir avec:

  1. Entrée/sortie canalisée (N'IMPORTE QUELLE langue peut le faire car l'entrée et la sortie doivent nécessairement être implémentées dans toutes les langues non-jouets)
  2. La compilation du code dans une langue vers une bibliothèque native tandis que l'autre prend en charge l'appel de code natif.
  3. Communiquer via une connexion réseau en boucle. Vous pouvez rencontrer des difficultés avec les interférences du pare-feu de cette façon.
  4. Bases de données. Ceux-ci peuvent être considérés comme un format de stockage de données "universel", et sont donc accessibles par la plupart des langues avec des extensions de base de données. Cela nécessite généralement un programme pour terminer l'opération avant que le programme suivant puisse accéder à la base de données. De plus, toutes les "communications" sont généralement écrites sur disque.
  5. Si les langues impliquées s'exécutent sur le même runtime (c'est-à-dire .NET, JVM), vous pouvez généralement passer les données d'objet d'une langue directement à l'autre avec peu d'impédance.

Dans presque tous les cas, vous devez convertir toute communication dans un format commun avant de pouvoir l'échanger (l'exception concerne les langues sur le même runtime). C'est pourquoi plusieurs langues sont rarement utilisées dans un même projet.

5
shsmurfy

Vous pourriez avoir une application où l'essentiel du travail est effectué en Java, mais il peut y en avoir une partie, comme peut-être un analyseur de données ou quelque chose est écrit en Python ou quoi d'autre). Presque deux applications distinctes vraiment, peut-être que l'analyseur fait juste un peu de travail sur les fichiers, puis votre application principale en Java les utilise pour quelque chose. Si quelqu'un me demandait ce que j'ai utilisé dans ce projet Je dirais "Java et Python".

1
Carter

Il existe différentes manières d'utiliser plusieurs langues dans un même projet. Quelques exemples:

  • Vous pouvez écrire un DLL dans, disons, C, puis utiliser cette bibliothèque à partir, disons, d'un programme VB.
  • Vous pouvez écrire un programme serveur, disons C++, et avoir de nombreuses implémentations de langage différentes du client.
  • Un projet Web utilise souvent de nombreuses langues; par exemple, un programme serveur, écrit, disons Java (un langage de programmation), qui récupère les données d'une base de données à l'aide de SQL (un langage de requête), envoie le résultat au navigateur en HTML ( un langage de balisage), avec lequel l'utilisateur peut interagir en utilisant Javascript (un langage de script) ...
1
Kieron

Juste pour ajouter à la liste d'exemples, il est assez courant d'optimiser Python en C ou C++ ou d'écrire une bibliothèque C pour lier une autre bibliothèque à Python.

0
Jason Baker

Cela dépend du type de projet. Si vous voulez expérimenter, vous pouvez configurer un projet Web, dans .NET, et changer la langue page par page. Cela ne fonctionne pas comme vous le montrez dans votre pseudocode, mais c'est plusieurs langues. Bien sûr, le répertoire de code réel doit être une seule langue.

0
Gregory A Beamer

Il existe plusieurs façons dont le code dans les langues peut interagir directement. Tant que les données transmises entre le code sont au bon format, au niveau des bits et octets, il n'y a aucune raison pour que différentes langues ne puissent pas interopérer. Cette approche est utilisée dans les fenêtres traditionnelles DLL. Même sur différentes plates-formes, si vous pouvez obtenir le format correct (regardez grand/petit endian si vous êtes intéressé) cela fonctionnera tant que votre éditeur de liens ( pas le compilateur) sait joindre le code ensemble.

Au-delà de cela, il existe de nombreuses autres façons dont les langues peuvent se parler. Dans le monde .Net, le code est compilé en code IL, qui est le même pour chaque langue, de cette manière C #, VB.Net sont tous les mêmes sous le capot et peuvent s'appeler/travailler ensemble de manière transparente.

0
MrTelly

Mal. S'il n'y a pas de besoin urgent, respectez une seule langue. Vous augmentez les dépendances et la complexité. Mais lorsque vous disposez d'un code existant offrant des fonctionnalités intéressantes, il peut être plus facile de le coller ensemble que de le recréer.

0
Stephan Eggermont