Polyglot (computing)
From Wikipedia, the free encyclopedia
This article contains instructions, advice, or how-to content. The purpose of Wikipedia is to present facts, not to train. Please help improve this article either by rewriting the how-to content or by moving it to Wikiversity or Wikibooks. |
This article may contain original research or unverified claims. Please improve the article by adding references. See the talk page for details. (March 2009) |
This article does not cite any references or sources. Please help improve this article by adding citations to reliable sources (ideally, using inline citations). Unsourced material may be challenged and removed. (March 2009) |
In the context of 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 independently of the programming language used to compile or interpret it.
Generally polyglots are written in a combination of C (which allows redefinition of tokens with a preprocessor) and a scripting programming language such as Lisp, Perl or sh.
[edit] Techniques
The two most commonly used techniques for constructing a polyglot program are to make liberal use of languages which use different characters for comments and to redefine various tokens as others in different languages. Often good use is made of quirks of syntax. 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() #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 PHP 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()" 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.
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:
@echo off perl "%~dpnx0" %* goto endofperl @rem '; #!perl print "Hello, world!\n"; :endofperl
This allows the creation of Perl scripts that can be run on DOS systems with minimal effort.
[edit] External links
This article's external links may not follow Wikipedia's content policies or guidelines. Please improve this article by removing excessive or inappropriate external links. |
- An eight language polyglot (written in COBOL, Pascal, Fortran, C, PostScript, Unix shell, Intel x86 machine language and Perl 5)
- A six language polyglot (written in Perl, C, Unix shell, Brainfuck, Whitespace and Befunge)
- List of generic polyglots
- Merry Christmas polyglot in 4 languages
- Happy New year polyglot in 4 languages
- Computer polyglot in ANSI C, Unix shell, perl and tcl
- A polyglot in 15 different languages