Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Ruby

Ruby 4.0:คุณสมบัติหลัก ไฮไลท์การเปิดตัว และคู่มือการอัปเกรด

Ruby 4.0 เป็นเวอร์ชันหลักที่เปิดตัวในวันครบรอบ 30 ปีของ Ruby (25 ธันวาคม 2025) เพื่อเฉลิมฉลองสามทศวรรษของชุมชน ไม่ใช่เนื่องจากการเปลี่ยนแปลงครั้งใหญ่

ฉันรู้สึกประหลาดใจที่ได้รู้ว่า Ruby ไม่ได้เป็นไปตามเวอร์ชันเชิงความหมายจริงๆ!

Matz (ผู้สร้าง Ruby) จะเพิ่มเวอร์ชันหลักแทนเมื่อการเปลี่ยนแปลงทำให้เขาประทับใจ เวอร์ชันนี้ถือเป็นวันครบรอบ 30 ปีของ Ruby และแนะนำฟีเจอร์เพื่อขยายภาษา

Ruby 4.0:คุณสมบัติหลัก ไฮไลท์การเปิดตัว และคู่มือการอัปเกรด

ข่าวดีสำหรับชาว Rubyists ที่อัปเกรดเป็น Ruby 4 ก็คือ การอัปเกรดไม่น่าจะยุ่งยากนัก มีคุณสมบัติใหม่บางอย่างเช่น 01 และ 10 การปรับปรุงการทำงานพร้อมกันบางส่วน และการปรับแต่งอื่นๆ บางประการที่ส่วนใหญ่เข้ากันได้แบบย้อนหลัง

มาดูกันว่ามีอะไรเปลี่ยนแปลงใน Ruby 4 บ้าง และคุณจะอัปเกรดได้อย่างราบรื่นได้อย่างไร

22คืออะไร

หนึ่งในคุณสมบัติทดลองที่น่าสนใจที่สุดของ Ruby 4.0 คือ 34 ซึ่งแนะนำเนมสเปซแบบแยกหรือ “คอนเทนเนอร์” (เพื่อไม่ให้สับสนกับคอนเทนเนอร์นักเทียบท่า) ภายในกระบวนการ Ruby

โดยพื้นฐานแล้วมันเป็นวิธีหนึ่งในการแยกโลก Ruby ที่แยกออกมาภายในกระบวนการ Ruby ของคุณ เมื่อคุณสร้าง 41 ใหม่ คลาส โมดูล ตัวแปรโกลบอล ค่าคงที่ หรือแม้แต่ส่วนขยาย C ที่คุณโหลดภายใน Box นั้นจะถูกจำกัดไว้

มันเหมือนกับการจำลองเสมือนแบบน้ำหนักเบาในระดับภาษา โดยที่แต่ละ Box มีสถานะของตัวเองและจะไม่รั่วไหลคำจำกัดความไปยังกล่องอื่นๆ หรือสภาพแวดล้อมหลัก

เนื่องจากเป็นการทดลอง คุณจึงอาจพบจุดบกพร่องหรือความไม่เสถียร ค่าใช้จ่ายในการดำเนินงานคือการพิจารณา การแยกสิ่งต่างๆ ไม่ได้ฟรี ดังนั้นทีมงานหลักจึงตั้งใจที่จะเลือกใช้

ใน Ruby 4.0 นั้น Boxes ไม่ได้มีจุดมุ่งหมายเพื่อให้ดำเนินการแบบขนานอย่างแท้จริงในทันที พวกเขาวางรากฐานสำหรับการโหลดโค้ดที่ชาญฉลาดยิ่งขึ้นและสามารถพัฒนาเป็นสิ่งที่มีความหมายมากขึ้นได้ ฉันตื่นเต้นที่ได้เห็น Ruby พัฒนาไปในทางที่น่าสนใจเช่นนี้ หากคุณต้องการใช้ Ruby Box คุณจะต้องเปิดใช้งานตัวแปรสภาพแวดล้อมก่อน:

RUBY_BOX=1

เหตุใด ZJIT จึงมีความสำคัญ

Ruby 4.0 ขอแนะนำ ZJIT ซึ่งเป็นคอมไพเลอร์ Just-In-Time ใหม่ล่าสุด ซึ่งพัฒนาต่อจาก YJIT หากคุณกำลังนับอยู่ ตอนนี้ MRI มี สอง คอมไพเลอร์ JIT ZJIT แตกต่างจาก YJIT และกำลังได้รับการพัฒนาควบคู่กันไป หากคุณใช้ YJIT อยู่แล้ว คุณไม่จำเป็นต้องเปลี่ยน

สรุป YJIT

YJIT (“Yet Another JIT”) สร้างขึ้นโดย Shopify และเปิดตัวใน Ruby 3.1 โดยใช้วิธีการกำหนดเวอร์ชันของบล็อก Lazy Basic โดยรวบรวมโค้ดเล็กๆ น้อยๆ (บล็อกพื้นฐาน) ได้ทันทีและเน้นเป็นพิเศษตามประเภทรันไทม์

YJIT ได้รับการพิสูจน์แล้วว่าสามารถเพิ่มความเร็วให้กับแอป Ruby จำนวนมากได้อย่างมาก ในขณะที่เพิ่มได้ค่อนข้างง่าย เขียนด้วยภาษา Rust และเป็น JIT เริ่มต้น/หลักใน Ruby เวอร์ชันล่าสุด

ZJIT แตกต่างอย่างไร

ZJIT ใช้กลยุทธ์ JIT ที่อิงตามวิธีการแบบดั้งเดิมมากกว่า แทนที่จะรวบรวมบล็อกเล็กๆ ทีละน้อย ZJIT จะรวบรวมหน่วยที่ใหญ่กว่า (วิธีการทั้งหมดหรือชิ้นโค้ดที่ใหญ่กว่า) โดยใช้การแสดงระดับกลางของ SSA (Static Single Assignment) และไปป์ไลน์คอมไพเลอร์แบบทั่วไป

ได้รับการออกแบบให้คล้ายกับคอมไพเลอร์ JIT “ตำราเรียน” มากขึ้นอีกเล็กน้อย ซึ่งน่าจะช่วยให้ผู้มีส่วนร่วมเข้าใจและปรับปรุงได้ง่ายขึ้น

ทีมงานหลักของ Ruby ระบุเป้าหมายสองประการของพวกเขากับ ZJIT อย่างชัดเจนคือการเพิ่มเพดานประสิทธิภาพในระยะยาวของ Ruby (โดยการเปิดใช้งานการเพิ่มประสิทธิภาพขั้นสูงมากกว่าที่ YJIT สามารถทำได้) และทำให้ JIT สามารถแฮ็กได้มากขึ้นโดยชุมชน

การเปิดใช้งาน ZJIT ใน Ruby 4.0

ZJIT พร้อมใช้งานแต่ไม่ได้เปิดใช้งานตามค่าเริ่มต้นใน Ruby 4.0

หากต้องการทดลองใช้ คุณต้องสร้าง Ruby ที่ติดตั้ง Rust 1.85 ขึ้นไปบนระบบของคุณ แม้ว่าโค้ด JIT จะเป็นส่วนหนึ่งของ Ruby binary แต่ต้องใช้ Rust ในการสร้างมันขึ้นมา จากนั้น คุณสามารถเรียกใช้ Ruby ด้วยแฟล็ก '--zjit' เพื่อใช้ ZJIT

หากคุณปล่อยให้ JIT เป็นค่าเริ่มต้น คุณจะยังคงได้รับประโยชน์จาก YJIT (ซึ่งตัวมันเองจะพัฒนาอย่างต่อเนื่อง) หากคุณใช้ 51 ธง คุณจะสังเกตเห็นว่ามันถูกลบออกไปแล้วในรุ่นนี้

Ruby 4 มีการปรับปรุงบางอย่างสำหรับ Ractors

Ruby 3.0 เปิดตัว Ractors ซึ่งเป็นฟีเจอร์ทดลองเพื่อความเท่าเทียม Ractors อนุญาตให้เรียกใช้ล่าม Ruby หลายตัว (ส่วนหนึ่งของระบบที่รันโค้ดของคุณ) ในกระบวนการเดียวเพื่อแก้ไข GIL (Global Interpreter Lock) ซึ่งโดยปกติจะจำกัด Ruby ไว้ที่เธรดเดียวในแต่ละครั้ง แม้ว่าฉันไม่เคยใช้ Ractors มาก่อน แต่การลงทุนอย่างต่อเนื่องกับ Ractors ถือเป็นสัญญาณที่ชัดเจนว่าพวกเขามีความสำคัญต่ออนาคตของ Ruby

ใน Ruby 4.0 Ractors ยังคงอยู่ ทำเครื่องหมายว่าเป็นการทดลอง แต่พวกเขาได้รับการปรับปรุงที่สำคัญและการเปลี่ยนแปลง API เพื่อให้เข้าใกล้การใช้งานทั่วไปมากขึ้น

หากคุณเคยใช้ Ractors คุณจะรู้ว่าการส่งและรับข้อความนั้นค่อนข้างยุ่งยากเล็กน้อย Ruby 4.0 แทนที่ API ที่มีอยู่ด้วย 68 ที่แข็งแกร่งยิ่งขึ้น กลไก 76 โดยพื้นฐานแล้วเป็นไปป์หรือช่องทางที่ Ractors สามารถใช้เพื่อแลกเปลี่ยนค่า ตอนนี้ Ractor แต่ละตัวมีพอร์ตเริ่มต้น (81 ) และคุณยังสามารถสร้างออบเจ็กต์พอร์ตแบบกำหนดเองและส่งต่อไปมาได้

การเปลี่ยนแปลงของ Ractors ยังหมายความว่ามีการเปลี่ยนแปลงบางอย่างเกิดขึ้นด้วย ที่โดดเด่นที่สุดคือ 95 และ 108 ถูกลบออก

ภายใต้ฝากระโปรง การใช้งาน Ractor ของ Ruby 4.0 ได้รับการปรับแต่งเพื่อประสิทธิภาพและความปลอดภัยที่ดีขึ้น พวกเขาลดสถานะที่ใช้ร่วมกันระหว่าง Ractors สถานะที่ใช้ร่วมกันน้อยลงระหว่าง Ractors หมายถึงโอกาสลดลงที่จะทำลายการแยกโดยไม่ได้ตั้งใจและการใช้งานแคช CPU ที่ดีขึ้นบนระบบมัลติคอร์

Ractor ควรปรับขนาดได้ดีขึ้นและทำงานเร็วขึ้นในขณะนี้ แม้ว่าจะยังไม่ได้ใช้กันอย่างแพร่หลายเท่ากับเธรดหรือกระบวนการก็ตาม

110 การเปลี่ยนแปลงใน Ruby 4

สาด 127 ไม่เรียก 130 อีกต่อไป ใน Ruby 4.0

ใน Ruby เวอร์ชันเก่า ให้ทำบางอย่างเช่น 148 จะเรียก 158 เบื้องหลัง (ซึ่งส่งคืน 163 ) ดังนั้นคุณจะได้อาร์เรย์ว่าง นี่เป็นเรื่องมหัศจรรย์เล็กน้อยและไม่สอดคล้องกัน (ทำไม 171 ทำตัวเหมือนอาร์เรย์ว่างเหรอ?)

ใน Ruby 4.0 พฤติกรรมแปลกๆ นี้หายไปแล้ว การใช้เครื่องหมายสแปลต (181 ) บน 199 จะไม่ เรียกใช้ 203 . โดยพื้นฐานแล้วมันถูกมองว่าเป็น "ไม่มีอะไรจะเปิดเผย" การเปลี่ยนแปลงนี้ทำให้สอดคล้องกับวิธีเครื่องหมายคู่ 212 ไม่เรียก 227 ซึ่งเปิดตัวใน Ruby 3.4

ตัวดำเนินการเชิงตรรกะที่จุดเริ่มต้นของบรรทัดใน Ruby 4

นี่เป็นการปรับปรุงไวยากรณ์ที่ค่อนข้างเล็กซึ่งจะทำให้ Rubyists หลายคนยิ้มได้!

ตอนนี้คุณสามารถใส่ 231 , 246 , 257 หรือ 266 ที่ จุดเริ่มต้น ของบรรทัดเพื่อดำเนินการต่อนิพจน์บูลีนจากบรรทัดก่อนหน้า ตัวอย่างเช่น คุณสามารถเขียน:

if user_signed_in?
 && user.admin?
 && feature_enabled?
 perform_admin_task
end

นี่เหมือนกับ

if user_signed_in? &&
 user.admin? &&
 feature_enabled?
 perform_admin_task
end

มันค่อนข้างแปลกสำหรับฉันที่สิ่งเหล่านี้ไม่เหมือนเดิมอยู่แล้ว ดังนั้นฉันจึงมีความสุขกับการอัปเดตครั้งนี้

การอัปเดตคลาสบางส่วนใน Ruby 4

Ruby 4.0 ยังมาพร้อมกับการเปลี่ยนแปลงและปรับปรุงคลาสหลักเล็กน้อย

ขั้นแรก 278 ตอนนี้ class เป็นคลาสหลักในตัว ซึ่งหมายความว่าคุณสามารถใช้งานได้โดยไม่ต้องใช้ 289 . สิ่งนี้มาพร้อมกับการลบ 292 .

ตอนนี้ก็เช่นเดียวกันกับ 306 ซึ่งได้รับการเลื่อนระดับเป็นคลาสหลัก

นอกจากนี้ยังมี 316 ใหม่อีกด้วย วิธีการ! รุ่นนี้ปรับปรุงประสิทธิภาพของ 328 ซึ่งค้นหาอาร์เรย์อย่างชาญฉลาดมากกว่าการค้นหาเชิงเส้นแบบธรรมดา เรายังแนะนำ 330 อีกด้วย - นั่นไม่ใช่ตัวพิมพ์ผิด! เมธอดนี้จะค้นหา องค์ประกอบสุดท้ายที่ตรงกับเงื่อนไข ในอาร์เรย์

Ruby 4 ยังเพิ่มวิธีการทางคณิตศาสตร์ใหม่บางอย่าง การควบคุมวิปัสสนา 349 การปรับปรุง และอื่นๆ อีกมากมาย! คุณควรตรวจสอบเอกสารอย่างเป็นทางการเพื่อดูรายการการปรับปรุงทั้งหมด

วิธีอัปเกรดเป็น Ruby 4

การอัปเกรดเวอร์ชัน Ruby ในแอปที่ใช้งานจริงควรทำด้วยความระมัดระวังเสมอ แต่หากคุณมาจาก Ruby 3.4 นี่ควรเป็นหนึ่งในการอัปเกรดที่ง่ายกว่า คุณเคยมีประสบการณ์

เคล็ดลับบางประการเพื่อให้แน่ใจว่ามีการเปลี่ยนผ่านอย่างปลอดภัย:

บันทึกประจำรุ่น

ขั้นแรก อ่านบันทึกประจำรุ่นอย่างเป็นทางการ! ตรวจสอบประกาศการเลิกใช้งานอย่างเป็นทางการอีกครั้ง มี ไม่ควร จะเซอร์ไพรส์อะไรที่นี่ Ruby 3.4 ควรเตือนคุณเกี่ยวกับการเลิกใช้งานที่กำลังจะเกิดขึ้น

คำเตือนการเลิกใช้งาน

หากคุณเพิกเฉยต่อคำเตือนเรื่องการเลิกใช้งานจากล่าม Ruby ของคุณ ให้จัดการคำเตือนเหล่านั้นก่อนที่จะอัปเดตภาษา

การทดสอบพื้นฐาน

ต่อไปต้องแน่ใจว่าคุณมีการทดสอบที่ดี วิธีนี้จะช่วยให้คุณสร้างความมั่นใจว่าพฤติกรรมของแอปไม่เปลี่ยนแปลง หากคุณไม่มี ใดๆ การทดสอบ ตอนนี้เป็นเวลาที่ดีที่จะลงทุนในการทดสอบเพื่อให้ครอบคลุมเส้นทางที่สำคัญของคุณเป็นอย่างน้อย

อัปเดตบันเดิล

เป็นความคิดที่ดีที่จะอัปเดต Bundler ต่อไป เมื่อคุณใช้เวอร์ชันล่าสุดแล้ว ให้เรียกใช้ 355 และตรวจสอบข้อผิดพลาดหรือคำเตือน

เพิ่มเวอร์ชัน Ruby ของคุณ

ตอนนี้คุณสามารถติดตั้งและเปลี่ยนไปใช้ Ruby เวอร์ชันใหม่ได้แล้ว ตัวจัดการเวอร์ชัน Ruby เช่น 368 หรือ 371 เป็นที่นิยมในโลก Ruby เพื่อควบคุมเวอร์ชันท้องถิ่นของคุณ หากแอปของคุณทำงานใน Docker คุณจะต้องอัปเดตเวอร์ชัน Ruby ใน Dockerfile หากแอปของคุณทำงานบนแพลตฟอร์มที่ไม่มี Docker คุณจะต้องอัปเดตเวอร์ชัน Ruby ที่นั่น

อัปเกรดเป็น Ruby 4.0 ใน Gemfile ของคุณ

อัปเดตเวอร์ชัน Ruby ของคุณใน Gemfile ของคุณ (หากคุณล็อคไว้ด้วย 385 directive) และเรียกใช้ 399 เป็นครั้งสุดท้าย

ทำการทดสอบของคุณ

ท้ายที่สุด ทำการทดสอบของคุณ! หากไม่มีสิ่งใดเสียหาย ตรวจสอบให้แน่ใจว่าได้ดำเนินการผ่านเส้นทางที่สำคัญในแอปพลิเคชันของคุณเพื่อสร้างความมั่นใจมากยิ่งขึ้น ก่อนที่คุณจะจัดส่งการอัปเกรด ให้พิจารณาใช้บริการตรวจสอบข้อยกเว้น เช่น Honeybadger เพื่อให้คุณ ทราบ อย่างแท้จริง หากการอัพเกรดเป็น Ruby 4 ทำให้เกิดปัญหากับผู้ใช้

หากคุณทำตามขั้นตอนเหล่านี้ คุณจะมีประสบการณ์ที่ปราศจากความเจ็บปวดในการติดตามข่าวสารล่าสุดเกี่ยวกับสิ่งที่ดีที่สุดที่ Ruby มอบให้ เมื่อคุณทำการทดสอบ อย่าลืมอวยพรวันเกิดครบรอบ 30 ปีของ Ruby!