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. -
printf
est 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
main
fonction. En PHP, lamain
fonction est définie mais pas appelée et en C, il n'est pas nécessaire d'appeler explicitement lamain
fonction.
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
- Un polyglotte en 330 langues différentes
- Un polyglotte en 16 langues différentes
- Un polyglotte en 8 langages différents (écrit en COBOL , Pascal , Fortran , C , PostScript , Unix shell , Intel x86 machine language et Perl 5)
- Un polyglotte en 7 langages différents (écrit en C , Pascal , PostScript , TeX , Bash , Perl et Befunge98 )
- Un polyglotte en 6 langages différents (écrit en Perl , C , Unix shell , Brainfuck , Whitespace et Befunge )
- Liste des polyglottes génériques