การสำรวจแนวคิดเรื่อง array ล่าสุดได้จุดประกายการอย่างในชุมชนนักพัฒนาเกี่ยวกับเหตุผลที่ภาษาโปรแกรมสมัยใหม่ยังคงประสบปัญหาในการใช้งาน multidimensional arrays ที่แท้จริง แม้จะมีความสำคัญพื้นฐานในการคำนวณทางวิทยาศาสตร์และการวิเคราะห์ข้อมูล
การสนทนานี้มุ่งเน้นไปที่ช่องว่างระหว่างสิ่งที่ภาษาโปรแกรมเสนอในปัจจุบันกับสิ่งที่นักพัฒนาต้องการจริงๆ สำหรับการจัดการข้อมูลที่ซับซ้อน ในขณะที่ภาษาแรกๆ เช่น FORTRAN มี multidimensional arrays ตั้งแต่เริ่มต้น ภาษาร่วมสมัยหลายภาษากลับล้มเหลวในการให้ความสามารถที่คล้ายกัน
ภาษาสมัยใหม่พลาดเป้า
ชุมชนโปรแกรมเมอร์ได้เน้นย้ำถึงการมองข้ามที่สำคัญในการออกแบบภาษา ภาษาอย่าง Go และ Rust แม้จะมีสถาปัตยกรรมที่ทันสมัยและเน้นประสิทธิภาพ แต่กลับขาดการสนับสนุน multidimensional arrays ที่แท้จริงในระดับภาษา แทนที่จะใช้ arrays-of-arrays ซึ่งไม่รับประกันว่า sub-arrays ทั้งหมดจะมีความยาวเท่ากัน ซึ่งเป็นข้อกำหนดสำคัญสำหรับการดำเนินการทางคณิตศาสตร์และการคำนวณทางวิทยาศาสตร์
ข้อจำกัดนี้กลายเป็นปัญหาโดยเฉพาะเมื่อนักพัฒนาต้องการดำเนินการเช่นการ transpose matrix หรือการ slice ตามแกนต่างๆ การอภิปรายในชุมชนเผยให้เห็นว่าความพยายามในการเพิ่มฟีเจอร์เหล่านี้มักจะติดขัดในรายละเอียดการใช้งานที่ซับซ้อน โดยเฉพาะอย่างยิ่งเกี่ยวกับการดำเนินการ slicing
Arrays-of-arrays: โครงสร้างข้อมูลที่แต่ละองค์ประกอบของ array เป็น array ด้วยตัวเอง แต่ inner arrays สามารถมีความยาวที่แตกต่างกันได้ Slicing: การดึงส่วนหนึ่งของ array เช่น การดึงองค์ประกอบทั้งหมดจากตำแหน่งที่ 2 ถึง 5
ภาษาโปรแกรมที่รองรับอาร์เรย์หลายมิติ:
- FORTRAN: อาร์เรย์หลายมิติแบบดั้งเดิม (ในอดีต)
- Pascal: ประเภทดัชนีและช่วงที่กำหนดเอง
- Haskell: การจัดทำดัชนีอาร์เรย์ที่ยืดหยุ่นด้วยประเภทที่กำหนดเอง
- Julia: ช่วงจำนวนเต็มที่กำหนดเองสำหรับดัชนีอาร์เรย์
- Ada: ช่วงแยกแยะใดๆ (จำนวนเต็ม, ตัวอักษร, enums)
ภาษาโปรแกรมที่ขาดอาร์เรย์หลายมิติที่แท้จริง:
- C/C++: เป็นเพียงอาร์เรย์ของอาร์เรย์เท่านั้น
- Go: ไม่มีการรองรับอาร์เรย์หลายมิติแบบดั้งเดิม
- Rust: การใช้งานแบบอาร์เรย์ของอาร์เรย์
- Java: อาร์เรย์ของอาร์เรย์ที่มีความยาวแปรผัน
ปัญหาการแลกเปลี่ยนประสิทธิภาพ
สมาชิกในชุมชนชี้ให้เห็นว่าความท้าทายไม่ได้อยู่ที่การใช้งานอย่างง่ายเท่านั้น ภาษาระดับต่ำต้องเผชิญกับการแลกเปลี่ยนที่รุนแรงเมื่อพยายามสนับสนุน multidimensional arrays อย่างมีประสิทธิภาพ ข้อกำหนดด้านประสิทธิภาพและความซับซ้อนในการจัดการหน่วยความจำทำให้ผู้ออกแบบภาษายากที่จะตกลงกันในแนวทางเดียวที่ทำงานได้ดีสำหรับทุกกรณีการใช้งาน
การแลกเปลี่ยนนั้นรุนแรงเกินไปสำหรับคนที่จะตกลงกันในการใช้งานใดๆ ในภาษาระดับต่ำอย่าง Rust หรือภาษาที่ต้องการเป็นระดับต่ำอย่าง Go
สิ่งนี้อธิบายว่าทำไมฟีเจอร์ที่ดูเหมือนจะตรงไปตรงมาในแง่คณิตศาสตร์กลับกลายเป็นเรื่องที่ถกเถียงกันเมื่อแปลงเป็นการออกแบบภาษาโปรแกรมในทางปฏิบัติ
ความยืดหยุ่นของ Index ยังคงจำกัด
อีกหนึ่งพื้นที่ที่ภาษาสมัยใหม่ยังขาดคือการอนุญาตให้ใช้ระบบ indexing ที่ยืดหยุ่น ภาษาโปรแกรมส่วนใหญ่บังคับให้นักพัฒนาใช้จำนวนเต็มที่เริ่มต้นจาก 0 หรือ 1 แม้ว่าโดเมนปัญหาจะได้ประโยชน์จากช่วงที่กำหนดเองหรือประเภท enumerated เป็น indices
การอภิปรายเผยให้เห็นว่ามีเพียงภาษาไม่กี่ภาษาเท่านั้น รวมถึง Pascal และ Haskell ที่ให้ความยืดหยุ่นในการกำหนด arrays ด้วยประเภท index ที่กำหนดเอง ข้อจำกัดนี้บังคับให้นักพัฒนาใช้ hash maps ที่มีประสิทธิภาพน้อยกว่าหรือคำนวณ offsets ด้วยตนเอง ทำให้เสียประสิทธิภาพไป
Hash maps: โครงสร้างข้อมูลที่ใช้ hash function เพื่อแมป keys กับ values โดยทั่วไปจะช้ากว่าการเข้าถึง array โดยตรง
การแสดงประเภทของอาร์เรย์:
- อาร์เรย์ 1 มิติ:
1..N -> ValueType
- อาร์เรย์ 2 มิติ:
1..M -> 1..N -> ValueType
- อาร์เรย์ 3 มิติ:
1..L -> 1..M -> 1..N -> ValueType
- ตารางที่มีข้อมูลหลากหลายประเภท:
Row -> Col -> StructType
- อาร์เรย์ที่กำหนดดัชนีเอง:
CustomSet -> ValueType
บริบททางประวัติศาสตร์และทิศทางในอนาคต
การสนทนาในชุมชนยังได้กล่าวถึงบริบททางประวัติศาสตร์ที่น่าสนใจ โดยสังเกตว่า index registers สามตัวของ IBM 704 มีอิทธิพลต่อการออกแบบ multidimensional array ของ FORTRAN การพัฒนาร่วมกันระหว่างฮาร์ดแวร์และซอฟต์แวร์นี้ตัดกันอย่างชัดเจนกับแนวทางในปัจจุบัน ที่ผู้ออกแบบภาษามักจะทำงานแยกจากความสามารถของฮาร์ดแวร์พื้นฐาน
การอภิปรายชี้ให้เห็นว่าแม้พื้นฐานทางคณิตศาสตร์สำหรับการจัดการ array ที่ดีกว่าจะเป็นที่เข้าใจกันดีแล้ว แต่ความท้าทายในทางปฏิบัติของการใช้งานในสภาพแวดล้อมการเขียนโปรแกรมสมัยใหม่ยังคงสร้างอุปสรรค จนกว่าผู้ออกแบบภาษาจะสามารถแก้ไขการแลกเปลี่ยนเหล่านี้ได้ นักพัฒนาจะยังคงต้องหาทางแก้ไขข้อจำกัดเหล่านี้โดยใช้วิธีแก้ปัญหาที่ไม่สวยงามนัก
การถกเถียงที่ดำเนินอยู่เน้นย้ำให้เห็นว่าโครงสร้างข้อมูลพื้นฐานที่ดูเหมือนจะแก้ไขแล้วจากมุมมองทฤษฎีสามารถยังคงท้าทายในการใช้งานอย่างมีประสิทธิภาพในทางปฏิบัติ ส่งผลกระทบต่อทุกอย่างตั้งแต่การคำนวณทางวิทยาศาสตร์ไปจนถึงเวิร์กโฟลว์การวิเคราะห์ข้อมูล
อ้างอิง: 2000 words about arrays and tables