ibash.org.ru - Новый цитатник Рунета | Цитаты: По дате По рейтингу Случайно Добавить Поиск RSS |
Форум: Программы-полиглоты 1 > [RSS] | Форум: Вход Регистрация Участники Поиск RSS |
Ским 16.06.2009 - 00:59 | Если что, предупреждаю, что сие - кросспостинг :) |
Ским #1 - 16.06.2009 - 00:59 | Есть люди-полиглоты, которые отличаются тем, что знают несколько языков. А есть программы-полиглоты, исходный код которых интерпретируется или компилируется независимо от языка. Вся прелесть полиглота в том, что один и тот же исходный код можно сохранить как сишный файл, скомпилировать его, и порадоваться результату работы. А можно этот же файл запустить как 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. #*/ Работает в 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. } Простенький 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 ]-->~ Работает в C(x2), C++, Haskell, Ruby, Python, Perl(x2), HTML, tcl, bash, zsh, make, bash и brainfuck. |
Shock #2 - 16.06.2009 - 01:21 | аха. читал, очень интересно. пс. в последнем еще JavaScript вижу. |
unikoid #3 - 16.06.2009 - 08:49 | Можно глупый вопрос? "А зачем?" |
xserg #4 - 16.06.2009 - 09:02 | для удобства отладки вестимо |
deyt #5 - 16.06.2009 - 12:39 | Чтобы чаще вспоминали написавшего код |
Кавайный Няшг #6 - 16.06.2009 - 19:47 | Данный код особенно хорошо медленно почитывать под ненавязчивую мелодию 13h-ой сонаты в ля-миноре с оркестром группы "Дрочащий Дикобраз". Мои искренние респекты автору. Йа свой моск сломал... *CRAZY* |
unikoid #7 - 16.06.2009 - 19:53 | А что-то реальное, полезное в таком виде существует? |
Кавайный Няшг #8 - 16.06.2009 - 20:12 | #7, вроде так висту писали. Чтобы можно было компилить на визуал бэйсике, дарк бэйсике, логоврайтере, брэйнфаке и 1ц. |
Кавайный Няшг #9 - 16.06.2009 - 20:12 | #7, пардон, полезное... хм... |
TUenUT #10 - 17.06.2009 - 02:04 | это трава... |
Enchant #11 - 17.06.2009 - 12:16 | прикольно) спасибо автору, не знал (: |
fbb #12 - 17.06.2009 - 21:04 | хех классно. Развитие темы самокомпилирующихся батников. |
Няшгъ Кавайный #13 - 17.06.2009 - 21:15 | Интересно, как на брэйнфаке выглядит компилятор брэйнфака? Вообще, не знает ли кто линков, по которым расположены сырцы простейших (без гуёв и прочей гадости, самый-самый минимум) компиляторов языков, на которых оные написаны? |
432234 #14 - 17.06.2009 - 21:59 | #13 fasm http://ru.wikipedia.org/wiki/Fasm |
deyt #15 - 17.06.2009 - 22:07 | #13 PyPy(Python написанный на Python) http://codespeak.net/pypy/dist/pypy/doc/ |
unikoid #16 - 18.06.2009 - 08:01 | Если хорошо поискать на ЛОРе, можно найти интерпретатор лиспа на самом лиспе, занимающий 2 или 3 строки.Вообще с интерпретаторами проще, поскольку во многих интерпретируемых языках существует возможность выполнения строкового выражения как команды языка. Ну а если речь о компиляторах,то FreePascal написан на самом себе. Да и GCC, по-моему, тоже. |
Няшгъ Кавайный #17 - 18.06.2009 - 08:39 | #14,15,16, спасибо. Освобожусь -- заценю перечисленное и выскажу авторитетную точку зрения о православности (= ... но сначала придётся выучить Питон... |
Xenius #18 - 18.06.2009 - 09:12 | Интерпретатор языка на самом этом языке не сможет работать без компилятора этого языка или компилятора другого языка, для которого {есть интерпретатор этого языка или языка для которого верно утверждение в фигурных скобках} |
RoadRunner #19 - 18.06.2009 - 10:08 | К компиляторам относится то же самое. Первую версию компилятора пишут на каком-либо другом языке, потом уже при ее помощи пишут следующую версию компилятора на том языке, для которого компилятор написан. Даже в случае компилятора асма нужно его написать на чем-то. В крайнем случае, на машинных кодах... |
Няшгъ Кавайный #20 - 18.06.2009 - 10:13 | Кто знает, есть ли язык программирования, предназначенный для написания компиляторов? Т.е. поддерживать некоторые парсерные функции, операции над таблицами переменных и стеком, а также ассемблерные макрофункции? |
RoadRunner #21 - 18.06.2009 - 10:31 | MASM? |
Xenius #22 - 18.06.2009 - 11:13 | Вроде есть некоторые, но я забыл. Еще есть yacc и bison, но о них я знаю только что они есть, да еще и не уверен в написании. Компилятор все-таки, если хотя бы у кого-то есть в скомпилированном виде (для компиляции его можно применить и интерпретатор, если он не на том же языке), уже автономен. Как fasm, например. И да, первые версии gcc можно было скомпилить любым имевшимся несвободным компилером и пересобрать несколько раз самим собой до полной идентичности бинарников после итерации |
Няшгъ Кавайный #23 - 18.06.2009 - 11:23 | #21, надеюсь, это не ответ был? (= |
RoadRunner #24 - 18.06.2009 - 11:24 | #22 И я о чем. Т.е., всегда нужен какой-то "пра-компилятор" |
Няшгъ Кавайный #25 - 18.06.2009 - 11:31 | Я полагаю, теоретически, можно написать компилятор в несколько килобайт, который многократной последовательной "разупаковкой" себя по некоторой формуле (входящей в состав "разупаковщика") разовьётся в нормальный компилятор, причём синтаксис на последнем шаге будет включать и исходный файл как интерпретируемый... (= |
RoadRunner #26 - 18.06.2009 - 12:26 | Тогда его придется писать непосредственно в машинном коде |
Няшгъ Кавайный #27 - 18.06.2009 - 12:31 | #26, таки да. |
Dink #28 - 19.06.2009 - 11:33 | #26, а еще его можна спаять =) |
RoadRunner #29 - 19.06.2009 - 12:28 | Аппаратный компилер? Исключено. Т.е., теоретически можно, но лишено смысла - затраты на производство будут несоизмеримо выше, чем в случае #26. Кроме того, он лишен гибкости самокомпиляции (как рассматривалось выше - т.е., компиляция, приводящая к идентичности бинарников компиляторов компилирующего и полученного из исходников) |
ВфклЦфтвукук #30 - 19.06.2009 - 14:13 | Что было раньше, компилятор или транслятор?.. |
RoadRunner #31 - 19.06.2009 - 15:41 | Машинный код, ибо без него ничего работать не будет. В принципе, можно сказать, что процессор - это транслятор машинного кода, поэтому, наверное, транслятор был раньше... |
Dink #32 - 19.06.2009 - 21:05 | #29 Аппаратный - не всегда сколоченный намертво гвоздями. Иногда оно может работать под управлением некоторой прошивки, и можно даже представить устройство, которое будет перепрошивать самое себя. ПЫСЫ Прошивка не всегда подразумевает процесор. Например вентильные матрицы. |
xserg #33 - 19.06.2009 - 22:51 | даешь самомодифицирующийся самообучающийся AI на php! |
424 #34 - 19.06.2009 - 22:55 | #33 он совершит самоубийство в момент, когда узнает, что написан на php |
Кавайный Няшг #35 - 20.06.2009 - 11:15 | main(a){printf(a,34,a=”main(a){printf(a,34,a=%c%s%c,34);}”,34);} // Влад Таиров, Рашид Фахреев |
Кавайный Няшг #36 - 20.06.2009 - 11:21 | Title: *.com Content: VZNNXPH555750K4PP5DM3D01D0X5AC3D21D2XP559550K4 Запустить в среде, поддерживающей .com |
Xenius #37 - 20.06.2009 - 15:07 | Вторая с wasm-а? Я тоже думал такое написать, но решил что лень и не написал. В кодах не ASCII у меня тоже оно есть, кстати, и короче. Вот даже исходник нашел. Оставляю как был, хотя знаю, как можно улучшить. Да, лицензия — "do whatever your want"... org 100h mov ah,2 ;Вторая функция int 21h выводит символ из dl mov bx,100h ;Адрес первого байта в bx mov cx,33 ;Размер скомпиленной проги в cx lp: mov dl,[bx] ;В dl кладем байт по адресу из bx int 21h ;Выводим этот байт как символ inc bx ;Переходим к следующему байту loop lp ;Зацикливаем, cx будет уменьшаться на 1, пока не станет нулем int 20h ;Завершение программы db '(c) Xenius, 2007' |
Xenius #38 - 20.06.2009 - 15:18 | Эх, табуляция съехала. Ну и ладно. А как работает прога на C? Не компилится она что-то, ругается на stray в gcc. |
Кавайный Няшг #39 - 20.06.2009 - 18:28 | cat $0 Unmatched ’. x=’y=‘echo .|tr . "\47"‘;echo "x=$y$x$y;$x"’;y=‘echo .|tr . "\47"‘;echo "x=$y$x$y;$x" --- #38, да, к этому ещё и ключи какие-то нужно было угадывать для заданного компилятора... найдёшь -- скинь. (= |
Кавайный Няшг #40 - 20.06.2009 - 18:30 | Да, #37 -- респектую! (= Доберуюсь до ассемблера -- извращу и возрадуюсь. (-; |
RoadRunner #41 - 22.06.2009 - 10:10 | Насколько помню, это прога в com-формате, умещается в 64к-сегменте. Получается, прога печатает сама себя в машинном коде? Ну, тогда уж лучше выводить в хексе... |
Неймфаг #42 - 24.06.2009 - 01:17 | В треде про написание зашел вопрос про написание трансляторов и никто не вспомнил о OCaml'е? Стыдно должно быть товарищи... |
anonimous #43 - 28.06.2009 - 16:14 | Няшгъ Кавайный >Интересно, как на брэйнфаке выглядит компилятор брэйнфака? >>>+++++[>+++++++++<-]>[>+>>+>>+>>+>>++>>++>>+>>+[<<]>-]+++++[>+++>>+++< <<-]>++>>>>->>+>>+>>+++>>-->>>,+[>>>+++++++++++[<++++++++++++>-]<++[>>[> ]+[<]<-]>+++++++++++[<+++++++++++>-]<++++++[>>[+>]<[<]<-]<+++++[>+++++[> >++++>+++>----->++>>----->---->+++>>---->++>---->-->-->+++>>----->+++>-- -->->+++>----->---->----->>----->----->>----->+++++>++++>++>>----->-->-- -->>----->++>----->-->---->>----->++>---->-->----->----->---->----->---- ->---->>----->+>----->+++>++>---->+++>---->---->+++>>----->-->+++++>---- ->++>----->+++>---->-->---->>+++++>+>----->+++>++>----->-->+++>----->--- ->-->+>---->--->++++>>----->>+++>----->+++>---->>++++>----->+++>---->->+ ++>+>+++++>>--->+>----->----->>--->+>----->----->>--->++>----->----->>-- ->++>----->++++>++++>>--->+++>----->+++>+++[<]<-]> >++>++>+>-->+>+>++>->->>++>-->>++>-->+>+>++>++>->>++>++>+>+>>++>+>+>-->+ >-->+>+>-->+>->+>+>>-->-->->+>+>-->>>++>++>+>>-->+>+>-->++>>++>-->++>++> ++>->->+>>-->+>++>+>++>++>-->-->->-->-->++>>++>+>++>-->+>-->>-->>++>-->- >++>+>->+>++>++>+>++>+>++>++>->>-->>+>+>-->+>+>+>+>++>+>+>+>+>++>+>+>+>+ >->+>->->+>+>->+>++>++[<]<<-]>> >+>>-->-->+>-->++>>>->-->->>>->>-->-->+>-->+>->>->++>+>->+>-->-->+>-->++ >-->-->->>>->++>-->+>>+>->->>+>->>->+>++>+>-->->>-->-->->-->+>++>>>+>>-- >++>-->++++++ >-->+>-->+>->>->>-->-->>>->-->->++>+>+>+>++>>+>+>++>+>-->+>+>++> +>-->+>-->-->-->>+>++>+>->->+>++>->->->+>++>->->->++>++>-->->->->++>++>- >->+>+[<]>[------.++++++>]<[[-]<]+++++++++++[<++++++++++++>-]<+[>>[>]+[< ]<-]>+++++++++++[<+++++++++++>-]<++++++[>>[+>]<[<]<-]<+++++[>+++++[> >+>----->---->+++>>++++>----->->->+>----->-->+>+++>--->+++>+++>++++>++++ +>++>>--->----->->->-->-->->--->+++>-->+>+>+>+++++>--->+++>++>-->++++>>+ ++++>-->++++>>+++++>--->++++>----->+++>-->----->+++>>+++++>+>+++>+>+>->- >-->----->++++>>+++++>----->>+++++>----->+>----->->->----->++++>---->--- ->---->----->+++>>----->+++>----->>++>---->+++>---->----->+++>----->---- ->+++++>++>+>++++>+>+++>--->+++>--->+++>+++++>++>+++>----->----->>-->>-- --->----->>----->+++>--->----->+++>-->----->+++>>----->+++>->----->>++++ >----->+>+++++[<]<-]> >-->++>++>->->>>-->-->-->>++>-->++>->+>++>++>->+>->->>-->>++>++>-->+>+>- >->->-->->+>->>-->-->-->>-->->->>+>->+>->>+>+>->-->-->>->->->-->++>>>++> -->+>++>>+>-->++>-->>>>-->++>-->++>-->+>+>>++>+>+>++>->-->+>-->>>->>-->> -->+>->++>+>->->>-->+>+>+>-->+>+>+>->+>-->++>+>-->++>+>->++>+>->++>+>++> +>>-->--[<]<<-]>> >+>>++>>>-->->+>>++>->->++>-->+>++>++>+>>-->->>->++>-->-->->->->->-->++> ++>++>-->->>>-->++>++>++>-->-->++>-->>-->>>>+>-->>->++>+>++>++>++>++>--> ++>++>->++>>->>>++>-->++>-->++>++>++>->++>>>>-->+>>+>->>->->+>-->++>++>+ +++++++>+ +>++>+>++>++>+>>->>+>-->-->+>->+>>+>-->-->->+>-->+>->->-->->-->++>->->-- >->->+>->++>-[<]<[<]>[------.++++++>]----.----------.>[------.++++++>]<[ [-]<]<<<[-[[>+<<-<<-<<-<<-<<-<<-<<-<<->>>>>>>>>>>>>>>-]<[<<]>>[>-[>>-<<+ ]>]>+++++++++[-[>+<-]>>+<[<+>-[->+<<-]>>[>]<<]>-[>+<-<+>]>>+<[<+>-[->+<< -]>>[>]<<]>-[>+<-<->]<<[>->>-<<<-]>[.[+]]>>[<<<->>>+[-]]<<<+<<[>>[>>++++ +++<<-]>>+<<<<-]>>[-]++++++[>+++++++++++<-]>+<<[>++++++++++[>+++++++++++ +++<-]>++<<-[>>+++++<<-[>>[-]+++++++<<-]]]>>>[<+>-]<.[-]<<<]<<<[<<+<<+<< +<<+<<+<<+<<+<<+>>>>>>>>>>>>>>>>-]<],+]]++++++++[>+++++>++++<<-]>+[<++++ +>-]<.>>. |
anonimous #44 - 29.06.2009 - 22:35 | 2anonimous Я в ахуе. У меня даже компилятора нет, чтобы проверить. Но я всё равно в ахуе. |
Кто-то #45 - 29.06.2009 - 23:07 | Что-то мне кажется коротковато для компилятора, хотя кто их психов знает. |
naryl #46 - 29.06.2009 - 23:47 | На брейнфаке невозможно написать компилятор брейнфака ввиду отсутствия средств ввода-вывода. Аноним, может всё-таки инерпретатор. |
naryl #47 - 29.06.2009 - 23:48 | Средств *файлового* ввода-вывода. |
RoadRunner #48 - 30.06.2009 - 09:34 | Ничего не мешает юзать стандартный ввод/вывод с перенаправлением последнего в файл |
unikoid #49 - 30.06.2009 - 12:20 | А как насчет интерпретатора whitespace на самом себе? |
Xenius #50 - 30.06.2009 - 13:45 | Ничего себе, коротковато |
К списку вопросов | Страницы: 1 > |
«ibash.org.ru — Новый цитатник Рунета» | Почта вебмастера: imail@ibash.org.ru |