Polyglotte (informatique) - Polyglot (computing)

En informatique , un polyglotte est un programme informatique ou un script écrit sous une forme valide de plusieurs langages de programmation , qui effectue les mêmes opérations ou sorties indépendamment du langage de programmation utilisé pour le compiler ou l' interpréter .

Généralement, les polyglottes sont écrits dans une combinaison de C (qui permet la redéfinition de tokens lexicaux avec un préprocesseur ) et d'un langage de script tel que Lisp , Perl ou sh .

Le balisage polyglotte est similaire, mais à propos ducontexte du langage de balisage .

La persistance polyglotte est similaire, mais à propos des bases de données .

Les microservices polyglottes permettent aux développeurs de choisir le langage de programmation de leur choix afin de créer des produits de manière plus efficace. Les professionnels de l'industrie pensent que, lorsque la gouvernance sur laquelle le langage de programmation doit être développé est assouplie, il y a plus d'opportunités pour la créativité des développeurs et la résolution de problèmes prête à l'emploi.

Méthodes

Les deux techniques les plus couramment utilisées pour construire un programme polyglotte consistent à faire un usage libéral des langues qui utilisent des caractères différents pour les commentaires et à redéfinir divers jetons comme d'autres dans différentes langues. Souvent, on fait bon usage des bizarreries de syntaxe . Ceux-ci sont démontrés dans ce polyglotte du domaine public écrit en ANSI C , PHP et bash :

#define a /*
#<?php
echo "\010Hello, world!\n";// 2> /dev/null > /dev/null \ ;
// 2> /dev/null; x=a;
$x=5; // 2> /dev/null \ ;
if (($x))
// 2> /dev/null; then
return 0;
// 2> /dev/null; fi
#define e ?>
#define b */
#include <stdio.h>
#define main() int main(void)
#define printf printf(
#define true )
#define function
function main()
{
printf "Hello, world!\n"true/* 2> /dev/null | grep -v true*/;
return 0;
}
#define c /*
main
#*/

Notez ce qui suit :

  • Un signe dièse marque une instruction de préprocesseur en C, mais est un commentaire à la fois en bash et en PHP.
  • "//" est un commentaire à la fois en PHP et en C et dans le répertoire racine de bash.
  • La redirection de shell est utilisée pour éliminer les sorties indésirables.
  • Même sur les lignes commentées, les indicateurs PHP " <?php" et " ?>" ont toujours leur effet.
  • L'instruction " function main()" est valide à la fois en PHP et en bash ; C #defines sont utilisés pour le convertir en " int main(void)" au moment de la compilation.
  • Les indicateurs de commentaires peuvent être combinés pour effectuer diverses opérations.
  • " if (($x))" est une instruction valide à la fois en bash et en PHP.
  • printfest un shell bash intégré qui est identique au printf C à l' exception de son omission de crochets (que le préprocesseur C ajoute s'il est compilé avec un compilateur C ).
  • Les trois dernières lignes ne sont utilisées que par bash, pour appeler la mainfonction. En PHP, la mainfonction est définie mais pas appelée et en C, il n'est pas nécessaire d'appeler explicitement la mainfonction.

Certains langages moins courants offrent également des possibilités de créer du code polyglotte. Voici un petit exemple, écrit simultanément en SNOBOL 4, Win32Forth , PureBasicv 4.x et REBOL :

 *BUFFER : A.A ; .( Hello, world !) @ To Including?
 Macro SkipThis; OUTPUT = Char(10) "Hello, World !"
 ;OneKeyInput  Input('Char', 1, '[-f2-q1]')  ; Char
 End; SNOBOL4 + PureBASIC + Win32Forth + REBOL = <3
 EndMacro: OpenConsole() : PrintN("Hello, world !")
 Repeat : Until Inkey() :  Macro SomeDummyMacroHere
 REBOL  [ Title:  "'Hello, World !' in 4 languages"
 CopyLeft:  "Developed in 2010 by Society" ]  Print
 "Hello, world !"  EndMacro:  func  [][]  set-modes
 system/ports/input [binary: true] Input  set-modes
 system/ports/input  [binary: false] NOP:: EndMacro
 ; Wishing to refine it with new language ? Go on !

Le terme est parfois appliqué à des programmes valides dans plusieurs langues, mais qui n'exécutent pas strictement la même fonction dans chacune. Une utilisation pour ce formulaire est un fichier qui s'exécute comme un fichier batch DOS , puis se réexécute en Perl :

 @rem = ' --PERL--
 @echo off
 perl "%~dpnx0" %*
 goto endofperl
 @rem ';
 #!perl
 print "Hello, world!\n";
 __END__
 :endofperl

Cela permet de créer des scripts Perl qui peuvent être exécutés sur des systèmes DOS avec un minimum d'effort.

Les références

Liens externes