ハクソク

世界を動かす技術を、日本語で。

Libgodc: セガドリームキャスト用のGoプログラムを書く

概要

libgodcは、Sega Dreamcast向けに設計されたGoランタイム
16MB RAMSH-4 CPUなど、Dreamcastの制約に最適化。
ガベージコレクションgoroutinechannelなどGoの主要機能を提供。
godc CLIツールによるセットアップとビルドが簡単。
実機でのパフォーマンスやサンプルプログラムも豊富。

libgodc - Sega Dreamcast向けGoランタイム概要

  • libgodcは、Sega Dreamcast専用に設計されたGo言語ランタイム
  • 標準Goランタイムを置き換え、16MB RAMSH-4シングルコアCPUOS非搭載の環境に最適化
  • ガベージコレクションgoroutinechannelなど、Goのコア機能をサポート
  • **CLIツール(godc)**により、ツールチェーンのセットアップとビルドを自動化
  • **C言語ラッパー(KOS Wrappers)**を通じて、GoからCの呼び出しも可能

クイックスタート手順

  • 前提条件
    • Go 1.25.3以上makegitのインストール
  • godc CLIツールのインストール
    • go install github.com/drpaneas/godc@latest
  • 環境セットアップ
    • godc setup
    • 動作確認(オプション): godc doctor
  • プロジェクト作成と実行
    • mkdir myproject && cd myproject
    • godc init
    • main.goや他の.goファイルを作成*
    • godc build
    • godc run
  • 詳細はQuick Start Guide参照

ドキュメント構成

  • Installation — セットアップと設定手順
  • Quick Start — 最初のプログラム作成ガイド
  • Design — ランタイムアーキテクチャ解説
  • Effective Dreamcast Go — 開発ベストプラクティス
  • KOS Wrappers — GoからC呼び出し方法
  • Limitations — 非対応機能一覧
  • Performance — 実機での性能測定結果

パフォーマンス指標(SH-4 @ 200MHz実機)

  • Gosched yield — 約120ナノ秒
  • メモリアロケーション — 約186ナノ秒
  • バッファ付きチャネル — 約1.8マイクロ秒
  • コンテキストスイッチ — 約6.4マイクロ秒
  • バッファなしチャネル — 約13マイクロ秒
  • goroutine生成 — 約31マイクロ秒
  • GCポーズ — 72マイクロ秒〜6ミリ秒

サンプルプログラム例

  • examples/ ディレクトリに動作サンプルを多数収録
    • hello — デバッグ出力付き最小プログラム
    • hello_screen — BIOSフォントによる画面表示
    • blue_screen — 最小グラフィックス例
    • input — コントローラー入力
    • goroutines — 同時実行するボール表示
    • channels — プロデューサ/コンシューマパターン
    • timer — フレームレート独立アニメーション
    • bfont — BIOSフォントレンダリング
    • filesystem — ディレクトリブラウザ
    • vmu — VMU LCD・ブザー制御
    • brkout — Breakoutクローン(Jim Ursetto氏のGPL v2移植)
    • pong — 1P/2Pモード・パーティクル・AI搭載のPongクローン

ライセンス

  • BSD 3-Clause Licenseを採用
  • 詳細はLICENSEファイル参照

Hackerたちの意見

セガ・ドリームキャスト用のGoランタイムを作ったよ。1999年のコンソールで、16MBのRAMと200MHzのSH4 CPUを搭載してる。goroutinesやchannels、ガベージコレクションなど、期待できる言語機能を使ってゲームが書けるんだ。gccgoを使ってコンパイルできて、実際のハードウェアやエミュレーターで動くよ。このプロジェクトには、Pong、Breakout、Platformerの3つのゲーム例や、入力処理、音声サポート、KallistiOS(ドリームキャストのホームブリューSDK)との統合が含まれてる。* スターはこちら: https://github.com/drpaneas/godc * ドキュメント: https://drpaneas.github.io/libgodc/ * 動画チュートリアル: https://youtu.be/ahMl0fUvzVA 実装についての質問には喜んで答えるよ!
あなたのドキュメントがすごく印象的だと言いたかったんだ。普通のreadme.mdを期待してたけど、あなたのreadmeは素晴らしいし(パフォーマンステーブルが最高)、フルドキュメントも素晴らしい。ほとんどの質問に答えてくれたよ。いい仕事だね!こんなプロジェクトがもっとあればいいのに。ドキュメントや本のスタイルも好きだな。
こんにちは、パノス!今のところちょっとしか見てないけど、すごく印象的だね!ドリームキャストをほこりを払って、これを動かさないと。ランタイムをn64にポーティングする時にgccgoを見たけど、その時はgo1.18以来更新されてなかったんだ。ドリームキャストでGoのジェネリクスは使えるのかな?SH4をサポートするにはgccgoが必要みたいだね。
これ、ちょっとクールだね。頑張ったね、すごいよ!
もう今週が最高になった!ありがとう!
これは存在するだけで美しいね。これを作ったことに大きなリスペクトを送るよ。
> ドリームキャストの制約に合わせて設計された標準のGoランタイムを置き換えます: メモリ16MB RAM、CPUはシングルコアのSH-4、オペレーティングシステムなし。システムとビデオの間に合計24メガバイトのメモリがあり(そのうち8MBはビデオ用)、シングルコアの200MHz CPU、グラフィックチップは100MHzで動作します。シェンムーも動くよ。チームを睨む。
それをベースにカスタムTeamsクライアントを実装できるかも。私の一番の懸念はTLSとメディアデコードだけど、トラフィックをプロキシしてテキスト専用クライアントを作ることもできる。前にMicrosoft Graphをちょっといじったけど、そんなに悪くなかったよ。
マイクロソフトがOSを作り、GUIスタックを構築・再構築できるのに、C#を使ってTeamsのUIを作れなかったのが不思議だよね???
> CPUはシングルコア これはGoにはあまり良くないね。
Teamsがどうやって開発されるのか全然わからない。今まで関わった最悪のオフショアプロジェクトですら、こんなに質が低くなることはなかったよ。
TeamsやSlackより、ネット対応のシェンムーでの仕事のチャットやビデオ会議の方が全然いいな。
これに関する「Effective Dreamcast Go」のドキュメントは素晴らしくよく書かれてる。大企業から読んだドキュメントの中には、もっとひどいものもあったよ。
ありがとう、@dontaj!本当に感謝!プロセスをドキュメント化するのは別のプロジェクトみたいに感じたから、そう言ってもらえて嬉しいよ!効果的なドリームキャストGoは、昔のクラシックからインスパイアされたんだよね https://go.dev/doc/effective_go :D
gccgoって古いGoのバージョンしかサポートしてないんじゃなかったっけ?それとも機能の一部だけ?ちょっと記憶をリフレッシュしないと。
sh-elf-gccgo (GCC) 15.1.0を使ってるけど、まあまあかな。一般的にgccgoはGoに近づこうとしてるけど、すべての機能を実装してるわけじゃないんだよね。例えば、ジェネリクスはまだないし。
> これは誰のためのもの? > ... > 厳しい制約の中で挑戦を楽しむ人たちへ。 ドリームキャストが登場したときのパワフルさや、ソウルキャリバーやシェンムーの素晴らしいグラフィックを思い出すと、ドリームキャストのハードウェアが「厳しく制約されている」とは考えにくいよね。
うん、わかる。懐かしさが襲ってくるね。ドリームキャストはその時代の怪物だったし、イーサネットもあったんだよ!VMUもすごいものでしたね!SEGAがキャンセルしなきゃよかったのに :(
スーパーファミコンがどうやって動いてたのか、現代のゲームやシステムがどうなってるのかは直感的にわかるんだけど、ドリームキャストやPS2、Xbox、ゲームキューブ時代のハードウェアスペックをその出力の最高と比べると、直感が全然働かないんだ。あの時代のゲームが現代のものに比べてどうかっていうと、エミュレーターでアップスケールしたりテクスチャ詰め込んだりしても、やっぱり立ち向かえないけど、あの少ないリソースでどうやって実現してたのかは本当に驚きだよ。
これ大好き!ドキュメントも素晴らしいし、ゴーランについてもいくつか学べたよ!ロゴを見ると、アイシータワーをDCに移植したくなるね。
ありがとう、@rpastuszak!めっちゃ感謝! :D
ニッチなハードウェアでgolangプロジェクトを動かしたい人には、ちょっとしたプロのヒントを教えるよ。golangを100% wasmに変換する方法があって、jsのシムとかは必要ないんだ。必要なのはwasmライブラリだけ。ソースからgolangを使わなきゃいけないけど(stackoverflowのページを見てね https://stackoverflow.com/questions/76087007/golang-to-wasm-... )。次のコマンドを実行してみて。 `go install golang.org/dl/gotip@latest` `gotip download GOOS=wasip1 GOARCH=wasm` `gotip build -o main.wasm` 俺がやった方法は、gotipフォルダに入って、その中のバイナリフォルダに行って、goコンパイラのバイナリを使うって感じだった。 `GOOS=wasip1 GOARCH=wasm ~/sdk/gotip/bin/go build -o main.wasm` 正確なパスは忘れちゃったけど、こんな感じだったよ。要は、すごく簡単なんだ :) 実際にやってみたけど、ちゃんと動くし、最新のgolangバージョンでも大丈夫。必要なのはwasmエンジンだけで、これはどこでも手に入ると思う。golangのコードをwasmに変換して、sshサーバーを立てて、そのwasmをサンドボックス内で動かすっていうソリューションを作ったんだ。サンドボックス化されたミニgolangサーバーを作る感じ :p 本当に好きだけど、プロトタイプ的なものかな。
https://tinygo.org/docs/guides/webassembly/wasi/
いいプロジェクトだね!16MbのRAMだけで、標準のGo(TinyGoじゃないやつ)には本当にチャレンジだよね!hello worldですら数メガあるし、ドリームキャストは64ビットじゃないと思うから、命令はもっと短いかも。何かがそれで書かれてるのを見るのは面白いね :)
ありがとう :D ディアブロの移植はどう? https://x.com/PanosGeorgiadis/status/2005692695402955143
これめっちゃクールだね!もし当時、こういうモダンな言語機能があったら、ドリームキャストの開発にどんな影響があったと思う?(コンソールの開発がどれくらい大変だったのか全然わからないけど。)