
2026/04/07 0:22
**タイトル:** *Sky ― Elm に触発された、Go へコンパイルされる言語*
RSS: https://news.ycombinator.com/rss
要約▶
Japanese Translation:
SkyはGoバイナリに直接コンパイルされる実験的なプログラミング言語で、Goの実用性とElm風の型推論・関数型設計を融合しています。Sky自体がコンパイラ、CLI、フォーマッタ、言語サーバーをホストし、Node.jsやnpmを必要とせずに約4 MBのネイティブバイナリを生成します。
ビルドパイプラインはソースコードをトークン化し、ASTへ解析、Hindley–Milner型推論を実行、プログラムを中間表現(IR)へ低減、Goコードを出力し、FFIラッパーをコピー、
go mod tidy を実行し、最後に go build でビルドします。FFIの統合ロード、モジュール低減の並列化、文字列結合最適化、インクリメンタルコンパイルキャッシュ、ランタイムホットパス改善(sky_equal ファストパス)などの最適化は速度と効率を重視しています。
Skyはフルスタック開発をサポートします。Go関数を呼び出すFFIバインディングを自動生成(Taskラップ、panic安全)、UIにはTEAアーキテクチャを提供し、Phoenix LiveViewに触発されたサーバ駆動型UIフレームワーク
Sky.Live を備えています。Sky.Live はWebSocketの代わりにServer‑Sent Eventsを使用し、ルーティング、購読(SubTimer、Time.every)、セッションストア(memory/redis/sqlite/postgresql)を含み、Elmの慣習に基づく自動コンポーネント接続機能も備えています。
言語はHindley–Milner型推論、代数的データ型、網羅的パターンマッチング、純粋関数、およびリッチな標準ライブラリ(List, Dict, Json, Html, Css, Task, Http など)を備えています。パッケージマネージャはSkyパッケージ(
sky.toml)とGoパッケージ(go.mod)の両方を扱い、自動的にバインディングを生成し、クリーン、プレフィックス付き、フルパスなどのインポートスタイルをサポートします。
現在の制限点—入れ子ケース式への不完全な対応、型注釈での匿名レコード不足、FFIコールバックラッピングの制限、一部クロスモジュールADTコンストラクタ問題—は将来リリース向けに追跡されています。プロジェクトはMITライセンスで公開されており、例作成、バグ報告、標準ライブラリ改善、
Sky.Live のテストを奨励する貢献ガイドラインが整備されています。
単一言語でエンドツーエンドアプリケーションを書き、効率的なGoバイナリにコンパイルできるようにすることで、Skyは現代の関数型機能と低レベル性能を組み合わせる実用的な道筋を提供します。
本文
実験的 – Sky は現在アクティブに開発中です。API と内部構造は変更される可能性があります。
Sky は Go の実用主義と Elm のエレガンスを融合させた実験的プログラミング言語で、FP コードを書きつつ 1 本の移植可能バイナリを生成できるシンプルなフルスタック言語です。
module Main exposing (main) import Std.Log exposing (println) main = println "Hello from Sky!"
Sky が結合するもの
| Go | Elm | Phoenix LiveView |
|---|---|---|
| 高速コンパイル、単一静的バイナリ、データベース・HTTPサーバー・クラウドSDKなどを網羅した実績のあるエコシステム | Hindley–Milner 型推論、代数型データ、網羅的パターンマッチ、純粋関数、Elm Architecture | DOM diffing、セッション管理、SSE サブスクライブ。クライアント側フレームワーク不要。WebSocket も必要なし |
Sky は Go にコンパイルされます。1 本のバイナリで API サーバー、データベースアクセス、サーバー描画 UI を全て実行できるため、コードベース・言語・デプロイメントアーティファクトは 1 つです。
コンパイラ・CLI・フォーマッタ・LSP はすべて Sky 自身で書かれ、Go にコンパイルされた約 4 MB のネイティブバイナリです。Node.js/TypeScript/npm の依存は一切ありません。コンパイラは 3 世代以上にわたる自己コンパイルで起動します。
Sky が存在する理由
私は Go、Elm、TypeScript、Python、Dart、Java などを長年プロフェッショナルに使用してきました。それぞれに強みがあるものの、シンプルさ・保証力・関数型プログラミング・フルスタック能力・ポータビリティ―すべてを一つの言語で実現できるものはありませんでした。
React/TypeScript フロントエンドと別途バックエンドを構築する際に、境界ごとに異なる型システムや重複モデル、複雑なビルドパイプライン、JS エコシステム特有の「本当に動くか?」という不確実性が生じ、保守コストが初期開発を上回る痛みを経験しました。
そこで Go のツールチェーン(高速ビルド・単一バイナリ・真の並行処理・大規模エコシステム)と Elm の開発体験(コンパイル成功=実行成功、恐れずにリファクタリングできる、アーキテクチャがスケールする)を組み合わせたかった。さらに Phoenix LiveView に触発され、サーバ駆動 UI がフロントエンド/バックエンド分離を完全に排除できることに気づきました―1 つの言語・モデル・デプロイメントで済む。
初期試作は Sky を JavaScript と React エコシステムにコンパイルしていましたが、npm の混乱やバンドル設定、動的型ランタイムの不確実性を抱えることになり、再設計しました。Go をターゲットにし、フロントエンドは Elm の構文と型システム、バックエンドは Go のエコシステムとバイナリ出力で統合し、任意の Go パッケージを安全に呼び出せる FFI バインディングを自動生成しました。
言語開発は通常数年の長期プロジェクトですが、AI 支援(Gemini CLI → Claude Code)によって数週間で実現できました。私は言語仕様・パイプライン・FFI 戦略・Live Architecture を設計し、AI ツールが単独では不可能だった高速反復をサポートしました。
Sky は「制限なし」を意味します。実験的で意見のはっきりしたものですが、もしあなたのワークフローに響くならぜひ教えてください。
目次
- クイックスタート
- 言語機能
- モジュール
- 型
- 関数
- パターンマッチ
- データ構造
- 演算子
- 制御フロー
- Go 連携 (FFI)
- TEA アーキテクチャ
- 標準ライブラリ
- Sky.Live
- パッケージ管理
- sky.toml リファレンス
- 依存関係
- ライブラリ公開
- CLI 参照
- ビルドパイプライン
- 型チェッカー
- フォーマッタ
- エディタ統合
- サンプル
- アーキテクチャ
- コンパイラ最適化の旅
- 次回作業 (v1.0)
- 型安全性の旅
- パーサ: インデントベースケーススコーピング
- 型チェッカー: クロスモジュール型解決
- 非網羅的ケース検出
- FFI 境界安全
- ランタイム正確性
- 増分コンパイル
- 制限事項 (v0.7.x)
- コントリビューション
- ライセンス
クイックスタート
インストール
# macOS / Linux curl -fsSL https://raw.githubusercontent.com/anzellai/sky/main/install.sh | sh # カスタムディレクトリにインストール curl -fsSL https://raw.githubusercontent.com/anzellai/sky/main/install.sh | sh -s -- --dir ~/.local/bin # Docker で実行 docker run --rm -v $(pwd):/app -w /app anzel/sky sky --help
前提: Go がインストールされていること(Sky は Go にコンパイルします)。
プロジェクト作成
sky init my-app cd my-app sky run
生成物:
my-app/ sky.toml # プロジェクトマニフェスト .gitignore # Sky 固有の除外ルール src/ Main.sky # エントリポイント
Docker (事前ビルドイメージ)
docker run --rm -v $(pwd)/my-app:/app -w /app anzel/sky sky build src/Main.sky docker run --rm -v $(pwd)/my-app:/app -w /app anzel/sky sky run src/Main.sky
言語機能
モジュール
各ファイルは
module 宣言で始まり、公開項目を列挙します。
module Main exposing (main) module Utils.String exposing (capitalize, trim) module Sky.Core.Prelude exposing (..) # すべて公開
モジュール名は PascalCase とドット区切り。ファイルパスはモジュール名と一致 (
Utils.String は src/Utils/String.sky)。
インポート
import Std.Log exposing (println) # 選択的インポート import Sky.Core.String as String # 別名付き限定 import Sky.Core.Prelude exposing (..) # 全公開 import Github.Com.Google.Uuid as Uuid # Go パッケージ via FFI import Database.Sql as Sql # Go 標準ライブラリ import Drivers.Sqlite as _ exposing (..) # 副作用インポート(Go ドライバ)
Sky.Core.Prelude はすべてのモジュールに暗黙的にインポートされます。
型
Hindley–Milner 推論と型クラス制約を採用。トップレベル定義にはアノテーションが推奨されます。
アノテーション例
add : Int -> Int -> Int add x y = x + y identity : a -> a identity x = x
既定型
| 型 | 説明 | 例 |
|---|---|---|
| 整数 | , |
| 浮動小数点 | , |
| テキスト | , |
| 真偽値 | , |
| 文字 | , |
| 空タプル | |
| 順序付きコレクション | |
| オプショナル値 | , |
| 成功/失敗 | , |
型制約
| 制約 | 対応型 | 用途 |
|---|---|---|
| | 等 |
| | |
| | |
誤った型はコンパイルエラーになります。
代数データ型 (Union Types)
type Maybe a = Just a | Nothing type Result err ok = Ok ok | Err err type Msg = Increment | Decrement | SetCount Int | Navigate Page
コンストラクタは 0 個以上の型付きフィールドを持つことができます。パターンマッチで網羅性チェックが行われます。
レコード
point = { x = 10, y = 20 } point.x { point | x = 99 } { model | count = model.count + 1, name = "Alice" } let { x, y } = point in x + y
タプル
pair = (1, "hello") triple = (True, 42, "yes") let (a, b) = pair in a + 1
関数
すべての関数はカリー化され、部分適用が可能です。
定義例
add x y = x + y greet : String -> String greet name = "Hello, " ++ name \x -> x + 1 \x y -> x + y
部分適用
addTen = add 10 result = addTen 5 -- 15
関数合成
f >> g は g (f x)、f << g は f (g x) を意味します。
Let‑In 式
calculate x = let doubled = x * 2 offset = 10 helper : Int -> Int helper n = n + offset in helper doubled
パターンマッチ
Case 表現
describe : Maybe Int -> String describe value = case value of Just n -> "Got: " ++ String.fromInt n Nothing -> "Nothing here"
リテラル、コンストラクタ、タプル、リスト、レコード、ネストパターン、
as パターンをサポート。網羅性チェックが行われます。
データ構造
リスト
numbers = [1, 2, 3, 4, 5] empty = [] combined = [1, 2] ++ [3, 4] withHead = 0 :: numbers List.map (\x -> x * 2) numbers List.filter (\x -> x > 3) numbers List.foldl (+) 0 numbers List.head numbers -- Just 1 List.length numbers -- 5
辞書
import Sky.Core.Dict as Dict users = Dict.fromList [ ("alice", 1), ("bob", 2) ] Dict.get "alice" users -- Just 1 Dict.insert "charlie" 3 users Dict.keys users -- ["alice","bob"]
演算子
| 演算子 | 説明 | 優先度 |
|---|---|---|
| ` | >` | パイプライン (左) |
| `< | ` | アプリケーション (右) |
| ` | ` | |
| 論理 AND | 3 |
| 比較 | 4 |
| 文字列/リスト連結 | 5 |
| 算術 | 6 |
| 算術 | 7 |
| 関数合成 | 9 |
パイプライン
result = " Hello, World! " |> String.trim |> String.toLower |> String.split " " |> List.head
これは
List.head (String.split " " (String.toLower (String.trim " Hello, World! "))) と等価です。
制御フロー
if‑then‑else
status = if count > 10 then "high" else if count > 5 then "medium" else "low"
if は式であり、両分岐は同じ型を返さなければなりません。
Go 連携 (FFI)
Sky は任意の Go パッケージをインポートできます。コンパイラは安全な
Task ラップ付きバインディングを自動生成し、panic 回復も行います。
Go パッケージのインポート
import Sky.Core.Task as Task -- Go パッケージは Task‑wrapped Sky バインディングが自動生成される import Github.Com.Google.Uuid as Uuid main = Uuid.newString () |> Task.map (\id -> "Generated: " ++ id) |> Task.perform
戻り値マッピング (Go → Sky)
| Go の戻り値 | Sky の戻り値 | 備考 |
|---|---|---|
| | panic 回復付き |
| | エラーは になる |
| | 効果的、失敗し得る |
| | を返す |
, | , | nil 安全 |
| (不透明ハンドル) | ポインタは隠蔽 |
| | スライス → リスト |
| Go 構造体 | 不透明型 | コンストラクタ + ゲッター/セッター |
パニック安全
すべての Go 呼び出しは
defer recover() でラップされ、パニックは Err "panic: …" に変換。
ポインタ安全
プリミティブポインタ (
*string, *int) → Maybe T。構造体ポインタ (*sql.DB) は Db(型名のみ)にマッピングされます。
標準ライブラリ
Sky.Core (プレロード)
| モジュール | 主な関数 |
|---|---|
| Result, Maybe, identity, not, always, fst, snd, clamp, modBy, errorToString, js |
| withDefault, map, andThen |
| withDefault, map, andThen, mapError, toMaybe |
| map, filter, foldl, foldr, head, tail, length, append, reverse, sort, range, member, concat 等 |
| split, join, contains, replace, trim, length 等 |
| empty, singleton, insert, get, push, length |
Std (アプリケーションフレームワーク)
- Std.Log: println で出力。
Sky.Live
Phoenix LiveView に触発されたサーバ駆動 UI フレームワーク。Go HTTP サーバー、DOM diffing、セッション管理、SSE サブスクライブ、小さな JS クライアントを生成します。WebSocket は不要です。
module Main exposing (main) import Std.Html exposing (..) ...
設定と環境オーバーライド
| 環境変数 | Sky 変数 |
|---|---|
| |
| (, ) |
| |
優先順位: コンパイル時デフォルト < sky.toml < 環境変数 < .env。
CLI 参照
| コマンド | 説明 |
|---|---|
| 新規 Sky プロジェクト作成 |
| Go にコンパイルしバイナリ生成 |
| ビルドして実行 |
| コンパイルなしで型チェック |
| コードをフォーマット(Elm スタイル) |
| 依存追加、バインディング生成、sky.toml 更新 |
| すべての依存をインストールし欠落バインディング生成 |
| 依存削除、キャッシュクリア |
| 既存モジュールで依存更新 |
エディタ統合
Sky.LSP をサポート。モジュール名やインポートのインデントを正しく扱います。