Есть люди-полиглоты, которые отличаются тем, что знают несколько языков. А есть программы-полиглоты, исходный код которых интерпретируется или компилируется независимо от языка.
Вся прелесть полиглота в том, что один и тот же исходный код можно сохранить как сишный файл, скомпилировать его, и порадоваться результату работы. А можно этот же файл запустить как bash-скрипт и увидеть точно такой же результат работы!
Пример такой программы:
Работает в ANSI C, PHP и bash. Подробней:
Для написания полиглотов обычно используется С т.к. он обладает мощным препроцессором и какой-нибудь из скриптовых языков, например Perl, PHP, sh или Lisp.
Например:
Но 2 языка это совсем примитивно, предлагаю вам взглянуть на полиглот на 15(!!!) языках:
Работает в C(x2), C++, Haskell, Ruby, Python, Perl(x2), HTML, tcl, bash, zsh, make, bash и brainfuck(спасибо maxshopen за подсказку :)).
Ну и под конец несколько ссылок на чуть менее монструозные конструкции:
8 языков: COBOL, Pascal, Fortran, C, PostScript, Unix shell, asm x86 и Perl 5
6 языков: Perl, C, Unix shell, Brainfuck, Whitespace и Befunge
Список полиглотов, написанных энтузиастами
Вся прелесть полиглота в том, что один и тот же исходный код можно сохранить как сишный файл, скомпилировать его, и порадоваться результату работы. А можно этот же файл запустить как 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
- #*/
* This source code was highlighted with Source Code Highlighter.
Работает в ANSI C, PHP и bash. Подробней:
- "//" является комментарием в PHP и рутовой директорией в sh
- Иструкция «function main()» является валидной для PHP и bash, для С она превращается в «int main()» во время компиляции
- Конструкция вида «if (($x))» может быть использована для bash и PHP
- Последние 3 строчки использует только bash
- «printf» в bash аналогична printf в С, за исключением скобок(их добавит препроцессор)
Для написания полиглотов обычно используется С т.к. он обладает мощным препроцессором и какой-нибудь из скриптовых языков, например Perl, PHP, sh или Lisp.
Например:
- #include <stdio.h>
- #define do main()
- do {
- printf("Hello World!\n");
- }
* This source code was highlighted with Source Code Highlighter.
Простенький Hello-World для С и Perl.Но 2 языка это совсем примитивно, предлагаю вам взглянуть на полиглот на 15(!!!) языках:
- # /* [ <!-- */ include <stdio.h> /* \
- #{\
- `""""true \\#{"\n#"}; \
- \
- if [ -n "$ZSH_VERSION" ]; then \
- \
- echo exec echo I\'m a zsh script.; \
- \
- elif [ -n "$BASH_VERSION" ]; then \
- \
- echo exec echo I\'m a bash script.; \
- else \
- echo exec echo I\'m a sh script.; \
- fi`; #\
- BEGIN{print"I'm a ", 0 ? "Ruby" :"Perl", " program.\n"; exit; }
- #\
- %q~
-
- set dummy =0; puts [list "I'm" "a" "tcl" "script."]; exit
-
- all: ; @echo "I'm a Makefile." \
- #*/
- /*: */ enum {a, b}; \
- \
- static int c99(void) {
-
- #ifndef __cplusplus /* bah */
-
- unused1: if ((enum {b, a})0) \
- (void)0;
- #endif
-
- unused2: return a; \
- } \
- static int trigraphs(void) { \
- \
- return sizeof "??!" == 2; \
- } \
- char X; \
- \
- int main(void) { \
- \
- struct X { \
- \
- char a[2]; \
- };\
- if (sizeof(X) != 1) { \
- \
- printf("I'm a C++ program (trigraphs %sabled).\n", \
- \
- trigraphs() ? "en" : "dis");\
- \
- }else if (1//**/2
-
-
- )unused3 : { ; \
- printf("I'm a C program (C%s, trigraphs %sabled).\n", \
- c99() ? "89 with // comments" : "99", \
- trigraphs() ? "en" : "dis"); \
- } else { \
- printf("I'm a C program (C89, trigraphs %sabled).\n", \
- trigraphs() ? "en" : "dis"); \
- } \
- return 0; \
- } /*
- # \
- > main :: IO () -- -- \
- > main = putStr "I'm a Literate Haskell program.\n"
- # \
- ]>++++++++[<+++++++++>-]<+.>>++++[<++++++++++>-]<-.[-]>++++++++++ \
- [<+++++++++++>-]<-.>>++++[<++++++++>-]<.>>++++++++++[<++++++++++> \
- -]<- - -.<.>+.->>++++++++++[<+++++++++++>-]<++++.<.>>>++++++++++[ \
- <++++++++++>-]<+++++.<<<<+.->>>>- - -.<+++.- - -<++.- ->>>>>+++++ \
- +++++[<+++++++++++>-]<- - -.<<<<<.<+++.>>>.<<<-.- ->>>>+.<.<.<<.> \
- ++++++++++++++.[-]++++++++++"""`
- # \
- print "I'm a Python program."; """[-][--><html><head>
- <!--:--><title>I'm a HTML page</title></head><body>
- <!--:--><h1>I'm a <marquee><blink>horrible HTML</blink></marquee> page</h1>
- <!--:--><script language="JavaScript">
- <!--: # \
- setTimeout( // \
- function () { // \
- document.body.innerHTML = "<h1>I'm a javascript-generated HTML page</h1>"; // \
- }, 10000); // \
- //-->
- </script><!--: \
- </body></html><!-- } # \
- say "I'm a Perl6 program", try { " ($?PUGS_VERSION)" } // "", "."; # """ # */
- #define FOO ]-->~
* This source code was highlighted with Source Code Highlighter.
Работает в C(x2), C++, Haskell, Ruby, Python, Perl(x2), HTML, tcl, bash, zsh, make, bash и brainfuck(спасибо maxshopen за подсказку :)).
Ну и под конец несколько ссылок на чуть менее монструозные конструкции:
8 языков: COBOL, Pascal, Fortran, C, PostScript, Unix shell, asm x86 и Perl 5
6 языков: Perl, C, Unix shell, Brainfuck, Whitespace и Befunge
Список полиглотов, написанных энтузиастами