ภาษาโปรแกรมยังคงประสบปัญหากับ Multidimensional Arrays แม้จะพัฒนามาหลายทศวรรษ

ทีมชุมชน BigGo
ภาษาโปรแกรมยังคงประสบปัญหากับ Multidimensional Arrays แม้จะพัฒนามาหลายทศวรรษ

การสำรวจแนวคิดเรื่อง 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