0Pricing
C++ Academy · บทเรียน

การกำหนดเวอร์ชัน 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 3

SONAME สำหรับไลบรารีแบบใช้ร่วมกัน

บน 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

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

  1. ไลบรารีแบบมีเฉพาะส่วนหัวเทียบกับไลบรารีที่คอมไพล์แล้ว
  2. การกำหนดเวอร์ชัน API และความเสถียรของ ABI
  3. ซ่อนการทำงานภายในด้วย PIMPL
  4. การเขียนไลบรารียูทิลิตี C++ สมัยใหม่แบบมีเฉพาะส่วนหัว
← กลับไปที่ C++ Academy