Standardy w kompilatorach C, takie jak C11, C99 i C90 (czasami mylony z C98), są kluczowe dla zapewnienia zgodności kodu między różnymi kompilatorami i platformami.

Każdy z tych standardów języka programowania C wprowadza nowe funkcje i udoskonalenia w języku C. Oto główne różnice między nimi:
C90 (znany też jako ANSI C lub C89)
- Wprowadzony w: 1989 (nazywany też ANSI C)
- Najważniejsze cechy:
- Podstawowe typy danych, struktury, unie, wyliczenia
- Standardowa biblioteka C (stdio.h, stdlib.h, string.h itd.)
- Brak wsparcia dla zmiennych o zmiennej długości (VLA)
- Brak funkcji inline
C99
- Wprowadzony w: 1999
- Najważniejsze cechy:
- Deklaracje w dowolnym miejscu: Można deklarować zmienne w dowolnym miejscu w kodzie, a nie tylko na początku bloku.
- Komentarze stylu C++: Dodano wsparcie dla komentarzy w stylu C++ (//).
- Typy całkowite o stałej szerokości: Wprowadzenie nagłówka <stdint.h> z typami takimi jak int32_t, uint64_t itd.
- Złożone typy liczbowe: Dodano wsparcie dla typów złożonych (_Complex).
- Zmienna długość tablic (VLA): Możliwość deklarowania tablic o zmiennej długości.
- Restrict: Nowe słowo kluczowe restrict dla wskaźników, poprawiające optymalizacje.
C11
- Wprowadzony w: 2011
- Najważniejsze cechy:
- Zgodność z wcześniejszymi standardami: Zapewniono wsteczną zgodność z C99.
- Atomowość: Dodano wsparcie dla operacji atomowych (stdatomic.h).
- Typy anonimowe: Możliwość używania typów anonimowych.
- Równoczesność: Nowe funkcje i makra wspierające równoczesność (threads.h).
- _Generic: Dodano słowo kluczowe _Generic do tworzenia genericznych makr.
- Static_assert: Dodano static_assert do sprawdzania warunków w czasie kompilacji.
- Anulowanie VLAs (opcjonalne): VLA (Variable Length Arrays) stały się opcjonalne, co oznacza, że nie wszystkie kompilatory muszą je wspierać.
Wpływ standardów języka C na rozwój systemów operacyjnych
Systemy operacyjne, zwłaszcza Unix i Linux, powstały dzięki językowi C.
UNIX i C – fundament nowoczesnych systemów operacyjnych
Pierwsze wersje UNIX-a były napisane w asemblerze, ale w 1973 roku system UNIX został przepisany w C. To pozwoliło na łatwiejsze przenoszenie kodu na różne platformy, co było kluczowe dla jego popularyzacji. Początkowo UNIX był systemem o licencji zamkniętej i tylko komputery na uczelniach miały dostęp do kodu UNIXa, który był napisany w języku Asembler i C. Tak rozpowszechnił się język C jako język programowania systemowego. To był ważny punkt startowy do powstania systemów z otwartym kodem *BSD. Po czym z kolei Linus Torvalds zainspirowany tym ruchem zaproponował swoje jądro Linux. Tak w skrócie narodził się Linux 🙂
Linux i standardy C
Jądro Linuxa jest zgodne głównie ze standardem C11, choć niektóre fragmenty kodu bazują na starszych rozwiązaniach. Nowoczesne standardy pomagają w:
- Zarządzaniu pamięcią – np.
aligned_alloc
z C11, - Programowaniu wielowątkowym – dzięki
stdatomic.h
, - Lepszej przenośności kodu – ułatwiają kompatybilność na różnych platformach.
Podsumowanie
Każdy z tych standardów wprowadza różne ulepszenia, które czynią język C bardziej elastycznym i lepiej dostosowanym do nowoczesnych potrzeb programistycznych:
- C90: Podstawy języka C.
- C99: Duże ulepszenia, szczególnie w zakresie zmiennych o zmiennej długości, nowych typów danych i deklaracji zmiennych w dowolnym miejscu.
- C11: Nowoczesne funkcje takie jak atomowość, równoczesność i genericy, które ułatwiają programowanie współczesnych aplikacji.
Standardy te pozwalają programistom na tworzenie bardziej złożonych i wydajnych aplikacji, jednocześnie zapewniając, że kod jest przenośny i zgodny z różnymi kompilatorami i platformami.