Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Quine, Polyglot, 良いコード
Search
Masaki Hara
November 06, 2024
Programming
4
540
Quine, Polyglot, 良いコード
QuineとPolyglotはプログラマの遊びと思われがちですが、保守性のある良いコードも一種のQuineでPolyglotであるという話を提案します。
※胡乱な話注意
Masaki Hara
November 06, 2024
Tweet
Share
More Decks by Masaki Hara
See All by Masaki Hara
Prolog入門
qnighy
4
1.2k
Rubyのobject_id
qnighy
6
1.5k
Getting along with YAML comments with Psych
qnighy
2
2.1k
状態設計から「なんとなく」を無くそう
qnighy
84
27k
日付時刻A to Z
qnighy
1
570
Hands-on Native ESM @ JSConf JP 2022
qnighy
0
5.6k
computed_modelの紹介 / Introducing computed_model (2)
qnighy
0
580
computed_modelの紹介 / Introducing computed_model
qnighy
0
350
Rust: imperative language 2.0
qnighy
10
2.5k
Other Decks in Programming
See All in Programming
Vue SFCのtemplateでTypeScriptの型を活用しよう
tsukkee
3
1.6k
Universal Linksの実装方法と陥りがちな罠
kaitokudou
1
240
Macとオーディオ再生 2024/11/02
yusukeito
0
270
飲食業界向けマルチプロダクトを実現させる開発体制とリアルな現状
hiroya0601
1
400
『ドメイン駆動設計をはじめよう』のモデリングアプローチ
masuda220
PRO
8
470
GCCのプラグインを作る / I Made a GCC Plugin
shouth
1
150
[PyCon Korea 2024 Keynote] 커뮤니티와 파이썬, 그리고 우리
beomi
0
120
Hotwire or React? ~Reactの録画機能をHotwireに置き換えて得られた知見~ / hotwire_or_react
harunatsujita
9
4.6k
外部システム連携先が10を超えるシステムでのアーキテクチャ設計・実装事例
kiwasaki
1
240
Dev ContainersとGitHub Codespacesの素敵な関係
ymd65536
1
130
Honoの来た道とこれから
yusukebe
19
3.1k
Boost Performance and Developer Productivity with Jakarta EE 11
ivargrimstad
0
1.1k
Featured
See All Featured
GitHub's CSS Performance
jonrohan
1030
460k
Java REST API Framework Comparison - PWX 2021
mraible
PRO
28
8k
StorybookのUI Testing Handbookを読んだ
zakiyama
26
5.2k
Bash Introduction
62gerente
608
210k
KATA
mclloyd
29
13k
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
27
800
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
280
13k
Typedesign – Prime Four
hannesfritz
39
2.4k
A designer walks into a library…
pauljervisheath
202
24k
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
27
1.9k
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
226
22k
Faster Mobile Websites
deanohume
304
30k
Transcript
© 2024 Wantedly, Inc. Quine, Polyglot, 良いコード 実務のための Nov. 7
2024 - Masaki Hara @ Wantedly Tech Lunch
© 2024 Wantedly, Inc. この発表について • Quine, Polyglotは多くの場合、実用的でないコードの代表 例として出てきます。 •
しかし、「良いコード」にもQuine, Polyglotと共通の性質があ るのではないかという話をします。 • 根拠の薄い話をします ◦ あくまで、考えるためのヒントくらいの位置づけで考えてください。
© 2024 Wantedly, Inc. Quine
© 2024 Wantedly, Inc. Quine Quine = 自分自身を出力するプログラム
© 2024 Wantedly, Inc. Quine Quine = 自分自身を出力するプログラム puts File.read(__FILE__)
?
© 2024 Wantedly, Inc. Quine Quine = 自分自身を出力するプログラム puts File.read(__FILE__)
× これは偽Quine ソースコードがどこかにあるという前提のものは禁止
© 2024 Wantedly, Inc. Quine Quine = 自分自身を出力するプログラム
© 2024 Wantedly, Inc. Quine Quine = 自分自身を出力するプログラム ".tap {
|s| puts s.inspect + s }" .tap { |s| puts s.inspect + s } 上はRubyの例だが、だいたいどんなプログ ラミング言語でもQuineは実装できる。 考えてみよう。
© 2024 Wantedly, Inc. Quine変種
© 2024 Wantedly, Inc. Quine変種 「自分自身をちょっと変更して出力するプログラム」も考えられる
© 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
© 2024 Wantedly, Inc. 自己書き換えコード 「自分自身をちょっと変更して出力するプログラム」 の偽バージョンもあえて考えてみる counter = 0
src = File.read(__FILE__).sub(/\d+/, "#{counter + 1}") File.write(__FILE__, src) puts counter このプログラムは、実行すると自分自身を書き換える。 つまり、ファイルを経由する 自己書き換えコード の一種と見なせる。
© 2024 Wantedly, Inc. Polyglot
© 2024 Wantedly, Inc. Polyglot Polyglot = 複数の言語で解釈可能なコード
© 2024 Wantedly, Inc. Polyglot Polyglot = 複数の言語で解釈可能なコード [] =begin
() ?? []; function begin() { console.log("This is JavaScript"); } /* =end puts "This is Ruby" # */
© 2024 Wantedly, Inc. Polyglot Polyglot = 複数の言語で解釈可能なコード [] =begin
() ?? []; function begin() { console.log("This is JavaScript"); } /* =end puts "This is Ruby" # */ Rubyではこっちが実行される JavaScriptではこっちが実行される
© 2024 Wantedly, Inc. Polyglot Polyglot作りの基本技: コメントを使う • 文法の差異を利用して、片方をコメント状態にする •
必要なコードを書いたら、状態を逆転させる • 最後に両方のコメント状態を終端させたら完成!
© 2024 Wantedly, Inc. 良いコード
© 2024 Wantedly, Inc. 入力とプログラム 突然ですがクイズです。 Q. 実行されているプログラムは ①〜③のうちどれ? $
ruby convert.rb image.png ① ② ③
© 2024 Wantedly, Inc. 入力とプログラム 2つの視点がある • “ruby” というプログラムが “convert.rb”
を入力として処理 している • “convert.rb” というプログラムが “image.png” を入力とし て処理している
© 2024 Wantedly, Inc. 「入力」と「プログラム」の 関係は、実はあいまい
© 2024 Wantedly, Inc. あなたとプログラム 「あなた」がプログラムを書き換えて改良するときの処理を考えて みる program = you(program)
© 2024 Wantedly, Inc. あなたとプログラム 「あなた」がプログラムを書き換えて改良するときの処理を考えて みる Q. 実行されているプログラムは ①〜②のうちどれ?
program = you(program) ① ②
© 2024 Wantedly, Inc. あなたとプログラム • 「あなた」に「プログラム」が入力されているのではなく、 • 「あなた」という処理系によって「プログラム」が実行されると考 えてみる
© 2024 Wantedly, Inc. 自己書き換え 「あなた」がプログラムを書き換えるとき、プログラムは自己書き換 えをしている program = program()
© 2024 Wantedly, Inc. Polyglot プログラムは常に2つの処理系によって実行される code.rb 出力 Rubyで実行 code.rb
「あなた」で実行 出力 Rubyで実行 code.rb 「あなた」で実行 出力 Rubyで実行
© 2024 Wantedly, Inc. Polyglot プログラムは常に2つの処理系によって実行される → 自己書き換えを成功させるには、Polyglotとしての性能を高 める必要がある
© 2024 Wantedly, Inc. 良いコードを書くために
© 2024 Wantedly, Inc. 良いコード 長期的によい動作をするコードは、「プログラムを改変しようとする プログラマー」による実行を想定したPolyglotな自己書き換えプ ログラムである。 よいコードは、「プログラマー」という処理系の特性を踏まえて書か れている必要がある。
© 2024 Wantedly, Inc. 注意力をコントロールする 「プログラマー」という言語処理系は以下の特徴を持つ • 状況に合わせて柔軟に考えることができる。 • 注意力の限界が厳しく、注意外のコードは認識できない。
→ この言語処理系のもとで正確な自己書き換えをするには、注 意力のコントロールが重要
© 2024 Wantedly, Inc. 注意力をコントロールする 注意力をコントロールするには、いくつかの方法がある • 関連して注意するべきコードを近くに配置する • 関連して注意するべきコードに遷移できるようにコメントやリン
クを配置する • CIによって注意を向ける (=注意力を向けさせるためにテスト を落とす)
© 2024 Wantedly, Inc. 注意力のその先 • 人は賢いので、注意力を向けさえすれば詳細に説明する必要 はない ◦ ということを述べたのが「ライト、ついてますか」という本の
1エピソード。 • ……とも言い切れない部分もある ◦ 結局、状況を理解できていなければ正確な推論はできない
© 2024 Wantedly, Inc. 環境をコントロールする 処理系そのものを改良する = よいプログラマーに書いてもらえる状態にする • 教育を充実させる
• いい人を採る • レビュー体制を強化する
© 2024 Wantedly, Inc. 注意点 • ここまでの説明は、あえてプログラムを主体、プログラマーを 客体としてとらえてみた • これは実験的な思考の道具にすぎないことに注意が必要
◦ 実際のプログラマーは感情を持った生きた人間である
© 2024 Wantedly, Inc. まとめ
© 2024 Wantedly, Inc. まとめ • Quine, Polyglot はプログラマーの古典的な遊びである。 •
しかし、見方を変えれば、保守性のある良いプログラムもある 種のPolyglotと見なせるのではないか。 ◦ この見方は、良いコードを書くための既存のプラクティスと整合性がありそう。