🐯

16 bit MS-DOS 向けにプログラムを作りたくなったので c++コンパイラを探した

2023/12/17に公開
2

16bit MSDOS 向けにプログラムを作りたくなったので

Xで人様のレトロPCネタとか 16bit センセーションとか見ていてむくむくとレトロPCで何かしたくなって。
でもハード復活させるの色々面倒なので、(8bit CPU を視野に)とりあえず妥協して MS-DOS なプログラムでも作ってみようかと。

できれば c++11 以降で組みたいけれど、8086 対応のものは少なくともフリーでは無さそう。
(gcc や Clang/LLVM は基本 32bit 以降向けのコンパイラアーキテクチャだし)

妥協して、template がそこそこちゃんと使える c++03 と考えると

くらいでしょうか。

手持ちのどこかに古の vc/msc とか borland/turbo c/c++ とかもあるはずだけど、template もままならない時代のものなので敢えて発掘せず。
(class や デストラクタは偉大だけれど、template ないなら C言語でいいかなと思ったり... 8bit 機を思うとハナから C 使うべきだけど、そこにたどり着く前に飽きるの目にみえてる)

WATCOM C/C++

WATCOM C/C++ は、2000年代にオープン化した元製品。

個人的には DOS エクステンダーで動くプログラムで重宝してました。90年代、Winにはメモリ少ないけど DOS としてはメモリ余ってる時分によく使われていた印象。

オープン化されても結局活発に開発されることなく、少なくとも c++ コンパイラ本体の言語処理の修正はほぼされてなさそうですが、c++03(98)コンパイラとしては template 以外はマトモな部類だったはず。MS互換度がちょっと低めで癖はありますが。

オプティマイズは当時としてはいいほうだったと思います。 現在の、発達したオプティマイズを前提とした書き方には弱いかもしれませんが。

template に関しては普段使いする分にはまあまあですが、SFINE とかメタプログラミングしようとすると残念な子になった記憶。
ああ、class template の メンバー関数template を class 定義内では定義できるけれど class 定義外で定義するとエラーになってました。その他、こまごま辛い部分あり。
※追記: メタプログラミング以前の template 利用でも色々罠あり。

標準c++ライブラリはオープンになってから作り直されていて、実装が足りてなかったり微妙だったりすることも... けれど久しぶりにみると昔よりは対応が増えてそうです。type_traits とか c++11 以降対応も増えてそう。
※追記:ostream << で string が対応されていない程度に作りかけのままだった。

まあ本気で 16bit プログラム作るなら、標準c++ライブラリはあまり使わないと思いますが。

※追記: template 周りだけでなく他で動くソースが実行時にダンプ吐かれて落ちた時の調査が辛く心折れる...

Digital Mars C/C++

Digital Mars C/C++ は 元 Semantic C/C++(Zortech C/C++) で、サイトにCD版販売とフリー版ダウンロードがあり。

16bit exe は製品版では作れますが、フリー版はコンパイラ自体は 16bit コード吐けても 16bit ライブラリが付属せず …… と、サイトでは今でもそれっぽいですが、製品版の構成ままのバイナリ&ライブラリ・ソース一式が

https://github.com/DigitalMars/dmc

で公開されていました。

git リポジトリに bin や lib のバイナリもそのまま登録されていて clone してしまえば、そのまま使えます。

Digital Mars は D 言語がメインになって c++ は打ち切られて更新が途絶えてしまっていますが、元製品ですし c++03(98) コンパイラとしては大丈夫な部類だと思います。

こちらも template 部分は メタプログラミングするには弱かった思い出。

付属の STL は stlport 4.5 ベース。

昔 stlport 5系でビルドしてたらシンボルバッファが溢れて音を上げてたので、template 使いたいマンには辛いかもです。optlink の更新で改善してたようにも思いますが、このへんは watcom より弱い印象。

16bit exe の実行環境

Windows x64 環境では 16bit exe を実行できないので、とりあえず MS-DOS Player を使います。

グラフィック触りたくなったら別を考えないといけないけれど、当面そこまでしそうにないし。

そもそも まだ hello world しただけ...

wcl -0 -ms -bt=dos -ox -DNDEBUG hello.c
dmc -0 -msd -o+all -DNDEBUG hello.c

まあ、追々。

Discussion

ウクレレ弾きのオッサンウクレレ弾きのオッサン

hello-worldでも画面を触る場合でも、dosbox-xがお薦めです。

tenkatenka

dosboxは太古の印象で考慮してませんでしたが、win9xインストールとか、pc98対応とか、面白そうですね。
ありがとうございます。