Kip ภาษาโปรแกรมที่อิงตามระบบการกของไวยากรณ์ภาษาตุรกี
(github.com/kip-dili)- Kip เป็น ภาษาโปรแกรมเชิงทดลอง ที่ผสาน ระบบการกและมูด (mood) ทางไวยากรณ์ ของภาษาตุรกีเข้ากับระบบชนิดข้อมูล โดยสำรวจการผสานกันระหว่างสัณฐานวิทยาภาษาธรรมชาติกับทฤษฎีชนิดข้อมูล
- สะท้อน การผันการกของคำนามและความกลมกลืนของสระ ในภาษาตุรกีลงในโครงสร้างโค้ด แยกความสัมพันธ์ของอาร์กิวเมนต์ของฟังก์ชันด้วยปัจจัยบอกการก และรองรับ ความยืดหยุ่นของลำดับอาร์กิวเมนต์
- แสดงความสามารถหลักของภาษาฟังก์ชันสมัยใหม่ เช่น pattern matching, polymorphic types, inductive data types, และ เอฟเฟกต์อินพุต/เอาต์พุต ผ่านรูปแบบไวยากรณ์ภาษาตุรกี
- สร้างด้วยตัววิเคราะห์หน่วยคำ Foma และ Haskell Stack พร้อมมี สภาพแวดล้อมรันบนเบราว์เซอร์ที่อิง WASM และความสามารถ แคชไบต์โค้ด (.iz)
- เป็น โครงการเพื่อการวิจัยและการศึกษา ที่แสดงจุดตัดระหว่างภาษาศาสตร์กับการออกแบบภาษาโปรแกรม และเป็นกรณีทดลองความเป็นไปได้ของการออกแบบภาษาที่อิงภาษาธรรมชาติ
ภาพรวมของ Kip
- Kip เป็นภาษาที่ตั้งชื่อตามคำภาษาตุรกี ‘kip’ (มูด) และเป็นภาษาเชิงทดลองที่ นำระบบการกของไวยากรณ์ภาษาตุรกีมาไว้ในระบบชนิดข้อมูล
- ผสาน การผันการกของคำนาม (ismin halleri) และ ความกลมกลืนของสระ (vowel harmony) ของภาษาตุรกีเข้ากับการออกแบบภาษาโปรแกรม
- เป็นโครงการเพื่อ การวิจัยและการศึกษา ไม่ใช่ภาษาสำหรับนำไปใช้งานจริง
- มี บทเรียนทั้งภาษาตุรกีและภาษาอังกฤษ ให้เรียนรู้วิธีเขียนโปรแกรม Kip
- ไวยากรณ์และพฤติกรรมของภาษายังอยู่ในขั้นทดลอง และ อาจเปลี่ยนแปลงได้ในอนาคต
คุณลักษณะของภาษา
- ใช้ระบบการกของภาษาตุรกีเป็นชนิดข้อมูล
- รองรับการก 8 แบบ ได้แก่ nominative, accusative, dative, locative, ablative, genitive, instrumental และ possessive
- แต่ละการกแสดงด้วยปัจจัยท้ายคำ และใช้แยกความสัมพันธ์ระหว่างอาร์กิวเมนต์ของฟังก์ชันอย่างชัดเจน
- ลำดับอาร์กิวเมนต์ยืดหยุ่น
- เนื่องจากปัจจัยบอกการกทำให้ความสัมพันธ์ของอาร์กิวเมนต์ชัดเจน จึงสลับลำดับอาร์กิวเมนต์ได้โดยยังคงความหมายเดิม
- ตัวอย่าง:
(5'le 3'ün farkını) yaz.และ(3'ün 5'le farkını) yaz.ให้ผลลัพธ์เหมือนกัน
- การกำหนดชนิดข้อมูลแบบอุปนัย
- นิยาม algebraic data types ด้วยไวยากรณ์ภาษาตุรกี
- ตัวอย่าง:
Bir doğal-sayı ya sıfır ya da bir doğal-sayının ardılı olabilir.
- รองรับ polymorphic types
- สามารถนิยามโครงสร้างข้อมูลแบบ generic ได้
- ตัวอย่าง: นิยามชนิดข้อมูลลิสต์ในรูป
(öğe listesi)
- Pattern matching
- ใช้ปัจจัยเงื่อนไข
-sa/-seเพื่อทำ pattern matching - รองรับ nested patterns, binders และ wildcard (
değilse)
- ใช้ปัจจัยเงื่อนไข
- การนิยามค่าคงที่
- ใช้คีย์เวิร์ด
diyelimเพื่อประกาศค่าคงที่ที่มีชื่อ - ตัวอย่าง:
sıfırın ardılına bir diyelim.
- ใช้คีย์เวิร์ด
- อินพุต/เอาต์พุตและการจัดการเอฟเฟกต์
- ใช้ปัจจัย
-ip/-ıp/-up/-üpสำหรับการรันแบบลำดับ และolarakสำหรับการ bind - ตัวอย่าง:
selamlamak, isim olarak okuyup, ("Merhaba "yla ismin birleşimini) yazmaktır.
- ใช้ปัจจัย
- ชนิดข้อมูลพื้นฐาน
- จำนวนเต็ม (
tam-sayı): รองรับการดำเนินการอย่างtoplamı,farkı,çarpımıเป็นต้น - สตริง (
dizge): มีuzunluğu,birleşimi,tam-sayı-hali - อินพุต/เอาต์พุต: รองรับคำสั่ง
yazmak,okumak
- จำนวนเต็ม (
- คอมเมนต์และลิเทอรัล
- คอมเมนต์:
(* ... *) - ลิเทอรัล: อยู่ในรูปพร้อมปัจจัยบอกการก เช่น
"merhaba"'yı yaz.
- คอมเมนต์:
การติดตั้งและการรัน
- เครื่องมือที่จำเป็น
- Foma: ชุดเครื่องมือวิเคราะห์หน่วยคำแบบ finite-state
- Stack: เครื่องมือ build สำหรับ Haskell
- วิธี build
- รันสคริปต์
install.shหรือ build ด้วยตนเองด้วยคำสั่งstack build - มี ตัวแปลง TRmorph อยู่ใน
vendor/trmorph.fst
- รันสคริปต์
- การรัน
- REPL:
stack exec kip - รันไฟล์:
stack exec kip -- --exec path/to/file.kip - ติดตั้งลง PATH:
stack install
- REPL:
WASM Playground
- ในไดเรกทอรี
playground/มี บิลด์สำหรับรันบนเบราว์เซอร์- คอมไพล์
kip-playgroundเป็นwasm32-wasi - ใช้งาน Kip ในเบราว์เซอร์ได้ผ่าน HTML/JS harness
- ขั้นตอน build โดยละเอียดดูที่
playground/README.md
- คอมไพล์
แคชไบต์โค้ด (.iz)
- แคช ผลการตรวจชนิดข้อมูล ของแต่ละไฟล์
.kipแล้วเก็บเป็นไฟล์.iz- หากซอร์สหรือ dependency ไม่เปลี่ยน จะนำแคชกลับมาใช้ซ้ำ
- หากลบไฟล์
.izจะทำการ parse และตรวจชนิดข้อมูลใหม่ - มี hash ของคอมไพเลอร์รวมอยู่ด้วย จึงทำให้แคชเป็นโมฆะอัตโนมัติเมื่อเวอร์ชันเปลี่ยน
โปรแกรมตัวอย่าง
- มีตัวอย่างการนิยามจำนวนธรรมชาติ การประกาศค่าคงที่ ฟังก์ชันบวก และการแสดงผลลัพธ์
Bir doğal-sayı ya sıfır ya da bir doğal-sayının ardılı olabilir. sıfırın ardılına bir diyelim. birin ardılına iki diyelim. ikinin ardılına üç diyelim. (bu doğal-sayıyla) (şu doğal-sayının) toplamı, bu sıfırsa, şu, öncülün ardılıysa, (öncülle) (şunun ardılının) toplamıdır. (ikiyle üçün toplamını) yaz.
โครงสร้างโปรเจกต์
- app/ : จุดเข้าใช้งาน CLI (
Main.hs) - src/Kip/ : มี AST, cache, interpreter, parser, renderer, type checker
- lib/ : โมดูลพื้นฐาน (
giriş.kip,temel.kip,temel-liste.kipเป็นต้น) - tests/ : ชุดทดสอบกรณีสำเร็จ (
succeed/) และล้มเหลว (fail/) - vendor/ : ตัวแปลงหน่วยคำ
trmorph.fst
การทดสอบ
- รันด้วยคำสั่ง
stack testtests/succeed/: การทดสอบที่ควรผ่านtests/fail/: การทดสอบที่ควรล้มเหลว
การวิเคราะห์หน่วยคำ
- Kip ใช้ TRmorph เพื่อวิเคราะห์หน่วยคำของภาษาตุรกี
- คำที่มีได้หลายความหมาย (เช่น “takası”) จะถูก parse โดยเก็บทุกการตีความที่เป็นไปได้ไว้
- ตัดสินความหมายในขั้นตอนการตรวจชนิดข้อมูล
- หากต้องการบังคับการตีความแบบเฉพาะ ให้ใช้อะพอสทรอฟี (
') เช่นtaka'sı,takas'ı
ใบอนุญาต
- ดูไฟล์ LICENSE
1 ความคิดเห็น
ความคิดเห็นบน Hacker News
สวัสดีทุกคน ฉันคือ ผู้พัฒนา Kip
เดิมทีตั้งใจจะเปิดเผยหลังจากทำ playground และหน้า landing page ให้เสร็จก่อน แต่ตอนนี้ขอแชร์ playground แบบทำงานบนเบราว์เซอร์ที่ทำไว้จนถึงตอนนี้
https://alpaylan.github.io/kip/
การ transpile ไปเป็น JavaScript เพิ่งเริ่มทำ จึงยังใช้งานไม่ได้ แต่ตัวภาษาเองสามารถรันได้เกือบทั้งหมดแล้ว
ถ้าเจอบั๊ก รบกวนแจ้งที่ issue ของ repo
ฉันเคยคิดจะเรียกมันว่า “Ç” แต่ไม่ได้ลงมือทำจริง ดีใจที่ได้เห็นมีคนลองทำ
โดยส่วนตัวคิดว่า “tense (กาล)” ใกล้เคียงที่สุด
สำหรับข้อมูลอ้างอิงที่เกี่ยวข้อง ฉันดู คำอธิบายของ BBC Bitesize
ตัวอย่างเช่น ในประโยคแบบนี้ ความหมายของ ‘farkını’ (ผลต่าง) และตำแหน่งของคำช่วยใช้แยกว่าเป็น 5-3 หรือ 3-5 หรือไม่
ด้วยความที่เป็นไวยากรณ์อิงภาษาธรรมชาติ มันเลยให้ความรู้สึกเหมือนภาษาที่ใช้อธิบายนิยามทางคณิตศาสตร์
https://kip-dili.github.io/
โครงสร้างของภาษายังดูเหมือนตาม ลำดับไวยากรณ์แบบแองโกล-แซกซัน อยู่
ฉันอยากเห็นรูปแบบประมาณนี้ที่เข้ากับไวยากรณ์ตุรกีมากกว่า
แค่การลองทำแบบนี้ก็เป็นจุดเริ่มต้นที่ยอดเยี่ยมแล้ว ขอแสดงความยินดี
โปรเจกต์นี้ เจ๋งมาก
ฉันเองก็กำลังทดลองแนวคิดคล้ายกันที่ Logicaffeine Studio
ลองดู Logos lang เพิ่มด้วยก็น่าสนใจ และฉันก็ชอบที่เลือก Haskell
คนรุ่นก่อนอาจจะจำ Lingua::Romana::Perligata ได้
https://metacpan.org/dist/Lingua-Romana-Perligata/view/lib/Lingua/Romana/Perligata.pm
ฉันเองก็เคยทดลองไอเดียคล้ายกันเมื่อหลายปีก่อน
https://github.com/celaleddin/sembolik-fikir
ช่วงสองสามวันข้างหน้าตั้งใจว่าจะลองดูเพิ่มอีก
ใน Kip ใช้ TRmorph เพื่อทำการวิเคราะห์หน่วยคำอย่างครบถ้วน และแก้ความกำกวมในขั้นตอน type checking
เลยแทบไม่ต้องใช้ apostrophe เลย เป็นงานที่ทำยาก แต่ก็เป็นปัญหาที่สนุกดี
ฉันอ่านภาษาตุรกีได้นิดหน่อย และโปรเจกต์นี้ทำให้วันนี้ของฉันสดใสขึ้น
น่าสนใจที่ ระบบการก ของภาษาตุรกีมีความชัดเจนและเป็นมาตรฐานมากพอ จึงทำให้การออกแบบภาษาแบบนี้เป็นไปได้
ตัวอย่างเช่นประโยค “Colonel Mustard killed him in the study at 5:00 with his own knife.” ถึงจะสลับลำดับก็ยังคงความหมายไว้ได้
ในบทกวีภาษาละตินหรือรัสเซียก็พบลำดับคำซับซ้อนแบบนี้บ่อยเช่นกัน
ตอนแรกฉันกดลิงก์เข้าไปด้วยอคติ แต่คำอธิบายนั้น เรียบร้อยและเข้าใจง่าย
ถ้ามีเวอร์ชันภาษาเยอรมันก็น่าจะสนุกดี
ขอแชร์ บทความจาก Language Log เป็นข้อมูลอ้างอิงเรื่องไวยากรณ์มากกว่าตัวภาษาเอง
แฟนฉันเป็นคนตุรกี เลยกำลังเรียนภาษาตุรกีอยู่ และตอนนี้น่าจะเร่งความเร็วการเรียนได้ด้วย เซนส์แบบโปรแกรมเมอร์
น่าทึ่งจริง ๆ
มันเป็นแรงจูงใจที่ดีให้กลับมาเรียนต่อจากจุดที่เคยหยุดไว้ในระดับกลาง
ใน ยุค AI แต่ละประเทศสามารถสร้างภาษาโปรแกรมที่สะท้อนขนบทางภาษาของตนเองได้
สิ่งนี้จะขยายทั้ง ความเป็นอิสระและความหลากหลาย ของวัฒนธรรมนักพัฒนาได้อย่างมาก