Programa poliglota
Um programa poliglota ( poliglota = multilíngue) é um programa de computador cujo código-fonte é válido em mais de uma linguagem de programação ; d. Em outras palavras, o respectivo intérprete ou compilador pode executar ou traduzir qualquer uma das linguagens fornecidas para ele sem erros. Geralmente, ele produz a mesma saída quando executado em idiomas diferentes . Tal programa não tem utilidade para o público em geral, sua criação é apenas um exercício exigente para o programador .
funcionalidade
Embora seja quase impossível formular um texto poliglota em linguagem natural, criar um programa poliglota é menos difícil do que parece inicialmente. Os seguintes fatos e métodos são usados para desenvolver programas poliglotas:
- Partes do código podem ser válidas em várias linguagens de programação, por exemplo, B. "
printf ("...")" gera saída textual em Perl e C. - Os comandos de salto podem ser usados para pular as partes do texto-fonte que são inválidas no respectivo idioma ou para
exitencerrar a execução do programa com “em tempo” antes que códigos inválidos apareçam. - Uma linha de programa pode representar código executável em uma linguagem de programação e um comentário em outra . Por exemplo, “
# include ...” em C é uma instrução de pré - processador , em muitas linguagens de script - por causa do caractere “#” no início da linha - uma linha de comentário. - Em algumas linguagens de programação (por exemplo, em C com uma instrução de pré-processador), você pode redefinir tokens ou redefinir os existentes e, assim, tornar um token válido em uma linguagem de programação estrangeira também válido em sua própria - possivelmente com um significado diferente.
Um exemplo simples
O exemplo a seguir é muito menos espetacular do que aquele referenciado nos links da web; foi especialmente elaborado com o objetivo de facilitar a compreensão, mesmo para o leigo. Ele faz uso das três primeiras técnicas mencionadas acima.
| Código fonte | Explicação |
|---|---|
|
|
O código-fonte ao lado é válido em C, Perl e muitos shells Unix (Bourne Shell, Korn Shell , Bash, C Shell, Z Shell). O programa produz o texto “ Olá, mundo! " Fora. |
|
|
C |
|
|
Shells Unix |
|
|
Perl |
Um exemplo mais complexo
O seguinte código-fonte é válido em C, PHP e Bash. Todos os métodos descritos acima são usados; em particular, a nova ou redefinição de cadeias de caracteres é necessária em vários casos para compatibilidade com C. Elas ocorrem nas #definelinhas que começam com " ", que são linhas de comentários para as duas linguagens de script.
#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 e Perl
Olá Mundo!
O seguinte programa pode através do intérprete Perl ou como um DOS - arquivo de lote para executar. (Explicações para cada linha à direita do texto fonte.)
| Código fonte | DOS | Pérola |
|---|---|---|
@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 |
Wrapper DOS para Perl
Um arquivo em lote do DOS para chamar um programa Perl pode ser criado de maneira semelhante: O arquivo em lote do DOS contém o código Perl e é executado (na linha 10) com o interpretador Perl. No entanto, é preciso algum esforço para coletar os argumentos da linha de comando e passá-los para 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 --------------------
|
Veja também
Outros exemplos de programas inúteis, mas educacionais:
- Programa Hello World - a saída de "Hello, World" em uma ampla variedade de linguagens de programação
- Quine - programas que geram seu próprio código-fonte
- Apenas outro hacker Perl - programas Perl criativos que geram "Apenas outro hacker Perl" de uma forma original
- Programas em linguagens de programação esotéricas
- Contribuições do programa para "Concursos Ofuscados" (por exemplo , Concurso Perl Ofuscado , Concurso Internacional de Código C Ofuscado )
Links da web
(Todas as fontes citadas aqui estão em inglês.)
- Um programa poliglota de 8 vezes (executável em Unix Shell , C , COBOL , Fortran , Pascal , Perl , PostScript e assembler x86 )
- Um programa poliglota de 7 dobras (executável em Bash , Befunge , C , Pascal, Perl, PostScript e TeX )
- Um programa poliglota de 6 vezes (executável em Brainfuck , Befunge , C, Perl, Unix Shell e Whitespace )
- Um programa poliglota de 4 vezes (executável em ANSI C , Perl, Tcl e Unix Shell)
- Uma compilação de 14 programas poliglotas