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 eval Anweisung 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