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
KOF2015 emacs 18.59 and mule 1.1 on NetBSD 7.0
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
Izumi Tsutsui
November 07, 2015
Programming
2
1.3k
KOF2015 emacs 18.59 and mule 1.1 on NetBSD 7.0
KOF2015 関西オープンソースの「BSDなひととき」のセミナーで発表した
「emacs 18.59 / mule 1.1 を NetBSD 7.0 で動かした話」
のスライドです。
Izumi Tsutsui
November 07, 2015
Tweet
Share
More Decks by Izumi Tsutsui
See All by Izumi Tsutsui
NetBSD+Raspberry Piで 本物のPSGを鳴らすデモを OSC駆動の7日間で作った話 / OSC2026Osaka
tsutsui
1
100
PC-6001でPSG曲を鳴らすまでを全部NetBSD上の Makefile に押し込んでみた / osc2025hiroshima
tsutsui
0
230
今年もNetBSD環境を使って PC-6001のPSG演奏デモを作った話 / KOF2025
tsutsui
0
250
NetBSD/luna68kの歴史解説と、LUNAでアニメGIF再生デモと ついでにPC-6001デモも作った話 / OSC2025Kyoto
tsutsui
0
120
NetBSDの解説と NetBSD/luna68kの歴史と ついでにPC-6001展示 / OSC2025Tokyo-spring
tsutsui
0
200
GitHub Actionsを使ってNetBSDマイナー機種用のビルドテストCIを書いてみた話 / OSC2025Osaka
tsutsui
0
160
PC-6001のPSG演奏デモを機会にNetBSDを真面目に説明してみる / OSC2024Ehime
tsutsui
0
460
PC-6001のPSG演奏デモをなるべくNetBSD環境を使って作った話 / KOF2024
tsutsui
1
700
OSC展示とLUNAとNetBSD / OSC2024Kyoto
tsutsui
1
710
Other Decks in Programming
See All in Programming
フロントエンド開発の勘所 -複数事業を経験して見えた判断軸の違い-
heimusu
7
2.8k
Smart Handoff/Pickup ガイド - Claude Code セッション管理
yukiigarashi
0
150
Gemini for developers
meteatamel
0
100
AI Agent の開発と運用を支える Durable Execution #AgentsInProd
izumin5210
7
2.3k
インターン生でもAuth0で認証基盤刷新が出来るのか
taku271
0
190
疑似コードによるプロンプト記述、どのくらい正確に実行される?
kokuyouwind
0
390
16年目のピクシブ百科事典を支える最新の技術基盤 / The Modern Tech Stack Powering Pixiv Encyclopedia in its 16th Year
ahuglajbclajep
5
1k
AIによる開発の民主化を支える コンテキスト管理のこれまでとこれから
mulyu
3
500
AWS re:Invent 2025参加 直前 Seattle-Tacoma Airport(SEA)におけるハードウェア紛失インシデントLT
tetutetu214
2
120
2026年 エンジニアリング自己学習法
yumechi
0
140
今こそ知るべき耐量子計算機暗号(PQC)入門 / PQC: What You Need to Know Now
mackey0225
3
380
humanlayerのブログから学ぶ、良いCLAUDE.mdの書き方
tsukamoto1783
0
200
Featured
See All Featured
From π to Pie charts
rasagy
0
130
The Spectacular Lies of Maps
axbom
PRO
1
530
How to build a perfect <img>
jonoalderson
1
4.9k
Stewardship and Sustainability of Urban and Community Forests
pwiseman
0
110
The MySQL Ecosystem @ GitHub 2015
samlambert
251
13k
Unlocking the hidden potential of vector embeddings in international SEO
frankvandijk
0
170
The Illustrated Guide to Node.js - THAT Conference 2024
reverentgeek
0
260
Sam Torres - BigQuery for SEOs
techseoconnect
PRO
0
190
WCS-LA-2024
lcolladotor
0
450
Tips & Tricks on How to Get Your First Job In Tech
honzajavorek
0
440
Primal Persuasion: How to Engage the Brain for Learning That Lasts
tmiket
0
260
XXLCSS - How to scale CSS and keep your sanity
sugarenia
249
1.3M
Transcript
emacs 18.59 / mule 1.1 を NetBSD 7.0 で動かした話 関西オープンソース2015
謎アプリ on 謎マシン Izumi Tsutsui
[email protected]
Emacs 使ってますか?
最新版は 24.5
・1992年10月リリース (LUNA-II発売の翌年) ・emacs18 の最終版 emacs 18.59 とは
今でもダウンロードできます https://ftp.gnu.org/old-gnu/emacs/
Emacs 18 antinews http://www.dennougedougakkai-ndd.org/alte/1ste/emacs/elisp-manual-19-2.4-jp2.0/elisp-jp_45.html
MULti-lingual Enhancment to GNU-Emacs mule 1.x は emacs18 を ベースに多言語化したもの
mule とは
なぜ mule 1.1なのか • 某サークルの386BSD機に入ってた • 機能的にあんまり困ってなかった • Emacs19で動かない *.el
があった • 1996年頃のNetBSD 1.2でも ビルドできてしまった • NetBSDの後方互換性が高過ぎて 気がつくと20年近く経っていた
1998年製バイナリ https://twitter.com/tsutsuii/status/566608838267138051
Yet another emacs18 user https://twitter.com/Chris_J_Baird/status/566596051042185216
復活の機運(?) https://twitter.com/tsutsuii/status/566617110042775552
とりあえず 適当にいじって gentooパッチを マージしてみる
なんとなく動きました https://twitter.com/tsutsuii/status/570284256338927617
X11term版が動かない問題 • 通常のターミナル版は動く • X11term版は起動後固まる? ⇒read(2)から帰ってこない • とりあえずいろいろ読んでみる
/* 92.7.10 modified for Mule Ver.0.9.5 by T.Enami In compile_pattern(),
set bufp->buffer to 0 for forcing re_compile_pattern() to alloc (not realloc) it. In set_pattern(), last_regexp is set to Qnil. */ https://twitter.com/tsutsuii/status/571003158199021569
えなみさん とは • 某サークルの先輩に当たる方 • 某曽田さんと同年代 • NetBSDデベロッパ • mule初期からいろいろと
パッチ送っていたり
https://twitter.com/tsutsuii/status/571403457875161088
4時間後
https://twitter.com/_enami/status/571469622001577984
中略
https://twitter.com/_enami/status/571487238321647616
( ゚д゚) https://twitter.com/tsutsuii/status/571487878192054272
NetBSD/i386 では復活 https://twitter.com/tsutsuii/status/571518589108293632
一部修正してluna68kでもOK https://twitter.com/tsutsuii/status/575336006292934657
amd64ではダメっぽい https://twitter.com/tsutsuii/status/576445070624186368
ふたたびえなみさん https://twitter.com/_enami/status/576454331299291136
Lisp_Object とは • 整数、ポインタ、その他の 内部値を保持する整数型 • emacs 18 では int型で定義
• mule 1.1は alpha OSF/1対応で long型でも定義できるように なっている?
int vs long 問題 Lisp_Objectを longにした場合 以下の問題が発生する • 関数プロトタイプ宣言が不完全 ⇒返り値が暗黙的に
int になる ⇒LP64では Lisp_Object の 上位32ビットが失われる
https://twitter.com/_enami/status/576515850233995265
( ゚д゚) https://twitter.com/tsutsuii/status/576550741055156225
個別に見てても 終わらないので 片っ端から プロトタイプ宣言 を追加
作業結果 https://twitter.com/tsutsuii/status/577167362266263552
修正行数 https://github.com/tsutsui/mule1.1-netbsd/commit/cb7f46b0ced6a3860f292c893ded76d3010b346e
ついでに オリジナルの emacs 18.59 も amd64対応 https://twitter.com/tsutsuii/status/578972091342401536
LP64対応の次は
https://twitter.com/tsutsuii/status/658325284463054848
というわけで sparc64 (LP64BE) です
初回トライ結果 https://twitter.com/tsutsuii/status/578230868579225600
mule固有部分で 落ちているので、 オリジナルの emacs 18.59でも トライしてみる
超微妙動作 なにコレ(´・ω・`)
よくわからんので 関数宣言を K&R⇒ANSI にして警告出るか 試してみる
修正行数 https://github.com/tsutsui/emacs-18.59-netbsd/commit/402435325b01dd9d95bc975ea1905a046dd5cfe2
作業結果 https://twitter.com/tsutsuii/status/658229468532596736
もう少し真面目に調べてみる • "*invalid*” の条件を確認 ⇒Lisp_Object の型情報が変 • i386で同じ変数の変化を確認 ⇒値が変化する関数を特定 •
その関数を見てみると……
ポインタキャストの罠? for (offset = (char *)&buffer_local_flags.name - (char *)&buffer_local_flags; offset
< sizeof (struct buffer); offset += sizeof (Lisp_Object)) /* sizeof int == sizeof Lisp_Object */ if (*(int *)(offset + (char *) &buffer_local_flags) > 0 || *(int *)(offset + (char *) &buffer_local_flags) == -2) *(Lisp_Object *)(offset + (char *)b) = *(Lisp_Object *)(offset + (char *)&buffer_defaults); Lisp_Objectっぽい領域に intでアクセスしている。 明らかにクサい https://github.com/tsutsui/emacs-18.59-netbsd/blob/0a7383dcb7b9dbc863fa4adf6c7ae3330ec551d5/src/buffer.c#L270
とりあえず (Lisp_Object *) のキャストに修正
超微妙動作2 ちょっと進んだ?
他のソースにも 同様のキャストが あったので 同じく修正
https://twitter.com/tsutsuii/status/658311797850542081
amd64では動いて sparc64では動かない ケース (LP64BE問題)
LP64LEでの動作 (LSB) 02 00 00 00 00 00 00 00
(MSB) 64ビットのLisp_Objectを 32ビットの (int *) でアクセスした場合、 先頭から4バイトの値を読み 32ビット整数として返す ⇒4バイトに収まる整数なら同じ値になる Lisp_Object (1) = 2 Lisp_Object (2) = 0 (LSB) 00 00 00 00 00 00 00 00 (MSB)
LP64BEでの動作 (MSB) 00 00 00 00 00 00 00 02
(LSB) Lisp_Object (1) = 2 0 Lisp_Object (2) = 0 (MSB) 00 00 00 00 00 00 00 00 (LSB) 64ビットのLisp_Objectを 32ビットの (int *) でアクセスした場合、 先頭から4バイトの値を読み 32ビット整数として返す ⇒上位4バイト側が返るので違う値となる
まとめ • コンパイラの警告は大事です • プロトタイプ宣言は重要です • 機種に依存しない記述が大事です • 調べて推測通りに動くと楽しい!