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
5
760
Quine, Polyglot, 良いコード
QuineとPolyglotはプログラマの遊びと思われがちですが、保守性のある良いコードも一種のQuineでPolyglotであるという話を提案します。
※胡乱な話注意
Masaki Hara
November 06, 2024
Tweet
Share
More Decks by Masaki Hara
See All by Masaki Hara
バックエンドのためのアプリ内課金入門 (サブスク編)
qnighy
8
1.9k
Dockerfileの考え方
qnighy
45
18k
Arm移行タイムアタック
qnighy
1
540
Prolog入門
qnighy
5
1.6k
Rubyのobject_id
qnighy
6
1.6k
Getting along with YAML comments with Psych
qnighy
2
2.4k
状態設計から「なんとなく」を無くそう
qnighy
85
28k
日付時刻A to Z
qnighy
1
680
Hands-on Native ESM @ JSConf JP 2022
qnighy
0
5.9k
Other Decks in Programming
See All in Programming
複数ドメインに散らばってしまった画像…! 運用中のPHPアプリに後からCDNを導入する…!
suguruooki
0
410
PHPでお金を扱う時、終わりのない 謎の1円調査の旅にでなくて済む方法
nakka
3
960
Gunma.web #55
tinykitten
0
130
小さく段階的リリースすることで深夜メンテを回避する
mkmk884
2
120
Functional APIから再考するLangGraphを使う理由
os1ma
4
640
「その気にさせる」エンジニアが 最強のリーダーになる理由
gimupop
3
470
ニックトレイン登壇資料
ryotakurokawa
0
130
Preact、HooksとSignalsの両立 / Preact: Harmonizing Hooks and Signals
ssssota
1
190
生産性アップのためのAI個人活用
kunoyasu
0
470
もう一人で悩まない! 個の知見をチームの知見にする3つの習慣と工夫 / Into team knowledge.
honyanya
3
520
OpenTelemetryを活用したObservability入門 / Introduction to Observability with OpenTelemetry
seike460
PRO
0
200
Going Structural with Named Tuples
bishabosha
0
150
Featured
See All Featured
Faster Mobile Websites
deanohume
306
31k
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
32
2.2k
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
33
2.1k
A better future with KSS
kneath
238
17k
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
227
22k
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
30
1.1k
Designing for humans not robots
tammielis
250
25k
Product Roadmaps are Hard
iamctodd
PRO
52
11k
The Cost Of JavaScript in 2023
addyosmani
48
7.6k
Evolution of real-time – Irina Nazarova, EuRuKo, 2024
irinanazarova
7
610
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
331
21k
Navigating Team Friction
lara
183
15k
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と見なせるのではないか。 ◦ この見方は、良いコードを書くための既存のプラクティスと整合性がありそう。