Polyglottes Programm



Ein Polyglott-Programm ( polyglott = mehrsprachig) ist ein Computerprogramm , lesen Quelltext in mehr als einer Programmiersprache vollständig ist; d. h., es kann vom jeweiligen Dolmetscher bzw. Compiler jeder der dafür vorgesehenen Sprachen fehlerfrei ausgeführt. übersetzt wurden. In der Regel Erzeugt es bei der Ausführung in der Verschiedenen Sprachen Jeweils Samt Ausgabe . Ein Solo-Programm hat keinen Nutzen für die Allgemeinheit, aber es ist keine gute Idee für den Programmierer .

Funktionales Schweißen

Während es nahezu Unmöglich sein dürftig, EIN natürlichsprachigen Polyglot Text zu formulieren, ist sterben Erstellung Polyglot Programm less Schwierig Eines, als es zunächst den Anschein Hass. Bei der Entwicklung Polyglot Programm macht man sich sterben following Tatsachen BZW. Methoden zunutze:

  • Teile des Codes können in mehreren Programmiersprachen vollständig sein, z. B. printf ("...")in Perl als auch in C eine textuelle Ausgabe.
  • Man Kann Durch Sprungbefehle sterben in der Sprache jeweilige ungültigen Teile des Quelltextes über Hahn oder sterben Programmausführung mit exit„Rechtzeitig“ Vor dem Auftauchen ungültigen Codes Termini Gelegenheit.
  • Eine Programmzeile Kann in der EINEN Programmiersprache ausführbaren Code in der Ande EINEN Kommentar Schauspieler. Beispielsweise ist “ # include ...“ in C Eine Präprozessoranweisung , in vielen Skriptsprachen – wegen des Zeichen “ #“ am Zeilenanfang – eine Kommentarzeile.
  • (. Z B. in in Manchen Programmiersprachen C mit Einer Präprozessoranweisung) Kann man Tokens neu Definiert oder vorhanden redefinieren und DAMIT ein in Einem Fremden Programmiersprache gelbe Token in der Auch Eigenen – u . U. in Einer Anderen bedeutung – Gelb werden lassen.

Ein einmaliges Beispiel

Das folgende Beispiel ist spektakulärer als die in den Weblinks genannten; Es wurde speziell mit dem Ziel der Verständlichkeit auch für die Laien entworfen. Die Kraft des Letzten ist das Genie des Techniken Gebrauchs.

quelltext Erläuterungen
# include <stdio.h> /*
eval "echo 'Hello, world!'; exit";
sub echo { print "@_\n" }; __END__ */
main() { printf ("Hello, world!\n"); }
Der nibenstehende Quelltext ist in C, Perl und Unix-Shells (Bourne Shell, Cerealien Shell , Bash, C-Shell, Z-Shell) erhältlich. Dein Programm gibt den Text “ Hallo Welt! „Aus.
# include <stdio.h> /*
eval "echo 'Hello, world!'; exit";
sub echo { print "@_\n" }; __END__ */
main() { printf ("Hello, world!\n"); }
C
Der von /*und */geschlossene Text ist in C Comment und wird ignoriert. Der Rest is a Variante des Hallo- Welt-Programm in C .
# include <stdio.h> /*
eval "echo 'Hello, world!'; exit";
sub echo { print "@_\n" }; __END__ */
main() { printf ("Hello, world!\n"); }
Unix-Shells Die
Erste Zeile (grün) ist ein Kommentar und wird nicht ignoriert. Wenn die evalAnweisung ausgeführt wurde, terminierte das Programm weigeren exit; der Rest wird vom Dolmetscher nicht mehr übersetzt. Syntax geprüft.
# include <stdio.h> /*
eval "echo 'Hello, world!'; exit";
sub echo { print "@_\n" }; __END__ */
main() { printf ("Hello, world!\n"); }
Perl
De erste Zeile ist Kommentar. Die eval-Anweisung wird erst ausgeführt, nachfolgend in Zeile 3, welche das Unterprogrammecho festlegte. There auf the Schlüsselwort__END__ following Rest (wird) vom Perl-Interpreter, aber ignoriert.

Ein Komplexe Beispiel

Der folgende Quelltext ist in C, PHP und Bash verfügbar . Sie wurden alle beschrieben, es wurden Methoden gefunden, soweit die Kompatibilität mit C in Fällen der Neudefinition von Zeichenfolgen erforderlich ist. Dies sind die “ #define“ Anfänger Segeln, beide Skripte. Kommentare Segeln.

#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; dann
gebe 0 zurück;
// 2> / dev / null; fi
# define e?>
#define b * /
#include <stdio.h>
#define main () int main ()
# define printf printf (
#define true)
#define Funktion
Funktion main ()
{
printf „Hallo, Welt! \ n "wahr / * 2> / dev / null | grep -v wahr * /;
zurückgeben 0;
}
#define c / *
main
# * /

MS-DOS und Perl

Hallo, Welt!

Ihr folgendes Programm kann der Perl Interpreter oder DOS – Batchdatei ausgeführt sein. (Erklärungen zu jeder Zeile rechts neben dem Quelltext.)

quelltext DOS Perl
@rem = '
@echo Hallo, Welt!
@goto END
';
Drucksubstr "@rem", 7, 13;
__END__
: ENDE
Kommentar
Ausgabe
Sprung ans Ende
Wird übersprungen
Wird übersprungen
Wird übersprungen
End - Code
Definition von Arrays @rem
Inhalt des Arrays @rem
Inhalt des Arrays @rem
Ende der Definition von @rem
Ausgabe Teestring aus @rem
Ende Code
wird ignoriert

DOS-Wrapper für Perl

In ähnlicher Weise wurde das DOS-Batch-Date für den Aufruf eines Perl-Programms ersetzt: Die DOS-Batchdatei enthält Perl-Code und führt sich selbst (in Zeile 10) mit dem Perl-Interpreter aus. Hier sind alle das Beste von allem, die Commanding Sails -Argumente einzusammeln und Perl zu übergeben:

@rem = ‚---------- DOS BEGIN ------------------
 @ echo off
 set PROG =% 0.bat
 : ARG LOOP
 if„% 1 "==" „goto EXEC
 gesetzt ARGS =% ARGS %% 1
 Verschiebung
 goto ARG LOOP
 : EXEC
 perl% PROG %% ARGS%
 goto END
‚;
# ================ BEGIN PERL ==================
print "Perl hiermit diese Argumente: @ARGV \ n" ;
__END__ # ========= END PERL ===================
: END
gesetzt PROG =
Satz ARGS =
:: -------- -------- END DOS --------------------

Siehe auch

Weitere Beispiele für nuzlose, aber lehrreiche

  • Hello-Welt Programm – Die Ausgabe von „Hallo, Welt“ in der unterschiedlichsten Programmierung
  • Quine – Programm, das Quelltext enthält
  • Nur ein weiterer Perl-Hacker – kreative Perl-Programme, die im Initiator Weise „Nur ein weiterer Perl-Hacker“ ausgibt
  • Programme in der esoterischen Programmierung
  • Programmwettbewerb für verschleierte Wettbewerbe ( Obfuscated Perl Contest , International Obfuscated C Code Contest )

Weblinks

(Alle hier Engel Quellen Gedanken in englischer Sprache.)

  • Ein 8-fach Polyglottes Programm (Ausführbar in Unix-Shell , C , COBOL , Fortran , Pascal , Perl , PostScript und x86 Assembler )
  • Ein 7-fach Polyglottes Programm (Ausführbar in Bash , Befunge , C , Pascal, Perl, PostScript und TeX )
  • Ein 6-fach Polyglottes Programm (Darstellbar in Brainfuck , Befunge , C, Perl, Unix-Shell und Whitespace )
  • Ein 4-fach Polyglottes Programm (in ANSI C , Perl, Tcl und Unix-Shell ausführbar )
  • Eine Zusammenstellung mit 14 Polyglotten Programmen