1 คะแนน โดย GN⁺ 2026-01-19 | 1 ความคิดเห็น | แชร์ทาง WhatsApp
  • 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

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 test
    • tests/succeed/: การทดสอบที่ควรผ่าน
    • tests/fail/: การทดสอบที่ควรล้มเหลว

การวิเคราะห์หน่วยคำ

  • Kip ใช้ TRmorph เพื่อวิเคราะห์หน่วยคำของภาษาตุรกี
    • คำที่มีได้หลายความหมาย (เช่น “takası”) จะถูก parse โดยเก็บทุกการตีความที่เป็นไปได้ไว้
    • ตัดสินความหมายในขั้นตอนการตรวจชนิดข้อมูล
    • หากต้องการบังคับการตีความแบบเฉพาะ ให้ใช้อะพอสทรอฟี (') เช่น taka'sı, takas'ı

ใบอนุญาต

  • ดูไฟล์ LICENSE

1 ความคิดเห็น

 
GN⁺ 2026-01-19
ความคิดเห็นบน Hacker News
  • สวัสดีทุกคน ฉันคือ ผู้พัฒนา Kip
    เดิมทีตั้งใจจะเปิดเผยหลังจากทำ playground และหน้า landing page ให้เสร็จก่อน แต่ตอนนี้ขอแชร์ playground แบบทำงานบนเบราว์เซอร์ที่ทำไว้จนถึงตอนนี้
    https://alpaylan.github.io/kip/
    การ transpile ไปเป็น JavaScript เพิ่งเริ่มทำ จึงยังใช้งานไม่ได้ แต่ตัวภาษาเองสามารถรันได้เกือบทั้งหมดแล้ว
    ถ้าเจอบั๊ก รบกวนแจ้งที่ issue ของ repo

    • ฉันเรียน ภาษาตุรกี มาหลายปี และคิดว่าคุณสมบัติทางไวยากรณ์และความเป็นภาษาติดปะต่อของมันน่าจะน่าสนใจถ้านำมาทำเป็นภาษาโปรแกรม
      ฉันเคยคิดจะเรียกมันว่า “Ç” แต่ไม่ได้ลงมือทำจริง ดีใจที่ได้เห็นมีคนลองทำ
    • พอเห็นว่า “Kip” ในภาษาตุรกีหมายถึง มาลาอารมณ์ของไวยากรณ์ (mood) ก็เลยลองค้นดู แต่แต่ละบริการแปลออกมาเป็น “mode”, “modal”, “tense”, “module” ฯลฯ ต่างกันไป
      โดยส่วนตัวคิดว่า “tense (กาล)” ใกล้เคียงที่สุด
      สำหรับข้อมูลอ้างอิงที่เกี่ยวข้อง ฉันดู คำอธิบายของ BBC Bitesize
    • ไวยากรณ์น่าสนใจดี แต่ฉันสงสัยว่าไวยากรณ์สำหรับการคำนวณตัวเลขทำงานอย่างไร
      ตัวอย่างเช่น
      (5'le 3'ün farkını) yaz.  
      (3'ün 5'le farkını) yaz.  
      
      ในประโยคแบบนี้ ความหมายของ ‘farkını’ (ผลต่าง) และตำแหน่งของคำช่วยใช้แยกว่าเป็น 5-3 หรือ 3-5 หรือไม่
      ด้วยความที่เป็นไวยากรณ์อิงภาษาธรรมชาติ มันเลยให้ความรู้สึกเหมือนภาษาที่ใช้อธิบายนิยามทางคณิตศาสตร์
    • มีการเผยแพร่ เว็บเพจและ playground เวอร์ชันอัปเดตแล้ว
      https://kip-dili.github.io/
    • งานนี้เจ๋งมาก ฉันอยากสำรวจแนวทางแบบนี้มานานแล้ว
  • โครงสร้างของภาษายังดูเหมือนตาม ลำดับไวยากรณ์แบบแองโกล-แซกซัน อยู่
    ฉันอยากเห็นรูปแบบประมาณนี้ที่เข้ากับไวยากรณ์ตุรกีมากกว่า

    Fibonacci-Dizisi (n):  
      n 0'a eşitse: dur.  
      değilse:  
        bu-sayıyı yazdır.  
        şu-sayıyı, (bu-sayı + şu-sayı), (n - 1) ile Fibonacci-Dizisi'ne devam et.  
    

    แค่การลองทำแบบนี้ก็เป็นจุดเริ่มต้นที่ยอดเยี่ยมแล้ว ขอแสดงความยินดี

  • โปรเจกต์นี้ เจ๋งมาก
    ฉันเองก็กำลังทดลองแนวคิดคล้ายกันที่ 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
    ช่วงสองสามวันข้างหน้าตั้งใจว่าจะลองดูเพิ่มอีก

    • เป็นแนวทางที่น่าสนใจ ดูเหมือนจะใช้ การอนุมานหน่วยคำ จาก suffix เป็นหลัก
      ใน Kip ใช้ TRmorph เพื่อทำการวิเคราะห์หน่วยคำอย่างครบถ้วน และแก้ความกำกวมในขั้นตอน type checking
      เลยแทบไม่ต้องใช้ apostrophe เลย เป็นงานที่ทำยาก แต่ก็เป็นปัญหาที่สนุกดี
  • ฉันอ่านภาษาตุรกีได้นิดหน่อย และโปรเจกต์นี้ทำให้วันนี้ของฉันสดใสขึ้น
    น่าสนใจที่ ระบบการก ของภาษาตุรกีมีความชัดเจนและเป็นมาตรฐานมากพอ จึงทำให้การออกแบบภาษาแบบนี้เป็นไปได้

    • ลำดับคำที่ยืดหยุ่น แบบนี้ไม่ได้มีแค่ในภาษาตุรกี แต่ยังพบได้ในภาษาที่มีการผันคำมาก เช่น ภาษาสลาวิก สันสกฤต ฟินแลนด์ ฮังการี เป็นต้น
    • ที่จริงแล้วแม้แต่ภาษาอังกฤษก็มีความยืดหยุ่นของลำดับคำอยู่มากพอสมควร
      ตัวอย่างเช่นประโยค “Colonel Mustard killed him in the study at 5:00 with his own knife.” ถึงจะสลับลำดับก็ยังคงความหมายไว้ได้
      ในบทกวีภาษาละตินหรือรัสเซียก็พบลำดับคำซับซ้อนแบบนี้บ่อยเช่นกัน
  • ตอนแรกฉันกดลิงก์เข้าไปด้วยอคติ แต่คำอธิบายนั้น เรียบร้อยและเข้าใจง่าย
    ถ้ามีเวอร์ชันภาษาเยอรมันก็น่าจะสนุกดี

    • ฉันก็คิดเหมือนกัน ตอนแรกนึกว่าจะเป็นแค่การเอาคีย์เวิร์ดของภาษาอย่าง Rust มาแปลเป็นภาษาตุรกี แต่ของจริงละเอียดประณีตกว่านั้นมาก
  • ขอแชร์ บทความจาก Language Log เป็นข้อมูลอ้างอิงเรื่องไวยากรณ์มากกว่าตัวภาษาเอง

  • แฟนฉันเป็นคนตุรกี เลยกำลังเรียนภาษาตุรกีอยู่ และตอนนี้น่าจะเร่งความเร็วการเรียนได้ด้วย เซนส์แบบโปรแกรมเมอร์
    น่าทึ่งจริง ๆ

    • ฉันเองก็แต่งงานกับคนตุรกี และไม่เคยนึกถึงการผสมกันของ เทคโนโลยี+ภาษา แบบนี้มาก่อนเลย
      มันเป็นแรงจูงใจที่ดีให้กลับมาเรียนต่อจากจุดที่เคยหยุดไว้ในระดับกลาง
  • ใน ยุค AI แต่ละประเทศสามารถสร้างภาษาโปรแกรมที่สะท้อนขนบทางภาษาของตนเองได้
    สิ่งนี้จะขยายทั้ง ความเป็นอิสระและความหลากหลาย ของวัฒนธรรมนักพัฒนาได้อย่างมาก