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
710
Quine, Polyglot, 良いコード
QuineとPolyglotはプログラマの遊びと思われがちですが、保守性のある良いコードも一種のQuineでPolyglotであるという話を提案します。
※胡乱な話注意
Masaki Hara
November 06, 2024
Tweet
Share
More Decks by Masaki Hara
See All by Masaki Hara
Arm移行タイムアタック
qnighy
1
450
Prolog入門
qnighy
5
1.5k
Rubyのobject_id
qnighy
6
1.5k
Getting along with YAML comments with Psych
qnighy
2
2.3k
状態設計から「なんとなく」を無くそう
qnighy
85
28k
日付時刻A to Z
qnighy
1
610
Hands-on Native ESM @ JSConf JP 2022
qnighy
0
5.8k
computed_modelの紹介 / Introducing computed_model (2)
qnighy
0
610
computed_modelの紹介 / Introducing computed_model
qnighy
0
370
Other Decks in Programming
See All in Programming
[JAWS-UG横浜 #80] うわっ…今年のServerless アップデート、少なすぎ…?
maroon1st
0
100
asdf-ecspresso作って 友達が増えた話 / Fujiwara Tech Conference 2025
koluku
0
1.4k
Package Traits
ikesyo
1
210
テストコード書いてみませんか?
onopon
2
340
rails newと同時に型を書く
aki19035vc
5
710
Findy Team+ Awardを受賞したかった!ベストプラクティス応募内容をふりかえり、開発生産性向上もふりかえる / Findy Team Plus Award BestPractice and DPE Retrospective 2024
honyanya
0
140
ゼロからの、レトロゲームエンジンの作り方
tokujiros
3
1k
アクターシステムに頼らずEvent Sourcingする方法について
j5ik2o
6
700
Запуск 1С:УХ в крупном энтерпрайзе: мечта и реальность ПМа
lamodatech
0
950
DevFest - Serverless 101 with Google Cloud Functions
tunmise
0
140
Fixstars高速化コンテスト2024準優勝解法
eijirou
0
190
KMP와 kotlinx.rpc로 서버와 클라이언트 동기화
kwakeuijin
0
300
Featured
See All Featured
Speed Design
sergeychernyshev
25
740
GraphQLとの向き合い方2022年版
quramy
44
13k
KATA
mclloyd
29
14k
Designing for humans not robots
tammielis
250
25k
Building Better People: How to give real-time feedback that sticks.
wjessup
366
19k
A better future with KSS
kneath
238
17k
How to Think Like a Performance Engineer
csswizardry
22
1.3k
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
47
5.1k
A Philosophy of Restraint
colly
203
16k
Raft: Consensus for Rubyists
vanstee
137
6.7k
Scaling GitHub
holman
459
140k
Optimizing for Happiness
mojombo
376
70k
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と見なせるのではないか。 ◦ この見方は、良いコードを書くための既存のプラクティスと整合性がありそう。