Langues transcompilées: projets de conversion de code en code


Source: Ward Cunningham

La transpilation est la conversion de code d'une langue à une autre. À l'aide d'un transpilateur spécial (transcompilateur), un langage de programmation à usage général peut être transféré vers n'importe quel autre langage de programmation à usage général.

Si vous devez passer à une autre langue, les transpilers aideront les développeurs à enregistrer la plupart du code existant sans réécrire manuellement l'intégralité du code. Par exemple, lors de la conversion de programmes de Python 2 en Python 3, ou lors du déplacement de logiciels de l'ancienne API vers la nouvelle.

Les termes transpiler et transcompiler sont souvent utilisés de manière interchangeable, mais on pense toujours qu'il existe des différences. Par exemple, pour convertir du code C ++ en C, vous avez besoin d'un transpilateur et pour convertir Python-Ruby, vous avez besoin d'un transcompilateur. Babel pour JavaScript est un transpilateur et TypeScript est un langage transcompilé.

Parfois, après la conversion par le transporteur, pour le bon fonctionnement du code, une configuration manuelle est requise, tandis que dans les langues transcompilées, le code doit fonctionner sans modifications. Aujourd'hui, nous parlerons de ceux-ci et d'autres, mais plus important encore, nous parlerons de projets trans populaires que les développeurs peuvent utiliser dans leur travail quotidien.

Transpilation frontale


La conversion est une partie importante du développement frontal: à mesure que les nouvelles fonctionnalités apparaissent lentement dans les navigateurs, des langues dotées de capacités expérimentales ont été créées qui se traduisent en langues compatibles avec les navigateurs.

Les développeurs de navigateurs qui utilisent leur propre moteur JavaScript dans chaque projet sont également responsables des trans-langages en plein essor pour JavaScript. En conséquence, les navigateurs ont des performances différentes, implémentent leur propre ensemble de fonctions JavaScript et se rapprochent de la pleine conformité avec les spécifications à différentes vitesses.



Sass , Less et Stylus facilitent la création de code CSS. Sass a donc une syntaxe flexible, logique (@if, chacun), mathématiques (vous pouvez ajouter des nombres, des lignes et des couleurs), grâce à laquelle toute la richesse du code est transformée en un programme rubis CSS normal.

Less (Leaner Style Sheets) ressemble à CSS, mais a des ajouts pratiques: variables, mixins, opérations arithmétiques (comme Sass), etc.

Le stylet est écrit dans Node.js et diffère de Sass et Less dans une syntaxe plus propre. Mais en fait, ces trois langues sont très similaires les unes aux autres, vous ne vous tromperez donc pas si vous en sélectionnez une.



Dites «Bonjour tout le monde!» Dans CoffeeScript - ce qui pourrait être plus simple:

alert "Hello, World!" 

CoffeeScript est depuis longtemps le projet JavaScript le plus populaire . Ce n'est pas surprenant: combinant l'accessibilité (la documentation tient sur une seule page), les fonctionnalités (crochets, retraits, etc.) et la syntaxe pure inspirée de Ruby, ce langage offre aux développeurs de nombreux degrés de liberté et permet de rendre JS plus expressif.



TypeScript maître:

 let message:string = "Hello World" console.log(message) 

TypeScript est un projet concurrent pour JavaScript, un langage de script avec l'ajout de la saisie statique facultative. Vous permet de décrire plus complètement les propriétés et les méthodes des objets et des classes, contrairement à JS, éliminant ainsi la nécessité de vérifier tous les arguments inclus dans une méthode ou une fonction.

Il y a une opinion que JavaScript est un langage avec des défauts fondamentaux. Sinon, il est difficile d'expliquer la popularité des trans-langues travaillant spécifiquement pour corriger ses défauts. En plus des projets ci-dessus, il existe également un langage de programmation Web flexible Dart , un compilateur JavaScript dans le JavaScript Closure Compiler et de nombreuses autres solutions, que vous pouvez découvrir sur la page " Liste des langages qui se compilent en JS ".

Convertir en C




En 2006, le projet Vala est apparu, composé de deux langues: Vala et Genie, qui traduisent le code C le plus courant, qui, à son tour, est compilé dans un fichier exécutable ou une bibliothèque.

La syntaxe Vala est très similaire à C #, mais adaptée pour une meilleure compatibilité avec les systèmes GObject, tandis que Genie a beaucoup en commun avec Python. La première langue est maintenant plus courante que Genie, alors examinons-la de plus près.

Pourquoi aviez-vous besoin d'un tel projet? De nombreux développeurs souhaitaient écrire des applications et des bibliothèques pour GNOME dans des langages de haut niveau, mais pour diverses raisons, ils ne pouvaient pas ou ne voulaient pas utiliser C # ou Java. Vala vous permet de créer rapidement du code orienté objet complexe, prenant en charge l'API C standard et l'ABI avec de faibles besoins en mémoire.

Les bibliothèques C # et Java ne peuvent pas être utilisées de la même manière que les bibliothèques GObject natives de C et d'autres langages, et elles ne peuvent pas être considérées comme faisant partie de la plate-forme GNOME. Valac, le transcompilateur Vala, crée des fichiers C à partir de fichiers source Vala comme si vous aviez écrit votre bibliothèque ou votre application directement en C. L'utilisation de la bibliothèque Vala à partir de l'application C n'est pas différente de l'utilisation d'une autre bibliothèque basée sur GObject.

Nous lisons et écrivons le fichier à Vala:

 voidmain () { try { string filename = "data.txt"; // Writing string content = "hello, world"; FileUtils.set_contents (filename, content); // Reading string read; FileUtils.get_contents (filename, out read); stdout.printf ("The content of file '%s' is:\n%s\n", filename, read); } catch (FileErrore) { stderr.printf ("%s\n", e.message); } } 

Vous pouvez vous familiariser avec d'autres exemples de code sur le site .

De Flash à multiplateforme




Haxe a été créé en même temps que Vala, mais est destiné à être transpilé en Flash, JavaScript et Neko. Avec un tel ensemble de compétences, la langue était vouée à l'extinction, mais non seulement elle a survécu, mais elle a également gagné en popularité.

Le secret du succès est multi-plateforme. Au fil du temps, Haxe est devenu un ensemble puissant d'outils qui prennent en charge la transcompilation dans divers langages et plates-formes, notamment JavaScript, C ++, C #, Java, JVM, Python, Lua, PHP et Flash.

Haxe est un langage de programmation moderne, de haut niveau et fortement typé. En même temps, c'est assez simple et pratique, de sorte que la compilation peut être adaptée à différentes plates-formes cibles. Sa syntaxe est fondamentalement la norme ECMAScript, mais est modifiée si nécessaire.

"Hello World" sur Haxe:

 class Main { static public function main():Void { trace("Hello World"); } } 

En JavaScript, ces lignes de code ressembleront à ceci:

 haxe -main HelloWorld -js HelloWorld.js 

Et en Java comme ça:

 haxe -main HelloWorld -java path/to/java/out 

La plupart du code Haxe est organisé en classes et fonctions, ce qui en fait un langage OOP qui ressemble à Java, ActionScript 3 et C #. Cependant, Haxe a été conçu en mettant l'accent sur le pragmatisme et la facilité de syntaxe.

Et sur les transpilers


  • C2Rust et Corrode sont deux opportunités non sans péché de migrer de C vers Rust.
  • VOC est un transporteur de Python 3.4+ vers Java qui vous aidera à créer des applications Android basées sur du code Python.
  • Lombok est une solution intéressante pour ceux qui n'aiment pas Java, ou n'aiment rien d'autre que Java. Il s'agit d'un plugin de compilation qui ajoute de nouveaux «mots clés» à Java et transforme les annotations en code Java, réduisant les efforts de développement et fournissant des fonctionnalités supplémentaires. Par exemple, il permet l'utilisation du mot-clé val (un analogue de var de C #) dans le code Java standard.
  • Bridge.NET vous permet d'utiliser les performances C # en JavaScript, ainsi que les puissants IDE VisualStudio et les outils .NET standard (tels que msbuild, refactoring, tests unitaires, analyse statique, visualisation de code, FxCop).
  • Grumpy traduit le code Python en une représentation Go et vous permet d'exécuter de manière transparente des programmes Python dans des environnements d'exécution Go. Le projet élimine le problème du verrouillage global de l'interpréteur, qui ne permet pas l'exécution parallèle de plusieurs threads de code.

Bien sûr, il existe de nombreux autres transpilers. Vous pouvez traditionnellement parler de vos outils préférés dans les commentaires.

Conclusion


Il existe un grand nombre d'autres langues, donc pour votre projet, vous pouvez toujours choisir la plus appropriée. Mais les situations où une conversion de code en code est nécessaire ne sont pas rares, car les transpilations C ++ en C, PHP en C ++ et «tout en JavaScript» se produisent assez souvent.

Un «traducteur» d'une langue à une autre est une bonne idée, mais seulement tant que le résultat peut être clairement prévu et utilisé sans risque. Ainsi, la transition de COBOL à Java a été difficile, car en Java avant JDK 1.4, il n'y avait pas de fichiers mappés en mémoire . Et les C2Rust et Corrode mentionnés dans l'article donnent un code non idiomatique, marqué comme dangereux et rempli de pointeurs bruts.

Source: https://habr.com/ru/post/fr480724/


All Articles