Lock in $30 Savings on PRO—Offer Ends Soon! ⏳
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
150
Perl1.0 Deep Drive 0.01
ShizuokaTECH#1
でのトークです
AnaTofuZ
August 09, 2025
Tweet
Share
More Decks by AnaTofuZ
See All by AnaTofuZ
k1LoW/deckのすすめ
anatofuz
0
290
Rubyの国のPerlMonger
anatofuz
3
1.1k
Pythonで爆速でHello, World!する
anatofuz
0
87
思いつきで推しの誕生日記念コンテンツを2日で作る技術
anatofuz
0
140
AWSで雰囲気でつくる! VRChatの写真変換ピタゴラスイッチ
anatofuz
0
360
令和最新版 Perlコーディングガイド
anatofuz
5
7.6k
rakulangで実装する! RubyVM
anatofuz
6
4.2k
沖縄の大学で育った学生がエンジニアになるまで
anatofuz
2
6.2k
OpenAPI Generator Perl Clientでも型チューニングしたい!!
anatofuz
0
430
Other Decks in Technology
See All in Technology
知っていると得する!Movable Type 9 の新機能を徹底解説
masakah
0
210
AI時代におけるアジャイル開発について
polyscape_inc
0
100
Multimodal AI Driving Solutions to Societal Challenges
keio_smilab
PRO
1
120
Introduction to Sansan, inc / Sansan Global Development Center, Inc.
sansan33
PRO
0
2.9k
法人支出管理領域におけるソフトウェアアーキテクチャに基づいたテスト戦略の実践
ogugu9
1
140
Sansan Engineering Unit 紹介資料
sansan33
PRO
1
3.3k
なぜ使われないのか?──定量×定性で見極める本当のボトルネック
kakehashi
PRO
1
800
タグ付きユニオン型を便利に使うテクニックとその注意点
uhyo
2
660
Oracle Cloud Infrastructure:2025年11月度サービス・アップデート
oracle4engineer
PRO
1
120
Oracle Database@Google Cloud:サービス概要のご紹介
oracle4engineer
PRO
0
650
Introduction to Bill One Development Engineer
sansan33
PRO
0
330
著者と読み解くAIエージェント現場導入の勘所 Lancers TechBook#2
smiyawaki0820
10
3.3k
Featured
See All Featured
The Pragmatic Product Professional
lauravandoore
37
7.1k
Documentation Writing (for coders)
carmenintech
76
5.2k
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
234
17k
Keith and Marios Guide to Fast Websites
keithpitt
413
23k
Learning to Love Humans: Emotional Interface Design
aarron
274
41k
Into the Great Unknown - MozCon
thekraken
40
2.2k
The Illustrated Children's Guide to Kubernetes
chrisshort
51
51k
A better future with KSS
kneath
240
18k
Designing for Performance
lara
610
69k
The Cult of Friendly URLs
andyhume
79
6.7k
The Cost Of JavaScript in 2023
addyosmani
55
9.3k
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
132
19k
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した • 絶賛移植しているので別の機会に続きはご期待 まとめ