Slide 1

Slide 1 text

© 2024 Wantedly, Inc. Quine, Polyglot,      良いコード 実務のための Nov. 7 2024 - Masaki Hara @ Wantedly Tech Lunch

Slide 2

Slide 2 text

© 2024 Wantedly, Inc. この発表について ● Quine, Polyglotは多くの場合、実用的でないコードの代表 例として出てきます。 ● しかし、「良いコード」にもQuine, Polyglotと共通の性質があ るのではないかという話をします。 ● 根拠の薄い話をします ○ あくまで、考えるためのヒントくらいの位置づけで考えてください。

Slide 3

Slide 3 text

© 2024 Wantedly, Inc. Quine

Slide 4

Slide 4 text

© 2024 Wantedly, Inc. Quine Quine = 自分自身を出力するプログラム

Slide 5

Slide 5 text

© 2024 Wantedly, Inc. Quine Quine = 自分自身を出力するプログラム puts File.read(__FILE__) ?

Slide 6

Slide 6 text

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

Slide 7

Slide 7 text

© 2024 Wantedly, Inc. Quine Quine = 自分自身を出力するプログラム

Slide 8

Slide 8 text

© 2024 Wantedly, Inc. Quine Quine = 自分自身を出力するプログラム ".tap { |s| puts s.inspect + s }" .tap { |s| puts s.inspect + s } 上はRubyの例だが、だいたいどんなプログ ラミング言語でもQuineは実装できる。 考えてみよう。

Slide 9

Slide 9 text

© 2024 Wantedly, Inc. Quine変種

Slide 10

Slide 10 text

© 2024 Wantedly, Inc. Quine変種 「自分自身をちょっと変更して出力するプログラム」も考えられる

Slide 11

Slide 11 text

© 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

Slide 12

Slide 12 text

© 2024 Wantedly, Inc. 自己書き換えコード 「自分自身をちょっと変更して出力するプログラム」 の偽バージョンもあえて考えてみる counter = 0 src = File.read(__FILE__).sub(/\d+/, "#{counter + 1}") File.write(__FILE__, src) puts counter このプログラムは、実行すると自分自身を書き換える。 つまり、ファイルを経由する 自己書き換えコード の一種と見なせる。

Slide 13

Slide 13 text

© 2024 Wantedly, Inc. Polyglot

Slide 14

Slide 14 text

© 2024 Wantedly, Inc. Polyglot Polyglot = 複数の言語で解釈可能なコード

Slide 15

Slide 15 text

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

Slide 16

Slide 16 text

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

Slide 17

Slide 17 text

© 2024 Wantedly, Inc. Polyglot Polyglot作りの基本技: コメントを使う ● 文法の差異を利用して、片方をコメント状態にする ● 必要なコードを書いたら、状態を逆転させる ● 最後に両方のコメント状態を終端させたら完成!

Slide 18

Slide 18 text

© 2024 Wantedly, Inc. 良いコード

Slide 19

Slide 19 text

© 2024 Wantedly, Inc. 入力とプログラム 突然ですがクイズです。 Q. 実行されているプログラムは ①〜③のうちどれ? $ ruby convert.rb image.png ① ② ③

Slide 20

Slide 20 text

© 2024 Wantedly, Inc. 入力とプログラム 2つの視点がある ● “ruby” というプログラムが “convert.rb” を入力として処理 している ● “convert.rb” というプログラムが “image.png” を入力とし て処理している

Slide 21

Slide 21 text

© 2024 Wantedly, Inc. 「入力」と「プログラム」の 関係は、実はあいまい

Slide 22

Slide 22 text

© 2024 Wantedly, Inc. あなたとプログラム 「あなた」がプログラムを書き換えて改良するときの処理を考えて みる program = you(program)

Slide 23

Slide 23 text

© 2024 Wantedly, Inc. あなたとプログラム 「あなた」がプログラムを書き換えて改良するときの処理を考えて みる Q. 実行されているプログラムは ①〜②のうちどれ? program = you(program) ① ②

Slide 24

Slide 24 text

© 2024 Wantedly, Inc. あなたとプログラム ● 「あなた」に「プログラム」が入力されているのではなく、 ● 「あなた」という処理系によって「プログラム」が実行されると考 えてみる

Slide 25

Slide 25 text

© 2024 Wantedly, Inc. 自己書き換え 「あなた」がプログラムを書き換えるとき、プログラムは自己書き換 えをしている program = program()

Slide 26

Slide 26 text

© 2024 Wantedly, Inc. Polyglot プログラムは常に2つの処理系によって実行される code.rb 出力 Rubyで実行 code.rb 「あなた」で実行 出力 Rubyで実行 code.rb 「あなた」で実行 出力 Rubyで実行

Slide 27

Slide 27 text

© 2024 Wantedly, Inc. Polyglot プログラムは常に2つの処理系によって実行される → 自己書き換えを成功させるには、Polyglotとしての性能を高 める必要がある

Slide 28

Slide 28 text

© 2024 Wantedly, Inc. 良いコードを書くために

Slide 29

Slide 29 text

© 2024 Wantedly, Inc. 良いコード 長期的によい動作をするコードは、「プログラムを改変しようとする プログラマー」による実行を想定したPolyglotな自己書き換えプ ログラムである。 よいコードは、「プログラマー」という処理系の特性を踏まえて書か れている必要がある。

Slide 30

Slide 30 text

© 2024 Wantedly, Inc. 注意力をコントロールする 「プログラマー」という言語処理系は以下の特徴を持つ ● 状況に合わせて柔軟に考えることができる。 ● 注意力の限界が厳しく、注意外のコードは認識できない。 → この言語処理系のもとで正確な自己書き換えをするには、注 意力のコントロールが重要

Slide 31

Slide 31 text

© 2024 Wantedly, Inc. 注意力をコントロールする 注意力をコントロールするには、いくつかの方法がある ● 関連して注意するべきコードを近くに配置する ● 関連して注意するべきコードに遷移できるようにコメントやリン クを配置する ● CIによって注意を向ける (=注意力を向けさせるためにテスト を落とす)

Slide 32

Slide 32 text

© 2024 Wantedly, Inc. 注意力のその先 ● 人は賢いので、注意力を向けさえすれば詳細に説明する必要 はない ○ ということを述べたのが「ライト、ついてますか」という本の 1エピソード。 ● ……とも言い切れない部分もある ○ 結局、状況を理解できていなければ正確な推論はできない

Slide 33

Slide 33 text

© 2024 Wantedly, Inc. 環境をコントロールする 処理系そのものを改良する = よいプログラマーに書いてもらえる状態にする ● 教育を充実させる ● いい人を採る ● レビュー体制を強化する

Slide 34

Slide 34 text

© 2024 Wantedly, Inc. 注意点 ● ここまでの説明は、あえてプログラムを主体、プログラマーを 客体としてとらえてみた ● これは実験的な思考の道具にすぎないことに注意が必要 ○ 実際のプログラマーは感情を持った生きた人間である

Slide 35

Slide 35 text

© 2024 Wantedly, Inc. まとめ

Slide 36

Slide 36 text

© 2024 Wantedly, Inc. まとめ ● Quine, Polyglot はプログラマーの古典的な遊びである。 ● しかし、見方を変えれば、保守性のある良いプログラムもある 種のPolyglotと見なせるのではないか。 ○ この見方は、良いコードを書くための既存のプラクティスと整合性がありそう。