Question

J'ai entendu des gens programmer dans plusieurs langues dans un projet. Je ne peux pas imaginer comment les langues interagissent les unes avec les autres.

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

myProgram.callCfunction(parameters);

n'arrive jamais ou est-ce que je me trompe?

Était-ce utile?

La solution

Avoir plusieurs langues dans un même projet est en fait assez courant, mais les principes sous-jacents 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 un assembleur de machine ou C # et VB.Net est compilé dans un langage IL (langage compris par le runtime .NET).

Cela devient plus difficile si les langages / compilateurs utilisent un système de type différent. Les types de données de base tels que les nombres entiers, les nombres flottants et les doublons peuvent être représentés en interne de nombreuses façons et il existe encore plus de façons de représenter des chaînes. Lors du transfert de types entre les différentes langues, vous devez vous assurer que les deux côtés interprètent le type de la même manière, sinon les types sont correctement mappés. Ce type de mappage est également appelé marshalling .

Les exemples classiques d'interopérabilité entre différentes langues de programme sont (principalement issus 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 en VB peuvent être utilisés avec une grande variété de langages: VBScript, VB, tous les langages .NET, Java
  • Les fonctions de l'API Win32 peuvent être appelées à partir de .NET ou de VB
  • IPC (communication entre 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

Autres conseils

En règle générale, tout projet Web de taille décente utilise environ cinq langages: HTML, CSS, Javascript, une sorte de langage "faire le travail" côté serveur (ASP, JSP, scripts CGI avec Perl, PHP, etc.), et une variante de SQL pour la connectivité de la base de données.

(Bien entendu, il s'agit de dissuader l'argument de savoir si HTML et CSS sont considérés comme des langages de programmation - je suis le camp «ils sont, mais ce n'est tout simplement pas les langages complets de Turing», mais c'est un tout autre fil.)

Quelques exemples de la collaboration de tous ceux-ci:

Si vous suivez la route des meilleures pratiques, la structure d'une page Web est au format HTML et les instructions pour son affichage sont en CSS - elles peuvent se trouver dans le même fichier, mais ne sont pas obligées de l'être. être. Le code CSS contient un ensemble de classes, auxquelles le code HTML fait référence, et il appartient au navigateur de déterminer comment les cliquer ensemble.

Pour aller encore plus loin, tous les scripts javascript de cette page peuvent modifier le code HTML / CSS présent (modifier le contenu des entités HTML, échanger une classe CSS pour une autre, modifier le comportement du CSS, et ainsi de suite.) Cela se fait via quelque chose appelé Document Object Model, qui est essentiellement un langage et une API indépendante de la plate-forme permettant de manipuler les pages HTML à la manière d'un objet (à ce stade, je reculerai lentement et fournirai simplement un lien. sur le article pertinent du wiki .)

Mais alors, d'où vient tout le code 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 ensuite tout le processus AJAX où le javascript est capable d'envoyer des données directement au langage du serveur. Vous pouvez également imaginer où la langue du serveur permet de personnaliser le code HTML, CSS et Javascript, ce qui est génial: vous avez essentiellement un programme dans une langue qui écrit un programme dans une autre langue.

La connexion langage SQL côté serveur vers SQL fonctionne à peu près de la même manière. Il existe de nombreuses façons de le rendre plus complexe et plus sûr, mais le moyen le plus simple est de créer de manière dynamique une chaîne contenant une commande SQL dans la langue de votre serveur, puis de la transmettre à la base de données via un type de connecteur, puis de revenir en arrière. un ensemble de résultats. (Dans ce cas, vous avez réellement une fonction qui se résume à someValue = database.executeThisSQLCommand (SQLString).)

En résumé, différentes langues dans ce cas communiquent en écrivant des programmes les unes dans les autres ou en transmettant des données dans des formats très simples, faciles à analyser, que tout le monde peut comprendre. (Chaînes, principalement.)

L'utilisation de plusieurs langues s'appelle "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, tout langage .NET peut interopérer (méthodes d’appel définies par) des modules définis dans n’importe quel autre langage .NET.

À titre d'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 le résultat attendu.

De manière générale, certaines langues s’interopèrent mieux que d’autres, en particulier si les auteurs de langue en ont fait une caractéristique spécifique.

Plusieurs langues peuvent interagir avec:

  1. Entrée / sortie en pipeline (N'IMPORTE QUELLE langue peut le faire parce que l'entrée et la sortie doivent nécessairement être mises en œuvre dans chaque non-jouet langue)
  2. Compilation du code dans une langue dans une bibliothèque native tandis que l’autre prend en charge l’appel de code natif.
  3. Communication via une connexion réseau en boucle. Vous pouvez rencontrez des difficultés avec le pare-feu de cette façon.
  4. Bases de données. Ceux-ci peuvent être considérés comme un "universel" Les données format de stockage, et donc accessible à la plupart des langues avec des extensions de base de données. Ce généralement nécessite un programme pour terminer l'opération avant le programme suivant peut accéder à la base de données. En outre, toutes les «communications» sont généralement écrit sur le 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 transmettre des données d'objet d'un langage directement à l'autre avec peu d'impédance.

Dans presque tous les cas, vous devez convertir toute communication en un commun format avant de pouvoir être échangé (à l’exception des langues sur le même temps d'exécution). C’est pourquoi plusieurs langues sont rarement utilisées dans une même langue. projet.

Je travaille sur un grand projet d'entreprise composé d'environ 8 langues au dernier décompte. La majorité de la communication s'effectue via un bus de messages d'entreprise qui contient des liaisons pour plusieurs langues dans lesquelles il est possible de puiser et de transmettre des données. C'est ce qu'on appelle tibco .

Vous pourriez avoir une application où la plus grande partie du travail est effectuée en Java, mais il peut y en avoir une partie, comme par exemple un analyseur de données ou quelque chose qui est écrit en Python. Presque deux applications vraiment séparées, l’analyseur travaille peut-être simplement sur des fichiers, puis votre application principale en Java les utilise pour quelque chose. Si quelqu'un me demandait ce que j'avais utilisé dans ce projet, je dirais "Java et Python".

Il existe de nombreuses manières d'utiliser des langues différentes dans un même projet. Il y a deux catégories principales qui me viennent à l'esprit

  1. Utiliser différentes langues pour créer une seule application. Par exemple, utiliser Java pour construire l'interface graphique et utiliser JNI pour accéder à l'API C (pour répondre à votre question, vous pouvez appeler des fonctions C depuis Java;))
  2. Utiliser différentes langues ensemble dans le même projet mais elles ne font pas partie de la même application. Par exemple. Je travaille actuellement sur une application pour iPhone qui utilise beaucoup de texte. J'utilise actuellement trois langages: Python (pour travailler avec les sources originales du texte), SQL (pour mettre les résultats de l'application Python dans un format facilement accessible depuis l'API iphone sqlite3) et Objectiv C pour créer l'application. Même si le produit final ne sera que l’objectif C, j’ai utilisé deux autres langues pour arriver au produit final

Plusieurs langues peuvent être utilisées dans un même projet. Quelques exemples:

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

Cela dépend du type de projet. Si vous souhaitez expérimenter, vous pouvez configurer un projet Web, en .NET, et modifier la langue page par page. Cela ne fonctionne pas comme vous l'avez montré dans votre pseudocode, mais il existe plusieurs langues. Bien entendu, le répertoire de code doit être une seule langue.

Le code dans les langues peut interagir directement de deux manières. Tant que les données échangées entre le code sont dans le bon format, au niveau des bits et des octets, il n'y a aucune raison pour que différentes langues ne puissent pas s'interopérer. Cette approche est utilisée dans le développement de DLL Windows traditionnel. Même sur différentes plates-formes, si vous pouvez obtenir le format correct (regardez gros / petit endian si cela vous intéresse), cela fonctionnera tant que votre éditeur de liens (et non le compilateur) sait comment joindre le code.

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 identique pour tous les langages. Ainsi, C # et VB.Net sont tous identiques sous le capot et peuvent s’appeler / travailler les uns avec les autres de manière transparente.

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

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

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