Kiedy i gdzie powstała konwencja $ dotycząca literałów szesnastkowych?

Aug 16 2020

Uważam, że pytanie o pochodzenie 0xoznaczenia szesnastkowego jest interesujące.

Jednak kiedy we wczesnych latach 80-tych zerwałem programowanie na 8-bitowych systemach 65xx, wszystko, co widziałem, używało a $do oznaczania cyfr szesnastkowych (asemblery, monitory, książki, czasopisma itp.). Dopiero kiedy dostałem swoją pierwszą Amigę 1000 i zacząłem uczyć się C, wiedziałem, że 0xprefiks to rzecz.

Jeśli 0xprzedrostek wyraźnie poprzedza 8-bitową rewolucję , to (1) dlaczego został $przyjęty tak szeroko? I odwrotnie, (2) skoro stał się wszechobecny dla całego pokolenia programistów 8-bitowych, dlaczego został nagle usunięty? (Nie żeby to miało znaczenie, ale nadal używam $podczas komentowania kodu lub bazgrania na martwych drzewach).

Odpowiedzi

21 Raffzahn Aug 16 2020 at 12:59

Krótka odpowiedź:

Motorola używała go do swojego 6800, a MOS (6500) odziedziczyła go po Motoroli. W końcu 6500 członków zespołu wyszło z projektu 6800, więc byli już do niego przyzwyczajeni.


Długa odpowiedź:

Jeśli prefiks 0x wyraźnie poprzedza 8-bitową rewolucję,

Tak naprawdę nie jest. Motorola używała tego $przedrostka już w 6800 z 1974 roku. Unix dopiero niedawno (1973) został przepisany w C, który dodał 0xkonwencję mniej więcej w tym czasie i pokazany poza AT&T.

wtedy (1) dlaczego $ został przyjęty tak szeroko?

Ze względu na linię Motorola 6800/02/09, a także serię 6500 MOS używaną w wielu niższych komputerach mikro (domowych). Przede wszystkim Acorn, Apple, Atari i Commodore. Oczywiście każdy piszący oprogramowanie dla tych maszyn / procesorów używałby jego notacji.

Później wzmocniła ją popularność 68000 używanego m.in. w maszynach Atari ST i Commodore Amiga.

I odwrotnie, (2) stał się wszechobecny dla całej generacji 8-bitowych programistów,

Teraz zależy to w dużej mierze od „bąbelka procesora”, ponieważ dotyczy to tylko użytkowników komputerów opartych na 65xx / 68xx. Ktokolwiek dorastał z maszyną opartą na x80 (8080, 8085, Z80) lub x86, jak Altair (S100), Tandy TRS-80 i cały świat MSX, nie zgodzi się. Będą dość stanowcze, ponieważ Hprzyrostek był jedynym prawidłowym sposobem, a wszystko inne jest dość egzotyczne :))

dlaczego został nagle upuszczony?

Nie było. Nie ma światowego organu rządzącego, który go deklasuje. W końcu używanie prefiksu (lub sufiksu) nie jest nieodłączne dla kodu szesnastkowego, ale jest zdefiniowane przez używany język. Asemblery Motorola / MOS chcą $prefiksu, Intel Hsufiks, C 0xprzedrostek, a inni ponownie chcą bardziej matematycznego prefiksu 16#(Ada) lub 16r(Smalltalk).

(Nie żeby to miało znaczenia, ale nadal używam $ podczas komentowania kodu lub bazgrania na martwych drzewach).

Podobnie jest z wieloma innymi (* 3).

Konkluzja: język, którego się używa, definiuje zapis - i jak zawsze pierwszy pozostawia najgłębsze wrażenie.


Przewaga prefiksu nad postfiksem

Matematyka klasyczna używa notacji postfiksowej, w której podstawa kończy się liczbą. Które Intel podążał z ich nnnnHnotacją. Przy pisaniu przez kompilator ma to tę wadę, że całe słowo (stała) musi być najpierw przeczytane, zanim będzie można zdecydować, jak je zinterpretować. Oznacza to, że potrzebny jest bufor przechowujący cały ciąg, ponieważ można go przekonwertować tylko po przejściu do przodu do postfiksu.

Używając prefiksu, od początku jest jasne, jak interpretować następujące znaki. Nie ma potrzeby buforowania (* 2). Daje to przewagę w projektowaniu parsera i bardzo upraszcza asembler. Było to szczególnie pomocne przy szybkim tworzeniu wczesnych narzędzi cross assemblera jako pierwszego bootstrapu.


Trochę historii

  • Zapis heksadecymalny był raczej rzadkością we wczesnych latach. Zamiast tego chodziło o ósemkowe, ponieważ większość maszyn była zbudowana z wielokrotnością 3 słów , a znaki były zwykle obsługiwane jako 6 bitów.

  • Spośród nielicznych maszyn / systemów, które bardzo wcześnie oferowały hex, wiele używało różnych liter / symboli, takich jak ostatnie 6 w alfabecie UVWXYZ(* 2), często nawet nieciągłych.

  • IBM wprowadził format ciągu znaków z prefiksem ( X'nnnn') z / 360 w 1965 roku

  • Datapoint używał ósemkowego z prefiksem zero

  • Intel 4004 użył hex z sufiksem h

  • Intel 8008 wykorzystywał wszystkie ósemkowe w instrukcjach i dokumentacji, napisane jako nnnO

  • W 1973 roku obaj asemblerzy używali tych samych przyrostków B / O / H.


* 1 - Dbanie o kilka bajtów bufora może wydawać się dziwne w dzisiejszych czasach, gdy całe źródło jest zwykle ładowane do pamięci, ale pamięć RAM była wtedy przerażającym zasobem. W rezultacie preferowano algorytmy, które potrafiły odczytywać dane, na przykład z taśmy papierowej, i bezpośrednio pracować na każdym odczytanym symbolu bez buforowania.

Optymalny asembler pozwala odczytać dowolną pozycję po postaci na raz i przetworzyć ją od razu, bez konieczności patrzenia w przyszłość. Użycie przedrostka to obsługuje.

* 2 - Konwencja często używana w inżynierii, gdy potrzebne są symbole.

* 3 - Tutaj na RC.SE staram się używać notacji zgodnie z tematem, czyli $dla 65/68, Hdla Intela itd ... a gdy nie ma wyraźnej relacji, wrócę do notacji / 370 x'nn', ponieważ tego używałem najczęściej, mimo że użyłem go jako $pierwszy.