Lista platform obsługiwanych przez standard C

Czy ktoś zna jakieś platformy obsługiwane przez standard C, dla których wciąż trwają prace rozwojowe, ale które to są:

  • nie dopełniacz 2 lub
  • szerokość Całkowita nie jest 32-bitowa, 64-bitowa lub
  • niektóre typy liczb całkowitych mają bity dopełniające lub
  • jeśli pracowałeś na maszynie dopełniacza 2, wzór bitowy ze znakiem bit 1 i wszystkie bity wartości zero nie są poprawną liczbą ujemną lub
  • Konwersja liczby całkowitej z podpisanego na niepodpisany (i odwrotnie) wynosi nie przez verbatim kopiowanie wzorców bitowych lub
  • przesunięcie w prawo liczby całkowitej nie jest przesunięciem arytmetycznym lub
  • Liczba bitów wartości w typie unsigned nie jest liczbą bity wartości w odpowiednim podpisanym typie + 1 lub
  • Konwersja z szerszego typu int na mniejszy nie jest przez obcinanie lewej większości bitów, które nie pasują

EDIT: , ale które zostały przerwane, też bym się nimi zainteresował.

EDIT: C ma to do powiedzenia o padding bitów:

Bity wypełnienia są dostępne dla użytkownika w typie unsigned integer. Na przykład, załóżmy, że maszyna używa pary 16-bitowych skrótów (każdy z własnym bitem znaku), aby utworzyć 32-bitowy int, a bit znaku niższego skrótu jest ignorowany, gdy jest używany w tym 32-bitowym int. Następnie, jako 32-bitowy znak int, znajduje się bit dopełniający (pośrodku 32 bitów), który jest ignorowane przy określaniu wartości 32-bitowego podpisanego int. Ale jeśli ten 32-bitowy element jest traktowany jako 32-bitowa niepodpisana liczba całkowita, to ten bit wypełnienia jest widoczny dla programu użytkownika. Komitet C został poinformowany, że istnieje maszyna, która działa w ten sposób, i to jest jeden z powodów, że bity padding zostały dodane do C99.

Przypisy 44 i 45 wspominają, że bity parzystości mogą być bitami padającymi. Komitet nie znajomość wszystkich maszyn z dostępnymi dla użytkownika bitami parzystości wewnątrz liczby całkowitej. W związku z tym, komitet nie jest świadomy żadnych maszyn, które traktują bity parzystości jako bity padding.

Kolejne pytanie brzmi: co to za maszyna o której wspomniał C99?

EDIT: wygląda na to, że C99 rozważał usunięcie wsparcia dla dopełnienia 1 i podpisał wielkość: http://www.open-std.org/jtc1/sc22/wg14/www/docs/n868.htm http://www.open-std.org/jtc1/sc22/wg14/www/docs/n873.htm (Szukaj 6.2.6.2)

 24
Author: Andrew Medico, 2011-11-04

7 answers

Ostatnio pracowałem w firmie, która nadal używała wersji PDP-10 i portu GCC na tę platformę. 10, którego użyliśmy, miało kilka z wymienionych atrybutów:

  • liczby całkowite nie są 32 lub 64-bitowe, mają szerokość 36-bitową.
  • bity wypełnienia są używane dla niektórych reprezentacji. Dla liczb całkowitych o rozszerzonej precyzji (np. typu long long), podstawowa reprezentacja była 72-bitowa, w której każde z 36-bitowych słów miało znak-bit.

Oprócz powyższych niezwykłych atrybuty, pojawił się problem, że maszyna miała kilka różnych mechanizmów adresowania bajtów. Bajty o szerokościach w zakresie 6-12 bitów mogły być adresowane za pomocą specjalnych bitów w samym adresie, które wskazywały szerokość i wyrównanie słów. Aby reprezentować znak*, można użyć reprezentacji, która adresowałaby 8-bitowe bajty, z których wszystkie były wyrównane do lewej w słowie, pozostawiając 4-bitowe w każdym 36-bitowym słowie, które w ogóle nie były adresowane. Alternatywnie 9-bit można by użyć bajtów, które pasowałyby równomiernie do 36-bitowego słowa. Oba takie podejścia miały pułapki przenośności, ale w czasie, gdy odszedłem, uważano za bardziej praktyczne użycie 8-bitowych bajtów ze względu na interakcję z siecią TCP/IP i standardowymi urządzeniami, które często myślą w kategoriach pól 16, 24 lub 32-bitowych, które również mają podstawową strukturę 8-bitowych bajtów.

Z tego co wiem ta platforma jest nadal używana w produktach w terenie, a jest programista kompilatora w tej firmie utrzymanie stosunkowo najnowszych wersji GCC na bieżąco, aby umożliwić dalszy rozwój C na tej platformie.

 11
Author: bockmabe,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-11-13 23:12:30

Należy zauważyć, że nie można polegać na niezdefiniowanym zachowaniu nawet na powszechnie używanych platformach, ponieważ nowoczesne Kompilatory optymalizujące wykonują transformacje programu, które zachowują tylko zdefiniowane zachowanie.

W szczególności nie można polegać na arytmetyce dopełniacza dwójki, dającej INT_MAX+1 == INT_MIN. Na przykład gcc 4.6.0 optymalizuje następujące elementy w nieskończoną pętlę:

#include <stdio.h>
int main() {
     int i = 0;
     while (i++ >= 0)
          puts(".");
     return 0;
}

Edytuj: Zobacz tutaj aby uzyskać więcej informacji na temat signed overflow i optymalizacji GCC.

 12
Author: han,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-11-07 19:28:06

[1]} około dekady temu musieliśmy przenieść naszą bazę danych C embedded do procesora DSP, który okazał się być głównym procesorem samochodowego stereo. Była to maszyna 24-bitowa, w najgorszym wypadku: sizeof(char) == sizeof(int) == sizeof(void*) == 1, która miała 24 bity. Gałąź, która zajmowała się tym portem nazwaliśmy "24-bitowym piekłem".

Od tego czasu przeportowaliśmy naszą bibliotekę na wiele platform, ale żadna nie jest tak dziwna. Mogą nadal istnieć (tanie 24-bitowe układy DSP są teraz jeszcze tańsze), spotykane w tanich urządzeniach, gdzie łatwość programowania jest odległa sekunda do niskiego rachunku materiałów (BOM). Myślę, że natknęliśmy się na maszynę, w której prawe przesunięcie niepodpisanej liczby całkowitej niekoniecznie wstawiało zero bitów. Mimo to, wysoce niestandardowe reguły arytmetyczne na platformie gwarantują trudne i podatne na błędy przenoszenie oprogramowania na nią, co znacznie zwiększa koszty rozwoju oprogramowania. W pewnym momencie przeważa rozsądek i przestrzegane są standardy.

Podejrzewam, że wiele motywacji do obecności tych reguły w C99 to ich obecność w C89, a wcześniejsze iteracje języka. Nie zapominaj, że kiedy wymyślono C, komputery były o wiele bardziej zróżnicowane niż obecnie. Dostępne były projekty procesorów "Bit-slice", w których można było dodać do procesora tyle bitów, ile chcesz, po prostu dodając chipy. A przed C trzeba było kodować w języku assembly lub martwić się dokładnie gdzie w pamięci RAM będzie znajdować się kod itp.

C był dramatycznym krokiem naprzód pod względem przenośności, ale miał aby zagarnąć różnorodne systemy, stąd bardzo ogólne zasady. 20 lat później, kiedy pojawiła się Java, jej zaletą było to, że historia pozwala jej z góry zadeklarować, jak wielkie mają być prymitywne typy, co sprawia, że wszystko jest o wiele łatwiejsze, o ile wybory Javy są rozsądne.

Wiem, że pytacie głównie o liczby całkowite, ale napotkałem pewne dziwactwa, jeśli chodzi o wskaźniki. Wczesne komputery Macintosh miały 32-bitowe procesory (Motorola 68000), ale tylko 24-bitowe szyny pamięci. Tak więc 0x00123456 i 0xFF123456 odnosiły się do tej samej komórki pamięci, ponieważ procesor odciął górne 8 bitów podczas uzyskiwania dostępu do pamięci RAM. Inżynierowie Apple używali tych bitów do przechowywania metadanych o pamięci, na którą wskazywał wskaźnik. Tak więc porównując wskaźniki, najpierw trzeba było zamaskować górne bity. I nie każ mi zaczynać na segmentowanych architekturach pamięci x86. :)

Ponieważ jesteśmy w tym temacie, przyjrzyjmy się standardowi kodowania MISRA, który jest preferowane przez producentów samochodów, które wymagają maksymalnej przenośności i bezpieczeństwa. Zobacz też Hacker 's Delight przez Henry' ego S. Warrena, który ma w sobie mnóstwo przydatnych sztuczek.

 11
Author: Randall Cook,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-11-09 07:43:57

Moje dwa centy. Nie obwiniaj się mocno, to z mojego doświadczenia wynika, że nie jestem teoretykiem:

  • nie dopełniacz 2

Wszystkie istniejących procesorów są uzupełnieniem 2

  • szerokość Całkowita nie jest 32-bitowa ani 64-bitowa

Istnieją również architektury 8 i 16 bitów. Dobrym przykładem jest 8-bitowy AVR MCU.

  • niektóre typy liczb całkowitych mają bity dopełniające

Nie jestem świadomy żadnegosystemu, który jest liczbą całkowitą. Floating numbers - to inna historia.

  • jeśli pracowałeś na maszynie dopełniacza 2, wzór bitowy ze znakiem bit 1 i wszystkimi bitami wartości zero nie jest poprawną liczbą ujemną
  • Konwersja liczby całkowitej z podpisanego na niepodpisany (i odwrotnie) nie odbywa się poprzez dosłowne kopiowanie wzorców bitowych
  • przesunięcie w prawo liczby całkowitej nie jest przesunięciem arytmetycznym
  • Liczba bitów wartości w typie unsigned nie jest liczbą bitów wartości w odpowiednim podpisanym typie + 1
  • Konwersja z szerszego typu int na mniejszy nie polega na obcięciu lewej większości bitów, które nie pasują

Wszystkie powyższe-nie są świadome żadnej, a zakładam, że nie ma takiej maszyny.

 6
Author: Andrejs Cainikovs,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-11-04 10:42:25

Nawet jeśli te maszyny są starożytne, nadal istnieje aktywne programowanie społeczności dla PDP-8, większość, ale nie wszystkie, używając Symulacji: PDP-8 jako przykład. A Ta maszyna, AFAIK, używa 12-bitowych liczb całkowitych!

 6
Author: Johan Bezem,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-11-05 08:28:50

Cc65 kompilator dla Commodore C64 wydaje się mieć pewną Aktualizację już w zeszłym roku.

 4
Author: Some programmer dude,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-11-04 10:38:16

Stare powiedzenie (zapomniałem przypisania) mówi, że

Nie ma czegoś takiego jak przenośny Kod

Ale tylko to, że są jakieś kody, które zostały przeniesione.

Nie powinieneś dbać o pisanie kodu przenośnego, powinieneś dbać o pisanie kodu, który będzie łatwy do przeniesienia na inne platformy.

Poza tym używanie tylko standardu C daje niewiele przydatnych rzeczy. Standardy Posix dają znacznie więcej.

 3
Author: Basile Starynkevitch,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-11-04 10:43:35