Neden bu kadar çok dil 0'dan başlayarak sayıları sekizlik olarak algılıyor?


21

Okudum Nerede octallar faydalı? ve sanki octallar bir zamanlar işe yarayan bir şeymiş gibi görünüyor.

Pek çok dil, 0'dan önce gelen rakamları sekizli olarak algılar, bu nedenle değişmez 010aslında 8'dir. Bunlardan bazıları JavaScript, Python (2.7) ve Ruby'dir.

Fakat bu dillerin neden sekizlik bir dil kullanmaları gerektiğini anlamıyorum, özellikle de gösterimin daha muhtemel kullanımı, gereksiz bir 0 ile bir ondalık sayı belirtmek olduğunda.

JavaScript istemci tarafı bir dildir, sekizlik oldukça işe yaramaz görünüyor. Her üçü de diğer anlamda oldukça modern ve bu "özelliği" kaldırarak kırılacak sekizlik gösterimi kullanarak çok fazla kod olacağını sanmıyorum.

Yani benim sorularım:

  • Sekizli harfleri destekleyen bu dillerin bir anlamı var mı?
  • Sekizli değişmezler gerekliyse neden böyle bir şey kullanmıyorsunuz 0o10? Neden daha kullanışlı bir kullanım senaryosunu geçersiz kılan eski bir notayı kopyala?

24
"Gençlerle görüşme sırasında şaşırtılmayı" bir cevap olarak kabul eder misiniz?
yannis

11
C sözdizimi + kör kopyalama
cırcır ucube

1
@ Manishearth C atalarından miras kaldı. Java'da var, çünkü C'de var. Çoğu diğerinde var çünkü C ve Java'da var.
Ingo

2
Biri hala sekizlik Unix dosyasındaki doğru değişiklikleri görüyor: chmodkullanıcı, grup ve diğerleri için 3 bitlik gruplar için 0666 veya 0777 ile: okuma, yazma, çalıştırılabilir.
Joop Eggen,

3
@Llepwryd Eski tarayıcılarda, parseInt('010')gerçekten de 8'e geri döndüler, bu nedenle her zaman kullanmaları için tüm tavsiyeler parseInt(foo, 10)(ve hala benim için bir alışkanlık)
Izkata

Yanıtlar:


34

C'nin kör kopyalaması, tıpkı mandallı ucube gibi yaptığı gibi

Bu günlerde "dil tasarımcılarının" büyük bir çoğunluğu C ve kopyalarından başka bir şey görmedi (C ++, Java, Javascript, PHP ve muhtemelen hiç duymadığım birkaç düzine kişi). FORTRAN, COBOL, LISP, PASCAL, Oberon, FORTH, APL, BLISS, SNOBOL gibi isimlere hiç dokunmadılar.

Bir zamanlar, birden fazla programlama diline maruz kalmak bilgisayar bilimi müfredatında ZORUNLU idi ve bu C, C ++ ve Java'yı üç ayrı dil olarak saymayı içermiyordu.

Daha önceki günlerde oktal kullanılmıştır, çünkü ikili komut değerlerinin okunmasını kolaylaştırmıştır. PDP-11, örneğin, BASICALLY, 4 bit bir opcode, 2 3 bit kayıt numarası ve 2 3 bit erişim mekanizması alanına sahipti. Sekizli kelimeyi ifade etmek her şeyi açıkça ortaya koydu.

C'nin PDP-11 ile erken ilişkisi nedeniyle, o sırada PDP-11'lerde çok yaygın olduğu için, sekizlik notasyon dahil edildi.

Diğer makinelerde hex ile iyi eşleşmeyen komut setleri vardı. CDC 6600 60-bit bir kelimeye sahipti, her kelime tipik olarak 2 ila 4 talimat içeriyordu. Her komut 15 veya 30 bitti.

Değerleri okumak ve yazmak için, bu en azından savunma sanayinde iyi bilinen bir endüstri en iyi uygulamasıyla çözülmüş bir problemdir. Dosya biçimlerinizi BELGELENDİNİZ Format belgelendiğinde belirsizlik yoktur, çünkü belge size bir ondalık sayıya, onaltılık sayıya veya sekizli sayıya baktığınızı söyler.

Ayrıca not: Eğer G / Ç sisteminiz varsayılan olarak sekiz anlamına gelirse, onaltılık değerleri belirtmek için çıktınızdaki diğer bazı kuralları kullanmanız gerekir. Bu mutlaka bir kazanç değildir.

Benim düşünceme göre, Ada en iyisini yaptı: 2 # 10010010 #, 8 # 222 #, 16 # 92 # ve 146 hepsi aynı değeri temsil ediyor. (Bu muhtemelen beni en az üç indirgemeye sokacak, sadece Ada'dan bahsettiğim için.)


11
Ada'dan bahsettiğin için Downvoted ... sadece şaka
kufi

12
"Dil tasarımcılarının" % 50'sinden fazlası olan bu rakamın nasıl ortaya çıktığını merak ediyorum - neden korkuyor? - C soyundan başka hiçbir şeyle ilgili deneyimim yok. Hayatımın iyi bir on altı yılını her gün profesyonel dil tasarımcılarıyla konuşarak geçirdim ve bunlardan biri tanımınıza uymuyor.
Eric Lippert,

Javascript, bu röportajı doğru hatırlıyorsam, tasarımcıyla ilgilenmek için "tarayıcıda lisp yapmak istiyoruz" olarak tanımlandı ...
Izkata

2
@Izkata: Nitekim, Waldemar Horwat bir keresinde JavaScript'i C gibi bir sözdizimiyle birlikte Common Lisp olarak gördüğünü söyledi. Aslında Waldemar bir meta dil tanımladı, Common Lisp'teki kendi meta dilini yorumladı, ardından kendi dil belgesinde JavaScript özelliğini yazdı ve böylece şartnameyi gerçekten çalıştırmasını sağladı . Zekice bir teknikti.
Eric Lippert,

Neden 0 olsa kullanıldı? Sayısal olmayan bir karakter kullanmak mantıklı olmaz mıydı? ANSI standardı, on üssü olma niyetinde olan sayıların neden olduğu bir öngörü öngörüsüne sahip değil miydi?
Eski Badman Gray

6

C'den alıyorlar. Neden kopyalansın? Çünkü hepsinin 3 temel uygulaması C'dir. Python'un varsayılan uygulaması CPython'dur . Ruby aslen C de inşa edildi . Javascript, buradaki en ilginç örnek. Tarayıcıda çalıştırıldı. İlk web tarayıcısının ne yazdığını tahmin etmek ister misiniz?

Öyleyse neden bu üç dil de C de uygulansın? Çünkü hepsi UNIX sistemlerinden geliyor. Bu yüzden ekosistem tarafından yönlendirilen bir kongre örneği. Perl bunu da yapar. Lua, eğer Lua iki katından ziyade tamsayılar kullanırsa büyük olasılıkla olurdu .

Bu yüzden, bu dillerin C dilinde yazılmasıyla ilgili bir konudur, bu yüzden sözleşmelerini C'den alırlar. İyi bir destekleyici sonuç, bunun yerine & O kullanan Visual Basic'tir . İhtiyacı olduğu kadarıyla, konvansiyondan başka herhangi bir şeyden çok, sızdıran bir soyutlamaya dönüşmüş gibi görünüyor.


Mosaic JavaScript'i destekliyor mu? Olmazsa, bununla nasıl ilgili?
salı

2
@svick Yapılan Netscape Navigator için temel.
Dünya Mühendisi

2

Tutarlılığın bir değeri var. Bir sayının nasıl çevrileceğini güvenilir bir şekilde belirleyemiyorsanız, farklı bağlamlarda bir değer kullanarak gerçek sorunlarınız olacaktır.

Aynı zamanda kendi ayrıştırıcınızı yazmak zorunda olmadığınız anlamına da gelir. İyi test edilmiş kütüphane rutinlerinin kullanılmasında büyük değer vardır.

Ayrıca, önde gelen 0 sözdizimini desteklemiyorsanız, sekizlik değerler yazmak için basit bir yönteminiz yoktur.

Bir zamanlar yaptığımız kadar sekizli sayılara bağlı olmamakla birlikte, yine de değerlidir. Aynı sonuçları onaltılık sayılarla elde etmekle birlikte, bazı bağlamlarda sekizliklerin anlaşılması daha kolaydır.

Şimdiye kadar ondalık sayılardaki baştaki sıfırlar için yalnızca bir kullanım gördüm. Kimlik numarası gibi sabit uzunluklu ondalık alanların gösterimi ve girişi. Sıfır gibi böyle alanları gördüğümden bu yana yıllar geçti. Bu, mevcut değerleri% 10 oranında azaltırken, kullanıcıların girerken sıklıkla önde gelen sıfırları bırakma sorununu ortadan kaldırır.


3
Önde gelen sıfır içeren alanlar, dizeler, sayılar değil, kendi anlamlarıyla görsel temsillerdir.
Pieter B

1
+1 chmod 438 ./myfileKorkunç düşünün !
Ingo

2
Neden bir 0o10sözdizimine izin vermiyorsunuz ? Python'un bunu desteklediğine inanıyorum. Sayıyı artık normal sayı yapmayan sekizli değerleri yazmak için her zaman basit bir yol yapabilirsiniz. İnsanların hizalama ve kolay manipülasyon için kodda sondaki sıfırları kullanmaya çalıştıklarını ve
sekizinci

İkili ve onaltılıya ek olarak, sekizlik değerler yazma araçlarına sahip olma arzusunu anlayabilirim. Ayrıca, bir derleyicinin 031Noel (25 Aralık) yerine Cadılar Bayramı (31 Ekim) olarak yorumlamasını , programcılar bu ikinci uygulamayı kullanan bir dilde yazılmış kodla kopyalarsa bazı riskler doğurabileceğini de anlayabilirim . Bununla birlikte, neden bir dilin 0q31sekizlik istendiğinde notasyon olarak destekleyerek ya da 0t025on bazının öncü sıfırlarla makro-yapıştırma değerlerine izin vermesini ve baz belirleyicileri olmadan sadece başlangıç ​​sıfırlarını yasaklamasını sağlayarak neden her iki dünyanın en iyisini elde edemediğini görmüyorum. .
supercat

@supercat Sekizinci tarihi temsil etmek için baştaki 0'ı en azından gençliğinize aittir. Sıkça kullanıldığı durumlar, bitlerin önem taşıdığı durumlardır ve sayının ondalık sayı olarak yorumlanması sadece 8'den küçük değerler için doğrudur. Ek karakterlerin eklenmesi (ondalık sayılardaki baştaki sıfırlar dahil) yararlı olmaktan daha kafa karıştırıcı olabilir . Neden bir tarihin 012 031, 010 031 veya 012 025 yazıldığını sorguluyorum.
BillThor
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.