ทำไมภาษาจำนวนมากจึงปฏิบัติต่อตัวเลขที่เริ่มต้นด้วยเลขฐานแปด


21

ฉันอ่านแล้วเลขฐานแปดมีประโยชน์อย่างไร และดูเหมือนว่า octals นั้นเป็นสิ่งที่มีประโยชน์กาลครั้งหนึ่งนานมาแล้ว

หลายภาษาปฏิบัติกับตัวเลขที่อยู่ก่อนหน้าด้วย 0 เป็นฐานแปดดังนั้นตัวอักษร010จึงเป็น 8 จริง ๆ สองสามอย่างคือ JavaScript, Python (2.7) และ Ruby

แต่ฉันไม่เห็นจริง ๆ ว่าทำไมภาษาเหล่านี้จึงต้องการเลขฐานแปดโดยเฉพาะอย่างยิ่งเมื่อมีการใช้สัญกรณ์ที่เป็นไปได้มากขึ้นในการแสดงจำนวนทศนิยมด้วย 0 ที่ไม่จำเป็น

JavaScript เป็นภาษาฝั่งไคลเอ็นต์, octal ดูเหมือนว่าไม่มีประโยชน์เลย ทั้งสามมีความทันสมัยในแง่อื่นและฉันไม่คิดว่าจะมีรหัสมากนักโดยใช้สัญกรณ์ฐานแปดที่จะใช้งานไม่ได้โดยการลบ "คุณสมบัติ" นี้ออก

ดังนั้นคำถามของฉันคือ:

  • มีจุดใดในภาษาเหล่านี้ที่สนับสนุนตัวอักษรฐานแปด
  • ถ้าตัวอักษรฐานแปดมีความจำเป็นทำไมไม่ใช้สิ่งที่ต้องการ0o10? ทำไมคัดลอกสัญกรณ์เก่าที่แทนที่กรณีการใช้งานที่มีประโยชน์มากกว่า?

24
คุณจะยอมรับ "ทำให้เด็กสับสนระหว่างการสัมภาษณ์" เป็นคำตอบหรือไม่?
yannis

11
เป็นไปตามไวยากรณ์ C + + คัดลอกคนตาบอด
วงล้อประหลาด

1
@Manishearth C สืบทอดมาจากบรรพบุรุษของมัน Java มีมันเพราะ C มีมัน คนอื่น ๆ ส่วนใหญ่มีมันเพราะ C และ Java มีมัน
Ingo

2
หนึ่งยังคงเห็นการเปลี่ยนแปลงที่ถูกต้องของไฟล์ Unix แปดด้าน: chmodกับ 0666 หรือ 0777 สำหรับกลุ่มของ 3 บิตสำหรับผู้ใช้กลุ่มและอื่น ๆ : อ่าน, เขียน, ปฏิบัติการ
Joop Eggen

3
@Llepwryd ในเบราว์เซอร์รุ่นเก่าparseInt('010')ไม่แน่นอนกลับ 8 เพราะฉะนั้นทุกคำแนะนำในการใช้งานเสมอparseInt(foo, 10)(และก็ยังคงเป็นนิสัยสำหรับฉัน)
Izkata

คำตอบ:


34

การคัดลอกคนตาบอดของ C เช่นเดียวกับวงล้อประหลาดกล่าวในความคิดเห็นของเขา

"นักออกแบบภาษา" ส่วนใหญ่ในทุกวันนี้ไม่เคยเห็นอะไรเลยนอกจาก C และสำเนา (C ++, Java, Javascript, PHP, และอาจมีอีกไม่กี่โหลที่ฉันไม่เคยได้ยิน) พวกเขาไม่เคยสัมผัส FORTRAN, COBOL, LISP, PASCAL, Oberon, FORTH, APL, BLISS, SNOBOL เพื่อตั้งชื่อ

กาลครั้งหนึ่งการสัมผัสกับภาษาการเขียนโปรแกรมหลายภาษาคือ MANDATORY ในหลักสูตรวิทยาศาสตร์คอมพิวเตอร์และนั่นไม่รวมถึงการนับ C, C ++ และ Java เป็นสามภาษาแยกกัน

Octal ถูกใช้ในวันก่อนหน้าเพราะทำให้การอ่านค่าคำสั่งไบนารีง่ายขึ้น ตัวอย่างเช่น PDP-11, BASICALLY มี opcode 4 บิต, หมายเลขลงทะเบียน 2 3 บิตและฟิลด์กลไกการเข้าถึง 2 3 บิต การแสดงคำเป็นฐานแปดทำให้ทุกอย่างชัดเจน

เนื่องจากการเชื่อมโยงแรกของ C กับ PDP-11 ทำให้มีการแสดงเลขฐานแปดเนื่องจากเป็นเรื่องธรรมดามากใน PDP-11s ในเวลานั้น

เครื่องอื่น ๆ มีชุดคำสั่งที่ไม่ได้จับคู่กันได้ดี CDC 6600 มีคำ 60 บิตโดยแต่ละคำจะมีคำแนะนำ 2 ถึง 4 คำ แต่ละคำสั่งคือ 15 หรือ 30 บิต

สำหรับค่าการอ่านและการเขียนนี่เป็นปัญหาที่แก้ไขได้ด้วยการปฏิบัติที่ดีที่สุดในอุตสาหกรรมที่รู้จักกันดีอย่างน้อยในอุตสาหกรรมการป้องกันประเทศ คุณจัดรูปแบบไฟล์ของคุณ ไม่มีความกำกวมเมื่อจัดรูปแบบเอกสารเพราะเอกสารบอกคุณว่าคุณกำลังดูเลขทศนิยมเลขฐานสิบหกหรือเลขฐานแปด

หมายเหตุ: หากระบบ I / O ของคุณเริ่มต้นที่จะนำ 0 หมายถึงฐานแปดคุณต้องใช้การประชุมอื่น ๆ ในการแสดงผลของคุณเพื่อแสดงค่าเลขฐานสิบหก นี่ไม่จำเป็นต้องชนะ

ในความเห็นส่วนตัว Ada ทำได้ดีที่สุด: 2 # 10010010 #, 8 # 222 #, 16 # 92 #, และ 146 ทั้งหมดเป็นค่าเดียวกัน (นั่นอาจจะทำให้ฉันมี downvotes อย่างน้อยสามตัวที่นั่นเพียงพูดถึง Ada)


11
ลงคะแนนให้คุณที่กล่าวถึง Ada ... เพียงล้อเล่น
kufi

12
ฉันอยากรู้ว่าคุณมาจากตัวเลขที่มากกว่า "นักออกแบบภาษา" มากกว่า 50% - ทำไมคำพูดที่ทำให้ตกใจ? - ไม่มีประสบการณ์กับสิ่งใดนอกจากลูกหลาน C ฉันใช้เวลาสิบหกปีในชีวิตกับการพูดคุยกับนักออกแบบภาษามืออาชีพทุกวันและไม่ตรงกับคำอธิบายของคุณ
Eric Lippert

จาวาสคริอธิบายว่า "เราต้องการที่จะทำเสียงกระเพื่อมในเบราว์เซอร์" จะได้รับการออกแบบของตนสนใจถ้าผมจำได้ให้สัมภาษณ์ว่าถูกต้อง ...
Izkata

2
@Izkata: แท้จริงแล้ว Waldemar Horwat เคยบอกฉันว่าเขามองว่า JavaScript เป็น Common LISP ที่มีไวยากรณ์เหมือน C ในความเป็นจริง Waldemar กำหนด metalanguage เขียนล่ามสำหรับ metalanguage ของเขาใน Common LISP และจากนั้นเขียนข้อมูลจำเพาะ JavaScript ใน metalanguage ของเขาซึ่งทำให้เขาสามารถเรียกใช้ข้อมูลจำเพาะได้ มันเป็นเทคนิคที่ฉลาด
Eric Lippert

ทำไมถึงถูกใช้ 0 การใช้อักขระที่ไม่ใช่ตัวเลขใช่ไหม มาตรฐาน ANSI ไม่ได้มีการคาดการณ์ข้อบกพร่องที่เกิดจากตัวเลขที่คาดว่าจะเป็นฐานสิบหรือไม่?
เก่า Badman Gray

6

พวกเขาได้รับมาจากซีทำไมต้องทำสำเนา เพราะการดำเนินการฐานของทั้ง 3 อยู่ในการดำเนินการเริ่มต้นซีหลามเป็นCPython ทับทิมเดิมสร้างขึ้นในCเช่นกัน Javascript เป็นกรณีที่น่าสนใจที่สุดที่นี่ มันทำงานในเบราว์เซอร์ สนใจที่จะเดาว่าเว็บเบราว์เซอร์แรกถูกเขียนด้วยอะไร?

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

ดังนั้นจึงเป็นคำถามเกี่ยวกับสภาพแวดล้อมของภาษาเหล่านี้ที่เขียนด้วยภาษา C ดังนั้นพวกเขาจึงใช้ข้อตกลงจาก C. ข้อพิสูจน์ที่ดีคือ Visual Basic ซึ่งใช้& Oแทน เท่าที่จำเป็นมันดูเหมือนว่าจะมีสิ่งที่เป็นนามธรรมที่น่าเบื่อกลายเป็นอนุสัญญามากกว่าสิ่งอื่นใด


Mosaic สนับสนุน JavaScript หรือไม่ ถ้าไม่เกี่ยวข้องจะพูดถึงมันอย่างไร?
svick

2
@svick เป็นพื้นฐานสำหรับ Netscape Navigator ที่ทำ
วิศวกรโลก

2

มีค่าต่อความมั่นคง หากคุณไม่สามารถระบุได้อย่างแม่นยำว่าจะแปลตัวเลขอย่างไรคุณจะมีปัญหาจริงโดยใช้ค่าในบริบทที่แตกต่างกัน

นอกจากนี้ยังหมายความว่าคุณไม่ต้องเขียนโปรแกรมแยกวิเคราะห์ของคุณเอง มีคุณค่าอย่างมากในการใช้งานรูทีนไลบรารีที่ทดสอบแล้ว

นอกจากนี้หากคุณไม่สนับสนุนไวยากรณ์ 0 นำคุณไม่มีวิธีง่ายๆในการเขียนค่าฐานแปด

แม้ว่าเราจะไม่ได้ขึ้นอยู่กับตัวเลขฐานแปดเท่าที่เราเคยทำ แต่ก็ยังมีค่าอยู่ ในขณะที่ผลลัพธ์เดียวกันสามารถรับได้ด้วยตัวเลขฐานสิบหกในบริบทบางอย่างจะง่ายต่อการเข้าใจ

จนถึงตอนนี้ฉันเห็นเพียงครั้งเดียวที่ใช้สำหรับนำเลขศูนย์ในเลขทศนิยม ที่อยู่ในจอแสดงผลและรายการของฟิลด์ทศนิยมความยาวคงที่เช่นหมายเลขประจำตัว เป็นเวลาหลายปีแล้วที่ฉันได้เห็นทุ่งนาแบบนี้โดยมีศูนย์นำ แม้ว่าสิ่งนี้จะลดค่าที่มีอยู่ลง 10% แต่ก็ลดปัญหาที่ผู้ใช้มักจะทิ้งค่าศูนย์นำหน้าเมื่อป้อนค่า


3
เขตข้อมูลที่มีเลขศูนย์นำหน้าคือสตริงการแสดงภาพด้วยความหมายของตัวเองไม่ใช่ตัวเลข
Pieter B

1
+1 ถือว่าchmod 438 ./myfileแย่มาก!
Ingo

2
ทำไมไม่อนุญาตให้มี0o10ไวยากรณ์? ฉันเชื่อว่า Python สนับสนุนสิ่งนั้น คุณสามารถสร้างวิธีง่ายๆในการเขียนค่าฐานแปดที่ไม่ทำให้หมายเลขนั้นไม่ใช่หมายเลขปกติอีกต่อไป ฉันเคยเห็นผู้คนพยายามใช้เลขศูนย์ต่อท้ายในรหัสเพื่อการจัดตำแหน่งและการจัดการที่ง่ายและถูกกัดด้วยการใช้เครื่องหมายแปดด้าน
Manishearth

ฉันสามารถเข้าใจความต้องการที่จะมีวิธีการเขียนค่าฐานแปดนอกเหนือไปจากไบนารีและฐานสิบหก ฉันยังสามารถเข้าใจได้ว่าการแปลภาษาแปล031ว่า Halloween (31 ต.ค. ) มากกว่าวันคริสต์มาส (25 ธ.ค. ) อาจมีความเสี่ยงหากโปรแกรมเมอร์เขียนโค้ดภาษาที่ใช้ในการดำเนินการหลัง ฉันไม่เห็นเหตุผลใด ๆ ทำไมภาษาไม่สามารถบรรลุผลที่ดีที่สุดของทั้งสองโลกได้โดยการสนับสนุน0q31เป็นสัญลักษณ์เมื่อต้องการให้มีฐานแปดหรือ0t025สำหรับฐานสิบเพื่อให้ค่าการวางแมโครด้วยศูนย์นำหน้าและห้ามศูนย์นำชั้นนำ .
supercat

@supercat ใช้ 0 นำหน้าเพื่อแทนค่าวันที่ฐานแปดย้อนหลังอย่างน้อยกับเยาวชนของคุณ กรณีที่มีการใช้บ่อยเป็นกรณีที่บิตมีความสำคัญและการตีความของตัวเลขเป็นเลขฐานสิบจะถูกต้องเฉพาะสำหรับค่าที่น้อยกว่า 8 การเพิ่มตัวละครเพิ่มเติม . แน่นอนฉันจะถามว่าทำไมวันที่ถูกเขียน 012 031, 010 031 หรือ 012 025
BillThor
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.