การเรนเดอร์th-TH

Reader locales

Reader locale#

Reader locale คือระบบของ Faber สำหรับแสดงซอร์สโค้ด ข้อผิดพลาดของคอมไพเลอร์ และคีย์เวิร์ดของภาษาในภาษามนุษย์ของผู้อ่าน โดยไม่แยกความหมายของภาษาออกเป็นคนละ สาขา โปรแกรมเมอร์ชาวไทยสามารถอ่านและเขียนซอร์ส Faber ด้วยคีย์เวิร์ดภาษาไทย รับข้อผิดพลาดของคอมไพเลอร์เป็นภาษาไทย และทำงานร่วมกันผ่าน HIR เดียวกับผู้ใช้ ภาษาละตินหรือภาษาจีน กลไกที่แปลโค้ดจากภาษาละตินเป็นภาษาไทยคือกลไกเดียวกับที่ ส่งออกโค้ดเป็น Rust: HIR → surface — ไม่มีรูปแบบใดได้รับสิทธิพิเศษ

ปัญหา#

โมเดลภาษาขนาดใหญ่ได้แปล บทสนทนา เกี่ยวกับการเขียนโปรแกรมให้เป็นภาษาท้องถิ่น — นักวิทยาการคอมพิวเตอร์ชาวไทยสามารถขอความช่วยเหลือจาก LLM เป็นภาษาไทยได้ — แต่ยัง ไม่ได้แปล สิ่งประดิษฐ์ที่คงอยู่ โค้ดที่สร้างขึ้น API ข้อผิดพลาดของคอมไพเลอร์ และ เอกสารยังคงมีรูปแบบที่ยึดภาษาอังกฤษ ความสามารถด้านภาษาอังกฤษจึงกลายเป็นด่านกั้น สู่การเรียนวิทยาการคอมพิวเตอร์ ไม่ใช่เพียงด่านกั้นของการสนทนา

Reader locale คือคำตอบด้านการออกแบบ: ภาษาที่มนุษย์ใช้เพื่อ ทำความเข้าใจ Faber — ซอร์ส โพรโทคอลแจ้งข้อผิดพลาด และชื่อใน stdlib หากเลือกใช้ — โดยไม่ต้องมีภาษาอังกฤษ เป็นข้อกำหนดเบื้องต้น นี่ไม่ใช่การทำให้แอปพลิเคชันเป็นสากล (การครอบคลุมเมทริกซ์ ข้อความทั้งหมด) แต่คือการรองรับภาษาถิ่นของผู้อ่าน: แพ็กแบบเลือกใช้ได้ และอาจ ครอบคลุมเพียงบางส่วน โดยมีแกนความหมายเดียวที่ไม่แยกสาขา

แนวคิดหลักของผลิตภัณฑ์: ไม่ควรกำหนดให้ภาษาอังกฤษเป็นภาษาที่ต้องใช้ในการ ตรวจทานเจตนาของซอฟต์แวร์ LLM ได้แปลบทสนทนาเกี่ยวกับการเขียนโปรแกรมให้เป็น ภาษาท้องถิ่นแล้ว reader locale จึงแปลสิ่งประดิษฐ์ที่คงอยู่ให้เป็นภาษาท้องถิ่นด้วย

วิธีทำงาน#

แพ็ก reader locale จะแมปคีย์เวิร์ดของ Faber ชื่อชนิดข้อมูลพื้นฐาน และเทมเพลต ข้อความแจ้งข้อผิดพลาดให้เป็นภาษาปลายทาง แพ็กเหล่านี้เป็นไฟล์ TOML ที่มีสามตาราง:

  • [keywords] — แมปชื่อคีย์เวิร์ดเป็นรูปสะกดเฉพาะภาษา
  • [types] — แมปชื่อชนิดข้อมูลพื้นฐานเป็นรูปสะกดเฉพาะภาษา
  • [diagnostics.*] — แมปรหัสข้อผิดพลาดเป็นเทมเพลตข้อความ
  • [llm] — ส่วนของ system prompt และตัวอย่างสำหรับการสร้างโค้ดด้วย LLM

คอมไพเลอร์จะตรวจสอบแพ็กกับโครงร่างภาษาละตินที่สร้างขึ้น — คีย์เวิร์ดและชนิดข้อมูล ทุกตัวต้องมีรูปสะกดที่กำหนดไว้ หรือระบุอย่างชัดเจนว่าให้สืบทอดจากภาษาละติน แถวที่ขาดหายจะแสดง fallback ให้เห็น แทนที่จะปล่อยให้เกิดช่องว่างโดยไม่มีสัญญาณ

เลือก locale ผ่านบรรทัดคำสั่งหรือใน faber.toml:

faber check --reader-locale th-TH program.fab
# faber.toml
[reader]
locale = "zh-Hans"

สิ่งที่แปลเป็นภาษาท้องถิ่นและสิ่งที่ไม่แปล#

ชั้นอยู่ใน HIR หรือไม่พฤติกรรม
คีย์เวิร์ด ชนิดข้อมูล และวลีคู่ใช่คงข้อมูลครบถ้วนในการเรนเดอร์ทุกรูปแบบ
อักขระ ← → ∴ ≡ ∪ ⇥ใช่ (ไม่เปลี่ยนแปลง)เหมือนกันในทุกการเรนเดอร์
โครงสร้างแบบชนิดข้อมูลนำหน้าใช่เหมือนกันในทุกการเรนเดอร์
ตัวเลขใช้ ASCII เท่านั้นในทุก locale
ความคิดเห็นไม่อยู่นอกขอบเขตของคอมไพเลอร์; จัดการผ่าน LLM และเลือกใช้ได้
ชื่อ identifierไม่คงเดิมทุกไบต์
รูปสะกดของ stdlibไม่เป็นโอเวอร์เลย์แยกตาม locale

หลักประกันทางสถาปัตยกรรมที่สำคัญคือ surface ของ locale ใด ๆ สามารถแปลงเป็น surface อื่นได้ทุกแบบ รวมถึงภาษาละติน และทำได้ทุกเมื่อ ไฟล์ Faber ที่แปลเป็น ภาษาท้องถิ่นจึงไม่มีทางตัน เพราะไม่เคยเป็นรูปแบบเดียวที่โค้ดสามารถมีได้ faber format --canonical มีความหมายตรงกับ faber format --reader-locale=la

แพ็กที่จัดส่งแล้ว#

ปัจจุบัน Radix จัดส่งแพ็กทั้งหมดเจ็ดแพ็ก:

รหัสภาษาอักษรสถานะ
laภาษาละตินละตินมาตรฐาน
th-THไทยไทยข้อพิสูจน์อ้างอิง
zh-Hansจีนตัวย่อจีนตัวย่อข้อพิสูจน์ความครอบคลุม
zh-Hantจีนตัวเต็มจีนตัวเต็มข้อพิสูจน์ความครอบคลุม
arอาหรับอาหรับข้อพิสูจน์ความครอบคลุม
hiฮินดีเทวนาครีข้อพิสูจน์ความครอบคลุม
viเวียดนามเวียดนาม (ละติน)ข้อพิสูจน์ความครอบคลุม

locale อ้างอิงทั้งห้าถูกเลือกเพื่อ ทดสอบแรงกดดันทางสถาปัตยกรรมร่วมกัน — เมื่อรวมกันแล้วจะบังคับให้ปัญหา Unicode และการส่งออกทุกแบบที่ substrate ต้องรองรับ ปรากฏขึ้น locale สี่ตัวใช้อักษรที่ไม่ใช่ละติน ส่วนภาษาเวียดนามเป็นกรณีควบคุมที่ใช้ อักษรละติน:

Localeการเข้าถึงแรงกดดันทางสถาปัตยกรรม
th-THสูงระบบอักษรไร้ช่องว่าง — การทดสอบความเครียดของตัวแยกโทเคน
zh-Hans / zh-Hantสูงมากคีย์เวิร์ดคู่; การสืบทอดแพ็กพี่น้อง; การยุบความกว้างด้วย NFKC
arสูงขวาไปซ้าย; การแยกทิศทางแบบ bidi ในข้อความแจ้งข้อผิดพลาด
hiสูงมากกลุ่มมาตรา/วิรามะ; ตัวเลขอินดิก
viสูงเครื่องหมายกำกับเสียงจำนวนมากบนอักษรละติน; กรณีขอบของ NFKC

ชุดอ้างอิงนี้เลือกเพื่อครอบคลุมสถาปัตยกรรม ไม่ใช่เพื่อจำนวนประชากร จำนวนประชากรเพียงอย่างเดียวไม่อาจพิสูจน์สิ่งใดที่ substrate ยังไม่รองรับได้

ตัวอย่างซอร์สที่แปลเป็นภาษาท้องถิ่น#

locale ที่ไม่ใช่ canonical ทั้งหกมีแพ็ก Faber ครบชุดอยู่ใต้ examples/reader-locale/ โดยมีซอร์สที่แปลเป็นภาษาท้องถิ่น กรณีทดสอบ ข้อผิดพลาด และ manifest faber.toml โปรแกรม greet เดียวกันเมื่อเรนเดอร์ ผ่านทุก locale ที่จัดส่ง:

ภาษาละติน lacanonical

ฟังก์ชัน salve(ข้อความ nomen)  ข้อความ {
    คงที่ ข้อความ msg  "Salve, §!"(nomen)
    คืน msg
}

เริ่ม {
    คงที่ ข้อความ m  salve("munde")
    บันทึก m
}

การเรนเดอร์แบบ canonical faber format --canonical มีความหมายตรงกับ faber format --reader-locale=la คีย์เวิร์ดภาษาละตินแมปเข้าหาตัวเอง และชื่อชนิดข้อมูลใช้รูปสะกดแบบ canonical

ไทย th-THข้อพิสูจน์อ้างอิง

ฟังก์ชัน salve(ข้อความ nomen) → ข้อความ {
    ค่าคงที่ ข้อความ msg ← "Salve, §!"(nomen)
    คืนค่า msg
}

เริ่มต้น {
    ค่าคงที่ ข้อความ m ← salve("มุนเด")
    แจ้ง m
}

ข้อพิสูจน์ด้านการเข้าถึง ภาษาไทยเป็นระบบอักษรไร้ช่องว่าง — ไม่มีขอบเขตระหว่างคำ — จึงเป็นการทดสอบความเครียดของตัวแยกโทเคนและเป็นแรงผลักดันดั้งเดิมของระบบ reader locale ทุกขอบเขตของโทเคนต้องถูกแก้ไขโดย lexer ด้วยการจับคู่คีย์เวิร์ดเท่านั้น

จีนตัวย่อ zh-Hans

函数 问候(文本 名字) → 文本 {
    常量 文本 问候语 ← "你好,§!"(名字)
    返回 问候语
}

入口 {
    常量 文本 消息 ← 问候("世界")
    显示 消息
}

คีย์เวิร์ดคู่ (如果/否则 สำหรับ si/secus) ต้องใช้กลุ่มคีย์เวิร์ดของแพ็ก; เครื่องหมายวรรคตอนแบบเต็มความกว้าง/ครึ่งความกว้าง; และการยุบความกว้างด้วย NFKC เมื่อเข้าสู่ lexer นี่เป็นกรณีการส่งออกด้วย LLM ที่ยากที่สุด เนื่องจากขอบเขต โทเคนของตัวแยก CJK แพ็กพี่น้องสำหรับภาษาจีนตัวเต็ม (zh-Hant) จะสืบทอดและ โอเวอร์ไรด์รากของ zh-Hans

อาหรับ ar

دالة salve(نص nomen) → نص {
    ثابت نص msg ← "مرحبا، §!"(nomen)
    أعد msg
}

بداية {
    ثابت نص m ← salve("عالم")
    اعرض m
}

ระบบอักษรขวาไปซ้ายที่ฝังอยู่ภายในบล็อกโค้ดลำดับตรรกะซ้ายไปขวา คีย์เวิร์ดจะถูก ห่อด้วย <bdi> (การแยกทิศทางแบบ bidi) ในเอาต์พุต HTML ของข้อความแจ้งข้อผิดพลาด จากคอมไพเลอร์ เพื่อป้องกันการบิดเบือนแบบ RFO (ขวาตามซ้าย) ซอร์สดิบใช้อักษรอาหรับ ตามลำดับตรรกะ ส่วนแสดงผลจะจัดการการนำเสนอแบบ bidi

ฮินดี hi

फलन salve(पाठ nomen) → पाठ {
    स्थिर पाठ msg ← "Salve, §!"(nomen)
    लौटा msg
}

आरंभ {
    स्थिर पाठ m ← salve("जगत")
    दिखा m
}

อักษรเทวนาครีที่มีกลุ่มพยัญชนะมาตรา/วิรามะ พิสูจน์เส้นทางสำหรับตระกูลอักษร อินดิกที่กว้างขึ้น — เบงกาลี ทมิฬ และเตลูกูสืบทอดโครงสร้างพื้นฐานด้านการจัดรูป เดียวกัน — แม้การเขียนแพ็กของแต่ละภาษาจะยังเป็นงานแยกต่างหาก อักขระตัวเลขอินดิก (०-९) ไม่ได้รับการยอมรับในลิเทอรัลตัวเลข; ตัวเลข ASCII ยังคงเดิมในทุก locale

เวียดนาม vi

hàm chào(vănbản tên) → vănbản {
    hằng vănbản lời_chào ← "Xin chào, §!"(tên)
    trả lời_chào
}

bắtđầu {
    hằng vănbản thông_điệp ← chào("thế giới")
    in thông_điệp
}

กรณีควบคุม: ใช้อักษรละตินแต่ไม่ใช่ภาษาอังกฤษ ภาระเครื่องหมายกำกับเสียงจำนวนมาก (ế, ệ, ả) ทดสอบกรณีขอบของ NFKC ใน lexer และป้องกันสถาปัตยกรรมที่ทำงานกับ อักษรแปลกใหม่ได้ แต่ยังไม่พิสูจน์กับอักษรละตินที่มีเครื่องหมายกำกับเสียง identifier ใช้คำภาษาเวียดนาม (chào, tên, lời_chào, thông_điệp) และคงเดิม ทุกไบต์โดยคอมไพเลอร์

อักขระ (← → ∴ ≡ ∪ ⇥) ตำแหน่งเชิงโครงสร้าง และชื่อ identifier เหมือนกัน ในการเรนเดอร์ทั้งหกแบบ ข้างต้น มีเพียงคีย์เวิร์ดและชื่อชนิดข้อมูลที่เปลี่ยน HIR คือโปรแกรมเดียวกันทุกประการ — คอมไพเลอร์ถือว่าทั้งหกแบบเทียบเท่ากัน การเรนเดอร์ Faber เป็นภาษาไทยคือการทำงาน ของคอมไพเลอร์แบบเดียวกับการเรนเดอร์เป็น Rust: HIR → surface โดยไม่มีรูปแบบใดได้รับสิทธิพิเศษ

ข้อความแจ้งข้อผิดพลาดที่แปลเป็นภาษาท้องถิ่น#

ข้อความแจ้งข้อผิดพลาดคือ ข้อเท็จจริงที่มีโครงสร้างก่อนจะเป็นร้อยแก้ว ข้อผิดพลาด แต่ละรายการมีรหัสคงที่ (LEX###, PARSE###, SEM###, WARN###) และอาร์กิวเมนต์ที่มีชื่อ แพ็กจะเป็นเจ้าของข้อความเทมเพลตที่เรนเดอร์ ซึ่งหมายความว่า renderer ของข้อความแจ้งข้อผิดพลาดสามารถสร้างข้อความใน locale ใด ก็ได้โดยไม่ต้องเปลี่ยนโครงสร้างพื้นฐานของระบบข้อผิดพลาด

แพ็กตัวอย่าง reader locale มีกรณีทดสอบข้อความแจ้งข้อผิดพลาด — ชนิดข้อมูลไม่ตรงกัน ตัวแปรที่ไม่ได้นิยาม ตัวเลขที่ไม่ใช่ ASCII — เพื่อพิสูจน์ว่าไปป์ไลน์ทั้งหมดรองรับ locale:

  • examples/reader-locale/vi/src/type-mismatch.fab
  • examples/reader-locale/vi/src/undefined-variable.fab
  • examples/reader-locale/vi/src/non-ascii-number.fab
  • examples/reader-locale/vi/src/keyword-suggestion.fab
  • examples/reader-locale/vi/src/keyword-edit-distance.fab

มีการแยกทิศทางแบบ bidi ในตัว: คีย์เวิร์ดภาษาอาหรับภายในบล็อกโค้ดลำดับตรรกะ ซ้ายไปขวาจะถูกห่อด้วยองค์ประกอบ <bdi> ในเอาต์พุต HTML เพื่อป้องกันการบิดเบือน แบบ RFO (ขวาตามซ้าย) ซึ่งมิฉะนั้นจะทำให้ช่วงข้อความ RTL อ่านไม่ออก

สถานะ#

ชั้นสถานะ
สคีมาแพ็ก alias การสืบทอด การตรวจสอบ ข้อผิดพลาด และอาร์ติแฟกต์ LLMจัดส่งแล้ว
การทำ lexing ที่รองรับแพ็ก การแก้ไขชนิดข้อมูล การเลือกผ่าน manifest/CLI และ fallback ที่มองเห็นได้จัดส่งแล้ว
การเรนเดอร์ข้อความแจ้งข้อผิดพลาดที่แพ็กเป็นเจ้าของ faber explain และการแสดงผลที่แยกทิศทาง bidiจัดส่งแล้ว
การจัดรูปแบบ Faber แบบ canonicalจัดส่งแล้ว
การส่งออก Faber ที่แปลเป็นภาษาท้องถิ่น (format --reader-locale)บางส่วน
โอเวอร์เลย์คำอธิบาย stdlib ความเที่ยงตรงของการส่งออกด้วย LLM ที่วัดผลแล้ว และความครอบคลุม locale ครบถ้วนเลื่อนออกไป
การสร้างเอกสารหลายภาษาเสนอแล้ว

ข้อกำหนดพื้นฐานของ substrate — การทำ normalization แบบ NFKC เมื่อเข้าสู่ lexer — ได้ถูกนำมาใช้แล้ว ตารางคีย์เวิร์ด อาร์กิวเมนต์ที่มีชื่อของข้อผิดพลาด renderer และ การจัดส่งแพ็กพร้อมใช้งานแล้ว ส่วนชั้นเป้าหมายหลัก — การส่งออกที่แปลเป็นภาษาท้องถิ่น คำอธิบาย stdlib การวัดผลการส่งออกด้วย LLM และเอกสารหลายภาษาที่สร้างขึ้น — ยังคงระบุไว้อย่างชัดเจนว่าอยู่ระหว่างดำเนินการหรือเลื่อนออกไป

แหล่งอ้างอิง#

  1. radix/docs/design/reader-locale.md — เอกสารการออกแบบฉบับเต็ม (69 KB)
  2. examples/reader-locale/ — แพ็ก locale 6 แพ็กพร้อมซอร์สที่แปลเป็นภาษาท้องถิ่น
  3. stdlib/reader/*/pack.toml — นิยามแพ็กที่ติดตั้งแล้ว 7 รายการ
  4. radix/crates/radix/src/reader_locale.rs — การทำงานของ runtime
  5. radix/docs/design/faber-canonical-surface.md — โหมด canonical และ faber format
  6. radix/docs/factory/lex-nfkc-normalization/ — การส่งมอบข้อกำหนดเบื้องต้น NFKC

Reader-locale packages#

แต่ละภาษาสำหรับผู้อ่านที่ไม่ใช่ภาษาละตินจะมีแพ็กเกจ Faber แบบสมบูรณ์อยู่ภายใต้ examples/reader-locale/ โดยมีซอร์สที่แปลเป็นภาษาท้องถิ่น กรณีทดสอบการวินิจฉัย และไฟล์แมนนิเฟสต์ faber.toml

แพ็กเกจที่มีให้ใช้งาน {#available-packages}

ภาษาเส้นทางตัวอย่างซอร์ส
th-THexamples/reader-locale/th-TH/ฟังก์ชัน salve(ข้อความ nomen) → ข้อความ
zh-Hansexamples/reader-locale/zh-Hans/函数 问候(文本 名字) → 文本
zh-Hantexamples/reader-locale/zh-Hant/函式 問候(文字 名字) → 文字
arexamples/reader-locale/ar/دالة تحية(نص اسم) → نص
hiexamples/reader-locale/hi/फलन नमस्कार(पाठ नाम) → पाठ
viexamples/reader-locale/vi/hàm chào(vănbản tên) → vănbản

กรณีทดสอบการวินิจฉัย {#diagnostic-test-cases}

แต่ละแพ็กเกจมีกรณีทดสอบที่ยืนยันว่ากระบวนการคอมไพเลอร์ทั้งหมดรองรับภาษาแต่ละภาษา:

  • type-mismatch.fab — ข้อผิดพลาดด้านชนิดข้อมูลที่แปลเป็นภาษาท้องถิ่น
  • undefined-variable.fab — ข้อผิดพลาดการแก้ชื่อที่แปลเป็นภาษาท้องถิ่น
  • non-ascii-number.fab — การจัดการ NFKC
  • keyword-suggestion.fab — คำแนะนำ “คุณหมายถึง?” ที่แปลเป็นภาษาท้องถิ่น