2 คะแนน โดย GN⁺ 2024-01-15 | 1 ความคิดเห็น | แชร์ทาง WhatsApp

คิดแบบภาษา K

  • การเขียนโปรแกรม K ส่วนใหญ่ทำผ่าน REPL
  • rlwrap ของ ngn/k สามารถเลื่อนดูประวัติด้วยปุ่มลูกศรได้ จึงมีประโยชน์สำหรับการพัฒนาโปรแกรมขนาดใหญ่
  • ฟังก์ชันจะถูกทดสอบใน REPL ก่อน แล้วจึงย้ายไปใส่ในโค้ดจริง
  • การแสดงผลแบบสวยงามของ ngn/k จะคืนค่าเป็นข้อมูล K ที่ถูกต้องเสมอ และสามารถคำนวณล่วงหน้าเพื่อเพิ่มความเร็วของโปรแกรมได้
  • สคริปต์ K จะทำงานเหมือนกับการพิมพ์ลงใน REPL และค่าที่คืนจากแต่ละบรรทัดจะถูกพิมพ์ออกมา เว้นแต่บรรทัดนั้นจะลงท้ายด้วยอัฒภาค
  • สคริปต์รองรับการกำหนดนิยามหลายบรรทัด ซึ่งช่วยให้อ่านง่ายขึ้น
  • หากต้องการบันทึกงานไว้ในสคริปต์แล้วนำมาใช้ใน REPL สามารถใช้ \\lfile.k เพื่อรันไฟล์และโหลดข้อมูลได้
  • สามารถโหลดไฟล์เดิมซ้ำหลายครั้งใน REPL เพื่อเขียนทับข้อมูลก่อนหน้าได้
  • คู่มือช่วยเหลือของ REPL ที่เข้าถึงด้วย \\ มีคำสั่งที่มีประโยชน์หลากหลาย

การทำให้ array programming เรียบง่ายขึ้น

  • array programming คือกระบวนการอย่างต่อเนื่องในการลดรูปแบบที่ซับซ้อนให้กลายเป็นรูปแบบที่เล็กลง เชิงประกาศมากขึ้น และอ่านง่ายขึ้น
  • วิธีทำให้รูปแบบที่ซับซ้อนง่ายลงมีการอธิบายไว้อย่างละเอียดใน "Patterns and Anti-patterns in APL: Escape the Beginner's Plateau - Aaron Hsu - Dyalog '17"

การแปลง matrix multiplication เป็น K

  • สามารถแปลงอัลกอริทึมแบบวนซ้ำของ matrix multiplication ที่นำมาจากบทความใน Wikipedia ให้เป็น K ได้โดยตรง
  • ตัวอย่างโค้ด K ที่แย่ที่สุดจะมีการกำหนดตัวแปร global จำนวนมาก มีลูปซ้อนกัน และต้องมีการแก้ไขข้อมูลจำนวนมาก
  • เราสามารถทำให้โค้ดง่ายขึ้นเพื่อแก้ปัญหาเหล่านี้ทีละอย่าง

การทำให้ลูปชั้นในง่ายขึ้น

  • ในลูปชั้นใน สามารถใช้ sum ร่วมกับ fold(/) เพื่อทำให้เรียบง่ายขึ้น
  • เนื่องจาก ' (each) คืนค่าเป็นอาร์เรย์ จึงสามารถลบตัวแปร global C ออกได้
  • สามารถลบตัวแปร i, j, k เพื่อทำให้ลูปง่ายขึ้น

การลบลูปและลดการใช้ตัวแปร global

  • สามารถลบลูประดับกลางได้โดยจับคู่แถวและคอลัมน์โดยตรงโดยไม่ต้องใช้ k
  • เพื่อลบ j สามารถจับคู่แต่ละคอลัมน์ของ B กับ A[i] ได้
  • เพื่อลบ i สามารถใช้ eachleft เพื่อจับคู่แต่ละแถวของ A กับแต่ละคอลัมน์ของ B ได้
  • ไม่จำเป็นต้องใช้ตัวแปร global อีกต่อไป

รูปแบบสุดท้ายของฟังก์ชัน matrix multiplication

  • + (transpose) มีต้นทุนสูง จึงสามารถตัดออกได้
  • แทนที่จะคูณแต่ละแถวของ x กับแต่ละคอลัมน์ของ y ก็สามารถทำงานเดียวกันโดยนัยได้ ด้วยการจับแต่ละแถวของ B เข้ากับ A ทั้งหมด
  • สุดท้ายจะได้ฟังก์ชัน matrix multiplication ที่กระชับและชัดเจน
  • กระบวนการทำให้โค้ดง่ายขึ้นอาจต้องผ่านหลายขั้นตอนในตอนแรก แต่เมื่อชำนาญ K มากขึ้น ก็จะง่ายและเป็นธรรมชาติมากขึ้น
  • matrix multiplication เป็นกระบวนการง่าย ๆ ที่เข้ากันได้ดีกับการรองรับอาร์เรย์ของ K
  • จะมีการดูอัลกอริทึมอื่น ๆ ที่เข้ากับ K ได้น้อยกว่า และวิธีจัดการกับมันในบทถัด ๆ ไป

ความเห็นของ GN⁺

  • บทความนี้แสดงให้เห็นว่าสามารถใช้ภาษา K เพื่อลดความซับซ้อนและปรับอัลกอริทึมอย่าง matrix multiplication ให้มีประสิทธิภาพขึ้นได้อย่างไร
  • ฟีดแบ็กทันทีผ่าน REPL และการปรับปรุงโค้ดแบบวนซ้ำเป็นลักษณะสำคัญของการเขียนโปรแกรม K และยังเป็นวิธีเรียนรู้ที่มีประโยชน์แม้สำหรับวิศวกรซอฟต์แวร์ระดับเริ่มต้น
  • กระบวนการทำให้โค้ดเรียบง่ายเป็นสิ่งสำคัญต่อการพัฒนาทักษะการเขียนโปรแกรม และบทความนี้ก็อธิบายกระบวนการดังกล่าวผ่านตัวอย่างที่เป็นรูปธรรมได้อย่างเข้าใจง่าย

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

 
GN⁺ 2024-01-15
ความคิดเห็นจาก Hacker News
  • หลายคนตั้งคำถามถึงประโยชน์ใช้สอยและความเข้าใจได้ของภาษาอาร์เรย์

    • ภาษาอาร์เรย์ไม่ได้เหมาะกับทุกปัญหา
    • แต่กลับเก่งอย่างน่าทึ่งกับปัญหาหลายประเภท
    • ผู้ใช้ภาษาอาร์เรย์โดยมากมักฉลาดมาก
    • การเรียนรู้วิธีการทำงานของภาษาอาร์เรย์เป็นความท้าทายใหญ่
    • การเขียนโค้ดแบบ "procedural" ในภาษาอาร์เรย์เป็นสิ่งที่แย่มาก
    • การเข้าใจ tacit programming เป็นประสบการณ์ที่ยอดเยี่ยมและช่วยขยายกรอบความคิด
    • ประสบการณ์เมื่อซึมซับ verb trains ได้อย่างแท้จริง
    • การเข้าใจวิธีที่ภาษาแบบอาร์เรย์จัดการอาร์เรย์ในทุกมิติ
    • การเข้าใจวิธีทำงานของ "under"
    • การเข้าใจวิธีทำงานของ function exponents
  • ภาษาอาร์เรย์มีแง่มุมที่น่าทึ่งอีกมาก และรายการข้างต้นเป็นเพียงบางส่วนเท่านั้น

    • การได้เห็น Aaron Hsu พัฒนาคอมไพเลอร์ APL แบบขนาน ทำให้เชื่อมั่นในศักยภาพที่แท้จริงของภาษาอาร์เรย์
    • มีการพูดถึง "semantic density" ของโค้ด APL
  • หากไม่เคยได้ยินเรื่อง array programming มาก่อนและอยากได้คำแนะนำเบื้องต้น ขอแนะนำ "The Array Cast"

  • เคยค้นพบ APL/APL2 ในช่วงยุค 70 และหลงใหลกับมัน แต่รู้สึกดึงดูดกับความสามารถในการประกอบฟังก์ชันมากกว่า

    • Haskell มีความเป็น pure และมี type system จึงสนุกและทรงพลังกว่า APL
    • "notation as a tool of thought" ของ APL ดูเหมือนเป็นตรรกะที่ใช้ทำให้ความกระชับเกินพอดูสมเหตุสมผล
  • ความตระหนักรู้ที่สำคัญที่สุดจากการใช้ภาษาอาร์เรย์:

    • กริยาคืออัลกอริทึม
    • การต่อเนื่องของกริยา (หรือคำกริยาวิเศษณ์) เป็นรูปแบบการประกอบที่ตรงไปตรงมาที่สุดเท่าที่เคยใช้มา
    • โปรแกรมคือการประกอบอัลกอริทึม ไม่ใช่ชุดของประโยคและนิพจน์
    • แนวคิดเรื่องการจัดการโดเมนและเรนจ์อย่างสม่ำเสมอข้ามอาร์เรย์ แมป และฟังก์ชัน
    • การประเมินผลจากซ้ายไปขวาโดยไม่ต้องให้สายตา "กระโดดไปมา" เวลาที่อ่านโค้ด
    • เป็นไปได้และน่าพึงใจกว่าที่จะส่งโค้ดไปหาข้อมูล
    • ข้อดีเพิ่มเติมของภาษา K: สามารถทำ views (หรือก็คือ dependencies) ได้โดยตรง และรองรับ hot code loading ผ่านอินเทอร์พรีเตอร์
  • คำถามเกี่ยวกับภาษาอาร์เรย์: จะทำงานอย่าง "หาตัวเลขทั้งหมดที่น้อยกว่า N ซึ่งทำให้เงื่อนไข P เป็นจริง" ได้อย่างไร?

    • โดยทั่วไปในภาษาอาร์เรย์ จะสร้างอาร์เรย์ตั้งแต่ 1 ถึง N แล้วทดสอบเงื่อนไขกับอาร์เรย์ จากนั้นใช้ mask เพื่อดึงเฉพาะองค์ประกอบที่ตรงเงื่อนไข
    • ถ้า N มีขนาดใหญ่และเงื่อนไขไม่ค่อยเป็นจริง การสร้างอาร์เรย์ชั่วคราวจำนวนมากเกินจำเป็นก็ดูเป็นการสิ้นเปลืองหน่วยความจำและทรัพยากร
    • การติดตั้งใช้งานของภาษาอาร์เรย์อาจปรับให้เหมาะสมกับปัญหานี้ หรือแก้ด้วยเทคนิคอย่าง lazy evaluation
  • ประสบการณ์กับภาษา J: พาราไดม์ของภาษาอาร์เรย์มีอคติในตัว และไม่แน่ใจว่าการคิดทุกปัญหาเป็นการซ้อนกันของอาร์เรย์นั้นมีประโยชน์จริงหรือไม่

    • การสร้างโครงสร้างข้อมูลได้อย่างอิสระเพื่อช่วยทำให้ปัญหาง่ายขึ้น อาจทำให้ส่วนของอัลกอริทึมเรียบง่ายลงได้มาก
    • หากจะใช้ APL/J/K ให้คล่อง ก็ต้องฉลาดขึ้นเพราะอคตินี้
  • ความประทับใจจากการแก้โจทย์ด้วยภาษา K: ภาษา K จงใจทำให้เข้าใจยาก

    • มันเป็นภาษาที่เหมาะกับปริศนาและวิธีแก้แบบชาญฉลาด แต่การทำงานกับอาร์เรย์ numpy ใน Python ก็ช่วยสอนให้เข้าใจภาษาอาร์เรย์และวิธีคิดแบบอาร์เรย์ได้เช่นกัน
  • ตัวอย่างจากภาษาอาร์เรย์ J: ใช้ dot =: +/ . * เพื่อคำนวณ dot product ของ P และ Q

  • ไวยากรณ์ของภาษา K สั้นกว่า แต่ต้องคงบริบทที่ฝังอยู่จำนวนมากเกี่ยวกับวิธีทำงานของภาษา K ไว้ในหัวตลอดเวลา