Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
Quine, Polyglot, 良いコード
Search
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
Masaki Hara
November 06, 2024
Programming
930
5
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Quine, Polyglot, 良いコード
QuineとPolyglotはプログラマの遊びと思われがちですが、保守性のある良いコードも一種のQuineでPolyglotであるという話を提案します。
※胡乱な話注意
Masaki Hara
November 06, 2024
More Decks by Masaki Hara
See All by Masaki Hara
文字コードの話
qnighy
47
21k
バックエンドのためのアプリ内課金入門 (サブスク編)
qnighy
9
2.6k
Dockerfileの考え方
qnighy
50
20k
Arm移行タイムアタック
qnighy
1
760
Prolog入門
qnighy
5
3.1k
Rubyのobject_id
qnighy
8
1.9k
Getting along with YAML comments with Psych
qnighy
2
3.2k
状態設計から「なんとなく」を無くそう
qnighy
90
30k
日付時刻A to Z
qnighy
3
1.1k
Other Decks in Programming
See All in Programming
テストを司るデーモンに会いに行く 〜隔離した仮想マシンでテストを通すまで〜
h1d3mun3
1
620
難しいけど、読めた。- OSSの入口に立った話。
sts11142
0
140
Starting & Sustaining Code-Based E2E Testing for Non-Coding QA Teams( #jasstniigata )
teyamagu
PRO
1
900
半永久的に提供し続けられるプライベートクラウドを目指して ― 利用者の認知負荷を抑えるAPI抽象化とハードウェア世代交代の基盤設計
tomokon
0
440
マイコン向けの軽量Ruby「PicoRuby」で各種デバイスを制御するネイティブアプリの実現手法
bash0c7
0
470
Heart of Swift Concurrency
koher
0
1.2k
なぜCTOを降りてFDEを選んだのか?〜なぜプロダクト企業がFDEで顧客の現場に踏み込むのか〜
gonta
1
150
When benchmarks go bad - what I learned from measuring performance wrong
hollycummins
0
130
AWSに止められる覚悟してますか?
morizo_1984
2
510
iOSDC2026登壇資料.pdf
riofujimon
0
210
速習iPhone Duo対応
yuukiw00w
2
960
Security issues being discussed on Web Platforms
petamoriken
0
1.4k
Featured
See All Featured
Future Trends and Review - Lecture 12 - Web Technologies (1019888BNR)
signer
PRO
0
3.8k
Self-Hosted WebAssembly Runtime for Runtime-Neutral Checkpoint/Restore in Edge–Cloud Continuum
chikuwait
0
860
How Fast Is Fast Enough? [PerfNow 2025]
tammyeverts
3
920
Building a Modern Day E-commerce SEO Strategy
aleyda
45
9.2k
Learning to Love Humans: Emotional Interface Design
aarron
275
41k
Are puppies a ranking factor?
jonoalderson
2
4k
Why You Should Never Use an ORM
jnunemaker
PRO
61
10k
Speed Design
sergeychernyshev
33
2.1k
Winning Ecommerce Organic Search in an AI Era - #searchnstuff2025
aleyda
2
2.2k
The Curse of the Amulet
leimatthew05
3
15k
Build your cross-platform service in a week with App Engine
jlugia
234
19k
Why Our Code Smells
bkeepers
PRO
340
58k
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と見なせるのではないか。 ◦ この見方は、良いコードを書くための既存のプラクティスと整合性がありそう。