- Swift รองรับทั้ง Linux และ Windows นอกเหนือจากแพลตฟอร์มของ Apple
- เมื่อใช้ Swift Static Linux SDK จะสามารถสร้างไฟล์ปฏิบัติการที่ลิงก์แบบสแตติกทั้งหมดได้อย่างสมบูรณ์โดยไม่ต้องพึ่งพา dependency ภายนอก
- ซึ่งหมายความว่าสามารถรันได้บนทุก Linux distribution
- สามารถพัฒนาและทดสอบบน macOS แล้วนำไป deploy บนเซิร์ฟเวอร์ที่ใช้ Linux ได้
- การลิงก์คือกระบวนการนำส่วนต่าง ๆ ของโปรแกรมคอมพิวเตอร์มาเชื่อมการอ้างอิงเข้าด้วยกัน
- การลิงก์แบบสแตติกเกิดขึ้นตอน build ส่วนการลิงก์แบบไดนามิกเกิดขึ้นตอน runtime
- static library คือชุดของไฟล์ออบเจ็กต์แต่ละไฟล์ ส่วน dynamic library มีลักษณะเป็น monolithic
- ข้อดีและข้อเสียของการลิงก์แบบสแตติก:
- ข้อดี: ไม่มี runtime overhead, รวมเฉพาะโค้ดไลบรารีที่จำเป็น, ไม่ต้องมี dynamic library ที่ติดตั้งแยก, ไม่มีปัญหาเรื่องเวอร์ชันตอน runtime
- ข้อเสีย: ไม่สามารถแชร์โค้ดได้ (ทำให้ใช้หน่วยความจำเพิ่มขึ้น), อัปเดต dependency ไม่ได้หากไม่ rebuild โปรแกรม, ขนาดไฟล์ปฏิบัติการใหญ่ขึ้น
- การใช้การลิงก์แบบสแตติกบน Linux ช่วยตัด dependency ต่อ system library ที่ต่างกันตาม distribution ออกได้ทั้งหมด
- ต้องติดตั้ง Open Source toolchain จาก swift.org (ไม่สามารถใช้ toolchain ที่มากับ Xcode ได้)
- สามารถติดตั้ง Static Linux SDK ได้ด้วยคำสั่ง
swift sdk install
- สามารถ build ไบนารี Linux แบบ x86-64 ได้ด้วยคำสั่ง
swift build --swift-sdk x86_64-swift-linux-musl และ build ไบนารี Linux แบบ ARM64 ได้ด้วยคำสั่ง swift build --swift-sdk aarch64-swift-linux-musl
- Swift package ที่ใช้ Foundation หรือ Swift NIO ยังคงทำงานได้ตามปกติ
- package ที่ใช้ C library ต้องแก้ไขให้ import Musl แทน Glibc
- Musl รองรับการลิงก์แบบสแตติกได้ดี และมีไลเซนส์แบบ permissive ที่ช่วยให้แจกจ่ายไฟล์ปฏิบัติการได้ง่าย
- สามารถแก้ไข package dependency ได้ด้วยคำสั่ง
swift package edit
2 ความคิดเห็น
ตอนนี้รู้สึกว่าพอใช้สิ่งนี้แล้ว น่าจะมีอะไรสักอย่างออกมาที่ช่วยให้รองรับการพัฒนา Android และ iOS พร้อมกันด้วย Swift ได้อย่าง seamless มากขึ้น..
ความเห็นจาก Hacker News
การรองรับแพลตฟอร์มแบบกำหนดเองใหม่ของ Swift: การที่ Swift รองรับระบบฝังตัวและ WASM รวมถึงการย้ายไปยังองค์กร GitHub ที่ไม่ใช่ของ Apple ถือเป็นความก้าวหน้าครั้งใหญ่ในการขยาย Swift ไปยังแพลตฟอร์มอื่น ๆ ความเป็นไปได้ที่จะนำไปใช้กับการตรวจสอบความปลอดภัยของ AI OS ก็น่าสนใจเช่นกัน
สามารถรันไบนารี Swift บนคอนเทนเนอร์ Alpine ได้: ดีใจที่ตอนนี้สามารถรันไบนารี Swift บนคอนเทนเนอร์ Alpine ได้ งานรองรับ musl คืบหน้าเร็วกว่าที่คาดไว้ การคอมไพล์ข้ามแพลตฟอร์มก็มีประโยชน์มากเช่นกัน
ความคาดหวังต่อการรองรับ Debian: ดีใจที่ได้เห็นการเพิ่มแพ็กเกจ Swift ใน Debian คิดว่าน่าจะได้ใช้ Debian เป็น VM สำหรับพัฒนามากขึ้น
คาดหวังการใช้ Swift บนระบบฝังตัว: เคยทำงานกับระบบฝังตัวด้วย C มาเยอะ แต่อยากลองใช้ Swift บนบอร์ดพัฒนา STM ดู
ข้อเสียของการลิงก์แบบสแตติก: ASLR อาจทำงานได้ไม่สมบูรณ์หรือมีการสุ่มเพียงอ็อบเจ็กต์เดียว อย่างไรก็ตาม ในภาษาที่ปลอดภัยด้านหน่วยความจำ นี่อาจไม่ใช่ข้อเสียใหญ่ การแชร์อ็อบเจ็กต์ร่วมกันยังช่วยลด I/O ได้ด้วย
ปัญหาความเข้ากันได้ระหว่างดิสทริบิวชัน: โปรแกรมที่บิลด์บนดิสทริบิวชันหรือเวอร์ชันหนึ่งอาจไม่ทำงานบนอีกดิสทริบิวชันหนึ่ง การที่ Swift รองรับการลิงก์แบบสแตติกเป็นเรื่องดี แต่ทางที่ดีที่สุดคือให้แต่ละดิสทริบิวชันเลือกวิธีแจกจ่ายแพ็กเกจเองได้
ความเป็นไปได้ในการแข่งขันกับ Golang: Swift น่าจะสามารถแข่งขันกับ Golang ในแง่ความง่ายของการดีพลอยได้ โดยผลักความซับซ้อนให้ห่างจากผู้ใช้ปลายทาง
แอป GUI ข้ามแพลตฟอร์ม: สงสัยว่าถ้าสร้างแอป GUI ข้ามแพลตฟอร์มด้วย Swift จะเป็นอย่างไร แม้ SwiftUI น่าจะใช้ไม่ได้ แต่ก็ตั้งใจจะใช้ Swift สำหรับเขียนสคริปต์ง่าย ๆ
คำเตือนเรื่องการใช้ image ของ CentOS 7: การยังคงแจก image ของ CentOS 7 อยู่ดูเหมือนเป็นเรื่องบ้าคลั่ง พร้อมคำเตือนว่าไม่ควรใช้งาน
ความซับซ้อนของ Swift ที่เพิ่มขึ้น: เดิมที Swift อาจแทนที่ Python ได้อย่างง่ายดาย แต่ภาษากลับซับซ้อนขึ้นจนตอนนี้กลายเป็นเหมือน C++ เวอร์ชันเลียนแบบ
เหตุผลที่ใช้ Swift แทน Rust: มีคำถามว่าทำไมควรใช้ Swift แทน Rust
เหตุผลที่ใช้ Swift โดยไม่มี iOS/SwiftUI: มีคำถามว่ามีเหตุผลอะไรบ้างที่จะใช้ Swift โดยไม่มี iOS/SwiftUI นอกจากกรณีที่นักพัฒนา Swift อยากใช้ภาษาที่คุ้นเคยกับโปรเจกต์เล็ก ๆ