0Pricing
Lua Academy · レッスン

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フィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. FFIの基礎:ffi.cdefとffi.load
  2. FFIによるC関数の呼び出し
  3. FFIにおけるポインター、構造体、配列
  4. コールバック:Lua関数をCに渡す
← Lua Academyに戻る