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
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を鳴らすデモを ブラッシュアップしました / osc2026Tokyo-spring
tsutsui
1
18
NetBSD+Raspberry Piで 本物のPSGを鳴らすデモを OSC駆動の7日間で作った話 / OSC2026Osaka
tsutsui
1
140
PC-6001でPSG曲を鳴らすまでを全部NetBSD上の Makefile に押し込んでみた / osc2025hiroshima
tsutsui
0
250
今年もNetBSD環境を使って PC-6001のPSG演奏デモを作った話 / KOF2025
tsutsui
0
260
NetBSD/luna68kの歴史解説と、LUNAでアニメGIF再生デモと ついでにPC-6001デモも作った話 / OSC2025Kyoto
tsutsui
0
130
NetBSDの解説と NetBSD/luna68kの歴史と ついでにPC-6001展示 / OSC2025Tokyo-spring
tsutsui
0
210
GitHub Actionsを使ってNetBSDマイナー機種用のビルドテストCIを書いてみた話 / OSC2025Osaka
tsutsui
0
170
PC-6001のPSG演奏デモを機会にNetBSDを真面目に説明してみる / OSC2024Ehime
tsutsui
0
510
PC-6001のPSG演奏デモをなるべくNetBSD環境を使って作った話 / KOF2024
tsutsui
1
730
Other Decks in Programming
See All in Programming
今更考える「単一責任原則」 / Thinking about the Single Responsibility Principle
tooppoo
3
1.4k
JPUG勉強会 OSSデータベースの内部構造を理解しよう
oga5
2
230
Go 1.26でのsliceのメモリアロケーション最適化 / Go 1.26 リリースパーティ #go126party
mazrean
1
350
株式会社 Sun terras カンパニーデック
sunterras
0
2k
encoding/json/v2のUnmarshalはこう変わった:内部実装で見る設計改善
kurakura0916
0
310
Ruby x Terminal
a_matsuda
7
580
The Past, Present, and Future of Enterprise Java
ivargrimstad
0
380
The Ralph Wiggum Loop: First Principles of Autonomous Development
sembayui
0
3.7k
ベクトル検索のフィルタを用いた機械学習モデルとの統合 / python-meetup-fukuoka-06-vector-attr
monochromegane
2
320
TipKitTips
ktcryomm
0
150
Rで始めるML・LLM活用入門
wakamatsu_takumu
0
160
go directiveを最新にしすぎないで欲しい話──あるいは、Go 1.26からgo mod initで作られるgo directiveの値が変わる話 / Go 1.26 リリースパーティ
arthur1
2
470
Featured
See All Featured
コードの90%をAIが書く世界で何が待っているのか / What awaits us in a world where 90% of the code is written by AI
rkaga
60
42k
B2B Lead Gen: Tactics, Traps & Triumph
marketingsoph
0
68
Improving Core Web Vitals using Speculation Rules API
sergeychernyshev
21
1.4k
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
31
2.7k
The Cult of Friendly URLs
andyhume
79
6.8k
brightonSEO & MeasureFest 2025 - Christian Goodrich - Winning strategies for Black Friday CRO & PPC
cargoodrich
3
120
Deep Space Network (abreviated)
tonyrice
0
86
Building Applications with DynamoDB
mza
96
6.9k
Automating Front-end Workflow
addyosmani
1370
200k
Practical Orchestrator
shlominoach
191
11k
Lightning Talk: Beautiful Slides for Beginners
inesmontani
PRO
1
460
The Hidden Cost of Media on the Web [PixelPalooza 2025]
tammyeverts
2
240
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バイト側が返るので違う値となる
まとめ • コンパイラの警告は大事です • プロトタイプ宣言は重要です • 機種に依存しない記述が大事です • 調べて推測通りに動くと楽しい!