- นักพัฒนาของ Anthropic ใช้ Claude Fable 5, Claude Opus 4.8 และ dynamic workflows เพื่อย้ายแพ็กเกจ 10 รายการที่มีขนาดตั้งแต่หลายหมื่นถึงหลายแสนบรรทัดในช่วงเดือนที่ผ่านมา โดยไม่ได้แก้โค้ดทีละส่วน แต่ปรับปรุง กระบวนการวนซ้ำที่สร้างโค้ด
- การย้าย Bun จาก Zig→Rust สร้างโค้ด 1 ล้านบรรทัด ภายในไม่ถึง 2 สัปดาห์ และผ่านชุดทดสอบเดิม 100% ก่อน merge ส่วนโปรเจกต์ Python→TypeScript ย้ายโค้ด 165,000 บรรทัดในช่วงสุดสัปดาห์ โดยใช้เอเจนต์หลายร้อยตัว ด่านตรวจ 8 ขั้น และการรีวิวแบบ adversarial 3 ครั้ง
- การย้ายขนาดใหญ่เหมาะกับการสร้าง ลูปตรวจสอบที่เป็นวัตถุวิสัย เพราะงานสามารถขนานกันได้ โค้ดเดิมทำหน้าที่เป็นทั้งสเปกและคำตอบที่ถูกต้อง และความล้มเหลวจากการ compile/ทดสอบจะสร้างคิวงานถัดไปโดยอัตโนมัติ
- กระบวนการดำเนินเป็นขั้น ๆ ตั้งแต่เตรียมเกณฑ์ตัดสิน จัดทำ rulebook แผนที่ dependency และรายการความต่าง stress test กฎ แปลทั้งระบบ compile รัน และเปรียบเทียบพฤติกรรม โดยข้อผิดพลาดที่เกิดซ้ำจะไม่แก้เป็นรายไฟล์ แต่ แก้กฎระดับบนแล้วสร้างใหม่
- ค่าใช้จ่ายยังอยู่ที่หลายหมื่นถึงหลายแสนดอลลาร์ขึ้นไป แต่สามารถทิ้ง branch ที่ล้มเหลวแล้วลองใหม่ได้ การย้าย Bun ใช้เงินตามราคา API ราว 165,000 ดอลลาร์ ก่อนจะลดการใช้หน่วยความจำ ลดขนาด binary ลง 19% และเพิ่มประสิทธิภาพ workload จริง 2–5%
แนวทางปรับปรุงลูปการสร้าง ไม่ใช่ตัวโค้ด
- AI code migration คือวิธีที่เอเจนต์ย้าย codebase ระดับ production ไปยังภาษาใหม่หรือ framework ใหม่
- แทนที่วิศวกรจะแปลไฟล์เองโดยตรง ก็เขียนกฎการย้ายและลูปตรวจสอบ
- เอเจนต์จะแปล compile และทดสอบซ้ำจนกว่าพฤติกรรมของโค้ดใหม่จะตรงกับต้นฉบับ
- โปรเจกต์ที่ในอดีตต้องใช้เวลาหลายปีสามารถย่นลงเหลือระดับหลายสัปดาห์ได้
- Anthropic ใช้ Claude Fable 5, Claude Opus 4.8 และ dynamic workflows ย้ายแพ็กเกจโค้ด 10 รายการที่มีขนาดตั้งแต่หลายหมื่นถึงหลายแสนบรรทัดในหนึ่งเดือน
- หลักการปฏิบัติสำคัญคือไม่ซ่อมโค้ดที่ถูกสร้างขึ้นโดยตรง แต่ แก้ลูปที่สร้างโค้ดนั้น
ตัวอย่างการ migration จริง
-
การย้าย Bun จาก Zig→Rust
- Jarred Sumner ใช้ Claude Code ย้าย Bun จาก Zig ไป Rust
- สร้างโค้ด 1 ล้านบรรทัด ในเวลาน้อยกว่า 2 สัปดาห์
- ผ่านชุดทดสอบเดิมของ Bun ใน CI 100% ก่อน merge
- regression 19 รายการที่พบหลัง merge ได้รับการแก้ไขทั้งหมด
- Rust port ถูกนำเข้าใช้ใน Claude Code เมื่อเดือนมิถุนายน
- Bun มียอดดาวน์โหลดรายเดือนมากกว่า 10 ล้านครั้ง และถูกใช้อย่างกว้างขวางภายใน Claude Code ด้วย
-
การย้าย Python→TypeScript
- Mike Krieger ย้าย codebase Python เป็น TypeScript 165,000 บรรทัด ในช่วงสุดสัปดาห์
- ใช้เอเจนต์หลายร้อยตัว ด่านตรวจ 8 ขั้น และการรีวิวแบบ adversarial 3 ครั้ง
- ทำการตรวจสอบความเท่าเทียมขั้นสุดท้าย โดยเปรียบเทียบ output ของทุกคำสั่งกับต้นฉบับ Python
- ทำซ้ำด้วยการทิ้งผล migration ทั้งหมด แล้วแก้กฎและ workflow โดยเลือกใช้ผลจากการรันครั้งที่สาม
เงื่อนไขที่ควรกลับมาพิจารณาการย้ายภาษา
- หากสภาพแวดล้อมทางเทคนิคเปลี่ยนไปหลังการพัฒนาครั้งแรก จน trade-off เดิมกลายเป็นข้อจำกัด มีแนวทางที่ดีกว่าเกิดขึ้น หรือ ecosystem เดิมหดตัวลง ก็อาจพิจารณาการย้ายได้
- Zig ให้ประสิทธิภาพระดับ C และความเรียบง่าย ซึ่งเหมาะกับสภาพแวดล้อมช่วงแรกที่พัฒนา Bun เพียงลำพัง แต่ความเรียบง่ายนั้นมี trade-off ที่ทราบอยู่แล้ว
- ในอดีต การย้ายภาษาต้องหยุด roadmap และทุ่มทรัพยากรหลายไตรมาส
- อาจต้องดูแล codebase สองชุดคู่กันเป็นเวลาหลายไตรมาสหรือหลายปี
- หากความตรงกันของพฤติกรรมสุดท้ายอยู่แค่ 90% ก็อาจเกิดปัญหาบำรุงรักษาใหญ่กว่าก่อนเริ่ม
- ตอนนี้มีทางเลือกในการลบ branch ที่ล้มเหลวแล้วรันใหม่
- การย้าย 1 ล้านบรรทัดไม่จำเป็นต้องใช้ต้นทุนวิศวกรรม 3–4 ล้านดอลลาร์ ตลอด 4 ปีอีกต่อไป แต่ก็ยังอาจมีค่าใช้จ่ายหลายหมื่นถึงหลายแสนดอลลาร์ขึ้นไป
- การย้าย Bun ใช้ input token ที่ไม่ถูก cache 5.9 พันล้าน token และ output token 690 ล้าน token
- ค่าใช้จ่ายตามราคา API อยู่ที่ประมาณ 165,000 ดอลลาร์
- ส่วนหลักของ port ของ Mike ใช้ 27 ล้าน token
- เหตุผลทางธุรกิจของการย้ายไม่จำเป็นต้องถึงขั้นชี้เป็นชี้ตายอีกต่อไป แค่การแก้ memory bug ที่เกิดซ้ำตลอดปี หรือ bottleneck เรื้อรังเพียงจุดเดียว ก็อาจเพียงพอที่จะ justify ได้
-
แก้ bottleneck ของ build ใน Python
- เครื่องมือภายในของ Mike ถูกส่งให้ผู้ใช้เป็น binary เดี่ยว แต่การสร้าง binary รายแพลตฟอร์มด้วย Python toolchain ใช้เวลาประมาณ 8 นาที
- ใน build matrix ทั้งหมด ต้องรอราว 30 นาที ต่อ release
- หลังย้ายเป็น TypeScript การ compile ลดเหลือราว 2 วินาที การเริ่ม binary เร็วขึ้น 6 เท่า และยกเลิก deployment pipeline แยกต่างหากได้
ทำไม AI agent จึงเหมาะกับการย้าย
- สามารถทำงานแบบ ขนาน ได้
- แบ่งเป็นหน่วยอิสระหลายพันหน่วย เช่น ไฟล์และ crate แล้วให้เอเจนต์หลายตัวจัดการพร้อมกันได้
- โค้ดเดิมทำหน้าที่เป็น สเปก ที่ชัดเจนและครอบคลุม
- ยังใช้เป็นแหล่งอ้างอิงหลักในการสร้างคำสั่งสำหรับเอเจนต์แปลได้ด้วย
- ชุดทดสอบทำหน้าที่เป็นตัวตัดสินที่มีอยู่ในตัว
- หากการตรวจสอบเป็นวัตถุวิสัย โมเดลสามารถทำงานซ้ำหลายวันโดยยึดคำตอบที่ถูกต้องได้ โดยไม่ต้องให้มนุษย์คอยไกล่เกลี่ยคุณภาพตลอดเวลา
- ความล้มเหลวจากการ compile หรือทดสอบจะกลายเป็นงานถัดไปโดยอัตโนมัติ จึงลดความจำเป็นในการเขียนคิวงานแยก
- สามารถใส่ความสม่ำเสมอและการจัดการข้อยกเว้นไว้ในลูปได้
- ผู้รีวิวเชื่อมแต่ละปัญหากับกฎที่ถูกละเมิด
- วิธีแก้ข้อยกเว้นจะกลายเป็นกฎที่เอเจนต์ทั้งหมดปฏิบัติตามภายหลัง
- แทนที่จะเกิดพฤติกรรมไม่ตรงกันแบบเงียบ ๆ การละเมิดกฎจะกลายเป็นรายการงานที่ชัดเจน
- Fable และ Opus 4.8 ถูกใช้เพื่อมอบหมาย ควบคุม และตรวจสอบงานขนานของ sub-agent รวมถึงค้นหาเส้นทางหลายแบบในการไปถึงเป้าหมาย
- ใช้ รูปแบบที่ปรึกษา ที่ผสมโมเดลหลายระดับเพื่อ optimize การใช้ token
เงื่อนไขตั้งต้น: ตัดสินความเท่าเทียมระหว่างต้นฉบับกับ port
- ก่อนเริ่มย้าย ต้องมี ตัวตัดสิน ที่แข็งแรงเพื่อประเมินโค้ดต้นฉบับและโค้ดปลายทางด้วยเกณฑ์เดียวกัน
- หากไม่มีตัวตัดสิน ก็ไม่มีเกณฑ์ความสำเร็จและเงื่อนไขจบงาน
- การทดสอบที่พึ่งพาฟังก์ชันภายในของภาษาต้นฉบับอาจรันบนโค้ดปลายทางตามเดิมไม่ได้
- แบ่งการทดสอบเดิมออกเป็นการทดสอบที่แสดงเป็นการเรียกภายนอกได้ และการทดสอบที่พึ่งพา implementation ภายในซึ่งจะไม่ถูก port
- เขียนการทดสอบพฤติกรรมภายนอกใหม่ให้เป็น assertion ที่รันได้ทั้งบนต้นฉบับและ port
- เอเจนต์ adversarial ตรวจสอบว่าระหว่างเขียนใหม่ assertion ไม่ถูกทำให้อ่อนลง
- รันตัวตัดสินกับโค้ดต้นฉบับเพื่อยืนยันว่าผ่าน จากนั้นตรวจด้วยว่าโค้ดที่จงใจทำให้เสียจะล้มเหลวหรือไม่
- Jarred มีชุดทดสอบขนาดใหญ่ที่เขียนด้วยภาษาเครื่องที่สามคือ TypeScript
- Mike สร้าง equivalence harness จากสถานการณ์ใช้งานจริง 7 แบบ และถือว่าการเปลี่ยนแปลงพฤติกรรมทั้งหมดเป็น bug ที่ต้องแก้
ขั้นที่ 1: rulebook, แผนที่ dependency และรายการความต่าง
- ผลลัพธ์พื้นฐานไม่ใช่แค่ผลการแปลง่าย ๆ แต่เป็นรายการตำแหน่งที่ต้อง refactor, rulebook ของวิธีแปล และแผนที่ dependency สำหรับกำหนดลำดับงาน
- ลำดับการเขียนมีความสำคัญ
- ต้องกำหนดค่า default ของ rulebook ก่อน จึงจะนิยามรายการที่ default นั้นจัดการไม่ได้เป็นรายการความต่างได้
- rulebook และรายการความต่างต้องถูกตรวจสอบร่วมกันผ่านการ audit ร่วม
-
Rulebook
- รูปแบบของ rulebook ขึ้นอยู่กับว่าโค้ดใหม่จะคงโครงสร้างเดิมไว้หรือออกแบบใหม่ทั้งหมด
- หากคงโครงสร้างแบบ Jarred จุดหลักจะเป็น ตาราง mapping ของ type และ idiom ระหว่างภาษา และ component ที่แปลยากจะอ้างอิงรายการความต่าง
- หากออกแบบใหม่แบบ Mike rulebook จะทำหน้าที่เป็น design document
- Jarred สนทนากับ Claude เพื่อสร้าง policy สำหรับทุกพื้นที่ที่กำกวม และตั้ง sub-agent 8 ตัวให้รีวิวข้อผิดพลาดที่คาดไว้ 8 หมวดหมู่แยกกัน
-
แผนที่ dependency
- ในการย้ายแบบขนาน ต้องเข้าใจ dependency ระหว่างไฟล์เพื่อกำหนดว่าจะย้ายไฟล์ใดก่อน และไฟล์ใดควรอยู่ batch เดียวกัน
- สำหรับโค้ด legacy ที่ไม่มี manifest ชัดเจน และ codebase อย่าง C/C++, Python ต้องค้นหาและทำแผนที่ dependency เอง
- เอเจนต์ Claude Code สามารถสร้างแผนที่ได้ผ่านลูปที่เขียนและรันสคริปต์แบบ deterministic แล้วรีวิวและแก้ไข
- ดูตัวอย่างทั่วไปได้ที่ dependency map prompt
-
รายการความต่างของภาษาและผู้รีวิวที่ตั้งข้อสงสัย
- รายการความต่าง บันทึกความรู้ที่ซ่อนอยู่โดยนัยในโค้ดเดิม แต่ต้องทำให้ชัดเจนในภาษาปลายทาง
- สำหรับ Zig→Rust ความต่างหลักคือวิธีจัดการหน่วยความจำ
- ใน Zig ข้อเท็จจริงที่ว่าผู้เรียกต้อง free buffer อาจมีอยู่แค่ใน comment และแม้ลืม free ก็ยัง compile ได้ โดย leak จะพบตอน runtime
- ใน Rust ownership จะย้ายไปยังผู้เรียกและ memory จะถูก free อัตโนมัติ ส่วนการใช้หลัง move หรือ double free จะ compile ไม่ผ่าน
- สำหรับ Python→TypeScript ความต่างหลักคือ interface และ contract
- Python ไม่จำเป็นต้องประกาศรูปทรงของ object ที่รับเข้ามาและค่าที่ return
- TypeScript ต้องเขียน contract ของ method, argument และ return shape จึงจะ compile ได้
- Jarred ทำรายการความต่างก่อนแปล ส่วน Mike แปลก่อนแล้วค่อยสร้างรายการระหว่าง audit ดังนั้นใช้ได้ทั้งสองแนวทางตามโปรเจกต์
- ดูตัวอย่างทั่วไปได้ที่ gap inventory prompt
ขั้นที่ 2: stress test กฎ
- ก่อนย้ายทั้งหมด ให้ใช้ trial migration ขนาดเล็กเพื่อเขย่า rulebook และหาปัญหา
- Jarred เปรียบเทียบงานของเอเจนต์สามแบบ
- เอเจนต์แรกแปลไฟล์ 3 ไฟล์ตาม rulebook
- เอเจนต์ที่สองแปลขนาดเดียวกันเหมือนวิศวกร Rust ที่มีประสบการณ์
- เอเจนต์ที่สามเขียนกฎการแปลใหม่จากความต่างระหว่างผลลัพธ์ทั้งสอง
- กระบวนการนี้พบปัญหาร้ายแรง 2 เรื่องก่อนที่จะลุกลามไปทั้ง 1,448 ไฟล์
- วิธีนี้ใช้ได้เฉพาะกับ การย้ายแบบคงโครงสร้าง ที่เปรียบเทียบผลแปลสองแบบของไฟล์เดียวกันทีละบรรทัดได้
- หากออกแบบใหม่แบบ Mike ผู้รีวิว adversarial ต้องโจมตี design document และตรวจสอบด้วยการรัน end-to-end ที่ทิ้งได้
- ไฟล์ทั้งหมดที่แปลในการทดลองควรถูกทิ้ง เพราะเป้าหมายคือปรับปรุงกฎ ไม่ใช่ความคืบหน้าของโค้ดแบบค่อยเป็นค่อยไป
- ดูตัวอย่างงานทั่วไปได้ที่ stress test prompt
ขั้นที่ 3: แปลโค้ดทั้งหมด
- ขั้นต่อจากนี้ทั้งหมดใช้ลูป multi-agent แบบ implement→review→fix
- การ implement จำนวนมากอาจมอบให้โมเดลเล็ก และให้โมเดลใหญ่รับหน้าที่ review
- Mike ใช้ sub-agent Claude Sonnet 12 ตัวเมื่อขนานงานย้ายหลัก
- จัดการคิวงานแบบกลไก
- batch script ตัดสินสถานะเสร็จจากการมีไฟล์แปลอยู่บนดิสก์
- แบ่งไฟล์ที่เหลือเป็น batch สำหรับเอเจนต์ implement
- ทุกครั้งที่รันจะสร้างคิวใหม่จากสถานะบนดิสก์ จึงโดยพื้นฐานแล้วหยุดแล้วทำต่อได้
- หากเอเจนต์ระมัดระวังเกินไปจนจัดการได้น้อย ให้สั่งอย่างตรงขึ้นพร้อมบริบทว่า compiler จะจับ error ในขั้นถัดไป
- รายการที่ยังจัดการอย่างมั่นใจไม่ได้ให้ทำเครื่องหมายเป็น
// TODO(port): <reason>และแก้ในขั้นที่ 4 - รายการงานหลังจากนั้นจะถูกสร้างอัตโนมัติจาก compile error, smoke test crash และ test failure
-
การรีวิวแบบ adversarial และการอัปเดตกฎ
- ผู้รีวิว adversarial 2 ตัวที่มี context แยกกันประเมินผล implement และหากเห็นต่างกัน ให้เอเจนต์ที่สามตัดสิน
- หาก error เดิมเกิดซ้ำในหลายไฟล์ จะไม่แก้ทีละไฟล์
- เพิ่มประโยคหนึ่งใน rulebook แล้วสร้าง batch ที่ได้รับผลกระทบใหม่
- แม้ในขั้นแปล rulebook ก็ยังขยายต่อไป และไม่ patch โค้ดที่ผิดกฎด้วยมือ
-
ตำแหน่งการวาง compiler
- หาก compile เร็ว สามารถใส่ไว้ในลูปการแปลได้
- Mike รันในทุกลูป เพราะ TypeScript compile เสร็จภายในไม่กี่วินาทีต่อหน่วย
- หาก compile ใช้เวลานาน ให้ย้ายไปขั้นถัดไป
- Jarred ห้ามใช้ compiler ในลูปแปล เพราะการรัน
cargoใช้เวลาหลายนาที - ตั้งแต่ขั้นนี้ prompt จะสั้นลง ดูตัวอย่างได้ที่ translation kickoff prompt
ขั้นที่ 4–6: compile, รัน และทำให้พฤติกรรมตรงกัน
- ทั้งสามขั้นใช้โครงสร้างลูปเดียวกัน และยิ่งไปขั้นหลัง ๆ ยิ่งต้องใช้ดุลยพินิจมนุษย์น้อยลง
- ขึ้นอยู่กับภาษาและขนาดโปรเจกต์ ขั้น compile อาจถูกรวมเข้าไปในขั้นแปลทั้งหมดได้
-
ขั้นที่ 4: Compile
- Jarred ตั้งค่าให้ orchestrator script รัน compiler หนึ่งครั้งใน workspace ทั้งหมด
- เอเจนต์แก้ไขประมวลผลรายการ error แบบขนาน ผ่านการรีวิว adversarial แล้ว build ซ้ำ วนเช่นนี้ต่อไป
- การรีวิวรายการ error ใช้เพื่อค้นหาปัญหาเชิงระบบ ไม่ใช่ error รายตัว
- หลังแก้ circular import ที่ delayed compilation ของ Zig อนุญาตไว้ ก็เกิด error ของ Rust module หลายพันรายการ
- เพิ่ม logic ในลูปเพื่อจัดหมวดหมู่ว่าจะลบหรือย้าย dependency ใด หรือปรับโครงสร้าง boundary อย่างไร
-
ขั้นที่ 5: การรันและ smoke test
- crash ที่เกิดใน smoke test ทำหน้าที่เป็น คำตอบเชิงกลไก เช่นเดียวกับรายการ compile error
- ไม่จัดการปัญหาทีละรายการ แต่จัดกลุ่มตาม root cause แล้วให้ sub-agent adversarial รีวิว
-
ขั้นที่ 6: เปรียบเทียบพฤติกรรมกับต้นฉบับ
- แบ่งโค้ดที่ผ่านการแปล compile และ smoke test แล้ว จากนั้นรันชุดทดสอบที่เตรียมไว้ในขั้นก่อนหน้ากับทั้งต้นฉบับและ port
- เอเจนต์แก้ไขตรวจสอบ test ที่ล้มเหลวพร้อม codebase ทั้งสองฝั่ง และผู้รีวิว adversarial ตรวจผลการแก้ไข
- จำกัดให้มีเพียง build daemon ที่สามารถ build binary ใหม่ได้
- เอเจนต์แก้ไขเขียน patch และ daemon จะรวบรวม patch แล้ว rebuild เพียงครั้งเดียว
- รัน test ที่ได้รับผลกระทบซ้ำแล้วคืนผลลัพธ์
- ทำให้งานเป็นลำดับเพื่อไม่ให้เอเจนต์หลายตัวรัน build ราคาแพงแยกกัน
- หาก failure เดิมเกิดซ้ำในหลาย test ให้แก้กฎระดับบนที่สร้าง bug นั้น แล้วสร้างใหม่เฉพาะไฟล์ที่กฎนั้นส่งผล
-
กรณีไม่มีชุดทดสอบ
- Mike ให้ Claude สร้างสคริปต์เล็ก ๆ ที่รันสถานการณ์จริง 7 แบบกับโค้ด Python ต้นฉบับและ port ใหม่ แล้วเปรียบเทียบผล
- มอบหมายเอเจนต์แก้ไขแยกกันสำหรับแต่ละ scenario ที่ล้มเหลว และวนซ้ำจนทั้ง 7 แบบผ่านทั้งหมด
- Claude ยังออกแบบชุดทดสอบ end-to-end ของตนเองและรันอัตโนมัติข้ามคืน
- ทำซ้ำการแก้ error แล้วรันใหม่เป็นเวลา 4 คืน
- รายการ scenario ที่เขียนไว้ล่วงหน้าช่วยพบแม้แต่ปัญหา usability เล็ก ๆ ที่คาดเดายาก
- แม้ไม่มี test เดิม ก็สามารถใช้ codebase ต้นฉบับเป็นคำตอบที่ถูกต้องเพื่อให้ Claude สร้างตัวตัดสินได้
หลักการปฏิบัติที่พบจากการรันซ้ำ
- ควรวางแผนการย้ายกับ Claude ให้เหมาะกับลักษณะโปรเจกต์ก่อนเริ่ม ไม่ใช่ทำตามคู่มือแบบตรงตัว
- ปล่อยให้เอเจนต์แก้ไขจัดการ failure รายตัว ส่วนมนุษย์ควรโฟกัสที่ รูปแบบ error ที่เกิดซ้ำ
- จัดให้การรีวิวเป็นแบบ adversarial และการตรวจสอบเป็นแบบกลไก
- การรีวิว adversarial มีประโยชน์กับงานระยะยาว และอาจคุ้มกับ token เพิ่มเติม
- ใช้สคริปต์ เช่น compiler, diff และ test suite เป็นตัวตัดสินสุดท้าย
- ไม่ใช้โมเดลใหญ่ที่สุดกับทุกงาน
- ใช้โมเดลเล็กเพื่อขนานงาน implement จำนวนมาก
- ให้โมเดลใหญ่ที่สุดโฟกัสที่การ review และการเขียนกฎให้เอเจนต์อื่นทำตาม
- เวลาทำงานของมนุษย์ควร ลงทุนล่วงหน้า กับ rulebook และ stress test ส่วนกระบวนการหลังจากนั้นส่วนใหญ่เป็นงานระบายคิว
- สถานะเสร็จต้องตัดสินได้แบบกลไก เช่น “ไฟล์ output มีอยู่บนดิสก์” และคิวงานต้องทำต่อจากเดิมได้
ผลลัพธ์และข้อจำกัดของการย้าย Bun
- Rust port ของ Bun ทำงานอยู่ใน production แล้ว แต่โค้ด Rust ประมาณ 4% อยู่ใน block
unsafe- ส่วนใหญ่เป็น pointer operation บรรทัดเดียวตรง boundary ของ C/C++
- แก้ memory leak ทั้งหมดที่เครื่องมือตรวจจับได้
- ใน benchmark ที่รัน build ซ้ำ 2,000 ครั้ง การใช้หน่วยความจำลดจาก 6,745MB เหลือ 609MB
- ขนาด binary บน Linux และ Windows ลดลง 19%
- การ optimize ข้ามภาษาช่วยให้ประสิทธิภาพ workload จริง เช่น HTTP service,
next buildและtscดีขึ้น 2–5% - ในการย้ายขนาดใหญ่ ควรรีวิว ผลลัพธ์ที่ลูปสร้างขึ้นและรูปแบบการวนซ้ำ มากกว่าโค้ดที่ถูกสร้างทีละบรรทัด
เนื้อหาที่เกี่ยวข้อง
- Migration starter kit: template ที่ทำให้กระบวนการในบทความเป็นรูปแบบทั่วไป โดย port จริงทั้งสองงานไม่ได้รันด้วย kit นี้
- Code-modernization plugin: plugin สำหรับ modernize legacy และ upgrade framework ไม่ใช่การ port ภาษา
- Dynamic workflows in Claude Code: แนะนำ dynamic workflows ของ Claude Code
ยังไม่มีความคิดเห็น