クワイン一覧!10言語で書けるコード付き【プログラミング】

クワインとは、プログラミングにおいて自分自身を出力するコードのことです。ここでは、各言語でのクワインを10言語、一覧で表記していきます。

また、すぐに実行する方法も解説していきます。

\当サイトではリンク広告を利用しています。/

クワインとは?

クワイン(Quine)とは、自分自身のソースコードを出力するプログラムのことです。

つまり、実行すると自分のプログラムそのものが表示される、ちょっと不思議で面白いコードです。

コーディングの技術を使った遊びの一つでもあります。

プログラミング言語の仕組みや文字列処理の理解にも役立ちます。

クワインの試し方

クワインは各言語の開発環境がなくても、ブラウザだけですぐに試すことができます。

paiza.ioなど、ブラウザ上で様々なコーディングができるツールで実行して試すことができます。

やり方は、各言語のコードをそのまま貼り付けて、実行ボタンを押すだけです。
ブラウザ上で動かせるので、すぐに確認可能です。

上図はPythonのクワインを実行してみた実例です。ソースコードがそのまま出力されているのがわかります。


各言語でのクワイン

ここでは代表的な5言語に加えて、様々な言語でのクワイン例を紹介します。
基本的な構造は、文字列を変数に入れ、それを呼び出すことで自己出力を実現しています。


1. C言語

#include <stdio.h>
char *s = "#include <stdio.h>%cchar *s=%c%s%c;%cint main(){printf(s,10,34,s,34,10);return 0;}";
int main() {
    printf(s,10,34,s,34,10);
    return 0;
}

解説

  • s に自分のコードを文字列として格納
  • printf%s として表示
  • 特殊文字(改行 10、ダブルクオート 34)を使って構文を維持

2. Python

s='s=%r\nprint(s%%s)'
print(s%s)

解説

  • %r を使って文字列をエスケープ付きで出力
  • s % s で文字列自身を出力

3. Java

public class Quine {
    public static void main(String[] args) {
        String s = "public class Quine {%n    public static void main(String[] args) {%n        String s = %c%s%c;%n        System.out.printf(s,10,34,s,34);%n    }%n}";
        System.out.printf(s,10,34,s,34);
    }
}

解説

  • System.out.printf で書式付き出力
  • 改行 %n とダブルクオート %c を組み合わせて文字列を出力

4. HTML + JavaScript

<!DOCTYPE html>
<html>
<body>
<script>
var s = '<script>var s=%s;document.write(s.replace(/%s/,JSON.stringify(s)))<\/script>';
document.write(s.replace(/%s/,JSON.stringify(s)))
</script>
</body>
</html>

解説

  • JavaScript の文字列にソースコードを格納
  • JSON.stringify で特殊文字をエスケープ
  • document.write でHTML上に表示

5. Ruby

s='s=%p;puts s%%s';puts s%s

解説

  • %p でエスケープ済み文字列を出力
  • s % s で自分自身を表示

6. JavaScript(Node.js向け)

s="s=%o;console.log(s,s)";console.log(s,s)

解説

  • %o でオブジェクト(文字列)を出力
  • console.log(s,s) で自己出力

7. PHP

<?php
$s='<?php $s=%s; printf($s, var_export($s,true)); ?>';
printf($s, var_export($s,true));
?>

解説

  • var_export で文字列をエスケープして表示
  • printf で自己出力

8. Perl

$_='$_=%q|%s|;printf $_,$_';printf $_,$_

解説

  • %q|…| で文字列リテラル化
  • printf で文字列自身を出力

9. Go

package main
import "fmt"
func main() {
    s:="package main\nimport \"fmt\"\nfunc main() {\n\ts:=%q\n\tfmt.Printf(s,s)\n}"
    fmt.Printf(s,s)
}

解説

  • %q でGo用文字列としてエスケープ
  • fmt.Printf で出力

10. Swift

let s = "let s = %c%@%c\nprint(String(format: s, 34, s, 34))"
print(String(format: s, 34, s, 34))

解説

  • %@ で文字列を挿入
  • 34 はダブルクオートの ASCII コード
  • String(format:) で自己出力

クワインの仕組み

ほとんどの言語で、基本構造は次の通りです:

  1. 文字列にソースコードを格納
  2. その文字列を出力
  3. 必要に応じて 文字列の中に文字列を入れる(エスケープ処理)

これにより、実行すると自分のコードそのものが表示されるという現象が起こります。


まとめ

  • クワインは「自己出力プログラム」で、どの言語でも作ることが可能
  • 基本は文字列を扱うテクニックがポイント
  • 学習や遊びとして、複数言語で書き比べると理解が深まる

ぜひ、上記の10言語の例を実際に試して、自分のクワインを作ってみましょう!
プログラミングの奥深さを感じられる楽しいチャレンジです。

haccle