FFIの基礎:ffi.cdefとffi.load
LuaJITのffiモジュールでCの型を宣言し、共有ライブラリを読み込みます。
「FFIの基礎:ffi.cdefとffi.load」はCoddyKit上の無料Lua Academyレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはLua Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Lua Academyコースには全4レッスンが含まれています。
FFIとは
LuaJITのFFI(Foreign Function Interface)を使うと、Cのラッパーコードを記述せずに、LuaからCライブラリの関数を呼び出したり、Cのデータ構造を直接使用したりできます。
FFIをrequireする
require("ffi")でFFIライブラリを読み込みます。これはLuaJITに組み込まれており、標準のPUC Luaでは利用できません。
local ffi = require("ffi")ffi.cdef:C型を宣言する
ffi.cdef(cDeclarations)はCの宣言を解析し、型と関数シグネチャをFFIから利用できるようにします。実際のコードをコンパイルするのではなく、型情報だけを登録します。
ffi.cdef[[
int printf(const char *fmt, ...);
double sqrt(double x);
typedef struct { int x; int y; } Point;
]]ffi.load:共有ライブラリを読み込む
ffi.load(libname)は共有ライブラリを読み込み、宣言したC関数をフィールドとして持つオブジェクトを返します。
local C = ffi.C -- access to libc on POSIX
local m = ffi.load("m") -- libm
print(m.sqrt(2.0)) -- 1.414...libcの関数に直接アクセスする
POSIXシステムでは、ffi.Cを使うと、明示的に読み込まなくても標準Cライブラリのすべての関数にアクセスできます。
ffi.cdef[[ int puts(const char *s); ]]
ffi.C.puts("Hello from C!")ffi.loadのパス
完全なパスまたは標準ライブラリ名を渡します。Linuxでは、libm.soには"m"、pthreadには"pthread"などを使用します。
構造体を宣言する
cdefでCの構造体を宣言し、Luaから割り当ててアクセスします。
ffi.cdef[[
typedef struct { float x, y, z; } Vec3;
]]
local v = ffi.new("Vec3", {1, 2, 3})
print(v.x, v.y, v.z) -- 1.0 2.0 3.0型アノテーションと修飾子
cdefはconst、unsigned、int32_t、uint64_tなど、標準的なCの型をサポートしています。
複数回のcdef呼び出し
ffi.cdefは複数回呼び出せます。重複する宣言は無視されます。通常はライブラリごとに整理します。
プラットフォームの違い
構造体のレイアウトや関数シグネチャは、プラットフォーム(WindowsとLinux、32ビットと64ビットなど)によって異なる場合があります。ffi.osとffi.archを使い、正しいシグネチャを条件付きで宣言してください。
安全性に関する注意
FFIはLuaの型安全性を回避します。誤ったCの宣言は、メモリ破壊、セグメンテーションフォールト、未定義動作の原因になります。必ず実際のCヘッダーと照合して宣言を確認してください。
FFIの基礎に関する質問
ffi.cdefは何をしますか?
まとめ:FFIの基礎
ffi.cdefでCの型や関数を宣言し、ffi.loadで共有ライブラリを読み込みます。ffi.Cを使うとlibcに直接アクセスできます。メモリ破壊を避けるため、宣言が実際のCヘッダーと一致していることを必ず確認してください。
よくある質問
「FFIの基礎:ffi.cdefとffi.load」レッスンは無料ですか?
はい。「FFIの基礎:ffi.cdefとffi.load」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Lua Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Lua Academyコースには全4レッスンが含まれています。
「FFIの基礎:ffi.cdefとffi.load」で何を学びますか?
LuaJITのffiモジュールでCの型を宣言し、共有ライブラリを読み込みます。 ブラウザで直接実行するハンズオンコードでLua Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Lua Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのLua Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/4です。
「FFIの基礎:ffi.cdefとffi.load」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このLua Academyレッスンでコードを書いて実行できますか?
はい。すべてのLua Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- FFIの基礎:ffi.cdefとffi.load
- FFIによるC関数の呼び出し
- FFIにおけるポインター、構造体、配列
- コールバック:Lua関数をCに渡す