Полиглоты

    Есть люди-полиглоты, которые отличаются тем, что знают несколько языков. А есть программы-полиглоты, исходный код которых интерпретируется или компилируется независимо от языка.

    Вся прелесть полиглота в том, что один и тот же исходный код можно сохранить как сишный файл, скомпилировать его, и порадоваться результату работы. А можно этот же файл запустить как bash-скрипт и увидеть точно такой же результат работы!

    Пример такой программы:
    1. #define a /*
    2. #<?php
    3. echo "\010Hello, world!\n"// 2> /dev/null > /dev/null \ ;
    4. // 2> /dev/null; x=a;
    5. $x=5 // 2> /dev/null \ ;
    6. if (($x))
    7. // 2> /dev/null; then
    8. return 0;
    9. // 2> /dev/null; fi
    10. #define e ?>
    11. #define b */
    12. #include <stdio.h>
    13. #define main() int main()
    14. #define printf printf(
    15. #define true )
    16. #define function
    17. function main()
    18. {
    19. printf "Hello, world!\n"true/* 2> /dev/null | grep -v true*/;
    20. return 0;
    21. }
    22. #define c /*
    23. main
    24. #*/
    * 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.

    Например:
    1. #include <stdio.h>
    2. #define do main()
    3. do {
    4.   printf("Hello World!\n");
    5. }
    * This source code was highlighted with Source Code Highlighter.
    Простенький Hello-World для С и Perl.

    Но 2 языка это совсем примитивно, предлагаю вам взглянуть на полиглот на 15(!!!) языках:
    1. # /* [  <!-- */ include  <stdio.h> /*   \
    2.   #{\
    3. `""""true \\#{"\n#"};           \
    4.   \
    5. if [ -n "$ZSH_VERSION" ]; then           \
    6.   \
    7.   echo exec  echo I\'m a zsh script.; \
    8.   \
    9. elif [ -n "$BASH_VERSION" ]; then        \
    10.   \
    11.   echo exec  echo I\'m a bash script.; \
    12. else  \
    13.   echo exec  echo  I\'m  a sh  script.;    \
    14. fi`;  #\
    15. BEGIN{print"I'm a ", 0 ? "Ruby"  :"Perl",  " program.\n";  exit; } 
    16.   #\
    17. %q~            
    18.   
    19. set dummy =0; puts [list "I'm"  "a"  "tcl"  "script."]; exit   
    20.   
    21. all: ; @echo "I'm a Makefile."          \
    22.   #*/
    23. /*: */ enum {a, b};            \
    24.   \
    25. static int c99(void) {         
    26.   
    27. #ifndef __cplusplus /* bah */        
    28.   
    29. unused1: if ((enum {b, a})0)          \
    30.   (void)0;
    31. #endif           
    32.   
    33. unused2:  return a;     \
    34. }  \
    35. static int trigraphs(void) {         \
    36.   \
    37.   return sizeof  "??!"  ==  2;    \
    38. }  \
    39. char X;               \
    40.   \
    41. int main(void) {             \
    42.   \
    43.   struct X  {        \
    44.   \
    45.      char  a[2];    \
    46.   };\
    47.   if (sizeof(X)  !=  1) {       \
    48.   \
    49. printf("I'm a C++ program (trigraphs %sabled).\n",         \
    50.   \
    51.    trigraphs()  ? "en"  : "dis");\
    52.   \
    53. }else if (1//**/2
    54.  
    55.  
    56. )unused3 : { ; \
    57.     printf("I'm a C program (C%s, trigraphs %sabled).\n", \
    58.         c99() ? "89 with // comments" : "99", \
    59.         trigraphs() ? "en" : "dis"); \
    60.   } else { \
    61.     printf("I'm a C program (C89, trigraphs %sabled).\n", \
    62.         trigraphs() ? "en" : "dis"); \
    63.   } \
    64.   return 0; \
    65. } /*
    66. # \
    67. > main :: IO () -- -- \
    68. > main = putStr "I'm a Literate Haskell program.\n"
    69. # \
    70. ]>++++++++[<+++++++++>-]<+.>>++++[<++++++++++>-]<-.[-]>++++++++++ \
    71. [<+++++++++++>-]<-.>>++++[<++++++++>-]<.>>++++++++++[<++++++++++> \
    72. -]<- - -.<.>+.->>++++++++++[<+++++++++++>-]<++++.<.>>>++++++++++[ \
    73. <++++++++++>-]<+++++.<<<<+.->>>>- - -.<+++.- - -<++.- ->>>>>+++++ \
    74. +++++[<+++++++++++>-]<- - -.<<<<<.<+++.>>>.<<<-.- ->>>>+.<.<.<<.> \
    75. ++++++++++++++.[-]++++++++++"""`
    76. # \
    77. print "I'm a Python program."; """[-][--><html><head>
    78. <!--:--><title>I'm a HTML page</title></head><body>
    79. <!--:--><h1>I'm a <marquee><blink>horrible HTML</blink></marquee> page</h1>
    80. <!--:--><script language="JavaScript">
    81. <!--: # \
    82. setTimeout( // \
    83.   function () { // \
    84.    document.body.innerHTML = "<h1>I'm a javascript-generated HTML page</h1>"; // \
    85.   }, 10000); // \
    86. //-->
    87. </script><!--: \
    88. </body></html><!-- } # \
    89. say "I'm a Perl6 program", try { " ($?PUGS_VERSION)" } // "", "."; # """ # */
    90. #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
    Список полиглотов, написанных энтузиастами
    Share post

    Similar posts

    Comments 66

      +8
      Очень круто, и ровно столько же странно =)
        +17
        И настолько же бесполезно =)
          +1
          зато весело :)
            0
            У автора наверно очень много времени.
        • UFO just landed and posted this here
            +7
            Ждём статью о ректальной тонзиллэктомии. ;)
              0
              А на Хабре всегда так — одно время сгустки этого, другое — сгустки того.
                0
                весенне-летнее и осенне-зимнее обострения? )))
                +1
                Точно, их бы энергию да в мирное русло ;)))
                  0
                  а когда было про линукс в винде? что-то пропустил. (это про coLinux?)
                  • UFO just landed and posted this here
                  +10
                  >>Работает в C(x2), C++, Haskell, Ruby, Python, Perl(x2), HTML, tcl, bash, zsh, make, bash.

                  Там еще и brainfuck.

                  Внешний вид — устрашает, полагаю писать что-то большее чем «hello, world» таким образом — настоящее маньячество :)

                    +6
                    Туда явно напрашивается Whitespace
                      +1
                      Это чтобы совсем башню отрывало? :))
                  • UFO just landed and posted this here
                      +1
                      Вот я его и перенёс в соответствующий блог :)
                      0
                      Чего только не придумают ))
                        0
                        здорово)
                        а можно подробнее — зачем?
                        или это просто для развлечения…

                        ах да, я 14 только насчитал, ибо bash 2 раза написан
                        Работает в C(x2), C++, Haskell, Ruby, Python, Perl(x2), HTML, tcl, bash, zsh, make, bash и brainfuck
                          0
                          Надо полагать javascript :)
                            0
                            sh ещё. Разница между ними тремя (zsh, bash, sh) просто поражает воображение, в контексте этого кода :)
                              +18
                              Нет, разумеется, это не развлечение, а прием для кроссплатформенности.
                                0
                                Поглядев на дваваскрипт в среднестатистической веб странице, у меня складывается именно такое впечатление
                              • UFO just landed and posted this here
                                  +1
                                  Если я встречу такое в рабочем коде — потрачу сколько угодно времени, чтобы найти разработчика. Найти и убить.
                                    0
                                    адрес, имя и телефон — обычно также шифруются в тексте программы.
                                  +10
                                  с другой стороны, чтобы писать такие извращения, нужно иметь определенный уровень подготовки. простой кодер без опыта такое не напишет. респект таким чудикам.
                                    +1
                                    вот извращенцы то…
                                      +5
                                      читабельность храмает
                                        +5
                                        олгоритм нипонятный
                                        +4
                                        Это весьма своеобразный памятник программированию и языкам. Никакой практической ценности, зато эстетическое удовольствие от созерцания этого монструозно-монументального творения. :)
                                          –4
                                          а смысл этого мероприятия?
                                            +5
                                            Смысл таких мероприятий иногда обозначают термином «академическая забава» :)
                                              –1
                                              забава — да, а в каком месте тут — академическая?
                                                0
                                                в том, что чтобы такое написать, надо очень тонко понимать суть языков с которыми имеешь дело. То же самое и с куайнами.
                                                  –2
                                                  практическое применение?
                                                    0
                                                    Чтобы вы спрашивали. Господи, ну что за занудство, простите?

                                                    Вы в жизни принципиально не занимаетесь тем, что не имеет практического применения?
                                                      0
                                                      ну простите.
                                                      все. молчу
                                            +1
                                            echo «hello, world»

                                            хотя и тут не все однозначно
                                              –2
                                              мда, 15-языковой полиглот очень чоткие пацаны писали, видно что не первый год занимаются Portable scripting
                                                –1
                                                Вот чем занимаются хакеры, когда им делать нечего :)
                                                  –5
                                                  жесть! Практического смысла я не вижу, по крайней мере со своей точки зрения. Может тем кто занимается вэбом — пригодиться… Мало ли там какие интерпритаторы стоят на специфичных хостингах, а код один… мде…
                                                  Если такая простая вещь, как представленная в сэмпле выглядит настолько страшно — то как будет выглядеть рога, делающая некую полезную работу? она будет абсолютно неподдерживаемой и подверженной ошибкам.
                                                  Обычно при создании систем стараются умело применять специфические особенности языка, типа динамического связывания или встроенных типов данных, например флоатов произвольной точности как в питоне. А при таком подходе все сводится на нет. Получается что можно использовать только те возможности, которые являются самыми базовыми и имеются во всех языках.
                                                  Короче очередная вещь в себе, придумка нердов, откашивающих от прелестей жизни в социуме))))
                                                    –1
                                                    фак!
                                                    пригодиТСя
                                                    Прога
                                                      +1
                                                      да что ж Вы так серьезно) Это ведь просто весело
                                                        +1
                                                        последнее время близкие люди мне все чаще говорят что я становлюсь жутким занудой :))
                                                    • UFO just landed and posted this here
                                                        +2
                                                        а вы напишите текст, который будет читаться на 15 человечьих языках. хотя я знаю, впрочем:
                                                          +2
                                                          ээ? wtf? вот, в общем: читается на куче языков:
                                                          ****!
                                                            0
                                                            языки, это, конечно, сложновато, но есть замечательные слова, которые одинаково хорошо читаются в win-1251 и koi-8.
                                                            +5
                                                            Всем, кто не придумал какая от этого может быть практическая польза, привожу пример: можно написать файл на C или Асме, и одновременно в него же bash (bat)-скриптом записать команды его компиляции (а они порой бывают очень заковыристы).

                                                            Таким образом у вас и файл исходника, и строка запуска компилятора — причем они никогда друг от друга никуда не потеряются! В таком стиле написаны примеры к очень хорошему циклу статей по написанию драйверов: www.wasm.ru/article.php?article=drvw2k03
                                                              –2
                                                              не вижу никакой практической цели применения данных вещей
                                                              разве что мозг размять или время убить, или понты ))
                                                              хотя, конечно же, это круто
                                                              прикидываю — приходит программист, владеющий 6 языками, устраиваться на фирму
                                                              его просят написать тестовую программу и он ее пишет вот таким способом в 1 файле на 6 языках ))
                                                                –4
                                                                90 строк быдлокода… вездекомпилирующегося быдлокода
                                                                  +2
                                                                  А ты попробуй написать программу, компилирующуюся на 15 языках, и при этом не выглядящую как быдлокод :)
                                                                  0
                                                                  ждем первый полиглот-фреймворк, чтобы сгладить различия языков ^_^
                                                                    0
                                                                    .NET?
                                                                      +2
                                                                      Толсто.
                                                                    0
                                                                    Даже комментировать боюсь. Смешанное чувство. С одной стороны — бесполезно, с другой — забавно :)
                                                                      0
                                                                      Потрясающе! Как-нибудь надо будет попытаться самому написать такое. Хотя бы языков для двух.
                                                                        –4
                                                                        «Когда коту нечего делать, он себе яйца лижет» :)
                                                                          0
                                                                          HTML вряд ли нужно ставить в этот ряд (всё-таки не язык программирования), а вот Javascript — вполне можно.
                                                                            0
                                                                            Никоим образом не умаляя оригинальность и интересность статьи, хочу чуточку позанудствовать по поводу терминологии. Полиглот — это всё-таки человек, владеющий несколькими языками, но никак не написанный текст. Т.е. если брать аналогии мира программирования, то полиглот — это программист, владеющий плюсами, перлом, питоном, шеллом, джавой и т.д. А то, о чём говорится в статье, можно сравнить с текстом на естественном языке, который будет осмысленным при прочтении его на другом языке. Ну вроде как, скажем, слово «gift» присутствует и в английском, и немецком (хотя и означает разные вещи), или «do deed» — «дудит»… Хотя написание подобного осмысленного текста длиннее двух-трёх слов уже приближается к высшему пилотажу.
                                                                              0
                                                                                0
                                                                                Далеко не всегда иностранные слова, которые пишутся и произносятся так же, как русские, означают то же самое. Мой любимый пример: «виртуальный» vs. «virtual». В русском «виртуальный» означает только нечто несуществующее (грубо говоря), а в английском — ещё и «фактический, действительный».
                                                                              –3
                                                                              Зажигает??!
                                                                              А зачем это нужно, кроме демонстрации «крутости»?
                                                                                0
                                                                                >> Для написания полиглотов обычно используется С т.к. он обладает мощным препроцессором

                                                                                C вообще мощный язык для таких вещей. Более простым аналогом таких задачек когда-то было: написать программу которая печатает сама себя. На С это может выглядеть в одну строчку. Например, так:
                                                                                char s[]=«char s[]=%c%s%c;main(){printf(s,34,s,34);}»;main(){printf(s,34,s,34);}
                                                                                +4
                                                                                Меня действительно насторожили комментарии в духе «не вижу никакой практической пользы, зачем это».
                                                                                Ребята, вы что? Может стоит немного отдохнуть от работы?
                                                                                Да и название блога, кагбе говорит нам.

                                                                                Only users with full accounts can post comments. Log in, please.