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
840
Quine, Polyglot, 良いコード
QuineとPolyglotはプログラマの遊びと思われがちですが、保守性のある良いコードも一種のQuineでPolyglotであるという話を提案します。
※胡乱な話注意
Masaki Hara
November 06, 2024
Tweet
Share
More Decks by Masaki Hara
See All by Masaki Hara
バックエンドのためのアプリ内課金入門 (サブスク編)
qnighy
9
2.3k
Dockerfileの考え方
qnighy
50
19k
Arm移行タイムアタック
qnighy
1
650
Prolog入門
qnighy
5
2.5k
Rubyのobject_id
qnighy
7
1.8k
Getting along with YAML comments with Psych
qnighy
2
2.9k
状態設計から「なんとなく」を無くそう
qnighy
89
29k
日付時刻A to Z
qnighy
3
910
Hands-on Native ESM @ JSConf JP 2022
qnighy
0
6.1k
Other Decks in Programming
See All in Programming
AI & Enginnering
codelynx
0
110
CSC307 Lecture 01
javiergs
PRO
0
690
2026年 エンジニアリング自己学習法
yumechi
0
130
dchart: charts from deck markup
ajstarks
3
990
IFSによる形状設計/デモシーンの魅力 @ 慶應大学SFC
gam0022
1
300
LLM Observabilityによる 対話型音声AIアプリケーションの安定運用
gekko0114
2
430
フロントエンド開発の勘所 -複数事業を経験して見えた判断軸の違い-
heimusu
7
2.8k
Package Management Learnings from Homebrew
mikemcquaid
0
210
余白を設計しフロントエンド開発を 加速させる
tsukuha
7
2.1k
AI Schema Enrichment for your Oracle AI Database
thatjeffsmith
0
260
そのAIレビュー、レビューしてますか? / Are you reviewing those AI reviews?
rkaga
6
4.5k
なぜSQLはAIぽく見えるのか/why does SQL look AI like
florets1
0
450
Featured
See All Featured
Code Reviewing Like a Champion
maltzj
527
40k
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
10
1.1k
jQuery: Nuts, Bolts and Bling
dougneiner
65
8.4k
sira's awesome portfolio website redesign presentation
elsirapls
0
150
HU Berlin: Industrial-Strength Natural Language Processing with spaCy and Prodigy
inesmontani
PRO
0
200
Building Better People: How to give real-time feedback that sticks.
wjessup
370
20k
Bioeconomy Workshop: Dr. Julius Ecuru, Opportunities for a Bioeconomy in West Africa
akademiya2063
PRO
1
54
Building a Scalable Design System with Sketch
lauravandoore
463
34k
Reality Check: Gamification 10 Years Later
codingconduct
0
2k
The Straight Up "How To Draw Better" Workshop
denniskardys
239
140k
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
PRO
196
71k
職位にかかわらず全員がリーダーシップを発揮するチーム作り / Building a team where everyone can demonstrate leadership regardless of position
madoxten
57
50k
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と見なせるのではないか。 ◦ この見方は、良いコードを書くための既存のプラクティスと整合性がありそう。