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
200
0
Share
Perl1.0 Deep Drive 0.01
ShizuokaTECH#1
でのトークです
AnaTofuZ
August 09, 2025
More Decks by AnaTofuZ
See All by AnaTofuZ
Perl GraphQL 高速化バトル 2026年5月版
anatofuz
0
41
k1LoW/deckのすすめ
anatofuz
1
680
Rubyの国のPerlMonger
anatofuz
3
1.7k
Pythonで爆速でHello, World!する
anatofuz
0
120
思いつきで推しの誕生日記念コンテンツを2日で作る技術
anatofuz
0
180
AWSで雰囲気でつくる! VRChatの写真変換ピタゴラスイッチ
anatofuz
0
500
令和最新版 Perlコーディングガイド
anatofuz
5
11k
rakulangで実装する! RubyVM
anatofuz
6
5.2k
沖縄の大学で育った学生がエンジニアになるまで
anatofuz
2
6.8k
Other Decks in Technology
See All in Technology
Strands Agents超入門
kintotechdev
1
150
もりもり新機能を一挙紹介! AgentCoreに入門して、AWS上にAIエージェントを構築しよう
minorun365
PRO
5
340
Agentic AI時代における メルカリのAIガバナンスとガードレール実装
naoichihara
16
17k
AI Adaptable なテストを整える工夫 / Ways to Make Your Tests AI-Adaptable
bitkey
PRO
2
180
なぜハノーバーメッセに行くべきなのか 〜初参加だから語れること〜
tanakaseiya
0
180
layerx-fde-practices
cipepser
6
2.9k
ビジュアルプログラミングIoTLT vol.23
1ftseabass
PRO
0
160
A Harness for Behaviour: how to get AI to generate code that does what we intend, or "TDD in the age of AI"
xpmatteo
1
520
Kaggle未経験社員をメダリストに育てる「AIドラゴン桜」
lycorptech_jp
PRO
0
670
Fabric-cicd によるAzure DevOps デプロイ
ryomaru0825
0
160
大学生が本気でDatabricksを活用してDiscordサークルをデータ駆動させてみた
phantomjuju
1
300
権限管理設計を完全に理解した
rsugi
2
240
Featured
See All Featured
Claude Code のすすめ
schroneko
67
220k
Future Trends and Review - Lecture 12 - Web Technologies (1019888BNR)
signer
PRO
0
3.6k
Between Models and Reality
mayunak
4
320
コードの90%をAIが書く世界で何が待っているのか / What awaits us in a world where 90% of the code is written by AI
rkaga
61
44k
Building Adaptive Systems
keathley
44
3k
Ruling the World: When Life Gets Gamed
codingconduct
0
240
First, design no harm
axbom
PRO
2
1.2k
The Pragmatic Product Professional
lauravandoore
37
7.3k
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
16
2k
Sam Torres - BigQuery for SEOs
techseoconnect
PRO
0
280
AI Search: Implications for SEO and How to Move Forward - #ShenzhenSEOConference
aleyda
1
1.3k
Improving Core Web Vitals using Speculation Rules API
sergeychernyshev
21
1.5k
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した • 絶賛移植しているので別の機会に続きはご期待 まとめ