Программа Полиглот

Программа- полиглот ( polyglot = многоязычный) - это компьютерная программа , исходный код которой действителен на нескольких языках программирования ; d. Другими словами, соответствующий интерпретатор или компилятор может выполнять или переводить любой из предоставленных для него языков без ошибок. Обычно он дает одинаковый результат при запуске на разных языках . Такая программа не имеет смысла для широкой публики, ее создание - лишь сложное упражнение для программиста .

функциональность

Хотя может быть практически невозможно сформулировать текст полиглота на естественном языке, создание программы-полиглота менее сложно, чем кажется на первый взгляд. При разработке программ-полиглотов используются следующие факты и методы:

  • Части кода могут быть действительны на нескольких языках программирования, например. B. " printf ("...")" генерирует текстовый вывод как на Perl, так и на C.
  • Команды перехода могут использоваться для пропуска частей исходного текста, которые недопустимы для соответствующего языка, или для exitзавершения выполнения программы «заблаговременно» до появления недопустимых кодов.
  • Строка программы может представлять исполняемый код на одном языке программирования и комментарий на другом . Например, « # include ...» в C - это инструкция препроцессора , во многих языках сценариев - из-за символа « #» в начале строки - это строка комментария.
  • В некоторых языках программирования (например, в C с инструкцией препроцессора) вы можете переопределить токены или переопределить существующие и, таким образом, сделать токен, действительный на иностранном языке программирования, действительным и в вашем собственном - возможно, с другим значением.

Простой пример

Следующий пример гораздо менее впечатляющий, чем тот, который упоминается в веб-ссылках; он был специально разработан с целью облегчения понимания даже для непрофессионала. Он использует первые три из упомянутых выше техник.

Исходный код Объяснение

# include <stdio.h> /*                  
eval "echo 'Hello, world!'; exit";
sub echo { print "@_\n" }; __END__ */
main() { printf ("Hello, world!\n"); }

Напротив, исходный код действителен для C, Perl и многих оболочек Unix (Bourne Shell, Korn Shell , Bash, C Shell, Z Shell). Программа выводит текст « Hello, world! " вне.

# include <stdio.h> /*
eval "echo 'Hello, world!'; exit";
sub echo { print "@_\n" }; __END__ */
main() { printf ("Hello, world!\n"); }

C Текст, заключенный
в /*и */(здесь зеленый), является комментарием в C и игнорируется. Остальное это вариант программы Hello World в C .

# include <stdio.h> /*
eval "echo 'Hello, world!'; exit";
sub echo { print "@_\n" }; __END__ */
main() { printf ("Hello, world!\n"); }

Оболочки Unix
Первая строка (зеленая) является строкой комментария и игнорируется. Когда evalоператор был выполнен, программа завершается из-за exit; остальное (серый) больше не считывается интерпретатором и, следовательно, не проверяется на правильность синтаксиса .

# include <stdio.h> /*
eval "echo 'Hello, world!'; exit";
sub echo { print "@_\n" }; __END__ */
main() { printf ("Hello, world!\n"); }

Perl
Первая строка - комментарий. evalОператор выполняется только после того , как подпрограмма была echo определена в строке 3 . Остальное (серый) после по ключевому слову __END__ считываются интерпретатором 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 --------------------

Смотри тоже

Другие примеры бесполезных, но обучающих программ:

веб ссылки

(Все источники, цитируемые здесь, на английском языке.)