Lua Academy · บทเรียน

พื้นฐาน FFI: ffi.cdef และ ffi.load

ประกาศชนิดข้อมูล C และโหลดไลบรารีที่ใช้ร่วมกันด้วยมอดูล ffi ของ LuaJIT

บทเรียน 1 จาก 413 ขั้นตอน

พื้นฐาน FFI: ffi.cdef และ ffi.load เป็นบทเรียน Lua Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Lua Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Lua Academy มีบทเรียนทั้งหมด 4 บทเรียน

FFI คืออะไร

FFI (Foreign Function Interface) ของ LuaJIT ช่วยให้คุณเรียกใช้ฟังก์ชันของไลบรารี C และใช้โครงสร้างข้อมูลของ C ได้โดยตรงจาก Lua โดยไม่ต้องเขียนโค้ดตัวห่อหุ้ม C

การเรียกใช้ FFI

โหลดไลบรารี FFI ด้วย require("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 ให้ใช้ "m" สำหรับ libm.so และ "pthread" สำหรับ pthreads เป็นต้น

การประกาศโครงสร้าง

ประกาศโครงสร้าง C ใน cdef จากนั้นจัดสรรและเข้าถึงโครงสร้างเหล่านั้นจาก 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 จริง เพื่อป้องกันหน่วยความจำเสียหาย

เริ่มต้นได้ฟรี

เรียนรู้ Lua ด้วย AI tutor — ฟรี

เขียนและเรียกใช้โค้ดจริงในเบราว์เซอร์ของคุณ รับความช่วยเหลือทันทีจาก AI tutor 24/7 และเรียนรู้ต่อจากที่คุณหยุดบนเว็บหรือในแอป

คอร์ส
40
บทเรียน
159

คำถามที่พบบ่อย

บทเรียน “พื้นฐาน FFI: ffi.cdef และ ffi.load” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “พื้นฐาน FFI: ffi.cdef และ ffi.load” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Lua Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Lua Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “พื้นฐาน FFI: ffi.cdef และ ffi.load”

ประกาศชนิดข้อมูล C และโหลดไลบรารีที่ใช้ร่วมกันด้วยมอดูล ffi ของ LuaJIT คุณปฏิบัติ Lua Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Lua Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน Lua Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน

บทเรียน “พื้นฐาน FFI: ffi.cdef และ ffi.load” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน Lua Academy นี้ได้ไหม

ได้ บทเรียน Lua Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. พื้นฐาน FFI: ffi.cdef และ ffi.load
  2. การเรียกฟังก์ชัน C ผ่าน FFI
  3. พอยน์เตอร์ โครงสร้าง และอาร์เรย์ใน FFI
  4. ฟังก์ชันเรียกกลับ: การส่งฟังก์ชัน Lua ให้ C
← กลับไปที่ Lua Academy