Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Quine, Polyglot, 良いコード

Masaki Hara
November 06, 2024

Quine, Polyglot, 良いコード

QuineとPolyglotはプログラマの遊びと思われがちですが、保守性のある良いコードも一種のQuineでPolyglotであるという話を提案します。

※胡乱な話注意

Masaki Hara

November 06, 2024
Tweet

More Decks by Masaki Hara

Other Decks in Programming

Transcript

  1. © 2024 Wantedly, Inc. この発表について • Quine, Polyglotは多くの場合、実用的でないコードの代表 例として出てきます。 •

    しかし、「良いコード」にもQuine, Polyglotと共通の性質があ るのではないかという話をします。 • 根拠の薄い話をします ◦ あくまで、考えるためのヒントくらいの位置づけで考えてください。
  2. © 2024 Wantedly, Inc. Quine Quine = 自分自身を出力するプログラム puts File.read(__FILE__)

    × これは偽Quine ソースコードがどこかにあるという前提のものは禁止
  3. © 2024 Wantedly, Inc. Quine Quine = 自分自身を出力するプログラム ".tap {

    |s| puts s.inspect + s }" .tap { |s| puts s.inspect + s } 上はRubyの例だが、だいたいどんなプログ ラミング言語でもQuineは実装できる。 考えてみよう。
  4. © 2024 Wantedly, Inc. Quine変種 「自分自身をちょっと変更して出力するプログラム」も考えられる counter = 0 code

    = "counter = %d\ncode = %s\n printf code, counter + 1, code.inspect\n" printf code, counter + 1, code.inspect
  5. © 2024 Wantedly, Inc. 自己書き換えコード 「自分自身をちょっと変更して出力するプログラム」 の偽バージョンもあえて考えてみる counter = 0

    src = File.read(__FILE__).sub(/\d+/, "#{counter + 1}") File.write(__FILE__, src) puts counter このプログラムは、実行すると自分自身を書き換える。 つまり、ファイルを経由する 自己書き換えコード の一種と見なせる。
  6. © 2024 Wantedly, Inc. Polyglot Polyglot = 複数の言語で解釈可能なコード [] =begin

    () ?? []; function begin() { console.log("This is JavaScript"); } /* =end puts "This is Ruby" # */
  7. © 2024 Wantedly, Inc. Polyglot Polyglot = 複数の言語で解釈可能なコード [] =begin

    () ?? []; function begin() { console.log("This is JavaScript"); } /* =end puts "This is Ruby" # */ Rubyではこっちが実行される JavaScriptではこっちが実行される
  8. © 2024 Wantedly, Inc. Polyglot Polyglot作りの基本技: コメントを使う • 文法の差異を利用して、片方をコメント状態にする •

    必要なコードを書いたら、状態を逆転させる • 最後に両方のコメント状態を終端させたら完成!
  9. © 2024 Wantedly, Inc. 入力とプログラム 2つの視点がある • “ruby” というプログラムが “convert.rb”

    を入力として処理 している • “convert.rb” というプログラムが “image.png” を入力とし て処理している
  10. © 2024 Wantedly, Inc. Polyglot プログラムは常に2つの処理系によって実行される code.rb 出力 Rubyで実行 code.rb

    「あなた」で実行 出力 Rubyで実行 code.rb 「あなた」で実行 出力 Rubyで実行
  11. © 2024 Wantedly, Inc. 注意力のその先 • 人は賢いので、注意力を向けさえすれば詳細に説明する必要 はない ◦ ということを述べたのが「ライト、ついてますか」という本の

    1エピソード。 • ……とも言い切れない部分もある ◦ 結局、状況を理解できていなければ正確な推論はできない
  12. © 2024 Wantedly, Inc. まとめ • Quine, Polyglot はプログラマーの古典的な遊びである。 •

    しかし、見方を変えれば、保守性のある良いプログラムもある 種のPolyglotと見なせるのではないか。 ◦ この見方は、良いコードを書くための既存のプラクティスと整合性がありそう。