プログラミング
Show HN: Nimic – AOTコンパイルを備えたシステム言語としての純粋なPython
Show HN: Nimic – Pure Python as a systems language with AOT compilation (github.com)
要約
Nimicは、Pythonのサブセット(ドメイン固有言語)を使用してAOT(事前)コンパイル可能なコードを記述し、Pythonを離れることなくCレベルのパフォーマンスを達成することを目指す純粋なPythonモジュールです。ctypesモジュールを基盤とし、Nimプログラミング言語にトランスパイルされることで、ネイティブな動作とPythonの記述性を両立させています。これにより、Python開発者は低レベルのシステムプログラミングにおいて高いパフォーマンスを得ることが可能になります。
全文翻訳
Nimic Nimicは、Pythonのサブセット(ドメイン固有言語)でAOT(事前)コンパイル可能なコードの記述を容易にする純粋なPythonモジュールであり、Pythonを離れることなくCレベルのパフォーマンスを得ることを目指しています。ctypes組み込みモジュールに基づいており、ネイティブ型、ポインタ、およびそれらに対する操作のエミュレーションを含み、ディスパッチ、演算子オーバーロード、およびテンプレートを実装しています。NimicはNimプログラミング言語に密接に従っており、nimicコードはNimコードにトランスパイルされます。重要な原則は、nimicコードはネイティブに実行され、同等のNimコードにトランスパイルされる有効なPythonコードであるということです。
Module Architecture nimic/
├── ntypes.py — 公開API: 型システム + Nimキーワード/組み込みシムを再エクスポート
├── ntypesystem.py — コア型システム (Object, NScalar, seq, dispatch, distinct, converter)
├── transpiler.py — ASTベースのPython → Nimソースコードトランスパイラ
├── inliner.py — テンプレート関数インライン化 (@template, @template_expand)
├── ncode/ — Nim定義 (pydefs.nim, pystd/)
├── nimpy/ — Pythonライブラリ生成用API
├── std/ — Nim標準ライブラリ用Pythonシム (math, options, os, paths, strformat, ...)
└── system/ — Nimシステムモジュール用Pythonシム (ansi_c)
ntypesystem.py — コア型システム
低レベルメモリから高レベル抽象化まで層別に整理されています:
層 クラス 目的
メモリ Ntype, NTypeRegistry 値セマンティクスを持つctypes-backedバッファ
スカラー NScalar → NInteger / NFloat 算術昇格を伴う固定幅型 (int8..int64, uint8..uint64, float16..float64)
構造体 Object Nimの"object" — アノテーションによるフィールド、ctypes.Structureによってサポート
列挙型 NIntEnum 自動登録付きNim整数列挙型
バリアント Object + match kind: Nimの"case object" — 判別された共用体
コンテナ seq[T], UncheckedArray[T] 拡張可能なシーケンスとポインタインデックス配列
ディスパッチ @dispatch, DispDict, NMetaClass 型アノテーションによるNimスタイルのマルチディスパッチ
モディファイア @distinct, @converter 型の区別と単純な型変換
文字列 string Nim互換の&, %, isEmptyを持つstrサブクラス
ntypes.py — 公開APIとキーワード
ntypesystemのすべてを再エクスポートし、Nimのキーワード/組み込みエミュレーションを追加します:
コンパイラヒント — const, let, var, block, export, alias (Pythonでは何もしないが、Nimではスコープ設定)
参照型 — ref, ptr, mut@ (@演算子は同一性を返す)
列挙型ユーティリティ — succ/pred/ord/nrange/low/highを持つNStrEnum
キャストとメモリ — cast[T](x), sizeof(x), addr(x), unsafe_addr(x)
型エイリアス — SomeInteger, SomeFloat, untyped, char, u64, i64, f64
イテレーション — fields(obj), fields(a, b), countdown(a, b)
コンパイル時 — comptime(x), defined(varname), static
テンプレート — @template, @template_expand (inlinerから再エクスポート)
transpiler.py — Python → Nimトランスパイラ
Nim構文を出力するように_Unparserが拡張された、変更版のCPython ast.pyです。インデント、型定義、関数シグネチャ、演算子、インポート、制御フローに関する30以上の変換ルールを実装しています。
inliner.py — テンプレートインライン化
@template + @template_expand デコレータは、型指定されていないテンプレートに対してASTレベルの関数インライン化を実行し、パラメータ名を呼び出し引数に置き換えます。
DSL規約
Nimicは、Pythonの実行時動作とNimのトランスパイルセマンティクスという二重の意味を持つ特定の規約を備えたPython構文を使用します:
規約 例 目的
with let/var/const: with let: x = vec3(1,2,3) 変数宣言スコープ修飾子
mut @ annotation def f(x: mut @ Vec3): 可変引数 (Nimではvar)
{.pragma.} docstring """{.inline.}""" Nimプラグマ (inline, borrow, noSideEffect)
@dispatch @dispatch def f(x: float64): 引数型によるマルチディスパッチ
@distinct @distinct class Color(Vec3): 識別型 (暗黙の型変換なし)
@template @template def toUV(v): テンプレート (呼び出しサイトでインライン化される)
@converter @converter def toVec3(uv): 暗黙の型変換
<<= dst <<= -src 可変変数への値代入
match kind: match kind: case K.a: ... バリアント型定義 (case object)
comptime(expr) if comptime(cond): コンパイル時評価 (Nimではwhen)
fields(obj) for f in fields(obj): オブジェクトのフィールドをイテレート
with export: with export: mod1, mod2 モジュールの再エクスポート
Projects built with nimic
レイ・トレーサー(ppmからmp4へのコンバーターを含む)
画像データ前処理用Pythonモジュール
Quick Example
from __future__ import annotations
from nimic.ntypes import *
# 構造体定義 (Nim object)
class Vec3(Object):
x: float64
y: float64
z: float64
def __add__(self: Vec3, v: Vec3) -> Vec3:
"""{.inline.}"""
result = Vec3()
result.x = self.x + v.x
result.y = self.y + v.y
result.z = self.z + v.z
return result
# 識別型
@distinct
class Point3(Vec3):
"""{.borrow: `.`.}"""
# マルチディスパッチ
@dispatch
def point3(x: float64, y: float64, z: float64) -> Point3:
result = Point3(Vec3())
result.x = x; result.y = y; result.z = z
return result
# 使用例
with let:
a = point3(1.0, 2.0, 3.0)
b = point3(4.0, 5.0, 6.0)
c = Vec3(a) + Vec3(b)