hare-lang について
システムユーティリティを開発する人向けの Hare 言語ガイドです。ビルドとテスト、標準ライブラリー、明示的なエラー処理、C FFI を扱い、依存の少ない小規模ツールやデーモンに焦点を当てます。
主な機能
- 01hare build、test、run の利用
- 02標準ライブラリーモジュールの確認
- 03明示的なエラー伝播と処理
- 04@extern による C FFI
- 05タグ付き共用体とスライスの理解
活用シーン
- 01CLI ツールやビルドツールの作成
- 02軽量なネットワークデーモンの実装
- 03C ライブラリー呼び出しや C 向け関数の公開
- 04Hare、C、Zig の比較
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ mohitmishra786/ low-level-dev-skills --skill hare-langインストール後、Claude Code で/hare-langを入力して読み込まれたか確認します。
詳細
Hare
目的
Hare プログラミング言語についてエージェントをガイドします。設計理念(シンプルで安定したコンパイル型言語)、hare build/test/run のワークフロー、標準ライブラリの概要、@extern による C FFI、型システム(タグ付き共用体、スライス)、(T | error!) によるエラー処理、システムユーティリティにおける C および Zig との比較を扱います。
使用する場面
- C のような制御性と、現代的な安全性を備えた小規模なシステムユーティリティを作成する場合
- 依存関係を最小限に抑えて CLI ツールやデーモンを構築する場合
- Hare から C ライブラリを呼び出す場合、または Hare の関数を C にエクスポートする場合
- 例外よりも明示的なエラー処理を優先する場合
- 新しいプロジェクトで Hare、C、Zig のいずれを使うか評価する場合
- 重いランタイムを使わず、安定して監査しやすいコードベースが必要な場合
ワークフロー
1. Hare をインストールする
# Linux/macOS — build from source
git clone https://git.sr.ht/~sircmpwn/hare
cd hare
make check # builds and runs tests
sudo make install
hare version
# Create project (Hare has no project generator — lay out manually)
mkdir -p mytool && cd mytool
cat > hare.mod << 'EOF'
module mytool
EOF
2. Hello world とビルド
// main.ha
use fmt;
export fn main() void = {
fmt::println("Hello, Hare!")!;
};
hare build -o mytool
./mytool
hare run . # build and run
hare test # run tests
3. 標準ライブラリの概要
| モジュール | 目的 |
|---|---|
fmt | 書式付き I/O(printf、println) |
io | リーダー/ライターのインターフェース |
os | ファイル、環境、引数 |
strings | 文字列操作 |
bufio | バッファー付き I/O |
encoding | JSON、16 進数など |
net | TCP/UDP ネットワーク |
time | 日付と時間間隔 |
mem | メモリー関連のヘルパー |
types | プラットフォームの整数型 |
use os;
use fmt;
use strings;
export fn main() void = {
const args = os::args;
for (let i = 0z; i < len(args); i += 1) {
fmt::println(args[i])!;
};
};
4. エラー処理
// Errors are tagged union values — explicit propagation with !
fn read_file(path: str) (str | os::error) = {
const file = os::open(path)?;
defer os::close(file);
let buf: []u8 = [];
io::readall(file, &buf)?;
return strings::fromutf8(buf)!;
};
export fn main() void = {
match (read_file("config.txt")) {
case let s: str =>
fmt::println(s)!;
case let err: os::error =>
fmt::fatalf("error: {}", err)!;
};
};
? はエラーを伝播し、! はエラーが発生しないコンテキストで成功を保証します。処理には match を使います。
5. 型システム
// Tagged union
type color = (u8 | u16 | void);
fn get_color(c: color) u16 = {
match (c) {
case let v: u8 => return v: u16;
case let v: u16 => return v;
case => abort();
};
};
// Slices — pointer + length
fn sum(nums: []i32) i32 = {
let total = 0i32;
for (let i = 0z; i < len(nums); i += 1) {
total += nums[i];
};
return total;
};
暗黙的な型変換はありません。明示的なキャストが必要です。
6. C FFI — @extern
// Link against C library
use c;
@extern("c") fn strlen(s: *const u8) size;
export fn main() void = {
const s = "hello";
fmt::println(len(s))!; // Hare strlen via strings module
};
Hare の関数を C にエクスポートする方法:
// Exported C ABI function
export fn my_add(a: i32, b: i32) i32 = {
return a + b;
};
hare build -o libmytool.a
# Link from C with generated headers or manual declarations
// cgo-style module linking in hare.mod
module mytool
require (
libc
)
7. テスト
@test fn test_add() void = {
assert(sum(&[1i32, 2, 3]) == 6);
};
@test fn test_error() void = {
match (read_file("/nonexistent")) {
case => abort("expected error");
case let err: os::error => void;
};
};
hare test -v
8. Hare、C、Zig の比較
| 項目 | Hare | C | Zig |
|---|---|---|---|
| メモリー安全性 | 一部(null なし、タグ付きエラー) | 手動 | 手動+任意の安全性チェック |
| コンパイル時間 | 高速 | 高速 | Comptime の処理が重い |
| 標準ライブラリ | 最小限で安定 | libc | 豊富 |
| C との相互運用 | @extern | ネイティブ | @cImport |
| ジェネリクス | なし(Comptime は限定的) | なし | Comptime ジェネリクス |
| 最適な用途 | ユーティリティ、ツール | あらゆる用途 | メタプログラミングを伴うシステム |
9. ユースケース
Good Hare fits
├── CLI utilities (grep-like, init tools)
├── Build tools and scripts replacing shell
├── Network daemons with simple protocol
└── Auditable security-sensitive code
Consider C/Zig instead when
├── Heavy generic metaprogramming needed (Zig)
├── Existing massive C ecosystem glue
└── GPU/kernel domains with immature Hare support
よくある問題
| 症状 | 原因 | 解決方法 |
|---|---|---|
unknown type | インポートの不足 | use module; を追加する |
| FFI のリンクエラー | ライブラリが hare.mod にない | require を追加し、-l フラグを正しく指定する |
| エラーが処理されない | ? または match の不足 | エラーを伝播するか、すべてのケースを処理する |
| UTF-8 エラー | 文字列内の無効なバイト | strings::fromutf8 で検証する |
| テストが見つからない | @test の不足 | 関数名に @test 属性を付ける |
| プラットフォームのシステムコールがない | Hare 標準ライブラリの不足 | libc に @extern を使う |
関連スキル
skills/zig/zig-compiler— 代替のシステム言語としての Zigskills/zig/zig-cinterop— Zig の C 相互運用との比較skills/compilers/gcc— Hare と併用する C ツールチェーンskills/languages/carbon-lang— 新興のその他のシステム言語skills/build-systems/make— Makefile への Hare の統合skills/runtime-safety/sanitizers— C 相互運用の安全性テスト
コメント
Markdown 対応