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 ที่จัดส่ง:
ภาษาละติน la — canonical
ฟังก์ชัน 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.fabexamples/reader-locale/vi/src/undefined-variable.fabexamples/reader-locale/vi/src/non-ascii-number.fabexamples/reader-locale/vi/src/keyword-suggestion.fabexamples/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 และเอกสารหลายภาษาที่สร้างขึ้น — ยังคงระบุไว้อย่างชัดเจนว่าอยู่ระหว่างดำเนินการหรือเลื่อนออกไป
แหล่งอ้างอิง#
radix/docs/design/reader-locale.md— เอกสารการออกแบบฉบับเต็ม (69 KB)examples/reader-locale/— แพ็ก locale 6 แพ็กพร้อมซอร์สที่แปลเป็นภาษาท้องถิ่นstdlib/reader/*/pack.toml— นิยามแพ็กที่ติดตั้งแล้ว 7 รายการradix/crates/radix/src/reader_locale.rs— การทำงานของ runtimeradix/docs/design/faber-canonical-surface.md— โหมด canonical และfaber formatradix/docs/factory/lex-nfkc-normalization/— การส่งมอบข้อกำหนดเบื้องต้น NFKC
Reader-locale packages#
แต่ละภาษาสำหรับผู้อ่านที่ไม่ใช่ภาษาละตินจะมีแพ็กเกจ Faber แบบสมบูรณ์อยู่ภายใต้
examples/reader-locale/ โดยมีซอร์สที่แปลเป็นภาษาท้องถิ่น กรณีทดสอบการวินิจฉัย
และไฟล์แมนนิเฟสต์ faber.toml
แพ็กเกจที่มีให้ใช้งาน {#available-packages}
| ภาษา | เส้นทาง | ตัวอย่างซอร์ส |
|---|---|---|
| th-TH | examples/reader-locale/th-TH/ | ฟังก์ชัน salve(ข้อความ nomen) → ข้อความ |
| zh-Hans | examples/reader-locale/zh-Hans/ | 函数 问候(文本 名字) → 文本 |
| zh-Hant | examples/reader-locale/zh-Hant/ | 函式 問候(文字 名字) → 文字 |
| ar | examples/reader-locale/ar/ | دالة تحية(نص اسم) → نص |
| hi | examples/reader-locale/hi/ | फलन नमस्कार(पाठ नाम) → पाठ |
| vi | examples/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— การจัดการ NFKCkeyword-suggestion.fab— คำแนะนำ “คุณหมายถึง?” ที่แปลเป็นภาษาท้องถิ่น