Các ví dụ về sự không nhất quán và không đầy đủ trong Unix / C là gì?


20

Trong bài tiểu luận nổi tiếng của Richard Gabriel The Rise of Worse is Better , ông đối chiếu các phiên bản được biếm họa của các triết lý thiết kế MIT / Stanford (Lisp) và New Jersey (C / Unix) dọc theo trục của sự đơn giản, chính xác, nhất quán và hoàn chỉnh. Ông đưa ra ví dụ về "vấn đề kẻ thua cuộc trên PC" (được thảo luận ở nơi khác bởi Josh Haberman ) để cho rằng Unix ưu tiên sự đơn giản trong việc thực hiện hơn sự đơn giản của giao diện.

Một ví dụ khác tôi đã đưa ra là các cách tiếp cận khác nhau về số. Lisp có thể biểu diễn các số lớn tùy ý (tối đa kích thước của bộ nhớ), trong khi C giới hạn số ở một số bit cố định (thường là 32-64). Tôi nghĩ rằng điều này minh họa trục chính xác.

Một số ví dụ cho sự nhất quán và đầy đủ là gì? Dưới đây là tất cả các mô tả của Gabriel (mà anh thừa nhận là biếm họa):

Cách tiếp cận MIT / Stanford

  • Đơn giản - thiết kế phải đơn giản, cả về cách thực hiện và giao diện. Điều quan trọng là giao diện phải đơn giản hơn so với việc thực hiện.
  • Tính chính xác - thiết kế phải chính xác trong tất cả các khía cạnh quan sát được. Không chính xác chỉ đơn giản là không được phép.
  • Tính nhất quán - thiết kế không được nhất quán. Một thiết kế được cho phép hơi đơn giản và ít hoàn thiện hơn để tránh sự không nhất quán. Tính nhất quán cũng quan trọng như tính chính xác.
  • Tính đầy đủ - thiết kế phải bao gồm nhiều tình huống quan trọng như thực tế. Tất cả các trường hợp dự kiến ​​hợp lý phải được bảo hiểm. Đơn giản không được phép giảm quá mức hoàn thành.

Phương pháp tiếp cận New Jersey

  • Đơn giản - thiết kế phải đơn giản, cả về cách thực hiện và giao diện. Điều quan trọng là việc thực hiện phải đơn giản hơn giao diện. Đơn giản là sự xem xét quan trọng nhất trong một thiết kế.
  • Tính chính xác - thiết kế phải chính xác trong tất cả các khía cạnh quan sát được. Nó là một chút tốt hơn để đơn giản hơn chính xác.
  • Tính nhất quán - thiết kế không được quá nhất quán. Tính nhất quán có thể được hy sinh vì đơn giản trong một số trường hợp, nhưng tốt hơn là bỏ những phần đó của thiết kế xử lý các trường hợp ít phổ biến hơn là đưa ra sự phức tạp triển khai hoặc không nhất quán.
  • Tính đầy đủ - thiết kế phải bao gồm nhiều tình huống quan trọng như thực tế. Tất cả các trường hợp dự kiến ​​hợp lý nên được bảo hiểm. Sự hoàn thiện có thể được hy sinh để ủng hộ bất kỳ chất lượng nào khác. Trong thực tế, tính đầy đủ phải được hy sinh bất cứ khi nào việc thực hiện đơn giản bị nguy hiểm. Tính nhất quán có thể được hy sinh để đạt được sự hoàn thiện nếu sự đơn giản được giữ lại; đặc biệt vô giá trị là sự nhất quán của giao diện.

Xin lưu ý Tôi không hỏi liệu Gabriel có đúng không (đây là một câu hỏi không phù hợp với StackExchange) nhưng cho các ví dụ về những gì anh ta có thể đã đề cập đến.


6
Trong trường hợp bạn tò mò, đây không phải là vấn đề bài tập về nhà. Tôi là giáo viên. :-) Về ý nghĩ thứ hai, có lẽ điều đó làm cho bài tập về nhà của tôi.
Ellen Spertus

4
Tôi đấu tranh để xem tại sao câu hỏi này không có trên Unix & Linux (hoặc có thể là Kỹ thuật phần mềm ?). Bạn có thể giải thích theo cách bạn cần một quan điểm CS về vấn đề này không? Ngoài ra, hãy làm rõ xem bạn muốn ví dụ tích cực hay tiêu cực.
Raphael

Đó không phải là câu hỏi phù hợp hơn trên lập trình viên.stackexchange.com ?
Basile Starynkevitch

Tôi đã đăng nó lên CS vì tôi coi thiết kế ngôn ngữ là một trong những lĩnh vực cơ bản của khoa học máy tính, bao gồm khả năng tính toán, độ phức tạp, kiến ​​trúc, khả năng sử dụng, v.v. Tôi có thể đã đăng nó lên Unix / Linux, mặc dù tôi đang tìm kiếm một phạm vi rộng hơn lượt xem. Đối với các lập trình viên, mọi người hầu như luôn thù địch với tôi khi tôi đăng bài ở đó, ngay cả khi tôi nghĩ tôi đang ở chủ đề này, vì vậy tôi tránh xa khỏi đó.
Ellen Spertus

Câu trả lời:


15

Tiêu đề của câu hỏi gợi ý rằng một số mâu thuẫn giao diện người dùng cơ bản có thể khiến bạn quan tâm:

Các lệnh Unix không tuân theo bất kỳ cú pháp cụ thể nào để chỉ định các tùy chọn và cờ. Ví dụ: hầu hết các lệnh sử dụng các chữ cái đứng trước '-' là cờ: cat -n some_filenhưng các trường hợp ngoại lệ thích tar tf some_file.tardd in=some_file out=some_other_file count=2tồn tại trong các lệnh thường được sử dụng.

Unix và hậu duệ và họ hàng của nó có nhiều cú pháp biểu thức chính quy hơi khác nhau. Shell sử dụng "*" trong đó các chương trình khác (grep, egrep, vi) sử dụng '. *'. egrep có '+' và '|' Là nhà khai thác, grep không.

Giao diện cuộc gọi hệ thống "mọi thứ là một tập tin" cơ bản có thể được xem là không đầy đủ: đọc / ghi / tìm kiếm / đóng không phù hợp với mọi thiết bị I / O. Các trường hợp ngoại lệ cần thiết bị gộp vào các cuộc gọi "ioctl", nhưng các thiết bị như card âm thanh thậm chí không phù hợp lắm.


Câu trả lời tốt đẹp. Khi tôi nhìn thấy tiêu đề, tôi đã ngay lập tức nghĩ "ioctl" (và fcntl) nhưng bây giờ tôi không phải gõ một câu trả lời.
Louis

1
mô hình toàn cầu không phải là regexs
jk.

8

Tính nhất quán

Lisp có một cú pháp rất nhất quán, tất cả các phần mở rộng ngôn ngữ có thể được nhúng tự nhiên thông qua các macro và như vậy. Mặt khác, C có một cú pháp mã khá, cho phép người ta thực hiện một số "phím tắt", vì vậy trong một số trường hợp, mã C thực sự trông đơn giản hơn.

Hoàn thành

Trong Lisp, nếu bạn không có một tính năng ngôn ngữ cụ thể mà bạn cần, bạn có thể tự thực hiện nó với các macro. C cũng có tiền xử lý, nhưng nó khá rắc rối.


8

Chuỗi C không thể chứa ký tự 0 và các chức năng thư viện của nó không phù hợp để xử lý dữ liệu nhị phân.

Tên tệp trên hệ thống Unix không thể chứa ký tự 0 hoặc ký tự 47 (dấu gạch chéo).

Trong triển khai ban đầu của Unix, tên tệp được giới hạn ở 14 ký tự. Các phiên bản sau chỉ nới lỏng giới hạn này; họ đã không loại bỏ nó.

Đã thêm : Điều E2BIGkiện lỗi hệ thống, khi một người cố gắng execvới một danh sách đối số có quá nhiều đối số hoặc chiếm quá nhiều bộ nhớ hoặc môi trường quá lớn.

Unix nổi tiếng với loại giới hạn tùy ý này. Cho đến khi Perl ra đời vào năm 1987, việc xử lý các tập dữ liệu lớn hoặc các tập dữ liệu có các bản ghi dài hoặc dữ liệu nhị phân là cực kỳ không đáng tin cậy.


Không cho phép /không phải là tùy ý, cần thiết (?) Để giải quyết sự mơ hồ như /là dấu phân cách đường dẫn. Tôi vừa tạo một tệp 000, rõ ràng là hạn chế cụ thể đã biến mất trong thời của GNU / Linux hiện đại.
Raphael

Tôi không có ý nói rằng việc cấm /là tùy tiện, chỉ có điều là độ dài dòng và giới hạn kích thước tệp là tùy ý. Tuy nhiên, điểm là một thiết kế khác có thể cho phép tên tệp chứa dấu gạch chéo, nhưng các nhà thiết kế của Unix đã không coi nó quan trọng
Mark Dominus

Tôi chắc chắn rằng tại thời điểm đó, những giới hạn đó đã được đưa ra do những cân nhắc về hiệu suất; kỹ thuật chưa phát triển cũng có thể chơi vào nó. Từ quan điểm ngày nay, họ có vẻ nghi ngờ, đó là điều chắc chắn. Về /, tôi tò mò: giả sử một đường dẫn nên được mã hóa thành chuỗi, làm thế nào để bạn làm điều đó mà không có một ký tự dành riêng để phân tách đường dẫn?
Raphael

Tôi không hiểu quan điểm của bạn là gì. Câu hỏi yêu cầu "các ví dụ về sự không nhất quán và không đầy đủ trong Unix / C"; nó không đề cập đến hiệu suất.
Đánh dấu Dominus

1
@Raphael: Bạn thoát khỏi các vấn đề phân tách ngớ ngẩn bằng cách xác định pathloại dữ liệu trừu tượng và sử dụng nó trong các giao diện của bạn thay vì phơi bày một triển khai cụ thể (chuỗi ascii kết thúc null).
Logic lang thang

4

IIRC giáo viên của tôi nói rằng việc không thể sử dụng char *các biến trong các switchcâu trong C là một vấn đề không nhất quán, nhưng đối với tôi đó là vấn đề chung chung (tính đầy đủ). Tôi nghĩ rằng tốt hơn là sử dụng "tính nhất quán" chỉ trong thuật toán hoặc thiết kế phần mềm của bạn chứ không phải bằng ngôn ngữ lập trình (ít nhất là không phải ngôn ngữ như C. có thể ngôn ngữ lỗi có vấn đề về tính nhất quán), bởi vì ngôn ngữ lập trình có các tiêu chuẩn vững chắc xác định miền quy tắc và làm việc bằng cách áp dụng đầu vào cho các quy tắc. Vì vậy, nếu một cái gì đó không được phép trong ngôn ngữ, nó có kế hoạch không được phép và không nhất quán trong ngôn ngữ, IMHO.


  1. Tôi đã sử dụng tính tổng quát như tính đầy đủ. Tôi nghĩ rằng họ là điều tương tự. có lẽ tôi sai.
  2. Đây không phải là một câu trả lời. có thể đề nghị hoặc ý kiến ​​của tôi.

3

Ví dụ tốt nhất tôi có là người dùng nghèo có tệp .. -rvà được nhập vào rm *.

Cho dù câu chuyện này có đúng hay không, nó sẽ trở thành tác phẩm kinh điển của Unix.

Xem Cẩm nang Unix-Haters , có phần giới thiệu của chính Dennis Ritchie, để biết rất nhiều ví dụ này.

Ngoài ra, tôi sẽ nói thêm rằng việc tránh các loại sự cố này là một lực lượng lớn trong thiết kế Power Shell của Microsoft.


Tôi đọc bài tiểu luận của Richard Gabriel ở mặt sau của Cẩm nang Unix-Haters. :-)
Ellen Spertus

3
  • Chắc chắn vô số ý nghĩa của các cờ (ngắn) giống nhau cho các lệnh là một sự không nhất quán.
  • Mỗi chương trình sử dụng biểu thức chính quy có cú pháp riêng cho chúng
  • Các tệp cấu hình cho các dịch vụ là tất cả các cú pháp khác nhau (có thể được tha thứ một phần, trình nền thư của bạn có ít điểm chung với máy chủ web hoặc khởi động hệ thống của bạn, nhưng vẫn)
  • Có nhiều biên tập viên khác nhau! Người dùng sử dụng các loại vỏ khác nhau !! Tại sao có nhiều môi trường máy tính để bàn?!?

OTOH, thực tế là vỏ mở rộng các khối, và không phải là progam, loại bỏ rất nhiều mâu thuẫn khó chịu hiện diện trong các hệ thống khác. Thực tế là bạn có thể sử dụng cùng một lệnh để sao chép tệp từ nơi này sang nơi khác trong filessytem, ​​vào đĩa hoặc từ đĩa Zip sang băng.

Vì vậy, vâng, Unix không nhất quán. Các hệ thống khác cũng vậy, chỉ khác nhau ;-)


2

LISP hỗ trợ các số chính xác vô hạn so với C chỉ hỗ trợ các số nguyên máy không phải là một ví dụ về 'tính chính xác' của ngôn ngữ. Đó là một vấn đề đơn giản phát sinh từ thực tế là các ngôn ngữ có mục tiêu thiết kế rất khác nhau.

Quan điểm của C là ngôn ngữ gần với máy có thể được sử dụng để triển khai các hệ điều hành. Máy (hầu hết) không hỗ trợ số thập phân có độ chính xác vô hạn. Máy (hầu hết) có số nguyên có độ dài bit cố định.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.