อ่าน 3 นาที
libffi
libffi เป็น ไลบรารี อินเทอร์เฟซฟังก์ชันภายนอก มันมี อินเท อร์เฟซภาษา C สำหรับเรียกใช้ ฟังก์ชัน ที่คอมไพล์แบบเนทีฟ โดยให้ข้อมูลเกี่ยวกับ ฟังก์ชัน เป้าหมาย ในขณะ รันไทม์...
libffi
| libffi | |
|---|---|
| นักพัฒนา | แอนโทนี่ กรีน |
| ปล่อย | 7 ตุลาคม 2539 |
| เวอร์ชันเสถียร | 3.6.0 [ 1 ] |
| เขียนเป็น | C , ภาษาแอสเซมบลี |
| ระบบปฏิบัติการ | ระบบปฏิบัติการคล้าย Unix , Microsoft Windows , OS X , iOS , ระบบฮาร์ดแวร์โดยตรง |
| พิมพ์ | ไลบรารีรันไทม์ |
| ใบอนุญาต | ใบอนุญาต MIT [ 2 ] |
| เว็บไซต์ | sourceware.org/libffi/ |
| ที่เก็บข้อมูล |
|
libffiเป็น ไลบรารี อินเทอร์เฟซฟังก์ชันภายนอกมันมี อินเท อร์เฟซภาษา Cสำหรับเรียกใช้ฟังก์ชัน ที่คอมไพล์แบบเนทีฟ โดยให้ข้อมูลเกี่ยวกับฟังก์ชัน เป้าหมาย ในขณะรันไทม์แทนที่จะเป็นใน ขณะ คอมไพล์นอกจากนี้ มันยังใช้งานฟังก์ชันตรงกันข้ามได้ด้วย กล่าวคือ libffi สามารถสร้างพอยเตอร์ไปยังฟังก์ชันที่สามารถรับและถอดรหัสอาร์กิวเมนต์ใดๆ ก็ได้ที่กำหนดไว้ในขณะรันไทม์
libffi มักถูกใช้เป็น เทคโนโลยี เชื่อมต่อระหว่าง การใช้งานภาษาโปรแกรม แบบคอมไพล์และแบบอินเตอร์พรีเตอร์นอกจากนี้ libffi ยังอาจถูกใช้เพื่อสร้างปลั๊กอินโดยที่ลายเซ็นฟังก์ชันของปลั๊กอินนั้นไม่เป็นที่รู้จักในขณะที่สร้างแอปพลิเคชันหลัก
ผู้ใช้ที่โดดเด่น ได้แก่Python , Haskell , Dalvik , F-Script , PyPy , PyObjC , RubyCocoa , JRuby , Rubinius , MacRuby , gcj , GNU Smalltalk , IcedTea , Cycript , Pawn , Java Native Access , Common Lisp (ผ่าน CFFI), Racket , [ 3 ] Embeddable Common LispและMozilla [ 4 ]
บนMac OS Xนั้น libffi มักใช้ร่วมกับBridgeSupportซึ่งให้คำอธิบายอินเทอร์เฟซของเฟรมเวิร์กที่ไม่ขึ้นกับภาษาโปรแกรม และ Nu ซึ่งเชื่อมโยง การเข้าถึง Objective-C โดยตรง จากLisp
libffi ได้รับการพอร์ตไปยังแพลตฟอร์มต่างๆ อย่างแพร่หลาย และเผยแพร่ภายใต้ใบอนุญาต MIT
พื้นหลัง
แม้ว่าภาษาโปรแกรม C จะแพร่หลายในหลายแพลตฟอร์ม แต่รูปแบบการเรียกใช้ฟังก์ชันในโค้ดเครื่อง – ข้อกำหนดการเรียกใช้ฟังก์ชัน – นั้นแตกต่างกันไป เมื่อต้องการโหลดซับรูทีนแบบไดนามิกในระหว่างการทำงาน จำเป็นต้องมีความรู้เกี่ยวกับข้อกำหนดเหล่านี้
libffi มีความรู้เกี่ยวกับข้อกำหนดการเรียกฟังก์ชันบนแพลตฟอร์มต่างๆ (การรวมกันของโปรเซสเซอร์และระบบปฏิบัติการ) API ภาษา C ของ libffi ซึ่งใช้ร่วมกันในทุกเวอร์ชันของ libffi โดยไม่คำนึงถึง แพลตฟอร์ม จะช่วยลดความซับซ้อนของการโหลดโค้ดบนแพลตฟอร์มต่างๆ นอกจากฟังก์ชันทั่วไปแล้ว ยังรองรับฟังก์ชันแบบ variadic ใน รูปแบบภาษา C อีก ด้วย
ข้อกำหนดการเรียกฟังก์ชันแบบ C ไม่ได้ใช้เฉพาะในภาษา C เท่านั้น เนื่องจากมีโค้ดที่เขียนด้วยภาษา C อยู่เป็นจำนวนมาก ภาษาโปรแกรมคอมไพล์รุ่นใหม่ส่วนใหญ่จึงอนุญาตให้เขียนและเรียกฟังก์ชันตามข้อกำหนดดังกล่าวได้เช่นกัน ด้วยเหตุนี้ libffi จึงสามารถโต้ตอบกับฟังก์ชันบางฟังก์ชันที่เขียนด้วยภาษาเหล่านั้นได้ด้วย
ประวัติศาสตร์
libffi ซึ่งเดิมพัฒนาโดย Anthony Green ได้รับแรงบันดาลใจจากไลบรารี Gencall ของSilicon Graphics Gencall พัฒนาโดย Gianni Mariani ซึ่งในขณะนั้นทำงานอยู่ที่SGIโดยมีจุดประสงค์เพื่ออนุญาตให้เรียกฟังก์ชันโดยใช้ที่อยู่ และสร้างเฟรมการเรียกสำหรับข้อกำหนดการเรียกเฉพาะ ( MIPS O32) Anthony Green ได้ปรับปรุงแนวคิดและขยายไปสู่สถาปัตยกรรมและข้อกำหนดการเรียกอื่นๆ และเปิดเผยซอร์สโค้ดของ libffi
การรับเลี้ยงบุตรบุญธรรม
ไลบรารี libffi มีประโยชน์ในการสร้างสะพานเชื่อมระหว่างโค้ดที่ถูกตีความและโค้ดที่ถูกคอมไพล์แบบเนทีฟ ผู้ใช้งานที่โดดเด่นบางราย ได้แก่:
ดี
- libffi-d
- ส่วนเชื่อมต่อกับไลบรารี libffi สำหรับภาษา D ส่วนใหญ่ใช้สำหรับMCI (Managed Compiler Infrastructure)
เอฟ-สคริปต์
- เอฟ-สคริปต์
- สร้างคลาส Cocoa ที่เขียนด้วย F-Script แบบไดนามิก
กิล
- จีเอ็นยู ไกล์
- libffi ถูกใช้ใน Guile เวอร์ชัน 1.9.8 ขึ้นไป
ฮัสเคลล์
- จีเอชซี
- libffi ถูกนำมาใช้ในการทดสอบ FFI ส่วนใหญ่ที่ดำเนินการโดย GHC ตั้งแต่ปลายปี 2009 เป็นต้นมา
ชวา
- โอเพ่นเจดีเค
- การใช้งาน Java Platform Standard Edition แบบโอเพนซอร์สใช้ไลบรารี libffi เพื่อเชื่อมต่อระหว่างตัวแปลภาษาและโค้ดเนทีฟสำหรับการพอร์ตแบบ Zero-Assembly
- Java Native Access (JNA)
- วิธีการเรียกใช้โค้ดเนทีฟจาก Java โดยไม่ต้องใช้ JNI
- จีซีเจ
- ไลบรารีรันไทม์สำหรับคอมไพเลอร์ GNU สำหรับภาษาการเขียนโปรแกรม Java ใช้ libffi ในการจัดการการเรียกไปมาระหว่างโค้ดที่ถูกตีความและโค้ดที่คอมไพล์แบบเนทีฟ gcj เป็นส่วนหนึ่งของ GCC ซึ่งเป็นชุดคอมไพเลอร์ของ GNU
โค้ด JavaScript
- เจเอสโคโคอา
- เรียกใช้โค้ด Objective-C จาก JavaScript บน Mac OS X และ iPhone (ผ่านทางพอร์ต libffi-iphone)
- โมซโมซา
- libffi ถูกใช้ใน ไลบรารี js-ctypes (เดิมชื่อ ctypes.jsm) เพื่อเรียกฟังก์ชัน C ภายใน โค้ด JavaScript (มีให้ใช้งานในแอปพลิเคชันXULRunner ส่วนขยาย Firefoxเป็นต้น) [ 5 ]
- โหนด-เอฟฟี่
- ส่วน เสริม Node.jsสำหรับโหลดและเรียกใช้ไลบรารีแบบไดนามิกจาก JavaScript
ลิสป์
- ซีเอฟฟี่-ลิบเอฟฟี่
- ไลบรารีอินเทอร์เฟซฟังก์ชันต่างประเทศมาตรฐานสำหรับ Common Lisp CFFIประกอบด้วยระบบ cffi-libffi เพื่อรองรับการส่งผ่านและการส่งคืนอาร์กิวเมนต์โครงสร้างโดยค่า
- พิกซี่
- pixie ( ภาษา Lisp ที่ได้รับแรงบันดาลใจ จาก Clojure ) ใช้ libffi เป็นกลไกอินเทอร์เฟซฟังก์ชันภายนอกเริ่มต้น
เพิร์ล
- FFI::ดิบ
- ห่อหุ้ม libffi ไว้บางๆ
- FFI::แพลทิปัส
- ไลบรารี libffi เวอร์ชันใหม่ที่ใช้งานสะดวกกว่าเดิม
ไพธอน

- ซีพีไพธอน
- การใช้งานภาษาโปรแกรม Python ที่เป็นที่นิยมและแพร่หลายที่สุดโดยทั่วไปจะใช้ไลบรารี libffi ซึ่งเป็นส่วนหนึ่งของไลบรารี ctypes มาตรฐาน
- ไพโอบเจซี
- เรียกใช้โค้ด Objective-C จาก Python บน Mac OS X
แร็กเก็ต
- แร็กเก็ต
- เรียกใช้โค้ด C จากการใช้งาน Scheme ที่ได้รับความนิยมนี้
ทับทิม
- ซอ
- ตัวห่อหุ้ม libffi ในไลบรารีมาตรฐานของ Ruby
- รูบี้-เอฟเอฟไอ
- ส่วนขยาย Foreign Function Interface สำหรับ Ruby
- รูบี้โกโก้
- เรียกใช้โค้ด Objective-C จาก Ruby บน Mac OS X
ลิงก์ภายนอก
สรุปเนื้อหา
ข้อมูลสำคัญจากบทความ
ข้อมูลสำคัญเกี่ยวกับ libffi
libffi เป็น ไลบรารี อินเทอร์เฟซฟังก์ชันภายนอก มันมี อินเท อร์เฟซภาษา C สำหรับเรียกใช้ ฟังก์ชัน ที่คอมไพล์แบบเนทีฟ โดยให้ข้อมูลเกี่ยวกับ ฟังก์ชัน เป้าหมาย ในขณะ รันไทม์...
พื้นหลัง
แม้ว่าภาษาโปรแกรม C จะแพร่หลายในหลายแพลตฟอร์ม แต่รูปแบบการเรียกใช้ฟังก์ชันในโค้ดเครื่อง – ข้อกำหนดการเรียกใช้ฟังก์ชัน – นั้นแตกต่างกันไป เมื่อต้องการโหลดซับรูทีนแบบไดนามิกในระหว่างการทำงาน จำเป็นต้องมีความรู้เกี่ยวกับข้อกำหนดเหล่านี้
ประวัติศาสตร์
libffi ซึ่งเดิมพัฒนาโดย Anthony Green ได้รับแรงบันดาลใจจากไลบรารี Gencall ของ Silicon Graphics Gencall พัฒนาโดย Gianni Mariani ซึ่งในขณะนั้นทำงานอยู่ที่ SGI โดยมีจุดประสงค์เพื่ออนุญาตให้เรียกฟังก์ชันโดยใช้ที่อยู่...
การรับเลี้ยงบุตรบุญธรรม
ไลบรารี libffi มีประโยชน์ในการสร้างสะพานเชื่อมระหว่างโค้ดที่ถูกตีความและโค้ดที่ถูกคอมไพล์แบบเนทีฟ ผู้ใช้งานที่โดดเด่นบางราย ได้แก่: