Программа Полиглот
Программа- полиглот ( polyglot = многоязычный) - это компьютерная программа , исходный код которой действителен на нескольких языках программирования ; d. Другими словами, соответствующий интерпретатор или компилятор может выполнять или переводить любой из предоставленных для него языков без ошибок. Обычно он дает одинаковый результат при запуске на разных языках . Такая программа не имеет смысла для широкой публики, ее создание - лишь сложное упражнение для программиста .
функциональность
Хотя может быть практически невозможно сформулировать текст полиглота на естественном языке, создание программы-полиглота менее сложно, чем кажется на первый взгляд. При разработке программ-полиглотов используются следующие факты и методы:
- Части кода могут быть действительны на нескольких языках программирования, например. B. "
printf ("...")" генерирует текстовый вывод как на Perl, так и на C. - Команды перехода могут использоваться для пропуска частей исходного текста, которые недопустимы для соответствующего языка, или для
exitзавершения выполнения программы «заблаговременно» до появления недопустимых кодов. - Строка программы может представлять исполняемый код на одном языке программирования и комментарий на другом . Например, «
# include ...» в C - это инструкция препроцессора , во многих языках сценариев - из-за символа «#» в начале строки - это строка комментария. - В некоторых языках программирования (например, в C с инструкцией препроцессора) вы можете переопределить токены или переопределить существующие и, таким образом, сделать токен, действительный на иностранном языке программирования, действительным и в вашем собственном - возможно, с другим значением.
Простой пример
Следующий пример гораздо менее впечатляющий, чем тот, который упоминается в веб-ссылках; он был специально разработан с целью облегчения понимания даже для непрофессионала. Он использует первые три из упомянутых выше техник.
| Исходный код | Объяснение |
|---|---|
|
|
Напротив, исходный код действителен для C, Perl и многих оболочек Unix (Bourne Shell, Korn Shell , Bash, C Shell, Z Shell). Программа выводит текст « Hello, world! " вне. |
|
|
C Текст, заключенный |
|
|
Оболочки Unix |
|
|
Perl |
Более сложный пример
Следующий исходный код действителен для C, PHP и Bash. Используются все методы, описанные выше; в частности, новое или переопределение символьных строк необходимо в ряде случаев для совместимости с C. Это происходит в #defineстроках, начинающихся с " ", которые являются строками комментариев для двух языков сценариев.
#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
#*/
|
MS-DOS и Perl
Привет мир!
Следующая программа может через интерпретатор Perl или как DOS - пакетный файл для запуска. (Пояснения к каждой строке справа от исходного текста.)
| Исходный код | ДОС | Жемчужина |
|---|---|---|
@rem = ' @echo Hello, world! @goto END '; print substr "@rem", 7, 13; __END__ : END |
Kommentar Ausgabe Sprung ans Ende wird übersprungen wird übersprungen wird übersprungen Ende Code |
Definition des Arrays @rem Inhalt des Arrays @rem Inhalt des Arrays @rem Ende der Definition von @rem Ausgabe Teilstring aus @rem Ende Code wird ignoriert |
DOS-оболочка для Perl
Пакетный файл DOS для вызова программы Perl может быть создан аналогичным образом: пакетный файл DOS содержит код Perl и выполняется сам (в строке 10) с помощью интерпретатора Perl. Однако требуется некоторое усилие, чтобы собрать аргументы командной строки и передать их Perl:
@rem = ' ---------- BEGIN DOS ------------------
@echo off
set PROG=%0.bat
: ARG LOOP
if "%1" == "" goto EXEC
set ARGS=%ARGS% %1
shift
goto ARG LOOP
: EXEC
perl %PROG% %ARGS%
goto END
';
# ================ BEGIN PERL ==================
print "Perl here with these arguments: @ARGV\n";
__END__ # ========= END PERL ===================
: END
set PROG=
set ARGS=
:: ---------------- END DOS --------------------
|
Смотри тоже
Другие примеры бесполезных, но обучающих программ:
- Программа Hello World - вывод «Hello, World» на самых разных языках программирования.
- Quine - программы, выводящие собственный исходный код
- Просто еще один Perl-хакер - творческие Perl-программы, которые оригинальным образом выводят "Just another Perl hacker".
- Программы на эзотерических языках программирования
- Вклад в программу для «запутанных конкурсов» (например, запутанный конкурс Perl , международный конкурс запутанного кода C )
веб ссылки
(Все источники, цитируемые здесь, на английском языке.)
- Программа с 8-кратным полиглотом (исполняемая в Unix Shell , C , COBOL , Fortran , Pascal , Perl , PostScript и ассемблере x86 )
- Программа с 7-кратным полиглотом (исполняемая на Bash , Befunge , C , Pascal, Perl, PostScript и TeX )
- 6-кратная программа-полиглот (исполняемая на Brainfuck , Befunge , C, Perl, Unix Shell и Whitespace )
- 4-кратная программа-полиглот (исполняемая в ANSI C , Perl, Tcl и Unix Shell)
- Сборник из 14 полиглотовых программ