Polyglot (computing)
In computing, a polyglot is a computer program or script written in a valid form of multiple programming languages, which performs the same operations or output independent of the programming language used to compile or interpret it.[1] For example, $a = 1;
creates a variable called a
and assigns 1
to it in PHP, and creates an undeclared variable called $a
and assigns 1
to it in JavaScript.
Generally, polyglots are written in a combination of C (which allows redefinition of lexical tokens with a preprocessor) and a scripting language such as Lisp, Perl or sh.
Polyglot markup is similar, but about markup language context.
Polyglot persistence is similar, but about databases.
The polyglot microservices allow developers to pick a programming language of their choice in order to build products in more efficient ways. Industry professionals believe that, when the governance over which programming language to develop in are loosened, there are more opportunities for developer creativity and out-of-the-box problem solving.[2]
Methods
The two most commonly used techniques for constructing a polyglot program are to make liberal use of languages that use different characters for comments and to redefine various tokens as others in different languages. Often good use is made of syntax quirks. These are demonstrated in this public domain polyglot written in ANSI C, PHP and 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 #*/
Note the following:
- A hash sign marks a preprocessor statement in C, but is a comment in both bash and PHP.
- "//" is a comment in both PHP and C and the root directory in bash.
- Shell redirection is used to eliminate undesirable outputs.
- Even on commented out lines, the "<?php" and "?>" PHP indicators still have effect.
- The statement "function main()" is valid in both PHP and bash; C #defines are used to convert it into "int main(void)" at compile time.
- Comment indicators can be combined to perform various operations.
- "if (($x))" is a valid statement in both bash and PHP.
- printf is a bash shell builtin which is identical to the C printf except for its omission of brackets (which the C preprocessor adds if this is compiled with a C compiler).
- The final three lines are only used by bash, to call the main function. In PHP the main function is defined but not called and in C there is no need to explicitly call the main function.
Some less-common languages also offer possibilities to create Polyglot code. Here is a small sample, written simultaneously in SNOBOL4, Win32Forth, PureBasicv4.x, and 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 !
The term is sometimes applied to programs that are valid in more than one language, but do not strictly perform the same function in each. One use for this form is a file that runs as a DOS batch file, then re-runs itself in Perl:
@rem = ' --PERL--
@echo off
perl "%~dpnx0" %*
goto endofperl
@rem ';
#!perl
print "Hello, world!\n";
__END__
:endofperl
This allows creating Perl scripts that can be run on DOS systems with minimal effort.
References
- Fjeldberg, Hans (2008). Polyglot Programming - A Business Perspective (PDF) (M.Sc). Norwegian University of Science and Technology.
- Gupta, Tripta (2018-12-19). "Analyzing Polyglot Microservices". Medium. Retrieved 2019-08-05.
External links
- A polyglot in 300 different languages
- A polyglot in 16 different languages
- A polyglot in 8 different languages (written in COBOL, Pascal, Fortran, C, PostScript, Unix shell, Intel x86 machine language and Perl 5)
- A polyglot in 7 different languages (written in C, Pascal, PostScript, TeX, Bash, Perl and Befunge98)
- A polyglot in 6 different languages (written in Perl, C, Unix shell, Brainfuck, Whitespace and Befunge)
- List of generic polyglots