Jank:C++ とシームレスに連携するネイティブ Clojure ドायレクト

2026/10/23 8:56

Jank:C++ とシームレスに連携するネイティブ Clojure ドायレクト

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

要約▶

Japanese Translation:

Jank は、ゲーム開発に特化して設計された Clojure の専用ダイアレクタであり、コードブリッジ、手動登録、マーシャリングを必要とすることなく、ネイティブ C++ とシームレスな相互運用性を提供します。従来のアプローチとは異なり、Jank は開発者が機能的な Clojure コードの横に、高パフォーマンスな C++ ロジックを直接記述することを可能にし、LLVM ベースのフロントエンドである Clang を活用して、REPL 駆動のワークフロー内でのオンザフライコンパイルをサポートするインタラクティブな JIT コンパイラを実現します。このアーキテクチャにより、標準およびサードパーティ製の C++ ヘッダーの無効化なく含めることが可能となり、RAII、テンプレート、仮想関数、例外、オーバーロード解決といった高度な機能を利用する際にゼロのボーilerplate で動作します。プロジェクトは Leiningen モデルを用いて依存関係を管理し、ソースからライブラリを解決またはビルドできる豊富なネイティブビルドシステムをサポートしており、特に ImGui や GLFW を使用した例で示されるように、要求の多いグラフィックスニーズに特に適しています。Clojure の高速な反復を可能にする強力なマクロ機能と、堅牢な C++ 型システムを組み合わせて、Jank はコールバックオーバーヘッドを排除し、プロトタイプから生産への移行を簡素化し、機能的なロジックがネイティブ速度と対峙する高パフォーマンスアプリケーションの構築をチームに可能にし、開発者の生産性やアーキテクチャ的な柔軟性を損なうことなく実現します。

本文

Jank:C++ との完全な相互運用性を備えた Clojure 方言

Jank は、C++ とシームレスに連携するネイティブの Clojure 方言です。Java へのブリッジではなく、C++ の力をそのまま Clojure で活用することを目的としています。

主要な特徴

  • C++ 機能の完全なサポート: C++ のテンプレート、仮想関数、例外処理、オーバーロード解決、RAII がそのまま動作します。
  • 即座の開発開始: 余計な設定なしにヘッダーファイルを読み込むだけで利用可能。
  • 堅牢な設計: Clang ベースの C++ JIT コンパイラを搭載し、インタラクティブな REPL 駆動型の開発環境を提供。

コード例:C++ ライブラリの即座の使用

(ns my.app.filesystem
  (:include "boost/filesystem.hpp")
  (:refer-global :rename {boost.filesystem.file_size file-size}))

(defn file-info [file-path]
  (try
    (let [bytes (file-size (cpp/cast std.string file-path))]
      {:path file-path
       :size bytes})
    (catch boost.filesystem.filesystem_error e
      {:path file-path
       :error (.what e)})))

(file-info "/etc/passwd")
; {:path "/etc/passwd", :size 4025}

(file-info "/root/.bash_history")
; {:path "/root/.bash_history"
;  :error "boost::filesystem::file_size: Permission denied [system:13]: \"/root/.bash_history\""}

C++ ソースコードの直接実行とコンパイル

Jank は、必要に応じて

:jank
リード条件付きを使用し、以下の機能を備えています:

  • 任意の C++ ソースコードを直接含める
  • 任意の C または C++ ライブラリへのリンカー適用
  • C++ の型システムを活用
  • C++ へそのままコンパイルが可能(Clojure として実行可能)

ツールチェーンとプロジェクト管理

Leiningen ベースの環境

Jank は Leiningen をベースに構築されており、豊富なネイティブビルドシステムを提供します。

  • プロジェクトに C/C++ の依存関係を簡単に追加できる
  • 自動検出またはソースからのビルドに対応
  • 新しい依存関係の追加は一行の変更で可能

開発環境と最適化

Jank は LLVM ベースの JIT ランタイムを内蔵し、C++ コードを実際のニーズに応じて即時コンパイルします。

プロジェクト構成例(画像処理ライブラリ)

(defproject imgui+glfw "0.1-SNAPSHOT"
  :dependencies [[org.jank-lang.commons/imgui-glfw-sys "2026.06-6"]
                 [org.jank-lang.commons/imgui-opengl2-sys "2026.06-6"]
                 [org.jank-lang.commons/gl-sys "2026.06-1"]]
  :plugins [[org.jank-lang/lein-jank "2026.06-2"]]
  :middleware [leiningen.jank/middleware]
  :main imgui+glfw.main
  :profiles {:base {:jank {:target-dir "target/debug"
                           :optimization-level 0}}
             :release {:jank {:target-dir "target/release"
                              :optimization-level 3}}})

ゲーム開発への適合性

Jank はゲーム開発において特に優れています。

  • 関数的アプローチ: 不変なデータ構造と REPL 駆動型開発を標準で提供
  • ハイブリッドパフォーマンス: Clojure の機能性を保ちつつ、必要に応じて C++ にアクセスして追加のパフォーマンスを得る
  • 煩雑な設定なし: ブリッジ、手動関数登録、型のマーシャリング、コールバックの記述は一切不要

コード例:ImGui と GLFW の連携

(ns imgui+glfw.main
  (:include "GLFW/glfw3.h"
            "imgui.h" "imgui_impl_glfw.h" "imgui_impl_opengl2.h"))

(defn -main []
  (cpp/glfwInit)

  (let [window* (cpp/glfwCreateWindow 400 300
                                      "jank"
                                      cpp/nullptr cpp/nullptr)]
    (cpp/glfwMakeContextCurrent window*)
    (cpp/ImGui.CreateContext)
    (cpp/ImGui_ImplGlfw_InitForOpenGL window* true)
    (cpp/ImGui_ImplOpenGL2_Init)

    (while (cpp/! (cpp/glfwWindowShouldClose window*))
      (cpp/glfwPollEvents)
      (cpp/ImGui_ImplOpenGL2_NewFrame)
      (cpp/ImGui_ImplGlfw_NewFrame)
      (cpp/ImGui.NewFrame)

      (when (cpp/ImGui.Begin "jank")
        (cpp/ImGui.Text "Hello, jank and imgui!"))
      (cpp/ImGui.End)

      (cpp/ImGui.Render)
      (cpp/ImGui_ImplOpenGL2_RenderDrawData (cpp/ImGui.GetDrawData))
      (cpp/glfwSwapBuffers window*))

    (cpp/glfwTerminate)))

同じ日のほかのニュース

一覧に戻る →

2026/10/23 8:45

Docker は変だ

## Japanese Translation: 本文は、主に Linux コンテナが特定のコア機能を利用して孤立化されたプロセスであり、仮想マシンとは異なること、また Docker がイメージをフォルダとして管理することを明確にしています。完全な仮想化と異なり、コンテナは隔離にはネームスペースを用い、リソース管理には cgroups を用いて、管理されたディレクトリ内でバイナリを直接実行します。重要な技術的詳細として、Go で記述される `runc` ランタイムがあり、これは初期システムコールの処理に C モジュールを使用して Linux カーネルとインターフェースする必要があります。Go は `fork` などの特定の機能へのネイティブサポートを持っていないため、不足している振る舞いを近似させるために `/proc/self/exe` などのワークアラウンドが必要です。さらに、標準的な Linux カーネル API は通常ルートの権限を必要とするため、Docker デモンはデフォルトで昇権限(elevated permissions)で動作します。これを解決するためには、ルートレスコンテナランタイムは、通常ルートベースのセットアップが提供する機能を複製するために、ユーザースペースのネットワーキングスタックを再構築する必要があります。結局のところ、これらのアーキテクチャ的な制約を理解することは、安全なルートレス環境を管理するユーザーにとって不可欠であり、不要な権限昇格を避けながらシステム安定性を維持する互換性のあるインフラを設計する企業にとっても重要です。

2026/10/23 7:54

LLM が大規模な正式なソフトウェア検証の実現を可能にしています

## Japanese Translation: 研究者は、大規模言語モデル(LLM)の Claude を用いて、100 以上のオープンソースソフトウェアライブラリに対して前例のない規模での形式的検証を実行し、歴史的なマイルストーンを達成しました。Theorem との協力により、プロダクション向けソフトウェアに対する初の大規模 AI 主導の形式的検証として、アセンブリ(RISC-V)レベルで実装されたコードが検証されました。その結果、64 MB 未満の入力に対して、123 のライブラリの実行可能アーティファクトがメモリ安全性エラーやフェイルするアサートなしに正常終了することが証明されました。この達成には、Claude が Rocq コードを約 1.8 億行生成し、239 のエントリポイントを対象にクラッシュしない仕様を証明するとともに、従来のフォージングで検出されなかった深刻なバグを特定・修正する作業が行われたことが寄与しました。具体的には、カウンタのアンダーフローや境界外読み取りといった複雑な問題を含むものが含まれます。検証の対象は Linux でコンパイルされた RISC-V 命令であり、ユーザーが信頼しなくてもよいのは既知のハードウェア/ソフトウェアの数学モデル、定理ステートメント自体、および Rocq の証明チェッカーのみです。基本的安全性を超えて、このアプローチはデータ圧縮の精度やアルゴリズムの正しさ(例:red-black トリーの再平衡)といった高位のプロパティも検証しました。チームは共有作業空間戦略を採用し、証明の再利用によりトークン使用量を 17%削減するものであり、Mathlib のような数学ライブラリの成長に類似しています。形式的に検証済みであっても、形式仕様が実態と異なったり機械モデルが現実と異なる場合(例:x86/ARM システム上)には、完全なバグの不在を保証しないことに留意する必要があります。本プロジェクトでは公衆の検討のために一部の証明をリリースしており、AI 支援による検証をソフトウェア開発ワークフローでの標準へと導く道筋を用意しています。

2026/10/22 23:32

Quad9(DNS レゾルバー)がフランスから退出します

## Japanese 訳: 2026 年 11 月 24 日より、Quad9 はフランスのユーザーに対して、無料のサイバープロテクトおよび一般的なサービスを提供を永久に停止いたします。この決断は、beIN が提起した重大な訴訟において Quad9 に不利となるフランス裁判所の判断を受けたものです。beIN は、特定のドメイン名の再帰的 DNS 解決をブロックすることが、視聴覚的な権利を保護するために必要であると主張しました。裁判所は、違反が完了するまで(11 月 14 日)の金融ペナルティを約 580,000 �ーロから毎日上記 1,000 ユーロに減額しましたが、Quad9 は再帰的 DNS 解決が中立かつ受動的なサービスであり、応答を変更することはそのミッションであるプライバシー、セキュリティ、そしてインテグリティに違反するとする理由をもってこれに従うことができないと述べています。さらに、Quad9 の無料サービスには登録や身元証明は不要であり、ユーザーと管轄区域を関連付けるデータベースを持たないため、geoIP ベースの管轄区域マッピングは技術的に不可能です。フランス裁判所の要求を満たすためにグローバルなブロックを実施することは、French の法律を全世界のユーザーに適用することを意味し、Quad9 にとって許容されない越境的な先例となります。以前にも地理的な IP ブロックの実施を試みた際(例:2021 年から 2023 年にかけてドイツ)、原告が VPN を介してブロックを回避したために裁判所に対する軽蔑罪として罰金が科されるなどしました。Quad9 に対して数百のドメイン名のブロックを求めて進行中の訴訟が約 20 件あり、累積的な法的リスクは大きいです。上訴は進行中ですが、Quad9 は予定通り撤退を進めることにします。この動きにより、国家機関(例:DINUM, EDF, SNCF)、研究ネットワーク(RENATER)、大学、医療提供者、および民間企業を含む何百万人ものフランスのユーザーが、サイバー脅威からほぼ 9 年間も重要な保護を失うことになります。Quad9 は、将来、監督なしで民間企業が DNS コンテンツフィルタリングを自動化することを可能にする法律に対して警告を発し、市民に対し、日常のドメイン名lookup が刑事犯罪ではないことを明確化することを目指しています。

Jank:C++ とシームレスに連携するネイティブ Clojure ドायレクト | そっか~ニュース