ธรรมเนียมในการใช้วงเล็บเหลี่ยมสำหรับองค์ประกอบอาร์เรย์พัฒนาอย่างไร


11

ภาษาการเขียนโปรแกรมจำนวนมากใช้ไวยากรณ์a[i]เพื่ออ้างถึงiองค์ประกอบ 'ของอาร์เรย์ลำดับหรือเวกเตอร์a- โดยเฉพาะ C และ Pascal (จากช่วงปลายทศวรรษ 1960 และต้น 1970) ทำสิ่งนี้ ในทางตรงกันข้ามภาษาก่อนหน้านี้บางอย่างเช่น Fortran (จากปี 1950) ไม่ใช้การประชุมนี้ นอกจากนี้ฉันศึกษาวิชาคณิตศาสตร์นิดหน่อยและนักคณิตศาสตร์ใช้วงเล็บเหลี่ยมสำหรับช่วงเวลาและตัวห้อยสำหรับการดีอาเรย์และเมทริกซ์การห้อย (หรือวงเล็บปกติถ้าอาร์เรย์คิดว่าเป็นฟังก์ชั่นจากจำนวนเต็มไม่เป็นลบ)

ดังนั้นคำถามของฉันคือ: สี่เหลี่ยมจัตุรัสในบริบทนี้พัฒนาขึ้นมาจากไหน / อย่างไร / ในบริบทใดและใครเป็นใคร?

หมายเหตุ: ไม่ใช่คำถามที่เกี่ยวกับการใช้วงเล็บปีกกาในซี



@gnat: นี่คือสิ่งที่ล่อลวงของมันได้อย่างไร
einpoklum

1
ที่เกี่ยวข้อง แต่ไม่ใช่ล่อลวง
blaster

1
คำตอบที่สองที่นั่นครอบคลุมประวัติของวงเล็บเหลี่ยม
gnat

1
@Paul Typo คุณหมายถึงxkcd.com/163 (โดเมน xkdc มีการลงทะเบียนในประเทศจีน)
1201ProgramAlarm

คำตอบ:


10

ภาษาสารตั้งต้นหลักในซีและปาสคาลเป็นAlgol รุ่นแรกสุดคือAlgol 58ซึ่งใช้วงเล็บเหลี่ยมสำหรับการประกาศอาร์เรย์และการอ้างอิง

เหตุผลที่ Algol ใช้วงเล็บเหลี่ยมแทนวงเล็บคือสามเท่า:

  1. เพราะพวกเขาทำได้ คีย์บอร์ด IBM รุ่นแรกที่ Fortran ได้รับการออกแบบนั้นมีเฉพาะวงเล็บเท่านั้น สิ่งนี้เปลี่ยนไปตามเวลาที่ Algol ถูกระบุ
  2. ประสบการณ์กับ Fortran แสดงให้เห็นว่าโปรแกรมเมอร์มักสับสนกับการใช้วงเล็บมากเกินไปดังนั้นมันจึงถูกมองว่าเป็นการเปลี่ยนแปลงทางวากยสัมพันธ์ที่สำคัญ
  3. ความตั้งใจเบื้องหลังอัลกอลคือมันจะใช้สำหรับอธิบายอัลกอริธึมเพื่อให้มันใกล้เคียงกับสัญกรณ์ทางคณิตศาสตร์มาตรฐานที่สมเหตุสมผล

หมายเหตุซึ่งแตกต่างจาก C ซึ่งใช้อาร์เรย์ส่วนใหญ่เป็นหน่วยความจำดัชนี Algol อนุญาตให้ระบุขอบเขตดัชนีต่ำและสูง อีกครั้งสิ่งนี้สอดคล้องกับเจตนาทางคณิตศาสตร์ที่มากขึ้น ในความเป็นจริงแล้วอัลกอลเป็นภาษาที่แท้จริงสำหรับรหัสเทียมมาหลายปี


แต่วงเล็บเหลี่ยมใกล้กับสัญกรณ์คณิตศาสตร์มาตรฐานจริง ๆ หรือไม่ เมื่อฉันศึกษาการจับคู่[x]ใช้สำหรับคลาสที่เท่ากันไม่ใช่ตำแหน่งบ่งชี้ภายในเวกเตอร์หรือเมทริกซ์
einpoklum

2
@einpoklum เพิ่มเติมสำหรับช่วงในการประกาศมากกว่าตัวห้อยหรือตัวยกในการอ้างอิง แต่เนื่องจากพวกเขาไม่สามารถใช้ตัวห้อยหรือตัวยกด้วยเทคโนโลยีของเวลาพวกเขาจึงมีความมั่นคงทางสายตา และพวกเขาไม่ได้มีจุดมุ่งหมายเพื่อความคิดทางคณิตศาสตร์ในลักษณะที่ว่า APL ทำ พวกเขาตั้งเป้าที่จะแสดงอัลกอริธึมที่ชัดเจนซึ่งเป็นสาขาที่ค่อนข้างแคบ
Alex

โอ้ยังใช้วงเล็บสี่เหลี่ยมเป็นระยะ ฉันเดาว่ามันเหมือนกับช่วงในอาร์เรย์ในแง่หนึ่ง นอกจากนี้ - คุณแน่ใจหรือไม่ว่า Algol เป็นจุดเริ่มต้นนี้หรือไม่
einpoklum

@ einpoklum ฉันแน่ใจว่าการใช้วงเล็บเหลี่ยมใน C และ Pascal มาจาก Algol เชื้อสายนั้นได้รับการบันทึกไว้ค่อนข้างดี หากมีบรรพบุรุษของอัลกอล 58 ที่ผู้ออกแบบใช้ไวยากรณ์มาจากฉันก็ไม่รู้ตัว ไม่น่าเป็นไปได้ที่จะกำหนดเวลา แต่ไม่สามารถทำได้ Algol 58 ไม่ได้ดำเนินการก่อนหน้า Algol 60 ดังนั้นจึงเป็นไปได้ว่าภาษาที่ไม่ได้ใช้งานเป็นแรงบันดาลใจ
Alex

5

นี่คือการอ่านที่น่าสนใจ: https://en.m.wikipedia.org/wiki/Bracket

ต่อไปนี้เป็นข้อสังเกตของฉันเอง

นักออกแบบ C ใส่ใจอย่างมากกับการใช้ความหมายของตัวละครและโครงสร้างตามที่เคยใช้มาเป็นเวลาหลายร้อยปีในภาษาเขียนทั่วไป และการทำเช่นนั้นพวกเขาต้องทำงานกับชุดอักขระ ASCII จำนวน จำกัด ในภาษาตะวันตกมีการใช้อักขระกลุ่มมากขึ้นในข้อความที่เขียน แต่สิ่งเหล่านี้ไม่ได้ทำให้เป็น ASCII

ในภาษาปกติความหมายของวงเล็บคือการให้ข้อมูลด้านข้างโดยไม่ขัดจังหวะข้อความหลัก สิ่งนี้สมเหตุสมผลเมื่อเรียกโพรซีเดอร์: ข้อความหลักคือแอ็คชันที่ต้องดำเนินการและข้อมูลย่อยเป็นอาร์กิวเมนต์

วงเล็บปีกกาจะใช้สำหรับการจัดกลุ่ม "คอลเลกชันของคำนี้อยู่ด้วยกันจะถูกแยกออกจากส่วนที่เหลือ" ดังนั้นจึงเหมาะสมที่จะใช้มันสำหรับบล็อกของรหัส, คำสั่งผสม

วงเล็บเหลี่ยมใช้สำหรับการแทรกข้อความที่ไม่ได้เป็นส่วนหนึ่งของต้นฉบับเพื่อทำให้ข้อความต้นฉบับชัดเจนและให้บริบท หรือเพื่อระบุการละเว้นด้วยจุดไข่ปลา: [... ] "เธอ [ราชินี] ไม่สนุก" ในการเขียนโปรแกรมคอมพิวเตอร์มันมีเหตุผลเล็กน้อยที่จะใช้วงเล็บสำหรับการทำดัชนีอาเรย์เนื่องจากเป็นบริบทที่จัดเตรียมไว้ให้ "Array? Array คืออะไรดีโดยเฉพาะองค์ประกอบนั้น" แต่แม้ว่าความหมายดั้งเดิมจะไม่ครอบคลุมการใช้งานในภาษาคอมพิวเตอร์อย่างสมบูรณ์ แต่ก็ไม่มีตัวเลือกอื่นเหลืออยู่ใน ASCII

ดังนั้นฉันจะบอกว่ามันเป็นการรวมกันของศิลปะก่อนหน้าและสิ่งที่มีอยู่ในเวลาที่นำไปสู่การใช้วงเล็บเหลี่ยมสำหรับการทำดัชนีอาเรย์

[แก้ไขเนื่องจากความคิดเห็นของ Alex]

แหล่งอ้างอิงนี้ ASCII เปิดตัวเมื่อปีพ. ศ. 2506 และได้รับการอนุมัติจากรัฐบาลในปี 2511 การพัฒนาภาษาซีไม่ได้เริ่มขึ้นจนถึงปี 1969 ตามวิกินี้ ดังนั้นดูเหมือนว่านายริตชี่จะจับตาดูมาตรฐานใหม่ที่ได้รับการสนับสนุนอย่างกว้างขวางนี้ชื่อว่า ASCII เมื่อเลือกตัวละครของเขา

โปรดดูคำตอบอื่น ๆ ที่ทำให้เป็นกรณีสำหรับ Algol "แม่ของหลายภาษา" ซึ่งมีอิทธิพลอย่างมาก


ฉันคิดว่าฉันได้สิ่งที่คุณพูด แต่ ASCII ไม่ได้ประมวลผลจนกระทั่งเกือบทศวรรษหลังจาก C ถูกออกแบบ ผลกระทบโดยตรงมากขึ้นคือแป้นพิมพ์ของ PDP-11 ที่ C ถูกออกแบบมาสำหรับ มันสมเหตุสมผลที่จะใช้ตัวละครที่มันรองรับ การใช้วงเล็บเหลี่ยมสำหรับอาร์เรย์ได้รับแรงบันดาลใจโดยตรงจาก Algol ผ่าน BCPL และ B ในทำนองเดียวกันกับ Pascal Wirth นำ Algol-W ไปใช้ก่อนการออกแบบ Pascal
Alex
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.