Mozilla เปลี่ยนไปใช้เอ็นจิ้นนิพจน์ทั่วไปทั่วไปกับ Chromium

เอ็นจิ้น SpiderMonkey JavaScript ที่ใช้ใน Firefox แปลแล้ว เพื่อใช้การปรับปรุงนิพจน์ทั่วไปตามโค้ดปัจจุบัน ไม่แสดงผล จากเอ็นจิ้น V8 JavaScript ที่ใช้ในเบราว์เซอร์ตามโครงการ Chromium การใช้งาน RegExp ใหม่จะมีให้ใน Firefox 78 ซึ่งกำหนดไว้ในวันที่ 30 มิถุนายน และจะนำองค์ประกอบ ECMAScript ที่ขาดหายไปทั้งหมดที่เกี่ยวข้องกับนิพจน์ทั่วไปมาสู่เบราว์เซอร์

มีข้อสังเกตว่าเอ็นจิ้น RegExp ใน SpiderMonkey ได้รับการออกแบบให้เป็นส่วนประกอบแยกต่างหาก ซึ่งทำให้ค่อนข้างเป็นอิสระและเหมาะสำหรับการทดแทนโดยไม่จำเป็นต้องทำการเปลี่ยนแปลงที่สำคัญกับฐานโค้ด ความเป็นโมดูลทำให้ในปี 2014 สามารถแทนที่เอ็นจิ้น YARR RegExp ที่ใช้ใน Firefox ได้ด้วยการแยกเอ็นจิ้น Irregexp จาก V8 Irregexp เชื่อมโยงกับ V8 API ซึ่งเชื่อมโยงกับตัวรวบรวมขยะ และใช้การแสดงสตริงเฉพาะ V8 และโมเดลอ็อบเจ็กต์ ในกระบวนการปรับให้เข้ากับ API ภายในของ SpiderMonkey ในปี 2014 เอ็นจิ้น Irregexp ได้ถูกเขียนใหม่บางส่วน และการเปลี่ยนแปลงที่เกิดขึ้น เช่น ธง '\u' หากเป็นไปได้ โอนแล้ว ลงในทางแยกที่ดูแลโดย Mozilla

น่าเสียดายที่การรักษาทางแยกแบบซิงโครไนซ์นั้นยากและต้องใช้ทรัพยากรมาก ด้วยการมาถึงของคุณสมบัติใหม่ที่เกี่ยวข้องกับนิพจน์ทั่วไปในมาตรฐาน ECMAScript 2018 นักพัฒนา Mozilla จึงคิดเกี่ยวกับวิธีการทำให้การโยกย้ายการเปลี่ยนแปลงจาก Irregexp ง่ายขึ้น เพื่อเป็นทางออก มีการเสนอแนวคิดการห่อซึ่งช่วยให้สามารถใช้เอ็นจิ้น Irregexp ที่แทบจะไม่เปลี่ยนแปลงใน SpiderMonkey (การเปลี่ยนแปลงจะลดลงเฉพาะการแทนที่บล็อก “#include” โดยอัตโนมัติเท่านั้น)

Mozilla เปลี่ยนไปใช้เอ็นจิ้นนิพจน์ทั่วไปทั่วไปกับ Chromium

เฟรมเวิร์กนี้มอบความสามารถเฉพาะ V8 ที่จำเป็นให้กับ Irregexp รวมถึงการจัดการหน่วยความจำและฟังก์ชันการสร้างโค้ด รวมถึงโครงสร้างข้อมูลดั้งเดิมที่ใช้งานโดยใช้กลไกการจัดการหน่วยความจำ ตัวสร้างโค้ด และโครงสร้าง SpiderMonkey

การอัปเดตกลไก RegExp จะทำให้ Firefox สามารถรองรับคุณสมบัติต่างๆ เช่น การจับภาพที่มีชื่อ การยกเว้นคลาสอักขระ Unicode การตั้งค่าสถานะ dotAll และโหมด Lookbehind:

  • กลุ่มที่มีชื่อ ช่วยให้คุณสามารถเชื่อมโยงส่วนของสตริงที่จับคู่ด้วยนิพจน์ทั่วไปกับชื่อเฉพาะ แทนที่จะเป็นหมายเลขซีเรียลของรายการที่ตรงกัน (เช่น แทนที่จะเป็น “/(\d{4})-(\d{2})-(\d{ 2})/” คุณสามารถระบุ “/( ? \d{4})-(? \d{2})-(? \d{2})/" และเข้าถึงปีไม่ผ่าน result[1] แต่เข้าถึง result.groups.year)
  • หนีเรียน อักขระ Unicode เพิ่มโครงสร้าง \p{...} และ \P{...} ตัวอย่างเช่น \p{Number} กำหนดอักขระที่เป็นไปได้ทั้งหมดด้วยตัวเลข (รวมถึงสัญลักษณ์เช่น XNUMX), \p{Alphabetic} - ตัวอักษร (รวมถึง อักษรอียิปต์โบราณ ), \p{คณิตศาสตร์} — สัญลักษณ์ทางคณิตศาสตร์ ฯลฯ
  • ธง dotAll ทำให้หน้ากาก "." ลุกไหม้ รวมถึงอักขระป้อนบรรทัด
  • ระบบการปกครอง มองข้างหลัง ช่วยให้คุณสามารถกำหนดในนิพจน์ทั่วไปว่ารูปแบบหนึ่งอยู่ข้างหน้าอีกรูปแบบหนึ่ง (เช่น จับคู่จำนวนเงินดอลลาร์โดยไม่จับเครื่องหมายดอลลาร์)

โครงการนี้ดำเนินการโดยการมีส่วนร่วมของนักพัฒนา V8 ซึ่งในส่วนของพวกเขาได้ทำงานเพื่อลดการพึ่งพา Irregexp บน V8 และย้ายคุณสมบัติบางอย่างที่ไม่สามารถใช้งานได้โดยใช้ SpiderMonkey ไปเป็นการปิดการใช้งานบล็อก “#ifdef” ความร่วมมือกลายเป็นผลประโยชน์ร่วมกัน ในส่วนของนักพัฒนา Mozilla ได้ส่งการเปลี่ยนแปลงไปยัง Irregexp ซึ่งกำจัดบางส่วนออกไป ความไม่สอดคล้องกัน ด้วยข้อกำหนดของมาตรฐาน JavaScript และ การปรับปรุง คุณภาพของรหัส นอกจากนี้ ในระหว่างการทดสอบ Firefox แบบคลุมเครือ ข้อผิดพลาดที่ไม่มีใครสังเกตเห็นก่อนหน้านี้ในโค้ด Irregexp ซึ่งนำไปสู่การล่มก็ถูกระบุและกำจัดออกไป

ที่มา: opennet.ru

เพิ่มความคิดเห็น