Link
Embed
Share
Beginning
This slide
Copy link URL
Copy link URL
Copy iframe embed code
Copy iframe embed code
Copy javascript embed code
Copy javascript embed code
Share
Tweet
Share
Tweet
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と見なせるのではないか。 ○ この見方は、良いコードを書くための既存のプラクティスと整合性がありそう。