การกำหนดเวอร์ชัน API และความเสถียรของ ABI
วางแผนการกำหนดเวอร์ชันตามความหมาย และรักษาความเสถียรของ ABI ระหว่างรุ่น
การกำหนดเวอร์ชัน API และความเสถียรของ ABI เป็นบทเรียน C++ Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน C++ Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส C++ Academy มีบทเรียนทั้งหมด 4 บทเรียน
ความเข้ากันได้สองแบบที่แตกต่างกัน
ข้อควรพิจารณาด้านความเข้ากันได้มีสองประการ:
- ความเข้ากันได้ของ API — ซอร์สโค้ดที่คอมไพล์กับรุ่น N ได้ จะคอมไพล์กับรุ่น N+1 ได้ด้วย
- ความเข้ากันได้ของ ABI — ไบนารีที่คอมไพล์กับรุ่น N จะทำงานร่วมกับรุ่น N+1 ได้โดยไม่ต้องคอมไพล์ใหม่
เหตุใด ABI จึงสำคัญ
ความเข้ากันได้ของ ABI ทำให้สามารถอัปเกรดไลบรารีแบบใช้ร่วมกันได้โดยไม่ต้องคอมไพล์โปรแกรมที่พึ่งพาใหม่ ซึ่งสำคัญอย่างยิ่งสำหรับชุดแจกจ่าย ปลั๊กอิน และแอปพลิเคชันที่ใช้งานเป็นเวลานาน
สิ่งที่ทำให้ ABI ใช้งานร่วมกันไม่ได้
การเปลี่ยนแปลงที่ดูไม่มีพิษมีภัยหลายอย่างทำให้ ABI ใช้งานร่วมกันไม่ได้:
- เพิ่ม ลบ หรือจัดลำดับสมาชิกข้อมูลใหม่
- เพิ่มหรือลบฟังก์ชันเสมือน
- เปลี่ยนการสืบทอด
- เปลี่ยนพารามิเตอร์ของแม่แบบ
- เปลี่ยนฟังก์ชันแทรก (ในบางกรณี)
การกำหนดเวอร์ชันเชิงความหมาย (SemVer)
สื่อสารความเข้ากันได้ผ่านหมายเลขรุ่น MAJOR.MINOR.PATCH:
- MAJOR — การเปลี่ยนแปลงที่ทำให้ใช้งานร่วมกันไม่ได้
- MINOR — ฟีเจอร์ใหม่ที่ยังเข้ากันได้กับรุ่นก่อนหน้า
- PATCH — การแก้ไข
การระบุรุ่นในส่วนหัว
โปรดใส่มาโครระบุรุ่นไว้ในส่วนหัว
#define MYLIB_VERSION_MAJOR 2
#define MYLIB_VERSION_MINOR 1
#define MYLIB_VERSION_PATCH 3SONAME สำหรับไลบรารีแบบใช้ร่วมกัน
บน Linux ไลบรารีแบบใช้ร่วมกันจะมี SONAME ซึ่งเข้ารหัสรุ่นหลักไว้ ตัวเชื่อมโยงและตัวโหลดใช้ค่านี้เพื่อค้นหารุ่นที่เข้ากันได้
# libmylib.so.2 -> libmylib.so.2.1.3
# SONAME = libmylib.so.2การซ่อนรายละเอียดการใช้งาน
ABI ที่เสถียรจำเป็นต้องไม่นำการใช้งานไว้ในส่วนหัว โปรดใช้ PIMPL (ในบทเรียนถัดไป) เพื่อเพิ่มหรือลบสมาชิกส่วนตัวโดยไม่กระทบต่อผู้ใช้
ABI ของคอมไพเลอร์
ABI ของ C++ แตกต่างกันระหว่างคอมไพเลอร์ (GCC กับ MSVC ใช้การปรับเปลี่ยนชื่อและเค้าโครงคลาสต่างกัน) แจกจ่ายไบนารีที่สร้างด้วยคอมไพเลอร์เฉพาะ หรือยึดติดกับอินเทอร์เฟซ extern "C"
ABI ของไลบรารีมาตรฐาน
ไลบรารีมาตรฐานก็อาจทำให้ ABI ใช้งานร่วมกันไม่ได้เช่นกัน แม้ libstdc++ และ libc++ จะมีแนวทางรองรับก็ตาม หากต้องการความเข้ากันได้ข้ามรุ่น โปรดหลีกเลี่ยงการใช้ชนิดข้อมูลมาตรฐานใน API สาธารณะที่ต้องคงความเสถียร
การเพิ่มฟีเจอร์ให้เข้ากันได้
สิ่งที่เพิ่มได้อย่างปลอดภัย:
- ฟังก์ชันอิสระใหม่
- คลาสใหม่
- ฟังก์ชันสมาชิกที่ไม่ใช่เสมือนใหม่ (โดยต้องระมัดระวัง)
ไม่ปลอดภัย: การเปลี่ยนคลาสที่ผู้ใช้มีอยู่บนสแตกหรือคอมไพล์รวมไว้
เครื่องมือตรวจสอบ ABI
เครื่องมือที่เปรียบเทียบการสร้างสองครั้ง:
- abidiff — เปรียบเทียบ ABI
- abicompliance-checker — สร้างรายงาน
กลยุทธ์ระยะยาว
ออกแบบให้มีความเสถียรตั้งแต่ต้น: API สาธารณะขนาดเล็ก ชนิดข้อมูลทึบแสง และการใช้แม่แบบกับการสืบทอดอย่างระมัดระวัง เมื่อเผยแพร่แล้ว การทำให้ ABI ใช้งานร่วมกันไม่ได้มีต้นทุนสูง — ตรึงการเพิ่มรุ่นหลักและสื่อสารให้ชัดเจน
ตรวจสอบความเข้าใจ
การเปลี่ยนแปลงใดในคลาส C++ ที่มีแนวโน้มทำให้ ABI ใช้งานร่วมกันไม่ได้มากที่สุด
สรุป
ความเข้ากันได้ของ API หมายถึงความเข้ากันได้ของซอร์สโค้ด ส่วนความเข้ากันได้ของ ABI หมายถึงความเข้ากันได้ของไบนารี ABI เปราะบาง — การเพิ่มสมาชิก ฟังก์ชันเสมือน หรือการเปลี่ยนการสืบทอดจะทำให้ใช้งานร่วมกันไม่ได้ โปรดใช้ SemVer ซ่อนการใช้งานด้วย PIMPL แจกจ่ายรุ่นหลักหลายรุ่นไว้พร้อมกัน และเรียกใช้เครื่องมือตรวจสอบ ABI
คำถามที่พบบ่อย
บทเรียน “การกำหนดเวอร์ชัน API และความเสถียรของ ABI” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “การกำหนดเวอร์ชัน API และความเสถียรของ ABI” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส C++ Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส C++ Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “การกำหนดเวอร์ชัน API และความเสถียรของ ABI”
วางแผนการกำหนดเวอร์ชันตามความหมาย และรักษาความเสถียรของ ABI ระหว่างรุ่น คุณปฏิบัติ C++ Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน C++ Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน C++ Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน
บทเรียน “การกำหนดเวอร์ชัน API และความเสถียรของ ABI” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน C++ Academy นี้ได้ไหม
ได้ บทเรียน C++ Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- ไลบรารีแบบมีเฉพาะส่วนหัวเทียบกับไลบรารีที่คอมไพล์แล้ว
- การกำหนดเวอร์ชัน API และความเสถียรของ ABI
- ซ่อนการทำงานภายในด้วย PIMPL
- การเขียนไลบรารียูทิลิตี C++ สมัยใหม่แบบมีเฉพาะส่วนหัว