Show HN: Tiny – 内联 Go 原生関数を備えた解釈型動的言語

2026/06/21 3:53

Show HN: Tiny – 内联 Go 原生関数を備えた解釈型動的言語

RSS: https://news.ycombinator.com/rss

要約

Japanese Translation:

Tiny は、Go で実装された新しい同時実行対応の高性能プログラミング言語およびランタイムシステムであり、生のパフォーマンスを優先する独自バイトコード仮想マシン(

.tbc
)を搭載しています。効率的なインタプリタによる一般論理処理と、ホットループや文字列演算といったクリティカルなコードパス用に最適化された Just-In-Time(JIT)コンパイラを組み合わせたハイブリッド実行モデルを採用しています。このシステムは、固有のロックブロック内にある自動的にミューテックスが解放されるメカニズムと、孤立した VM 状態空間の利用によって、デッドロックなどの一般的な同時実行問題を防止します。

開発者は、動的型付け(オプションで静的ヒント可)を備えたモダンな開発体験、組み込みの Language Server(LSP)、OS レベルの並列処理を実現する

spawn
、継承ではなくクラス合成を実現する
embed
、堅牢なパターンマッチングのための
match
ブロックといったユニークな機能を含む開発環境を利用できます。片付けは
defer
構文により管理されます。インストールは Windows、Linux、macOS Apple Silicon を含め、簡単に行えます。コアエンジン以外に、Tiny は高スループット Web サービス(
http
)、スキーマ検証(
validate
)、タイマー(
time
)、ネイティブ配列演算(
array
)、デスクトップ UI オートメーション(
desktop
)のためのツールを含む豊富な標準ライブラリを提供します。ユーザーは、外部パッケージとのシームレスな相互作用を可能にする WebAssembly に Go コードを直接コンパイルする特別な
native fn
ブロックを作成することで、ランタイムをさらに拡張できます。要するに、Tiny はコンパイル言語のスピードとインタプリタ言語の柔軟性を組み合わせつつ、スレッド安全性と開発容易さを保証します。

本文

Tiny: 超高速並行バイトコード仮想マシン

Tiny は、高性能な並行型バイトコード仮想マシンと、そのランタイムを Go で実装した動的言語です。Tiny は、開発のスピード感と堅牢なマルチスレッド実行環境を両立するプラットフォームです。

概要

Tiny は、並行プログラミングに特化した言語およびランタイムシステムです。

  • バイトコード生成: ソースファイルを高度に最適化された仮想マシン(
    .tbc
    拡張子)上のコンパクトなスタック指向バイトコードに変換します(スロット方式のローカルストレージ採用)。
  • ハイブリッド実行モデル:
    • 一般的なロジックにはインタプリタを採用し、パフォーマンス重視箇所では**即時コンパイル(JIT)**を行う。
  • 主要機能:
    • OS 層による並列スレッド処理
    • ホストメモリに反映されたパック配列
    • 連結可能なスキーマ検証ライブラリ
    • ネイティブ WebAssembly エクステンション
    • 内蔵言語サーバー(LSP)

リソースリンク


インストール方法

公式リリースページから、対応 OS のバイナリを用意します。

バイナリダウンロード先

OSファイル名
Windows
tiny_windows_amd64.exe
Linux
tiny_linux_amd64
macOS (Apple Silicon)
tiny_darwin_arm64

セットアップ手順

  1. ご自身の OS に合ったバイナリをダウンロードします。
  2. ファイル名を
    tiny
    (Windows は
    tiny.exe
    )に統一します。
  3. バイナリディレクトリを作成し、システム PATH への追加を準備します(例:
    ~/.tiny/bin
    または Windows の
    %USERPROFILE%\.tiny
    )。
  4. システムの PATH 環境変数に上記ディレクトリを追加して完了です。

※ソースコードからのコンパイルについては公式ドキュメントをご参照ください。


言語仕様の特徴

動的型付けとオプショナルなヒント

  • デフォルトは動的型付けですが、ラピッドプロトタイピングも可能。
  • オプショナルな静的型ヒント(変数、引数、戻り値)を適用できます。
  • ユニオンジェネリクスによる型システムを提供します。
import std "io";

// 未定型変数
let data = "untyped string";

// 明示的な型ヒント
const port: number = 8080;

fn calculatePayout(base: number, multiplier: number): number {
    return base * multiplier;
}

io.println(calculatePayout(100, 1.5));

構造的インターフェースと形状検証

  • **構造体指向型(Shape-based)**アプローチを採用。オブジェクトは実行時に関係するインターフェースに対して検証されます。
  • JIT エンジンはオブジェクトの形状を追跡し、線形メモリのフィールドオフセットを活用してチェックを最適化します。
import std "io";

interface Task {
    title: string
    done: bool
}

fn printTask(t: Task) {
    let status = t.done ? "Completed" : "Pending";
    io.println(`${t.title} - Status: ${status}`);
}

// 構造的なマッチング
printTask({ title: "Write Compiler Tests", done: true });
printTask({ title: "Optimize VM Dispatcher", done: false, priority: 1 });

デストラクチャリング代入

  • let
    および
    const
    宣言において、オブジェクトと配列のデストラクチャリングをサポート。
  • ネストされたパターン、デフォルト値、プロパティの名前変更に対応。
import std "io";

const user = {
    name: "Alice",
    age: 30,
    address: { city: "NYC", zip: "10001" }
};

// オブジェクトと配列のデストラクチャリング
let { name, address: { city } } = user;
io.println(`${name} lives in ${city}`);

let coordinates = [10.5, 20.8, 30.0];
let [x, y] = coordinates;
io.println(`X: ${x}, Y: ${y}`);

クラスの合成と埋め込み

  • **継承よりも合成(Composition)**を重視。
  • embed
    キーワードにより、クラスのインスタンスに振る舞いを委譲可能。親クラスで欠落している場合、自動的に埋め込まれたインスタンスから解決されます。
import std "io";
import std "json";

class Logger {
    field messages = []
    fn log(message: string) {
        this.messages.push(message);
        io.println(`Log: ${message}`);
    }
    fn dump() { return this.messages; }
}

class SessionManager {
    field active = true
    embed logger // 埋め込みクラス
    
    fn init() {
        this.active = true;
        this.logger = Logger();
        this.log("Session manager initialized"); // 委譲された呼び出し
    }
    fn close() {
        this.active = false;
        this.log("Session closed");
    }
}

let session = SessionManager();
session.close();
io.println(json.pretty(session.dump()));

パターンマッチング

  • match
    ブロックは、リテラル値、変数、列挙体(enum)ユニオンプATTERN、ガード条件をサポート。
  • 列挙体のバリアントからデータを抽出する主要手段です。
import std "io";

enum Result {
    Ok(value),
    Error(message)
}

fn process(res: Result) {
    match res {
        Result.Ok(val) if val > 0 => io.println(`Success: ${val}`),
        Result.Ok(_) => io.println("Success with zero or negative value"),
        Result.Error(msg) => io.println(`Error: ${msg}`),
        _ => io.println("Unknown state")
    }
}

process(Result.Ok(42));

スコープ付きクリーンアップ(Defer)

  • defer
    文は、現在のスコープを退出する直前に関数呼び出しをスケジュール。
  • 早期リターンや例外が発生した場合でも、デフォルトの実行が保証されます
import std "fs";
import std "io";

fn processFile(path: string) {
    io.println("Opening file stream...");
    let file = fs.open(path);

    defer fn() {
        io.println("Running defer block: closing file stream.");
        file.close();
    }

    io.println("Processing file data...");
}

processFile("README.md");

並行モデル

並列スレッド実行

  • OS 層のマルチスレッドを活用した並列操作の実行
  • spawn
    キーワードで新しい実行ルーチンを開始し、隔離された VM の状態空間上で動作します。
  • イベントループとは異なり、利用可能なすべての CPU コアを横断してタスクを並行的に実行します。
import std "io";
import std "time";

let worker = spawn () fn() {
    time.sleep(1000);
    return "Worker thread complete";
};

io.println("Main thread proceeding...");
let result = await worker;
io.println(result);

スレッドセーフと Mutex ロッキング

  • 共有状態は、ミューテックスやネイティブロックブロックで調整可能。
  • コンパイラーが自動的にデッドロック防止を確保します(ロック脱出時の自動解放)。
import std "io";
import std "sync";

let counter = 0;
const m = sync.mutex();

fn increment() {
    lock m {
        counter = counter + 1;
    }
}

即時コンパイル (JIT)

ホットなバイトコードパスをネイティブの WebAssembly に翻訳する多機能な JIT コンパイルエンジンを内蔵。

機能点

  • リージョンアウトライニング: トップレベルコードや関数内のホットループを特定し、特殊化した JIT リージョンにアウトライン化します(手動カプセル化不要)。
  • パックされたオブジェクト配列: 一様な形状のオブジェクト配列に対し、ホストメモリのミラーリングとフィールドカラムポインタテーブルを活用し、相互運用性のオーバーヘッドを回避します。

JIT セーフなベストプラクティス

最大のパフォーマンスを得るための指針:

  • クロージャーを避ける: 変化する外部変数をキャプチャするとインタプリタで実行され、非効率になります。
  • 同期処理を保つ:
    async
    関数は対象外です。
  • 型ヒントの提供: JIT の特殊化を助けます(例:
    : number
    )。
  • 文字列連結:
    stringBuilder
    を使用し、大規模ビルド時の効率性を確保します。
// JIT 最適化が極めて高い関数の特徴:
// ・明示的な型指定
// ・同期処理
// ・外部変数のキャプチャなし
// ・ループ構造の利用
fn computeSum(n: number, initial = 0): number {
    let total = initial;
    for let i = 0; i < n; i++ {
        total += i;
    }
    return total;
}

インライン Go エクステンション (WebAssembly)

特定の Go パッケージが必要なロジックに対し、ネイティブ

fn
を用いてソースファイル内に直接 Go コードを記述できます。TinyGo 経由で WebAssembly にコンパイルされ、ランタイム時に読み込まれます。

import std "io";
import std "time";

native fn calculateSha256(input: string): string {
    go {
        import "crypto/sha256"
        import "encoding/hex"
        h := sha256.Sum256([]byte(input))
        return hex.EncodeToString(h[:])
    }
}

const text = "Tiny runtime speed";
io.println(`SHA256: ${calculateSha256(text)}`);

標準ライブラリ

validate (スキーマ検証)

  • データスキーマを定義・強制するための連結可能 API
  • オブジェクト、配列、ユニオン、変換をサポート。
import std "validate";
import std "io";

const userSchema = validate.object({
    username: validate.string().trim().nonempty().min(3).required(),
    age: validate.number().int().positive().default(18),
    tags: validate.array(validate.string()).default([])
});

const result = userSchema.safeParse({ username: "  alice  " });
if result.success {
    io.println(result.data.username); // "alice"
}

url (URL 処理)

  • URL のエンコードとデコーディングに対応。

time (タイマーと計測)

  • 実行遅延、パフォーマンス計測、管理されたタイマーをサポート。
import std "io";
import std "time";

let timer = time.interval(1000, fn() { io.println("Tick"); });
time.sleep(5000);
timer.cancel();

array (ネイティブ演算子)

  • 配列操作用のネイティブ演算子を内蔵。
  • find
    ,
    filter
    ,
    map
    ,
    reduce
    ,
    sort
    ,
    flat
    ,
    findIndex
    を備えます。

http (Web サーバー/クライアント)

  • 高スループットな完全並行 Web サーバーおよびクライアント。
  • ルートベースのマルチプレキシングと最適化された JSON シリアライゼーションをサポート。
import std "http";
import std "io";

let server = http.server(8080);

server.get("/users/:id", fn(req: http.RequestObject) {
    return http.json({
        id: req.params["id"],
        query: req.query
    });
});

io.println("Web server listening on port 8080");
server.start();

ui (WebView デスクトップアプリ)

  • HTML/CSS/JS を使用した軽量デスクトップコンテナ。
  • Tiny 関数との直接バインディングが可能。
import std "ui";

const win = ui.new(true);
win.setTitle("Tiny UI");
win.setSize(500, 400);

win.callback("registerClick", fn(arg) { return "Click registered"; });
win.setHtml("<h1>Hello Tiny</h1>");
win.run();

desktop (OS オートメーション)

  • キーボード、マウス、クリップボードの相互作用を自動化するためのネイティブインターフェースラッパー。
import std "desktop";

desktop.moveMouseSmooth(800, 600);
desktop.click();
desktop.type("Tiny Automation");

ツールとエコシステム

コマンドラインインターフェース (CLI)

  • tiny run <file>
    : スクリプトのコンパイル・実行(未変更ファイルはキャッシュを跳过)。
  • tiny pack <file> -o <binary>
    : バイトコードと VM ランタイムを単一ネイティブバイナリにバンドル。
  • tiny dist <file> -o <dir>
    : アプリケーション、コンパイル済みプラグイン、アセットをパッケージ化。
  • tiny lsp
    : 内蔵言語サーバーの起動。

内蔵言語サーバー (LSP)

VS Code などとの統合には

tiny lsp
を実行してください。主な機能:

  • インポートの整理: 自動ソートと未使用インポートの削除。
  • セマンティック回復: 構文エラー時でも診断情報を継続提供。
  • 型の狭化: フローベースの型推論(例:null チェック後の型判定)。
  • リファクタリングの安全性: オブジェクトキーや変数の正しいシンボル解決。

同じ日のほかのニュース

一覧に戻る →

2026/06/21 7:36

2022 年以前の書籍

## Japanese Translation: 著者は 2022 年以降に出版された書籍、特に未知の作家によるものに過小評価する個人的な無意識のバイアスを認め、すべての文字が人間によって入力され、編集され、校正されたためにより重みがあると信じる古いタイトルの作品を好むと告白している。大規模言語モデルは効果的なコーディングツールのことを認める一方で、このバイアスに不安を感じながらも、それが社会に対して新しい技術の悪影響や特定の業界の更新事項に関連すると見なすわけではない。その作品では、執筆、印刷、新聞、ラジオ、テレビ、インターネットといった歴史的なメディア形式に触れているが、これらを技術的出来事と結びつけてはいない。検証の主張や IT ニュースは提示されていない。著者はこの傾向に対する既知の解決策がないこと述べており、それを不要かもしれないとして結論づけ、その省察を広範な技術導入やビジネスへの影響に対する批判ではなく、個人の読書習慣についての評論として位置づけている。 ## Text to translate: The original summary is strong and accurate; only a minor adjustment to phrasing can make it slightly more direct. Here is an improved version: The author admits a personal subconscious bias that undervalues books published after 2022, especially by unknown writers, preferring older titles on the belief they carry more weight because every word was typed, edited, and proofread by humans. While acknowledging that large language models are effective coding tools, the writer feels uneasy about this bias but does not equate it with concerns that society is being negatively affected by new technology or tie it to specific industry updates. The piece references historical media forms—writing, printing, newspapers, radio, television, and the Internet—without linking them to technical events. No verification claims or IT news are presented. The author states there is no known solution to this inclination and concludes it may not need one, framing the reflection as a commentary on individual reading habits rather than a critique of broader technological adoption or business impacts.

2026/06/21 5:30

愛の物語

## Japanese Translation: このテキストは、「カップルが出会い、ともに生き抜く方法」調査(2017 年、2020 年、2022 年)のデータが表示されている方法を明確にし、誤解を防ぐことを目的としています。主なメッセージは、アイコンチャートは三つの波浪すべてに登場した参加者のみを表示し、各参加者は 1 つのアイコンで表されることです。これらの視覚化は個人を表しているものの、基礎となる分析は人口全体に基づいて行われ、統計的な正確さを確保するために人口特性に基づく加重されたサブセットを使用します。したがって、チャート内の正確な数は加重分析の合計数と一致しない場合があります。個々のアイコンは純粋に視覚化のための目的であり、視覚化は特定の人口統計ではなく一般的な結果を反映しています。より深い方法論的洞察や将来の更新については、Alvin のニュースレターへの購読を推奨します。このデータセットは Stanford University Libraries(https://data.stanford.edu/hcmst2017 でアクセス可能)を通じて Rosenfeld, Thomas, Hausen(2023)から取得されており、視覚化に使用された粘土アニメーションアイコンの作成に際し Amanda Sakuma 氏に特別感謝いたします。

2026/06/21 2:01

SMPTEが標準をフリーアクセス可能に

## Japanese Translation: 以下のものは、日付、場所、ドキュメントの完全な範囲、特定のリーダーの名前、そして企業サポーターの文脈など、欠落していた具体的な詳細を統合しつつ、読みにくさを保ちながら改訂されたバージョンです。 ## サマリー(改訂版) **ニューヨーク州、ホワイトプレインズ、2026 年 6 月 17 日** — SMPTE は、アクセシビリティにおける歴史的な転換を発表しました。同社全体の標準カタログ(発効済み標準、推奨プラクティス、エンジニアリングガイドライン、登録開示文書(RDD)、および今後のリリースをすべて含む)は、今やグローバルなメディアテクノロジーコミュニティ全体に対して無料で利用可能となりました。SMPTE 社長のリッチ・ウェルシュ氏は、この決断が 110 年にわたる進化の後に、将来の相互運用性を確保するために不可欠であると述べました。この戦略的措置は、AI の真正性、コンテンツの出所、IP ベースのワークフローなど、業界全体を変革する課題に直接対処しています。本イニシアチブは、GitHub ベースのワークフローを採用し、構造化された HTML 制作への移行を行うという広範な近代化プロジェクトの一部です。SMPTE 標準副本代表のレイモンド・ヨン氏によると、これらの障壁を取り除くことで透明性が支えられ、業界のニーズに応えるスピードが向上します。一方、ディレクターのスティーブ・LLAMB は、アクセシビリティの向上が誤情報の削減に寄与し、主要テクノロジー大手全体で一貫した実装を可能になると強調しました。このオープンアクセス図書館は、ダイヤモンドレベルの企業会員(Amazon AWS、Apple、Blackmagic Design、CBS/Paramount Global、Disney、Dolby、Fox、Google、Ross Video、Sony、Telstra)によって支えられています。この進化を持続させ、さらなるイノベーションを育成するため、SMPTE は創設者支援者認識プログラムを開始しました。2026 年 12 月 31 日までに 1 万ドル以上の寄付を行う団体は、「創設者支援者」として公的に認定されます。すべてのドキュメントは、次世代メディアエコシステムにおける透明性を推進するために、SMPTE スタンダードズライブラリを通じてアクセス可能です。 # チェックポイント検証 - **主要なキーポイントはすべて反映されていますか?** はい(日付/場所を追加し、ドキュメントの完全な範囲を記載、名前を特定されたリーダーが引用され、ダイヤモンドメンバーの完全リストが含まれています)。 - **テキストに含まれていない推測を含んでいますか?** いいえ、提供された事実に基づいて物語を展開しています。 - **メインメッセージは明確ですか?** はい、閉鎖からオープンへのアクセシビリティ転換が中心的なテーマとなっています。 - **曖昧な表現がありますか?** 「ダイヤモンドレベル」「特定のドキュメント種類」などの具体的な定義を追加することで軽減されました。