คิดแบบภาษาสำหรับอาร์เรย์
(github.com/razetime)คิดแบบภาษา 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) คืนค่าเป็นอาร์เรย์ จึงสามารถลบตัวแปร globalCออกได้ - สามารถลบตัวแปร
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 ความคิดเห็น
ความคิดเห็นจาก Hacker News
หลายคนตั้งคำถามถึงประโยชน์ใช้สอยและความเข้าใจได้ของภาษาอาร์เรย์
ภาษาอาร์เรย์มีแง่มุมที่น่าทึ่งอีกมาก และรายการข้างต้นเป็นเพียงบางส่วนเท่านั้น
หากไม่เคยได้ยินเรื่อง array programming มาก่อนและอยากได้คำแนะนำเบื้องต้น ขอแนะนำ "The Array Cast"
เคยค้นพบ APL/APL2 ในช่วงยุค 70 และหลงใหลกับมัน แต่รู้สึกดึงดูดกับความสามารถในการประกอบฟังก์ชันมากกว่า
ความตระหนักรู้ที่สำคัญที่สุดจากการใช้ภาษาอาร์เรย์:
คำถามเกี่ยวกับภาษาอาร์เรย์: จะทำงานอย่าง "หาตัวเลขทั้งหมดที่น้อยกว่า N ซึ่งทำให้เงื่อนไข P เป็นจริง" ได้อย่างไร?
ประสบการณ์กับภาษา J: พาราไดม์ของภาษาอาร์เรย์มีอคติในตัว และไม่แน่ใจว่าการคิดทุกปัญหาเป็นการซ้อนกันของอาร์เรย์นั้นมีประโยชน์จริงหรือไม่
ความประทับใจจากการแก้โจทย์ด้วยภาษา K: ภาษา K จงใจทำให้เข้าใจยาก
ตัวอย่างจากภาษาอาร์เรย์ J: ใช้
dot =: +/ . *เพื่อคำนวณ dot product ของ P และ Qไวยากรณ์ของภาษา K สั้นกว่า แต่ต้องคงบริบทที่ฝังอยู่จำนวนมากเกี่ยวกับวิธีทำงานของภาษา K ไว้ในหัวตลอดเวลา