Nowoczesny C23, C26

0

Witam, kiedyś istniał kompilator wyłącznie do języka C, czy obecnie jest rozwijany jakiś kompilator który nie wspiera C++?
Nie pamiętam już jego nazwy.
https://en.wikipedia.org/wiki/Small-C
https://en.wikipedia.org/wiki/Small_Device_C_Compiler
https://bellard.org/tcc/
https://en.wikipedia.org/wiki/LCC_(compiler)

Zmęczyła już mnie niekończąca się nauka C++ i Rust, to są dla mnie za duże języki. Chcę się nauczyć małego języka i tworzyć w nim programy, a nie ciągle się uczyć wszystkich tajników jakiegoś ogromnego języka. Gdzie twórca nie ma pojęcia o zaprojektowaniu sensownego zgrabnego języka programowania.


2
modern_c napisał(a):

Zmęczyła już mnie niekończąca się nauka C++ i Rust, to są dla mnie za duże języki. Chcę się nauczyć małego języka i tworzyć w nim programy, a nie ciągle się uczyć wszystkich tajników jakiegoś ogromnego języka. Gdzie twórca nie ma pojęcia o zaprojektowaniu sensownego zgrabnego języka programowania.

Sugestia że C to zgrabny język ... he he ...
To asembler z funkcją printf i scanf.

Ile tysięcy linii napisałeś i zdebugowałeś w C ?
Bo poglądy mi nasuwają jeden profil.

0

@AnyKtokolwiek skoro tak trudno debugować C, ale twórcom windowsa, linuksa, freebsd, apple jakoś to się udaje. To jaki zamiennik polecasz dla C. Tylko nie pisz o Rust, ponieważ Rust to zamiennik ale dla języka C++. Chociaż twórcy gier AAA nie lubią Rusta i prawdopodobnie kiedyś branża gier 3D wybierze zupełnie inny język systemowy.

2

W C podoba mi się to że masz tylko jedno rozwiązanie do każdego problemu, nie ma tylu rodzajów tablic co w Kotlinie. +. — modern_c

W C jest rozwiązanie jakiegoś istotnego zagadnienia ?
O ile rozwiazaniem jest scyzoryk, ducktape, trytrytki i glutownica

BTW nie posiada tablic w żadnym rozumianym dziś sensie, ma tylko arytmetykę tablicową

modern_c napisał(a):

To jaki zamiennik polecasz dla C.

A co do jezyka o bardzo prostej i spójnej budowie syntaktycznej to jest Java, została obcięta ze wszystkiego, co mogło dawać wątpliwości ... Drobne "ale" ... uważa się, że jest ZA PROSTA, co zmusza na runtime do nadrabiania tego, czego nie posiada

NIE ISTNIEJE język o cechach jednocześnie maksymalizujących
a) nauczenia się go przez kogoś, kto "męczy się uczeniem" (polecam excella / delphi, nic się nie czyta, tylko klika)
b) nadaje sie do profesjonalnych projektów dużej skali.
c) efektywny linii / problem czy osobolata / problem, godziny / bug itd

Zawsze jest coś za coś. Inny język do dydaktyki świeżaków, inny do ważnych wieloletnich projektów

modern_c napisał(a):

@AnyKtokolwiek skoro tak trudno debugować C, ale twórcom windowsa, linuksa, freebsd, apple jakoś to się udaje.

Przepraszam, nie wiedziałem ze należysz do tego kręgu. To wiele zmienia

1

@modern_c: W C można dodać różne parametry kompilatora -Wall -Wextra -Wpedantic -fsanitize=address/memory jest cppcheck valgrind, sonarqube, to wszystko pomaga usuwać błędy i nieścisłości, które dobrze jest poprawić. Parametrów kompilatora jest całe mnóstwo https://gcc.gnu.org/onlinedocs/gcc/Option-Summary.html
No i te błędy dla osoby doświadczonej są raczej proste do zrozumienia, oczywiście jak znasz terminologię związaną z programowaniem.

Dalej potrzebne są różne struktury danych gdyż potem nie dasz rady w rozsądnym czasie rozwiązać danego problemu przez zastosowanie nieodpowiednich struktur i algorytmów. Np. jak wyszukujesz coś po indexie to lepsza jest tablica, a jak po stringu to lepsza hashmapa itp. Akurat standardowa biblioteka C nie ma tych struktur, a C++ już tak więc w C musisz sam napisać lub ściągnąć jakąś bibliotekę.
Czyli jakbyś miał 1 mln użytkowników i chciałbyś wyszukać po imieniu to przy użyciu tablicy w najgorszym przypadku znajdziesz indeks danej osoby po 1 mln porównań, a w przypadku hashmapy w sposób logarytmiczny czyli 20 porównań oczywiście w przypadku braku kolizji, bo inaczej wtedy dochodzi jeszcze przejście po kubełku.

Ja do C i C++ używam neovim i jestem bardzo zadowolony, nawet do javascript, pythona, javy, assemblera.

Jak ktoś zna assemblera to może zawsze debugować na najniższym poziomie czystym assemblerze.
Ale gdb i inne debuggery pozwalają debugować na poziomie kodu źródłowego, czyli nie musisz iterować po instrukcjach procesora, a przeskakujesz po instrukcjach kodu źródłowego.
Czyli step to następna instrukcja procesora, a next to następna instrukcja kodu źródłowego.
Jak jesteś zaawansowany to możesz bez kodu źródłowego debugować i czytać instrukcje procesora jak poezję.

A zig, val, rust, roc nie spodobały ci się jednak?

0

@Autysta dałem się złapać w pułapkę VSCodium, ponoć miało nie być tej złej telemetrii Microsoftu. Ale jak się okazało całe te serwery na których są rozszerzenia należą do fundacji Eclipse. Twórcami VSCodium też są ludzie z tej fundacji i mają jeszcze Eclipse Theia. Po przejęciu przez niemieckiego IBM korporacji RedHat, w tym Fedory, Gnome, oraz IDE Eclipse, pojawiły się w tym środowisku programistycznym jakieś dziwne połączenia z serwerami fundacji, nie da się ich w ogóle wyłączyć. Po co mi te usługi fundacji łączące mnie z ich chmurą i sprawdzające ustawienia naszego routera. Oracle też jest sponsorem Eclipse CDT. W NetBeans nie ma tylu połączeń telemetrycznych co w tym Eclipse.
https://www.reddit.com/r/eclipse/comments/124qp6a/is_this_a_virus_i_never_got_it_on_older_versions/


1

Z tego co widzę, to młodzi mają bzika na punkcie przetwarzania danych o sobie, swoich poczynaniach.
Jak przeglądasz jutube to też oni analizują co wpisujesz, co klikasz myszką ile czasu na jaki film poświęcasz.

Ja nie przywiązuje za dużej wagi do unikania za wszelką cenę wszystkiego co może w jakikolwiek sposób zebrać dane o mnie.

Jestem też bardziej pragmatyczny, dlatego neovim jest spoko, bo możesz lua kod źródłowy przejrzeć na githubie pluginu jaki pobierasz, a że to pluginy to są dosyć małe projekty.
Dalej pluginy możesz nie aktualizować to się też nie wgra nic niepokojącego.

Jak jakaś usługa jest wartościowa i coś tam zbiera informacji to nic, nie wybiorę czegoś gorszego, bo tutaj sobie próbują analizować rynek.

2

czy obecnie jest rozwijany jakiś kompilator który nie wspiera C++?

Jeśli chodzi o platformy z unixem, linuxem, macosem czy windowsem to nikt nie używa kompilatorów innych niż "wielka trójka" czyli cl, gcc, clang/llvm do czegokolwiek na czym mu zależy i Ty też nie powinieneś. Po prostu ustaw flagę, który standard C chcesz używać. Nawet jeśli nie używasz pozostałych ficzerów kompilatora to fakt, że kompilator jest stale rozwijany dostaniesz optymalizacje czy usprawnienia dodane to Twojego wycinka niamal przy okazji, jeśli są dozwolone przez standard ofcourse. Do tego mniejsza szansa na bugi, jako, że duzi gracze polegają na nich w swoich produkcyjnych projektach taki kompilator przechodzi przez cały szereg QA.

Jeśli chodzi o inne platformy, embedded, RTOS itp, to używasz kompilatora dedykowanego na tą platformę.

1

Wyniesione z komentarzy.

Pytanie jeszcze o darmowy edytor do C bez połączeń telemetrycznych z dobrą obsługą debugera

Edytor z wbudowanym debuggerem to już praktycznie IDE i nie znam żadnego godnego polecenia, który spełniał by pozostałe kryteria, czyli żeby byl darmowy, dobry i bez telemetrii. Najbliżej jest chyba code-blocks, ale ja personalnie nigdy go nie lubiłem, nawet jak byłem na studiach 15 lat temu.

Na windowsie masz dwie realne opcje. VisualStudio gdzie masz wszystko w jednym albo RemedyBG plus osobny edytor wg Twoich preferencji. (edit) Debugger VisualStudio jest całkiem przyzwoity, więc trzecią opcją byłoby używanie go tylko jako debuggera a kod pisać w osobnym edytorze.

1

Jak cię tak bardzo boli telemetria to czemu nie załatwisz problemu tam gdzie jest tj. blokująć ją? Nie wiem jak jest z Clionem w tej kwestii, ale to zdecydowanie najlepsze IDE do C/C++. Co do kompilatorów to wybór czegoś innego niż gcc/clang/msvc to hipsteriada

0

@modern_c używaj clanga - ma lepsze komunikaty o błędach, raz na jakiś czas gcc bo zawsze może i on coś dobrego podrzuci.

Nie ma sensu używać innych kompilatorów niż te dwa. Nie będziesz miał lepszych warnów.

Do pisania oczywiście vim/nvim ;-)

0

Rust przeminie, to tymczasowa moda. @daniel1302 wczoraj długoletni programista Linuksa, H. Peter Anvin, odpowiedział na ten wątek listy mailingowej jądra.
„Andrew Piński niedawno dowiedział się o tym wątku. Zdaję sobie sprawę, że ukazał się on 1 kwietnia 2018 roku i albo był to żart, albo mógł zostać za taki odebrany. Jednakże myślę, że jest w nim słuszność i zamierzam to zrobić spróbuj uzasadnić moją opinię tutaj.

Zarówno C, jak i C++ przeszły duży rozwój od 1999 roku i C++, moim osobistym zdaniem, w końcu „wyrósł” na lepsze C dla tego rodzaju programowania wbudowanego, które uosabia jądro systemu operacyjnego. Mówię to jako autor bardzo dużej liczby hacków do makr i montażu inline w jądrze.

To, co naprawdę sprawia, że ​​to mówię, to to, że wiele rzeczy, o które ostatnio prosiliśmy o rozszerzenia specyficzne dla gcc, jest w rzeczywistości stosunkowo łatwych do zaimplementowania w standardowym C++ i w wielu przypadkach pozwala na ulepszenie infrastruktury bez globalnych zmian w kodzie (patrz poniżej .)

C++ 14 jest moim zdaniem wersją „minimalną”, która ma rozsądną obsługę metaprogramowania i ma większość bez tego piekła typów z wcześniejszych wersji (C++ 11 miał większość, ale C++ 14 wypełnia niektóre kluczowe brakujące elementy ).

Jednak moim zdaniem C++20 naprawdę zmienia zasady gry; chociaż wcześniejsze wersje mogły odtwarzać wiele hacków SFINAE, wyświetlały także całkowicie bezużyteczne barf jako komunikaty o błędach. C++20 dodaje koncepcje, które umożliwiają uzyskanie rozsądnych błędów.

„A teraz „dlaczego nie Rust”? Po pierwsze, Rust używa innej (często, moim zdaniem, nieuzasadnionej) składni i nie tylko wszyscy programiści jądra musieliby dokładnie zapoznać się z poziomem uzyskiwania tego samego rodzaju „odczuć”, tak jak w przypadku C, ale konwersja kodu C do Rusta nie jest czymś, co można wykonać fragmentarycznie, podczas gdy po niektórych porządkach istniejący kod C można skompilować jako C++.

Uważam jednak, że nie zgadzam się z niektórymi wnioskami Davida; tak naprawdę uważam, że David jest niepotrzebnie pesymistą, przynajmniej biorąc pod uwagę nowoczesny C++.

Należy pamiętać, że nikt o zdrowych zmysłach nie spodziewałby się używać wszystkich funkcji C++. Podobnie jak mamy „jądro C” (obecnie podzbiór C11 ze stosunkowo dużym zestawem dozwolonych rozszerzeń specyficznych dla kompilatora), mielibyśmy „jądro C++”, które sugerowałbym jako ściśle zdefiniowany podzbiór C++ 20 łącznie z podobnym zestawem rozszerzeń kompilatora.) Zdaję sobie sprawę, że obsługa kompilatora C++ 20 jest wciąż bardzo nowa z oczywistych powodów, więc przynajmniej część z nich dotyczy przyszłości.

https://www.phoronix.com/news/CPP-Linux-Kernel-2024-Discuss

2
voytek4 napisał(a):

„A teraz „dlaczego nie Rust”? Po pierwsze, Rust używa innej (często, moim zdaniem, nieuzasadnionej) składni i nie tylko wszyscy programiści jądra musieliby dokładnie zapoznać się z poziomem uzyskiwania tego samego rodzaju „odczuć”, tak jak w przypadku C, ale konwersja kodu C do Rusta nie jest czymś, co można wykonać fragmentarycznie, podczas gdy po niektórych porządkach istniejący kod C można skompilować jako C++.

Przeczytanie książki do Rusta z 10 razy i wielomiesięczna nauka to i tak dużo mniejszy koszt niż nauka C++ do takiego stopnia, żeby wiedzieć co się dzieje. C++ lubi robić dziwne rzeczy o których programista nie ma pojęcia np. niepotrzebne kopiowanie albo problemy z RVO. Rust pod tym względem jest dużo bardziej przewidywalny

Ficzery w Ruscie są też po prostu dużo lepiej zaprojektowane niż w C++, bo Rust jest iteracją na temat tego co C++ zrobił źle np. destructive moves, traity, brak exceptionów, przystosowanie do pracy przy minimalnym runtimie

1
modern_c napisał(a):

czy obecnie jest rozwijany jakiś kompilator który nie wspiera C++?

Nie istnieje żaden który ma lepsze komunikaty błędów niż te kompilatory obok których też istnieją kompilatory C++. Kryterium doboru kompilatora swoją drogą dość losowe (co cię obchodzi, że wspiera również inne języki? Jak się odniesiesz do istnienia kompilatorów języków takich jak Ada czy Fortran w GCC?). Zastanów się lepiej co chcesz osiągnąć.

0
modern_c napisał(a):

Gdzie twórca nie ma pojęcia o zaprojektowaniu sensownego zgrabnego języka programowania.

Na rynku jest nadal miejsce na nowy idealny język programowania, więc śmiało.
Czekamy na wczesną alpha

1

No dobra, gcc na początku było napisane w C.

Zadowolony? ;-)

1

W C podoba mi się to że masz tylko jedno rozwiązanie do każdego problemu, nie ma tylu rodzajów tablic co w Kotlinie. +. — modern_c

Poczułem potrzebę poznęcania się

Kocham przerośnięte "modele pamieci C" około 3-5 zależy jak liczyć (auto na ramce, alokowane, statyczne ze słowem static lub publiczne, statyczne wewnętrzne, i jeszcze jakieś) , dodając 3-4 zwyczaje / konwencje "jak zwrócić obiekt", przy czym jakaś biblioteka może użyć sposobu N+1

0

Zmęczyła już mnie niekończąca się nauka C++ i Rust, to są dla mnie za duże języki. Chcę się nauczyć małego języka i tworzyć w nim programy, a nie ciągle się uczyć wszystkich tajników jakiegoś ogromnego języka. Gdzie twórca nie ma pojęcia o zaprojektowaniu sensownego zgrabnego języka programowania.

To prawda, ze C++ i Rust ma znacznie więcej możliwości niż C, co też sprawia, że i kompilator jest bardziej skomplikowany. Natomiast od siebie dodam, ze nie wiem, jak zdaniem innych, ale moim zdaniem, w przypadku programowania na komputer z systemem operacyjnym lub do WebAssembly, lepiej posługiwać się językiem C++ niż C z prozaicznego powodu. Nawet mały, prosty program, łatwiej napisać jest w C++ niż w C, choć oczywiście tworzenie w C jest możliwe. Przede wszystkim ze względu na to, że są klas i obiekty, jest dużo gotowców, jak string (mający więcej możliwości niż cstring), vector, a co bardzo ważne, C++ ma inteligentne wskaźniki. Programowanie prostych i zabytkowych mikroprocesorów, jak Z80, 8051, 6502 realizowane w C to odrębny temat i zupełnie inaczej do tego się podchodzi.

Co do zarządzania pamięcią, to wydaje mi się, że to, co oferuje C++ z wykorzystaniem inteligentnych wskaźników i Rust to jest najlepszy sposób, jaki kiedykolwiek wymyślono. Obiekt jest tworzony w chwili wskazanej przez programistę, a niszczony jest najpóźniej w chwili utraty wskaźnika na obiekt. W Rust jest to od początku jego istnienia, a w C++ osiąga się to poprzez shared_ptr zamiast new i delete. Nie ma ryzyka wycieku pamięci (jedynie jest ryzyko w przypadku niepoprawnego tworzenia powiązań cyklicznych), ale też nie jest potrzebny żaden "zmiatacz" zwany GC, który co jakiś czas wstrzymuje program i przegląda całą pamięć w poszukiwaniu obiektów, do których utracono wskaźniki.

Widocznie, w dawnych czasach, wprowadzenie zmiatacza jako remedium na wycieki pamięci na użytej Java i C# było najprostszym, a niekoniecznie najlepszym rozwiązaniem. Jednak niezrozumiałe jest, dlaczego w tych językach pozbawiono możliwości zniszczenia obiektu w chwili wskazanej przez programistę.

W języku C, takich "udogodnień" nie ma, stąd w wielu przypadkach lepszym wyborem jest C++.

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.