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
Perl1.0 Deep Drive 0.01
Search
AnaTofuZ
August 09, 2025
Technology
0
25
Perl1.0 Deep Drive 0.01
ShizuokaTECH#1
でのトークです
AnaTofuZ
August 09, 2025
Tweet
Share
More Decks by AnaTofuZ
See All by AnaTofuZ
Rubyの国のPerlMonger
anatofuz
3
730
Pythonで爆速でHello, World!する
anatofuz
0
73
思いつきで推しの誕生日記念コンテンツを2日で作る技術
anatofuz
0
110
AWSで雰囲気でつくる! VRChatの写真変換ピタゴラスイッチ
anatofuz
0
300
令和最新版 Perlコーディングガイド
anatofuz
5
6.7k
rakulangで実装する! RubyVM
anatofuz
6
3.4k
沖縄の大学で育った学生がエンジニアになるまで
anatofuz
2
6k
OpenAPI Generator Perl Clientでも型チューニングしたい!!
anatofuz
0
380
perlimportsから探るPPIの世界
anatofuz
0
4.2k
Other Decks in Technology
See All in Technology
みんなのSRE 〜チーム全員でのSRE活動にするための4つの取り組み〜
kakehashi
PRO
2
140
生成AI導入の効果を最大化する データ活用戦略
ham0215
0
110
VLMサービスを用いた請求書データ化検証 / SaaSxML_Session_1
sansan_randd
0
220
Lambda management with ecspresso and Terraform
ijin
2
150
Claude Codeから我々が学ぶべきこと
oikon48
10
2.8k
Kiroでインフラ要件定義~テスト を実施してみた
nagisa53
3
320
家族の思い出を形にする 〜 1秒動画の生成を支えるインフラアーキテクチャ
ojima_h
1
580
【OptimizationNight】数理最適化のラストワンマイルとしてのUIUX
brainpadpr
1
400
Nx × AI によるモノレポ活用 〜コードジェネレーター編〜
puku0x
0
400
AIに目を奪われすぎて、周りの困っている人間が見えなくなっていませんか?
cap120
1
440
マルチモーダル基盤モデルに基づく動画と音の解析技術
lycorptech_jp
PRO
5
570
2時間で300+テーブルをデータ基盤に連携するためのAI活用 / FukuokaDataEngineer
sansan_randd
0
140
Featured
See All Featured
Measuring & Analyzing Core Web Vitals
bluesmoon
8
540
GraphQLとの向き合い方2022年版
quramy
49
14k
Documentation Writing (for coders)
carmenintech
73
5k
Principles of Awesome APIs and How to Build Them.
keavy
126
17k
Into the Great Unknown - MozCon
thekraken
40
2k
Git: the NoSQL Database
bkeepers
PRO
431
65k
Typedesign – Prime Four
hannesfritz
42
2.7k
How GitHub (no longer) Works
holman
314
140k
VelocityConf: Rendering Performance Case Studies
addyosmani
332
24k
Embracing the Ebb and Flow
colly
86
4.8k
The Illustrated Children's Guide to Kubernetes
chrisshort
48
50k
Java REST API Framework Comparison - PWX 2021
mraible
33
8.8k
Transcript
2025/08/10 ShizuokaTECH#1 八雲アナグラ (@AnaTofuZ) Perl1.0 Deep Drive 0.01
2 • 八雲アナグラ(@AnaTofuZ) • 株式会社コードタクトでRailsエンジニアをしています • 山梨県甲府市でリモートワーク ◦ 沖縄と京都にもいました •
Kofu.rb / Houtou.pm • Perl生まれPerl育ちです • 伊豆と清水によくいきました ◦ 東海大学海洋科学博物館 ◦ いのしし村 my $self = shift;
3
4 【PR】山梨にもきてくれ !!!(今熱いぞ!!) • Kofu.なんか ◦ 2025/08/16 クラフトビール屋さんでやるテックトーク • Kofu.rb
◦ 2025/08/23 TRICKを見る会 • Otsuki.なんか ◦ 2025/10/11 古民家でのノンジャンルトークイベント
5 • 今年のはじめにRubyの会社に転職した ◦ 今まではPerlやTypeScriptがメイン • Rubyの勉強をする必要がある ◦ Perlは得意 ▪
なら得意なPerlをRubyで作れば最強なのでは...!? • 現存する最古のPerlことPerl1.0をRubyで実装してみる • というのを今やっているのですが、そこでわかったPerl1.0についての話で す ◦ 移植の話しようとしたら15分では足りなかった Perl1.0再考
6 • 今はPerl5.42 ◦ 究極 • ずっとPerl5のままだがPerl1 ~ Perl4の時代もあったことがある ◦
1994年からPerl5 Perl
7 • 1987年12月18日にリリース • 驚くべきことにGitHubでソースコードが見れる ◦ メンテナンスされているバージョンも ▪ https://github.com/AnaTofuZ/Perl-1.0 ◦
DockerHubにもあるのでdockerでも動く • 文字列と文字列の配列、実験的機能で連想配列がサポート Perl1.0
8 • 置換 • 基本正規表現 • リスト操作 ◦ shift, unsfhit,
pop, push • サブルーチン • for文 結構いろいろある
9 • レキシカル変数 ◦ グローバル変数しかない • わかりやすいコード解説 ◦ そもそもK&R Cなので最近のCとも違う
◦ 最近はAIが出たのであんまり問題ではなくなった ないもの
10 • スコープがなく全部グローバル変数なのでfor文を抜けてもアクセスできる for文で配列を初期化するやつ
11 • Perl1.0を極力模倣して再実装したいのでPerl1.0の中身を見ていく必要が ある • 動くバイナリがあると便利なので一旦ローカルでビルドを通してみる ローカルビルド
12 • macOS(LLVM/clang環境)だとそのままだとコンパイルが通らない ◦ Linux環境(gcc)だと通る状態 • 動くようにパッチをつくった 昨日メンテナンスしました
13 • C言語の様々に対応する必要がある ◦ ビルド時のオプションで制御できるものとコードに手をいれるものの2 択 ◦ -Wno-implicit-function-declaration ▪ clangだと関数を使う前に宣言が必要だがなくても動くようにする
macOSで動くようにメンテナンス
14 • macOSだと/usr/includeや/usr/libがない ◦ /Library/Developer/CommandLineTools/SDKs/MacOSX. sdk/以下にあるのでこれを指定 macOSで動くようにメンテナンス
15 macOS使うの久々だったのでググったら自分のエントリが出てきた 自分のブログは便利
16 だいたい返り値の型がおかしいので指定すればよい 動くようにパッチをあてる
17 • #define DEBUGGINGの後ろに1をつけるとデバッグモードでビルドでき る • perlの起動オプションに-Dが追加される ◦ ./perl -D123
hoge.plのようにDの次に有効化したいデバッグ フラグに対応したビット列を渡す • 一部のデバッグモードでセグフォが起こるが基本はこの対応でビルドでき た デバッグモード
18 • 字句解析 ◦ 入力されたコードをトークン(意味ある単位)ごとに分割 • 構文解析 ◦ トークンを元に文法と照らし合わせてASTを作る •
実行 ◦ ASTを実行する 一般的なプログラミング言語の処理フロー
19 • 字句解析部分を手書き • 構文解析はYacc(Bison)を利用 ◦ 完全にフェーズが別れているわけではなく構文解析から字句解析を 呼び出す • 実行はASTを直接取り回す
◦ これはPerl5でも同様 Perl1.0においては
20 $が現れたらscanregした値を設定しREGトークンとして切り出す レキサー
21 @が現れたらcanした値を設定しREGトークンとして切り出す レキサー
22 リストを作る()などはトークンそのものが記号(char文字) 記号とトークンが一致するケース
23 • Perlの文法上数値はクォーテーションが不要 ◦ 数値がトーカナイズされたら以降は文字列読み取りモードに移行する リテラルのトーカナイズ
24 • Perlは"で変数を囲むと中身が展開される • Perl1.0ではデフォルトでは"は'であるとフラグをつける ◦ 読み取る文字列の中に$などがあればダブルクォーテーションモード に変更 ダブルクォーテーションおもしろポイント
25 Ruby製のパーサージェネレーターのLramaを使うとダイアグラムで表示でき る Perl1.0の文法規則
26 • bundle exec lrama --diagram perl.yするといい感じにHTML が生成される • https://anatofuz.net/perl-1.0-diagram/で見れるぞ!!
Perl1.0の文法規則
27 • 代入はsetexprとして定義されている 代入文
28 • 代入はsetexprとして定義されている • setexprはtermだけも含む 代入文
29 • termはREG(変数)やRSTRING(文字列)がマッチする ◦ 代入文の規則がここで判明する 代入文
30 こういう感じ
31 文法解析を見てみる
32 パースすると
33 • cmd ◦ 制御構造(basic block)単位を表現 • arg ◦ 実際の式や演算子を表現
▪ cmdにおける引数としての意味合い ◦ いわゆる値っぽいものはすべてこれ ASTの仕組み
34 基本ブロック!! cmd
35 いわゆるif文はサブタイプでtrueかそれ以外をリストしている cmd
36 • ちょっとわかってきましたね(???) • わかってきたので改造をしてみます Perl1.0わかってきた
37 • do/endでのブロックを作る構文にしてみる Perl1.0をRubyライクにする
38 • もともとPerlにはdoが意味を持つキーワードとして定義されている • endだけ定義しなおせばいい do
39 新定義
40 レキサーで endをキャプチャする
41 • もともと{}がPerlのブロック • 同じ処理block_headを使うといい感じにブロックに ブロックに対応させる
42 こういうのが動くように !!
43 • Perl1.0 Deep Driveした • 絶賛移植しているので別の機会に続きはご期待 まとめ