polyglotとは、複数のプログラミング言語として解釈可能なコンピュータープログラムまたはスクリプトであり、コンパイルまたは解釈に使用されるプログラミング言語とは関係なく、同じ操作または出力をするもののことである。
一般に、polyglotは、C(プリプロセッサを使用した字句トークンの再定義を可能にする)とLisp 、 Perl 、 shなどのスクリプト言語の組み合わせで作られる。
メソッド ポリグロットプログラムを構築するために最も一般的に使用される2つの手法は、コメントに異なる文字を使用する言語を組み合わせることと、さまざまなトークンを異なる言語の他のトークンとして再定義することである。多くの場合、構文の特徴がうまく利用することができる。以下、 ANSI C 、 PHP 、およびbashで記述されたポリグロットプログラムを示す。
#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(void) #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 #*/
ハッシュ記号はCのプリプロセッサステートメントを示すが、bashとPHPではコメントである。 「//」は、PHPとCの両方のコメントであり、bashのルートディレクトリである。 シェルリダイレクトは、望ましくない出力を排除するために使用される。 コメントアウトされた行でも、PHPインジケーターは効果がある。 ステートメント" function main() "は、PHPとbashの両方で有効であり、Cでは#definesは、コンパイル時に「 int main(void) 」に変換している。 コメントインジケータを組み合わせて、さまざまな操作を実行できる。 " if (($x)) "は、bashとPHPの両方で有効なステートメントである。 printfはbashシェルビルトインであり、ブラケットが省略されていることを除いてC printfと同じである(これがCコンパイラでコンパイルされている場合はCプリプロセッサが追加する)。 最後の3行は、main関数を呼び出すためにbashによってのみ使用される。 PHPでは、 main関数は定義されるが呼び出されず、Cでは、 main関数を明示的に呼び出す必要はない。
あまり一般的ではない言語では簡単に作ることもできる。これは、 SNOBOL 4、 Win32Forth 、 PureBasicv 4.x、およびREBOLで同時に記述された小さなサンプルである。 *BUFFER : A.A ; .( Hello, world !) @ To Including? Macro SkipThis; OUTPUT = Char(10) "Hello, World !" ;OneKeyInput Input('Char', 1, '[-f2-q1]') ; Char End; SNOBOL4 + PureBASIC + Win32Forth + REBOL = <3 EndMacro: OpenConsole() : PrintN("Hello, world !") Repeat : Until Inkey() : Macro SomeDummyMacroHere REBOL [ Title: "'Hello, World !' in 4 languages" CopyLeft: "Developed in 2010 by Society" ] Print "Hello, world !" EndMacro: func [][] set-modes system/ports/input [binary: true] Input set-modes system/ports/input [binary: false] NOP:: EndMacro ; Wishing to refine it with new language ? Go on !
関連項目 クワイン (プログラミング)
参考文献
外部リンク 345の異なる言語のポリグロット 16の異なる言語のポリグロット 8つの異なる言語のポリグロット( COBOL 、 Pascal 、 Fortran 、 C 、 PostScript 、 Unixシェル、 Intel x86機械語、 Perl 5で記述) 7つの異なる言語のポリグロット( C 、 Pascal 、 PostScript 、 TeX 、 Bash 、 Perl 、 Befunge98で記述) 6つの異なる言語のポリグロット( Perl 、 C 、 Unixシェル、 Brainfuck 、 Whitespace 、 Befungeで記述) 一般的なポリグロットのリスト