Następca C

nalik
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 1039
3

Cała dyskusja o następcy C nie ma sensu, jeżeli nie ma się ściśle określonych wymagań. A w szczególności jednym z tych wymagań powinno być sprecyzowanie zastosowania, bo być może nie potrzebujemy jednego języka, a kilku.

Istnieją też problemy, które spowalniają adopcję nowych języków programowania w zastosowaniach systemowych. Wymienię tylko dwa.

Problem Legacy kodu. Jest przecież mnóstwo kodu niskopoziomowego, który rozwiązuje konkretne, wbrew pozorom trudne, problemy. Przepisanie takiej bazy kodu do języka nowego może spowodować nowe ukryte błędy. Łączenie kodu nowego i starego może być jakimś rozwiązanie, ale ogranicza/upośledza "bezpieczne" mechanizmy nowego języka. Przepisanie kodu kosztuje. Wyszkolenie programistów by efektywnie używali nowego języka też kosztuje. Utrzymanie starego kodu oczywiście też. Klasyczny problem - inwestować w poprawę starego ale stabilnego rozwiązania czy przepisać wszystko od nowa, licząc na to, że po drodze nie popełnimy błędów. Kiedy przepisywać? Kiedy zostawiać? Nie ma uniwersalnej odpowiedzi, ale mam wrażenie, że w praktyce częściej zostawia się to co już działa.

Problem długoterminowego wsparcia. Niskopoziomowy język programowania ogólnego przeznaczenia wymaga wsparcia, ciągłego portowania na nowe platformy sprzętowe (choćby po to by wykorzystać nowe instrukcje, potrafić zoptymalizować kod pod daną architekturę a także naprawiać błędy, które mogą być w kompilatorze). Wsparcia, za które ktoś musi zapłacić. Takie wsparcie zapewniają zazwyczaj programiści zatrudnieni przez dostawcę sprzętu. To oni pracują nad backendem kompilatora odpowiedzialnym za generowanie kodu maszynowego.

Ostatnio mamy wysyp nowych języków programowania, które próbują coś naprawić, unowocześnić, zrobić inaczej. Pół biedy, gdy infrastruktura kompilatora nowego języka jest wspólna z już istniejącymi rozwiązaniami (gcc, llvm), ale nie do końca rozwiązuje to wszystkie problemy. Przykładowo - generując kod pośredni llvma trzeba wiedzieć pewne rzeczy o platformie docelowej (llvm IR nie jest niezależny od platformy!). Napisanie własnego kompilatora od zera może spowodować ograniczenie adopcji, bo jak przekonać vendorów, by pomogli? Można się spierać, że obecnie liczba platform sprzętowych jest ograniczona, ale nawet ta ograniczona liczba platform do wsparcia może sprawić niemały problem.

Jaką mamy pewność, że język nie podupadnie? Jak to wpłynie na naszą bazę kodu, którą być może trzeba będzie utrzymywać jeszcze przez lata? Kto jest gwarantem stabilnego rozwoju języka? Firmy nie są skore do eksperymentowania na szeroką skalę w kodzie, który ma im zapewnić przypływ gotówki na lata.

Rozwiązanie tylko tych dwóch problemów, nie opisanych w tym poście wyczerpująco, wymaga zainwestowania ogromnych środków finansowych i kadrowych. I nagle okazuje się, że stworzenie nowego język programowania nie jest najtrudniejszym problemem do rozwiązania. A wysyp nowych języków, pretendujących do bycia tym standardowym, nie ułatwia.

Ja bardzo kibicuję nowym językom programowania, śledzę nowości, eksperymentuję z nimi. Ale nie wierzę, by coś zbyt szybko uległo zmianie. Zbyt dużo niepewności i starego kodu, a także kosztów, które już zostały poniesione. Myślę, że C może jeszcze bardzo długo nie doczekać się powszechnie uznawanego następcy, a adopcja nowych języków w tym obszarze będzie bardzo powolna, chyba, że ktoś zainwestuje miliardy dolarów w przyśpieszenie owego procesu.

KamilAdam
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Silesia/Marki
  • Postów: 5550
1
vpiotr napisał(a):

Co powinien miec nastepca:
2) proste i pewne tablice - w C/C++ sa one konwertowalne do wskaznika, a ten do int-a, tablice w C nie maja kontroli rozmiaru, a tablice deklarowane dynamicznie nie maja rozmiaru

Przecież C++ ma vector

  1. lancuchy - powinny byc immutable, automatycznie zwalniane i posiadac kontrole dlugosci oraz mozliwosc jej sprawdzenia, w C masz tylko mozliwosc obliczenia dlugosci, w C++ masz do stringow co najmniej 4 rozne skladnie (wskaznik na znak, tablica znakow, std::string, std::string_view), kazda z nich ma swoje zastosowanie

W Ruscie zrobili mutowalne Stringi oparte na Vec[u8] (wektorze bajtów). Czyli jak String jest za duży to samodzielnie się relokuje.

  1. dobrze zdefiniowane moduly, niezalezne od miejsca uzycia - w C++ dopiero od C++20

Rust ma moduły i managera modułów cargo

  1. listy, slowniki/mapy jako elementy jezyka - patrz Python, PHP - czas pokazal ze te elementy bardzo ulatwiaja tworzenie oprogramowania w danym jezyku

? Nie rozumiem. W sensie prosta (specjalna) składnia? Rust ma kolekcje w bibliotece standardowej
EDIT po wyjaśnieniach. Rust nie ma arytmetyki wskaźników więc nie da się odczytać elementu tablicy spoza zakresu

  1. cos na wzor Either / Optional (niekoniecznie obiektowe)

Rust ma i Option i Either zwany tam Result

  1. twarde typowanie by default z opcja konwersji - jak mozna pisac oprogramowanie systemowe bez tego?

Rust ma, czasem aż za twarde :(

  1. korutyny ew. watki (w C++ od C++11 watki, korutyny od C++20)

Rust w bibliotece standardowej ma tylko wątki. Reszta jest dostarczana jako osobne biblioteki

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.