ทำไมเครื่องหมายรูปหมวกใช้สำหรับ XOR แทนการยกกำลัง?


32

ไม่ว่ามันจะเป็นปัญหาสำหรับทุกคนที่เคยประสบปัญหาเกี่ยวกับวากยสัมพันธ์นี้มาก่อน แต่ฉันเห็นความสับสนจำนวนมากที่เกิดขึ้นจากการใช้คาเร็ต ( ^) เนื่องจากการทำงานของ XOR แทนการปฏิบัติการยกกำลังทางคณิตศาสตร์ที่ยอมรับกันอย่างกว้างขวาง

แน่นอนว่ามีหลายแห่งที่อธิบายและแก้ไขการใช้คาเร็ต (mis-) แต่ฉันไม่ได้เจอแหล่งข้อมูลที่ชัดเจนว่าทำไมคาเร็ตได้รับความหมายที่แตกต่างกัน

มันเป็นเรื่องของความสะดวกสบายหรือไม่? อุบัติเหติ? เห็นได้ชัดว่าการใช้เหตุผลอาจแตกต่างกันไปในแต่ละภาษาดังนั้นข้อมูลใด ๆ ก็ตามจะมีความเฉียบแหลม


3
คำถามนี้มีการอภิปรายเมตา
Qix

คำตอบ:


58

แม้ว่าจะมีบรรพบุรุษที่เก่าแก่นักคณิตศาสตร์ชาวฝรั่งเศสผู้มีอิทธิพล Rene Descartes มักให้เครดิตในการแนะนำเลขยกกำลังสูง ( a ) ในการเขียนทางคณิตศาสตร์ในงานGeometrieซึ่งตีพิมพ์ในปี 1637 นี่เป็นสัญกรณ์ที่ใช้กันอย่างแพร่หลายในคณิตศาสตร์ในปัจจุบัน

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

ชุดอักขระที่นำมาใช้อย่างกว้างขวางครั้งแรกที่มีเครื่องหมายรูปหมวก^คือการเข้ารหัสASCII 7 บิตซึ่งเป็นมาตรฐานแรกในปี 1963 ภาษาการเขียนโปรแกรมที่เก่าแก่ที่สุดที่ฉันรู้ว่าใช้คาเร็ตเพื่อแสดงการยกกำลังคือ BASIC ซึ่งถึงปี 1964 เวลาที่ IBM ใช้การเข้ารหัสอักขระEBCDICซึ่งรวมถึงคาเร็ต^ด้วย

ภาษา C มีอยู่จริงในปี 1972 มันไม่ได้ให้โอเปอเรเตอร์ exponentiation แต่มันรองรับการยกกำลังด้วยฟังก์ชั่นpow()ไลบรารี่เช่น ดังนั้นไม่จำเป็นต้องมีสัญลักษณ์สำหรับการยกกำลังใน C และภาษาอื่น ๆ ในภายหลังในตระกูล C เช่น C ++ และ CUDA

ในทางกลับกันและแปลกสำหรับภาษาการเขียนโปรแกรมจนถึงเวลานั้น C ให้สัญลักษณ์สำหรับการดำเนินการระดับบิต จำนวนอักขระพิเศษที่มีอยู่ใน 7-bit ASCII นั้นมี จำกัด และเนื่องจากมี "ความสัมพันธ์ตามธรรมชาติ" ของการดำเนินการอื่น ๆ สำหรับอักขระพิเศษบางอย่างเช่น&สำหรับ AND และ~สำหรับ NOT จึงไม่มีตัวเลือกมากมายสำหรับสัญลักษณ์สำหรับ XOR .

ฉันไม่ทราบถึงเหตุผลที่ตีพิมพ์โดย Ritchie หรือ Kernighan ว่าทำไมพวกเขา^ถึงเลือกXOR โดยเฉพาะ ประวัติย่อของ C ใน Ritchie นั้นเงียบในเรื่องนี้ ดูที่ข้อกำหนดสำหรับผู้นำกับเซลเซียสภาษา Bเผยให้เห็นว่ามันไม่ได้มีผู้ประกอบการแฮคเกอร์ แต่ใช้แล้วอักขระพิเศษอื่น ๆ ทั้งหมดกว่า^, $, ,@#

[อัพเดท]ฉันส่งอีเมลถึง Ken Thompson ผู้สร้าง B และหนึ่งในผู้ร่วมสร้าง C สอบถามเกี่ยวกับเหตุผลในการเลือก^เป็นผู้ดำเนินการ XOR ของ C และขออนุญาตแบ่งปันคำตอบที่นี่ คำตอบของเขา (จัดรูปแบบใหม่เพื่อให้อ่านง่าย):

จาก: Ken Thompson
ส่ง: วันพฤหัสบดี, 29 กันยายน, 2016 4:50 AM
ถึง: Norbert Juffa
เรื่อง: Re: เหตุผลเบื้องหลังการเลือก caret เป็นผู้ดำเนินการ XOR ใน C?

มันเป็นตัวเลือกสุ่มของตัวละครที่เหลือ

ถ้าฉันต้องทำมันอีกครั้ง (ซึ่งฉันทำ) ฉันจะใช้ตัวดำเนินการเดียวกันสำหรับ xor (^) และ bit complement (~)

เนื่องจาก ^ ปัจจุบันเป็นโอเปอเรเตอร์ที่รู้จักกันดีในระหว่างการเดินทาง ^ คือ xor และเติมเต็มด้วย

การใช้^การยกกำลังใน "คณิตศาสตร์" ที่คุณอ้างถึงคือการใช้งานจริงที่จัดตั้งขึ้นในภายหลังสำหรับระบบเรียงพิมพ์เช่น Knuth's TeX ซึ่งมีอายุถึงปี 1978 อินเตอร์เฟสบรรทัดคำสั่งสำหรับระบบพีชคณิตเช่น Mathematica ซึ่งมีอายุถึงปี 1988 และการสร้างกราฟ เครื่องคิดเลขในต้นปี 1990

เหตุใดผลิตภัณฑ์เหล่านี้จึงนำมาใช้^เพื่อการยกกำลัง ในกรณีของเครื่องคิดเลขฉันสงสัยว่าอิทธิพลของ BASIC ตลอดยุค 80 มันเป็นภาษาโปรแกรมแรกที่ได้รับความนิยมมากและถูกฝังอยู่ในผลิตภัณฑ์ซอฟต์แวร์อื่น ๆ สัญกรณ์จึงจะคุ้นเคยกับผู้ซื้อจำนวนมากของเครื่องคิดเลข หน่วยความจำของฉันไม่ชัด แต่ฉันเชื่อว่ามีแม้แต่เครื่องคิดเลขที่ใช้ล่ามพื้นฐานอย่างง่าย


4
นั่นเป็นบทเรียนประวัติศาสตร์ที่ดี ดังนั้นคำถามที่แท้จริงคือ "ทำไมซอฟท์แวร์ของ Tex (และอื่น ๆ จากช่วงเวลานั้น) ได้ตัดสินใจที่จะใช้สัญลักษณ์ XOR นั้นมีการอธิบายแบบเอ็กซ์โปเนนเชีย ;)
AxelH

5
@AxelH ที่จริงแล้วมันไม่ได้ เท็กซ์ใช้^สำหรับยก และมันสมเหตุสมผลที่ฉันจะใช้อักขระ "up" สำหรับตัวยกและตัวอักษร "down" ( _) สำหรับตัวห้อย
svick

2
@AxelH ฉันเห็นด้วยกับ svick ว่า^ลูกศรชี้ขึ้นซึ่งบ่งบอกถึงตำแหน่งดั้งเดิมของเลขชี้กำลังยกกำลังสูงดังนั้นมันจึงเป็นแบบธรรมชาติ ฉันแน่ใจว่า Donald Knuth จะตอบอีเมลที่สอบถามเกี่ยวกับการตัดสินใจของเขาที่จะใช้^ในการยกกำลังใน TeX แต่เนื่องจากเขากำลังยุ่งอยู่กับการทำงานในสิ่งที่สำคัญกว่าเช่นการทำ TAOCP เสร็จฉันไม่ต้องการทำขั้นตอนนั้น มัน).
njuffa

7
ตามที่en.wikipedia.org/wiki/Caret , Algol 60 ใช้ลูกศรชี้ขึ้นสำหรับการยกกำลังและบันทึกที่ ASCII เดิมมีลูกศรขึ้นที่จุดรหัสเดียวกันกับที่มันมีสัญลักษณ์คาเร็ตดังนั้นทั้งสองจึงชัดเจน บรรจุซึ่งกันและกันในเวลาเดียวกัน
Periata Breatta

4
คำตอบทางประวัติศาสตร์ที่ดีจริงๆ ฉันต้องการเพิ่มเหตุผลที่เป็นไปได้สำหรับการใช้ตัวดำเนินการบิตแทนการยกกำลัง: เป้าหมายของ C คือภาษาระดับต่ำที่ทำให้โปรแกรมเมอร์สามารถเข้าถึงส่วนใหญ่ของสิ่งต่าง ๆ ที่ซีพียูสนับสนุนโดยกำเนิด และซีพียูมักจะให้คำแนะนำในการจัดการบิต แต่ฉันไม่รู้ซีพียูตัวเดียวที่มีคำสั่งพิเศษสำหรับการยกกำลัง ดังนั้นการยกกำลังจะต้องวนซ้ำ (อย่างน้อยกับเลขจำนวนเต็ม) และไม่มีคุณสมบัติเดียวใน C ที่ซ่อนลูปหลังโครงสร้างภาษา
cmaster
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.