ตัวอย่างของความไม่สอดคล้องและความไม่สมบูรณ์ใน Unix / C คืออะไร


20

ในบทความที่โด่งดังของ Richard Gabriel เรื่องThe Rise of Worse is Betterเขาได้เปรียบเทียบกับปรัชญาการออกแบบของ MIT / Stanford (Lisp) และ New Jersey (C / Unix) ตามแนวแกนของความเรียบง่ายความถูกต้องความสอดคล้องและความสมบูรณ์ เขายกตัวอย่างของ "ปัญหาผู้แพ้ PC" ( พูดถึงที่อื่นโดย Josh Haberman ) เพื่อยืนยันว่า Unix ให้ความสำคัญกับความเรียบง่ายของการใช้งานมากกว่าความเรียบง่ายของอินเตอร์เฟส

อีกตัวอย่างหนึ่งที่ฉันคิดขึ้นมาก็คือแนวทางที่แตกต่างกับตัวเลข เสียงกระเพื่อมสามารถแสดงตัวเลขขนาดใหญ่โดยพลการ (ขึ้นอยู่กับขนาดของหน่วยความจำ) ในขณะที่ C จำกัด ตัวเลขไว้ที่จำนวนบิตคงที่ (โดยทั่วไปคือ 32-64) ฉันคิดว่านี่แสดงให้เห็นถึงแกนความถูกต้อง

ตัวอย่างบางประการของความสอดคล้องและความสมบูรณ์มีอะไรบ้าง นี่คือคำอธิบายทั้งหมดของ Gabriel (ซึ่งเขายอมรับว่าเป็นการ์ตูนล้อเลียน):

วิธีการของ MIT / Stanford

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

วิธีการของนิวเจอร์ซีย์

  • ความเรียบง่าย - การออกแบบจะต้องเรียบง่ายทั้งในส่วนของการติดตั้งและส่วนต่อประสาน มันเป็นสิ่งสำคัญสำหรับการใช้งานที่จะง่ายกว่าอินเทอร์เฟซ ความเรียบง่ายคือการพิจารณาที่สำคัญที่สุดในการออกแบบ
  • ความถูกต้อง - การออกแบบจะต้องถูกต้องในทุกด้านที่สังเกตได้ มันจะดีกว่าเล็กน้อยที่จะง่ายกว่าที่ถูกต้อง
  • ความสอดคล้อง - การออกแบบจะต้องไม่สอดคล้องกันมากเกินไป ความสอดคล้องสามารถเสียสละเพื่อความเรียบง่ายในบางกรณี แต่เป็นการดีกว่าที่จะวางส่วนเหล่านั้นของการออกแบบที่จัดการกับสถานการณ์ที่พบได้น้อยกว่าการแนะนำความซับซ้อนของการใช้งานหรือความไม่สอดคล้องกัน
  • ครบถ้วน - การออกแบบจะต้องครอบคลุมสถานการณ์ที่สำคัญมากเท่าที่เป็นจริง ควรครอบคลุมทุกกรณีที่คาดหวัง ความสมบูรณ์สามารถเสียสละเพื่อคุณภาพอื่น ๆ ในความเป็นจริงความสมบูรณ์จะต้องเสียสละเมื่อใดก็ตามที่การดำเนินงานที่เรียบง่ายถูกทำลาย ความสม่ำเสมอสามารถเสียสละเพื่อให้บรรลุความสมบูรณ์ถ้าความเรียบง่ายจะถูกเก็บไว้; ไร้ค่าโดยเฉพาะอย่างยิ่งคือความสอดคล้องของอินเตอร์เฟซ

โปรดทราบว่าฉันไม่ได้ถามว่ากาเบรียลนั้นถูกต้องหรือไม่ (ซึ่งเป็นคำถามที่ไม่เหมาะสมสำหรับ StackExchange) แต่เป็นตัวอย่างของสิ่งที่เขาอาจอ้างถึง


6
ในกรณีที่คุณอยากรู้อยากเห็นนี่ไม่ใช่ปัญหาการบ้าน ฉันเป็นครู :-) ในความคิดที่สองบางทีนั่นอาจทำให้ฉันทำการบ้าน
Ellen Spertus

4
ฉันต่อสู้เพื่อดูว่าทำไมคำถามนี้ไม่ได้อยู่ในUnix & Linux (หรืออาจเป็นวิศวกรรมซอฟต์แวร์ ?) คุณสามารถอธิบายรายละเอียดเกี่ยวกับวิธีการที่คุณต้องการมุมมอง CS ในเรื่องนี้ได้หรือไม่? นอกจากนี้โปรดอธิบายว่าคุณต้องการตัวอย่างบวกหรือลบ
กราฟิลส์

คำถามนั้นไม่เหมาะสมกับprogrammers.stackexchange.comหรือ
Basile Starynkevitch

ฉันโพสต์สิ่งนี้ใน CS เพราะฉันคิดว่าการออกแบบภาษาเป็นหนึ่งในสาขาพื้นฐานขั้นพื้นฐานของวิทยาศาสตร์คอมพิวเตอร์การคำนวณที่ครอบคลุมความซับซ้อนสถาปัตยกรรมการใช้งาน ฯลฯ ฉันสามารถโพสต์ลงใน Unix / Linux ได้แม้ว่าฉันจะมองหาสิ่งที่กว้างขึ้น ดู. สำหรับโปรแกรมเมอร์ผู้คนมักจะเป็นศัตรูกับฉันเสมอเมื่อฉันโพสต์ที่นั่นแม้ว่าฉันคิดว่าฉันอยู่ในหัวข้อดังนั้นฉันจึงอยู่ห่างจากที่นั่น
Ellen Spertus

คำตอบ:


15

ชื่อของคำถามแสดงให้เห็นว่ามีความไม่สอดคล้องส่วนติดต่อผู้ใช้พื้นฐานบางอย่างที่คุณอาจสนใจ:

คำสั่ง Unix ไม่ปฏิบัติตามไวยากรณ์เฉพาะใด ๆ สำหรับการระบุตัวเลือกและแฟล็ก ตัวอย่างเช่นคำสั่งส่วนใหญ่ใช้ตัวอักษรเดียวนำหน้าด้วย '-' เป็นแฟล็ก: cat -n some_fileแต่มีข้อยกเว้นเช่นtar tf some_file.tarและdd in=some_file out=some_other_file count=2มีอยู่ในคำสั่งที่ใช้กันทั่วไป

Unix และผู้สืบทอดและญาติของมันมีไวยากรณ์การแสดงออกปกติแตกต่างกันเล็กน้อย เชลล์ใช้ "*" โดยที่โปรแกรมอื่น ๆ (grep, egrep, vi) ใช้ '. *' egrep มี '+' และ '|' ในฐานะผู้ประกอบการ grep ไม่ได้

อินเทอร์เฟซการเรียกระบบ "ทุกอย่างเป็นไฟล์" พื้นฐานอาจดูไม่สมบูรณ์: อ่าน / เขียน / ค้นหา / ปิดไม่เหมาะกับอุปกรณ์ I / O ทุกตัว ข้อยกเว้นที่ไม่เหมาะสมได้รับการเรียกเข้าสู่การเรียก "ioctl" แต่อุปกรณ์เช่นการ์ดเสียงไม่เหมาะกับที่ดีมาก


คำตอบที่ดี เมื่อฉันเห็นชื่อฉันคิดทันทีว่า "ioctl" (และ fcntl) แต่ตอนนี้ฉันไม่ต้องพิมพ์คำตอบ
Louis

1
รูปแบบ glob ไม่ใช่ regex
jk

8

ความมั่นคง

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

ความสมบูรณ์

ใน Lisp หากคุณไม่มีคุณสมบัติภาษาเฉพาะที่คุณต้องการคุณสามารถติดตั้งด้วยตนเองได้ด้วยแมโคร C ก็มีตัวประมวลผลล่วงหน้า แต่ก็ค่อนข้างน่างง


8

สตริงของ C ไม่สามารถมีอักขระ 0 และฟังก์ชันไลบรารีไม่เหมาะสมสำหรับการจัดการกับข้อมูลไบนารี

ชื่อไฟล์ในระบบ Unix ต้องไม่มีอักขระ 0 หรืออักขระ 47 (เครื่องหมายทับ)

ในการปรับใช้ Unix ดั้งเดิมชื่อไฟล์ถูก จำกัด ไว้ที่ 14 อักขระ รุ่นที่ใหม่กว่าผ่อนคลายข้อ จำกัด นี้เท่านั้น พวกเขาไม่ได้กำจัดมัน

เพิ่ม : E2BIGเงื่อนไขข้อผิดพลาดของระบบเมื่อมีคนพยายามที่จะexecมีรายการอาร์กิวเมนต์ที่มีข้อโต้แย้งมากเกินไปหรือมีหน่วยความจำมากเกินไปหรือสภาพแวดล้อมที่มีขนาดใหญ่เกินไป

Unix เป็นที่รู้จักสำหรับข้อ จำกัด แบบนี้ จนกระทั่งการถือกำเนิดของ Perl ในปี 1987 การจัดการชุดข้อมูลขนาดใหญ่หรือชุดข้อมูลที่มีการบันทึกที่ยาวนานหรือข้อมูลไบนารีนั้นไม่น่าเชื่อถืออย่างยิ่ง


การไม่อนุญาต/ไม่ใช่สิ่งที่จำเป็น (?) เพื่อแก้ไขความคลุมเครือเช่นเดียว/กับตัวแยกพา ธ ฉันเพิ่งสร้างไฟล์000ดูเหมือนว่าข้อ จำกัด เฉพาะหายไปในยุคของ GNU / Linux ที่ทันสมัย
กราฟิลส์

ฉันไม่ได้ตั้งใจจะบอกว่าการห้าม/นั้นเป็นการ จำกัด เพียงความยาวบรรทัดและขีด จำกัด ขนาดไฟล์โดยพลการอย่างไรก็ตามประเด็นก็คือการออกแบบที่แตกต่างกันอาจทำให้ชื่อไฟล์มีเครื่องหมายทับ แต่นักออกแบบของ Unix ไม่ได้ คิดว่ามันสำคัญ
Mark Dominus

ฉันแน่ใจว่าในเวลานั้นข้อ จำกัด เหล่านั้นถูกนำเสนอเนื่องจากการพิจารณาประสิทธิภาพ; เทคนิคที่ไม่ได้รับการพัฒนาอาจมีส่วนร่วมเช่นกัน จากมุมมองของวันนี้พวกเขาดูเหมือนจะสงสัยแน่นอน เกี่ยวกับ/ฉันอยากรู้อยากเห็น: สมมติว่าเส้นทางควรเข้ารหัสเป็นสตริงคุณจะทำอย่างไรโดยไม่มีอักขระที่สงวนไว้สำหรับการแยกเส้นทาง
กราฟิลส์

ฉันไม่เข้าใจว่าประเด็นของคุณคืออะไร คำถามถามหา "ตัวอย่างของความไม่ลงรอยกันและความไม่สมบูรณ์ใน Unix / C"; มันไม่ได้พูดถึงประสิทธิภาพ
Mark Dominus

1
@Raphael: คุณกำจัดปัญหาตัวคั่นที่โง่เง่าโดยกำหนดpathประเภทข้อมูลนามธรรมและใช้ในอินเทอร์เฟซของคุณแทนที่จะแสดงการใช้งานที่เฉพาะเจาะจง (สตริง ascii สิ้นสุดด้วย null)
Wandering Logic

4

IIRC ครูของฉันกล่าวว่าการไม่สามารถใช้char *ตัวแปรในswitchข้อความใน C เป็นเรื่องของความไม่ลงรอยกัน แต่สำหรับฉันแล้วนั่นคือปัญหาทั่วไป (ครบถ้วน) ฉันคิดว่าการใช้ "ความสอดคล้อง" จะดีกว่าเฉพาะในอัลกอริทึมหรือการออกแบบซอฟต์แวร์ของคุณไม่ใช่ภาษาโปรแกรม (อย่างน้อยก็ไม่ใช่ในภาษาเช่น C. อาจเป็นภาษาบักกี้ที่มีปัญหาเรื่องความมั่นคง) เพราะภาษาโปรแกรมมีมาตรฐานที่มั่นคง และทำงานโดยใช้อินพุตกับกฎ ดังนั้นหากสิ่งที่ไม่ได้รับอนุญาตในภาษานั้นมีการวางแผนที่จะไม่ได้รับอนุญาตและไม่สอดคล้องในภาษา IMHO


  1. ฉันใช้ความเป็นทั่วไปอย่างครบถ้วน ฉันคิดว่าพวกเขาเป็นสิ่งเดียวกัน บางทีฉันผิด
  2. นี่ไม่ใช่คำตอบ อาจจะเป็นข้อเสนอแนะหรือความคิดเห็นของฉัน

3

ตัวอย่างที่ดีที่สุดที่ฉันได้เป็นผู้ใช้ที่ยากจนที่มีไฟล์ชื่อและพิมพ์ลงใน.. -rrm *

ไม่ว่าเรื่องนี้จะเป็นจริงหรือไม่ก็ตามมันกลายเป็นความคลาสสิคของ Unix เกลียด

ดูคู่มือ Unix-Hatersซึ่งมี Dennis Ritchie แนะนำตัวเองสำหรับตัวอย่างเหล่านี้มากมาย

ฉันจะเพิ่มเพิ่มเติมว่าการหลีกเลี่ยงปัญหาประเภทนี้เป็นกำลังสำคัญในการออกแบบ Power Shell ของ Microsoft


ฉันอ่านเรียงความของ Richard Gabriel ที่ด้านหลังของคู่มือ Unix-Haters :-)
Ellen Spertus

3
  • แน่นอนความหมายนับไม่ถ้วนของธง (สั้น) เดียวกันกับคำสั่งคือความไม่สอดคล้องกัน
  • แต่ละโปรแกรมที่ใช้นิพจน์ทั่วไปมีไวยากรณ์เป็นของตนเอง
  • ไฟล์การกำหนดค่าสำหรับบริการนั้นมีรูปแบบแตกต่างกันไป (ซึ่งสามารถยกโทษให้ได้ส่วน mailer daemon ของคุณมีความเหมือนกันเล็กน้อยกับเว็บเซิร์ฟเวอร์หรือการเริ่มต้นระบบ แต่ยังคง)
  • มีบรรณาธิการที่แตกต่างกัน! ผู้ใช้ใช้กระสุนที่แตกต่างกัน !! เหตุใดจึงมีสภาพแวดล้อมบนเดสก์ท็อปมากมาย?!

OTOH ความจริงที่ว่าเปลือกหอยขยายความขุ่นมัวไม่ใช่ progam กำจัดความไม่ลงรอยกันที่น่ารำคาญมากมายในระบบอื่น ๆ ทำตามความจริงที่ว่าคุณสามารถใช้คำสั่งเดียวกันเพื่อคัดลอกไฟล์จากที่หนึ่งไปยังอีกที่หนึ่งใน filessytem ไปยังดิสเก็ตต์หรือจาก Zip disk ไปยังเทป

ดังนั้นใช่ Unix ไม่สอดคล้องกัน ดังนั้นเป็นระบบอื่น ๆ แตกต่างกันเพียง ;-)


2

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

จุด C คือภาษาใกล้กับเครื่องที่สามารถนำไปใช้กับระบบปฏิบัติการได้ เครื่อง (ส่วนใหญ่) ไม่รองรับตัวเลขทศนิยมที่ไม่มีที่สิ้นสุดอย่างแม่นยำ Machines (ส่วนใหญ่) มีจำนวนเต็มบิตยาวคงที่

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.