Czytałem Gdzie przydatne są ósemki? i wygląda na to, że ósemki były kiedyś użyteczne.
Wiele języków traktuje liczby poprzedzające 0 jako liczbę ósemkową, więc literał 010
to w rzeczywistości 8. Kilka z nich to JavaScript, Python (2.7) i Ruby.
Ale tak naprawdę nie rozumiem, dlaczego te języki wymagają liczby ósemkowej, zwłaszcza gdy bardziej prawdopodobne jest, że użycie notacji będzie oznaczać liczbę dziesiętną z zbędnym 0.
JavaScript jest językiem po stronie klienta, ósemkowy wydaje się dość bezużyteczny. Wszystkie trzy są całkiem nowoczesne w innym znaczeniu i nie sądzę, że byłoby dużo kodu używającego notacji ósemkowej, który zostałby zepsuty przez usunięcie tej „funkcji”.
Tak więc moje pytania to:
- Czy jest jakiś sens tych języków obsługujących literały ósemkowe?
- Jeśli konieczne jest użycie literału ósemkowego, dlaczego nie użyć czegoś takiego
0o10
? Po co kopiować starą notację, która zastępuje bardziej użyteczny przypadek użycia?
javascript
python
ruby
octal
Manishearth
źródło
źródło
chmod
poprawności pliku Unix: z 0666 lub 0777 dla grup 3 bitów dla użytkownika, grupy i innych: odczyt, zapis, plik wykonywalny.parseInt('010')
rzeczywiście zwróciło 8, stąd wszystkie porady, których należy zawsze używaćparseInt(foo, 10)
(i nadal jest to dla mnie nawyk)Odpowiedzi:
Ślepe kopiowanie C, tak jak powiedział grzechotnik w swoim komentarzu
Zdecydowana większość „projektantów języków” w dzisiejszych czasach nigdy nie widziała nic poza C i jego kopiami (C ++, Java, JavaScript, PHP i prawdopodobnie kilkadziesiąt innych, o których nigdy nie słyszałem). Nigdy nie dotknęli FORTRAN, COBOL, LISP, PASCAL, Oberon, FORTH, APL, BLISS, SNOBOL, żeby wymienić tylko kilka.
Dawno, dawno temu, kontakt z wieloma językami programowania był OBOWIĄZKOWY w programie nauczania informatyki i nie obejmował liczenia C, C ++ i Java jako trzech oddzielnych języków.
Oktal był używany wcześniej, ponieważ ułatwiał czytanie wartości instrukcji binarnych. Na przykład PDP-11, PODSTAWOWO, miał 4-bitowy kod operacji, 2 3-bitowe numery rejestrów i 2 3-bitowe pola mechanizmu dostępu. Wyrażenie tego ósemkowego uczyniło wszystko oczywistym.
Ze względu na wczesne skojarzenie C z PDP-11 włączono notację ósemkową, ponieważ w tym czasie była bardzo powszechna na PDP-11.
Inne maszyny miały zestawy instrukcji, które nie były dobrze odwzorowane na hex. CDC 6600 miał 60-bitowe słowo, przy czym każde słowo zawierało zwykle od 2 do 4 instrukcji. Każda instrukcja miała 15 lub 30 bitów.
Jeśli chodzi o czytanie i pisanie wartości, jest to rozwiązany problem, ze znanymi najlepszymi praktykami branżowymi, przynajmniej w przemyśle obronnym. DOKUMENTUJ swoje formaty plików. Nie ma dwuznaczności, gdy format jest dokumentowany, ponieważ dokument MÓWI, czy patrzysz na liczbę dziesiętną, liczbę szesnastkową czy liczbę ósemkową.
Uwaga: jeśli twój system I / O domyślnie ma wiodącą 0, czyli ósemkową, musisz użyć innej konwencji na wyjściu, aby oznaczyć wartości szesnastkowe. To niekoniecznie jest wygrana.
Moim osobistym zdaniem Ada zrobiła to najlepiej: 2 # 10010010 #, 8 # 222 #, 16 # 92 # i 146 wszystkie przedstawiają tę samą wartość. (Zapewne dostanę co najmniej trzy opinie poniżej, tylko za wspomnienie o Adzie.)
źródło
Dostają to od C. Po co kopiować? Ponieważ podstawową implementacją wszystkich 3 jest C. Domyślna implementacja Pythona to CPython . Ruby został wybudowany w C , jak również. JavaScript jest tutaj najciekawszym przypadkiem. Jest uruchamiany w przeglądarce. Chcesz zgadnąć, w czym została napisana pierwsza przeglądarka internetowa ?
Dlaczego więc wszystkie trzy z tych języków byłyby implementowane w C? Ponieważ wszystkie pochodzą z systemów UNIX. Jest to więc przypadek konwencji napędzanej przez ekosystem. Perl też to robi. Lua prawdopodobnie by to zrobił, gdyby Lua użył liczb całkowitych zamiast podwójnych .
Jest to więc kwestia środowiska, w jakim te języki są napisane w C, więc biorą swoje konwencje z C. Dobrym towarzyszącym wnioskiem jest Visual Basic, który zamiast tego używa & O. O ile jest to potrzebne, wydaje się, że jest to bardziej nieszczelna konwencja zmieniająca się w konwencję niż cokolwiek innego.
źródło
Spójność ma wartość. Jeśli nie możesz wiarygodnie określić, w jaki sposób liczba zostanie przetłumaczona, będziesz mieć prawdziwe problemy z użyciem wartości w różnych kontekstach.
Oznacza to również, że nie musisz pisać własnego parsera. Wykorzystanie dobrze przetestowanych procedur bibliotecznych ma wielką wartość.
Również jeśli nie obsługujesz wiodącej składni 0, nie masz prostego sposobu na pisanie wartości ósemkowych.
Chociaż nie polegamy tak bardzo na liczbach ósemkowych, jak kiedyś, wciąż są one cenne. Chociaż te same wyniki można uzyskać za pomocą liczb szesnastkowych, w niektórych kontekstach ósemka jest łatwiejsza do zrozumienia.
Do tej pory widziałem tylko jedno użycie zer wiodących w liczbach dziesiętnych. Oznacza to wyświetlanie i wprowadzanie pól dziesiętnych o stałej długości, takich jak numery identyfikacyjne. Minęły lata, odkąd widziałem takie pola z wiodącym zerem. Zmniejsza to dostępne wartości o 10%, ale eliminuje problem polegający na tym, że użytkownicy często pomijają początkowe zera podczas ich wprowadzania.
źródło
chmod 438 ./myfile
okropne!0o10
składnię? Wierzę, że Python to obsługuje. Zawsze możesz w prosty sposób zapisać wartości ósemkowe, które nie powodują, że liczba nie jest już liczbą normalną. Widziałem, jak ludzie próbują używać końcowych zer w kodzie do wyrównywania i łatwej manipulacji, i gryzie się w stopę za pomocą notacji ósemkowej031
jako Halloween (31 października), a nie Bożego Narodzenia (25 grudnia) może stanowić pewne ryzyko, jeśli programiści skopiują kod napisany w języku używającym tej ostatniej implementacji. Nie widzę jednak powodu, dla którego język nie mógłby osiągnąć tego, co najlepsze w obu światach, obsługując0q31
jako notację, gdy pożądana jest liczba ósemkowa, lub0t025
dla dziesiętnej podstawy, aby zezwolić na wklejanie makr z wiodącymi zerami i po prostu zabraniając wiodącym zerom bez podstawowych specyfikatorów .