Unix / C'deki tutarsızlık ve eksiklik örnekleri nelerdir?


20

Richard Gabriel'in ünlü makalesinde The Rise of Worse is Better , basitlik, doğruluk, tutarlılık ve bütünlük eksenleri boyunca MIT / Stanford (Lisp) ve New Jersey (C / Unix) tasarım felsefelerinin karikatürize versiyonlarını karşılaştırıyor. Unix'in arayüz basitliğine göre uygulamanın basitliğine öncelik verdiğini iddia etmek için "PC kaybeden sorunu" ( Josh Haberman tarafından başka bir yerde tartışılmıştır) örneğini veriyor .

Ortaya koyduğum bir diğer örnek de sayılara farklı yaklaşımlar. Lisp keyfi olarak büyük sayıları (bellek boyutuna kadar) temsil ederken, C sayıları sabit sayıda bitle (genellikle 32-64) sınırlar. Bence bu doğruluk eksenini gösteriyor.

Tutarlılık ve bütünlük için bazı örnekler nelerdir? İşte Gabriel'in tüm açıklamaları (kabul ettiği karikatürler):

MIT / Stanford yaklaşımı

  • Basitlik - tasarım hem uygulamada hem de arayüzde basit olmalıdır. Arayüzün uygulamadan basit olması daha önemlidir.
  • Doğruluk - tasarım, gözlemlenebilir tüm yönleriyle doğru olmalıdır. Yanlışlığa izin verilmez.
  • Tutarlılık - tasarım tutarsız olmamalıdır. Bir tasarımın tutarsızlığı önlemek için biraz daha az basit ve daha az eksiksiz olmasına izin verilir. Tutarlılık, doğruluk kadar önemlidir.
  • Tamlık - tasarım, pratik olduğu kadar önemli durumları da kapsamalıdır. Makul bir şekilde beklenen tüm vakalar ele alınmalıdır. Sadeliğin bütünlüğü aşırı derecede azaltmasına izin verilmez.

New Jersey Yaklaşımı

  • Basitlik - tasarım hem uygulamada hem de arayüzde basit olmalıdır. Uygulamanın arayüzden daha basit olması daha önemlidir. Sadelik bir tasarımda en önemli husustur.
  • Doğruluk - tasarım, gözlemlenebilir tüm yönleriyle doğru olmalıdır. Basit olmak doğru olmaktan biraz daha iyidir.
  • Tutarlılık - tasarım aşırı tutarsız olmamalıdır. Tutarlılık, bazı durumlarda basitlik için feda edilebilir, ancak tasarımın daha az yaygın koşullarla ilgilenen kısımlarını, uygulama karmaşıklığı veya tutarsızlığı sunmaktan daha iyi bırakmak daha iyidir.
  • Tamlık - tasarım, pratik olduğu kadar önemli durumları da kapsamalıdır. Makul düzeyde beklenen tüm vakalar ele alınmalıdır. Bütünlük başka bir kalite lehine feda edilebilir. Aslında, uygulama basitliği tehlikeye atıldığında bütünlük feda edilmelidir. Sadelik korunursa, bütünlüğü sağlamak için tutarlılık feda edilebilir; özellikle değersiz arayüzün tutarlılığıdır.

Lütfen Gabriel'in haklı olup olmadığını (StackExchange için uygun olmayan bir soru) değil, neye atıfta bulunabileceğinin örnekleri için soruyorum.


6
Merak ediyorsanız, bu bir ev ödevi sorunu değildir. Ben öğretmenim. :-) İkinci düşünce, belki de bu benim ödevim yapar.
Ellen Spertus

4
Bu sorunun neden Unix ve Linux'ta (ya da belki Yazılım Mühendisliği ?) Olmadığını görmek için mücadele ediyorum . Konuyla ilgili bir CS perspektifine hangi şekilde ihtiyacınız olduğunu açıklayabilir misiniz? Ayrıca, olumlu ya da olumsuz örnekler isteyip istemediğinizi açıklayınız.
Raphael


Bunu CS'ye gönderdim, çünkü dil tasarımını bilgisayar biliminin temel derin alanlarından biri olarak hesaplanabilirlik, karmaşıklık, mimari, kullanılabilirlik, vb. Olarak görüyorum. görünüm. Programcılara gelince, insanlar konuya geldiğimi düşündüğümde bile, orada yayınladığımda neredeyse her zaman bana düşman oluyorlar, bu yüzden oradan uzak duruyorum.
Ellen Spertus

Yanıtlar:


15

Sorunun başlığı bazı temel kullanıcı arayüzü tutarsızlıklarının ilginizi çekebileceğini gösteriyor:

Unix komutları, seçenekleri ve bayrakları belirtmek için herhangi bir sözdizimine uymaz. Örneğin, komutların çoğu flag: olarak '-' ile başlayan tek harf kullanır cat -n some_file, ancak yaygın olarak kullanılan komutlarda istisnalar vardır tar tf some_file.tarve dd in=some_file out=some_other_file count=2vardır.

Unix ve onun torunları ve akrabaları, biraz farklı düzenli ifade sözdizimlerine sahiptir. Kabuklar, diğer programların (grep, egrep, vi) '. *' Kullandığı yerlerde "*" kullanır. egrep'te '+' ve '|' vardır operatör olarak grep bunu yapmaz.

Temel "her şey bir dosyadır" sistem çağrı arayüzü eksik olarak görülebilir: okuma / yazma / arama / kapatma her G / Ç cihazına uymuyor. Çok ihtiyaç duyulan istisnalar "ioctl" çağrılarına dahil olur, ancak ses kartları gibi cihazlar buna çok iyi uymaz.


Güzel cevap. Ben başlığı görünce hemen "ioctl" (ve fcntl) düşünüyordum ama şimdi bir cevap yazmak zorunda değilim.
Louis

1
glob kalıpları normal ifadeler değildir
jk.

8

Tutarlılık

Lisp çok tutarlı bir sözdizimine sahiptir, tüm dil uzantıları makrolar ve benzeri aracılığıyla doğal olarak gömülebilir. Öte yandan, C'nin bir "kısayol" almasına izin veren oldukça bir kod sözdizimi vardır, bu nedenle bazı durumlarda C kodu aslında daha basit görünür.

tamlık

Lisp'te, ihtiyacınız olan belirli bir dil özelliğiniz yoksa, bunu makrolarla kendiniz uygulayabilirsiniz. C'nin de önişlemcisi var, ama oldukça şaşırtıcı.


8

C dizeleri karakter 0 içeremez ve kütüphane fonksiyonları ikili verilerle başa çıkmak için uygun değildir.

Unix sistemlerindeki dosya adları 0 veya 47 karakteri (eğik çizgi) içeremez.

Unix'in orijinal uygulamasında, dosya adları 14 karakterle sınırlıydı. Daha sonraki versiyonlar sadece bu sınırlamayı hafifletti; onlar onu ortadan kaldırmadılar.

Eklendi : E2BIGSistem hatası koşulu, execçok fazla bağımsız değişkeni olan veya çok fazla bellek işgal eden veya çok büyük bir ortam içeren bir bağımsız değişken listesi ile çalışıldığında .

Unix, bu tür keyfi sınırlamalarla ünlüdür. Perl'in 1987'de ortaya çıkmasına kadar, büyük veri kümelerinin veya uzun kayıtlara veya ikili verilere sahip veri kümelerinin işlenmesi son derece güvenilir değildi.


İzin vermemek /keyfi değildir /, yol ayırıcı gibi belirsizlikleri çözmek de gereklidir (?) . Bir dosya oluşturdum 000, görünüşe göre modern bir GNU / Linux günlerinde belirli bir kısıtlama gitti.
Raphael

Yasağının /keyfi olduğunu, sadece satır uzunluğu ve dosya boyutu sınırlarının keyfi olduğunu söylemek istemedim.Ancak , farklı bir tasarımın dosya adlarının eğik çizgiler içermesine izin verebileceği, ancak Unix tasarımcılarının önemli olduğunu düşünün.
Mark Dominus

Eminim o zamanlar performansla ilgili hususlar nedeniyle bu sınırlar getirilmiştir; gelişmemiş teknikler de buna girebilir. Bugünün bakış açısından, şüpheli görünüyorlar, bu kesin. İle ilgili olarak /, ben merak ediyorum: Bir yol dizesi olarak kodlanmış olmalıdır varsayarak, bunu nasıl yol ayrımı için ayrılmış bir karakter olmadan yapacağız?
Raphael

Ne demek istediğini anlamıyorum. Soru "Unix / C'deki tutarsızlık ve eksiklik örnekleri" sorusunu soruyor; performanstan bahsetmez.
Mark Dominus

1
@Raphael: pathSoyut bir veri türü tanımlayarak saçma ayırıcı sorunlarından kurtulursunuz ve bunu belirli bir uygulamayı (boş sonlandırılmış ascii dizeleri) göstermek yerine arayüzlerinizde kullanırsınız.
Gezici Mantık

4

Öğretmenim IIRC , C'deki ifadelerde char *değişkenleri kullanamamanın switchbir tutarsızlık sorunu olduğunu, ancak benim için bu genellik (bütünlük) meselesi olduğunu söyledi. Bunu sadece içinde "tutarlılık" kullanmak daha iyi olduğunu düşünüyorum sizin programlama dilleri kurallarının etki alanını tanımlayan katı standartlara sahip, çünkü değil (en azından değil C. belki arabası dil tutarlılık sorunu var gibi dillerde) dilini kendisi programlama algoritmaların veya yazılım tasarımı kurallara girdi uygulayarak çalışabilirler. Dilde bir şeye izin verilmiyorsa, izin verilmemesi planlandı ve dilde tutarsızlık değil, IMHO.


  1. Ben bütünlüğü bütünlük olarak kullandım. Bence onlar aynı şey. belki de ben hatalıyım.
  2. Bu bir cevap değil. belki öneri ya da benim görüşüm.

3

Sahip olduğum en iyi örnek, adlandırılmış .. -rve yazılan bir dosyaya sahip olan kötü kullanıcı rm *.

Bu hikaye doğru olsun ya da olmasın, bir Unix düşmanı klasiği haline geldi.

Bu örneklerin birçoğu için Dennis Ritchie'nin kendisi tarafından tanıtılan Unix-Haters El Kitabı'na bakınız .

Ayrıca, bu tür sorunlardan kaçınmanın Microsoft'un Power Shell tasarımında büyük bir güç olduğunu da ekleyeceğim.


Richard Gabriel'in makalesini The Unix-Haters El Kitabının arkasında okudum. :-)
Ellen Spertus

3
  • Elbette aynı (kısa) bayrakların komutlara ait sayısız anlamları bir tutarsızlıktır.
  • Normal ifadeler kullanan her programın kendi sözdizimi vardır
  • Hizmetler için yapılandırma dosyalarının hepsi farklı sözdizimidir (kısmen affedilebilir, posta postanızın web sunucunuz veya sistem başlangıcı ile çok az ortak noktası vardır, ancak yine de)
  • Farklı editörler var! Kullanıcılar farklı kabuklar kullanır !! Neden bu kadar çok masaüstü ortamı var?!?

OTOH, kabuğun progamı değil, globları genişletmesi, diğer sistemlerde bulunan tahriş edici tutarsızlıkları ortadan kaldırır. Dosyayı bir dosyadan diğerine filessytem, ​​disket veya Zip diskten banda kopyalamak için aynı komutu kullanabilmeniz de mümkündür.

Evet, Unix tutarsız. Diğer sistemler de farklı ;-)


2

Sonsuz hassas sayıları destekleyen LISP'ye karşı, sadece makine tam sayılarını destekleyen C, dilin doğruluğuna bir örnek değildir. Dillerin çok farklı tasarım hedeflerine sahip olmasından kaynaklanan basit bir konudur.

C'nin noktası, işletim sistemlerini uygulamak için kullanılabilecek makineye yakın bir dil olmaktı. Makineler (çoğunlukla) sonsuz duyarlıklı ondalık sayıları desteklemez. Makinelerde (çoğunlukla) sabit bit uzunluklarında tamsayılar vardır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.