ibash.org.ru - Новый цитатник Рунета

Форум: Программы-полиглоты 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