Wpis z mikrobloga

Mirki i mirabelki z #programowanie #jezykc i #cplusplus i innych hashtagów które wołam.

Kodzę głównie w C/C++ - w sensie drivery, finalne rozwiązania - nie wiem jak to dobrze określić - po prostu apki nisko poziomowe, blisko sprzętu. Tylko coraz częściej jest tak, że żeby dojść sedna problemu gdzie faktycznie C/C++ jest tym narzędziem, które robi robotę to muszę przejść przez warstwę sieciową, żeby odebrać config, sparsować (np JSON RPC czy dbus) zaaplikować, wygenerować odpowiedź itd. Ogólnie dużo roboty która nie jest w ścieżce krytycznej, ale generuje kolosalny nakład pracy. No i tu pojawia się problem bo C/C++ to tak średnio do tego. No można niby wszystko tylko po co jeżeli można prościej i szybciej.

Co polecacie jako (nie wiem czy dobrze sie wyrażam) "frontend dla backendu" :P Chodzi mi jaki jezyk wybrać żeby:

1. Łatwo obsugiwać komuniację sieciową (zakładajć że kontroluję kod klienta i serwer): HTTP, JSON RPC i być może inne protokoły (dbus?).
2. Łatwa interakcja z plikami, serializacja/deserializaja.
2. Mieć w miarę szybki kod - nie musi być demonem prędkości, to nie jest ścieżka krytyczna.
3. Mieć możliwość łatwej interakcji z C/C++ - w sensie odbieram config, wołam funkcje z C/C++, żeby go zaaplikować.
4. Wszystkie zależności muszą być dostępne offline w czasie budowy paczki i uruchamiania aplikacji (w sensie totalnie offline).
5. Mieć dobre IDE z uzupełnianiem składni i hintami - must have.
6. Możliwość debugowania, najlepiej przez coś al'a gdb + IDE support - must have.

Myślałem ostanie o #golang W sumie tutoriale wyglądają prosto, język wydaje się prosty. Tylko znajomy powiedział mi, że po dłuższym spotkaniu z tym językiem to poza zastosowaniami sieciowymi to gówno totalne.

Teraz myślę nad #rustlang tylko tutaj nie mam w ogóle doświadczeń. W sumie jestem negatywnie nastawiony do tego języka ze względu, że nie podoba mi się składnia, ale co tam jak będzie robił robotę to mogę się przełamać i nauczyć.

Próbowałem też #python i #lua, ale dla mnie języki dynamicznie typowane to dzieło szatana.

Jakieś propozycje języków z przykładami dla powyższych wymagań?

#programista15k #programowanie i wszyscy inni święci.
  • 17
@urodziwyKutak: Nie bardzo rozumiem, w czym jest problem, by pisać wysoko poziomowo w C++, ale faktycznie kompilowanie i przygotowanie wszystkich zależności to kij w dupie.

W moim odczuciu tylko #rustlang i nie ma tak naprawdę alternatywy, skoro kodzisz w C++ to jego trudność jest do ogarnięcia. Tylko nie bardzo rozumiem, jak to ci się składnia nie podoba, w Go jest dużo gorsza i prymitywniejsza. A jak zrozumiesz jak Rust rozwiązuje problemy
Myślałem ostanie o #golang W sumie tutoriale wyglądają prosto, język wydaje się prosty. Tylko znajomy powiedział mi, że po dłuższym spotkaniu z tym językiem to poza zastosowaniami sieciowymi to gówno totalne.


@BeginEnd: a masz inne zastosowania? Zastanów się dwa razy nad odpowiedzą.

Jeżeli możesz robić appki od podstaw, to też może zrób sobie szablon projektu i np. skorzystaj z takich udogodnień jak vcpkg:
https://vcpkg.io/en/docs/examples/manifest-mode-cmake.html

Albo może jednak kod niskopoziomowy ci się
1. Łatwo obsugiwać komuniację sieciową (zakładajć że kontroluję kod klienta i serwer): HTTP, JSON RPC i być może inne protokoły (dbus?).


@BeginEnd:
Jeżeli C++:
* do HTTP: https://github.com/yhirose/cpp-httplib#server-multi-threaded
* do JSON: https://github.com/nlohmann/json
* binarny standard serializacji/deserializacji: https://google.github.io/flatbuffers/ albo coś od BSON

A ogólniej:
1️⃣ https://www.google.com/search?hl=en&q=awesome%20C%2B%2B%20curated%20list
2️⃣ https://vcpkg.io/en/packages.html
@BeginEnd: Tylko Rust. Golang ma fatalne powolne FFI (jak Java; spowodowane obecnością GC oraz wątków M:N), więc trochę słabo w zastosowaniach mocno niskopoziomowych gdzie musisz wywoływać kod w C/C++. Poza tym Golang dość mało ekspresywny jest. W Rust takie rzeczy jak serializacja/deserializacja do Jsona robisz dwiema linijkami (derive na struct i potem wywolujesz parse i zrobione), w sumie to w żadnym innym języku nie widziałem tak dobrze rozwiązanej serializacja/deserializacji. Rust ma
Tylko znajomy powiedział mi, że po dłuższym spotkaniu z tym językiem to poza zastosowaniami sieciowymi to gówno totalne.


@BeginEnd, @patrolez: niepopularna opinia: uważam że do sieci tym bardziej gówno i nie rozumiem co ludzie widzą w tym języku. No dobra, może nie gówno, ale Rust ma obsługę sieci i współbieżności zrobioną pod każdym względem lepiej. Go nie gwarantuje wykrycia wyścigów w danych, gorutyny są znacznie cięższe od korutyn w Rust,
@Krolik: no odpowiedź brzmi: deployment.

Golang super łatwo umożliwia bundlowanie jednoplikowej binarki z pełną appką Web, gdzie statyczne pliki też są bundlowane na np. assety: https://blog.jetbrains.com/go/2021/06/09/how-to-use-go-embed-in-go-1-16/

Szybciej nie da się napisać czegoś z API, co działa off-the-shelf niż w Go, co można to albo wykorzystać do prototypowania, albo na "tymczasowe" (co w praktyce znaczy, że jako docelowe/permanentne) rozwiązanie.
@patrolez: > Golang super łatwo umożliwia bundlowanie jednoplikowej binarki z pełną appką Web

@patrolez: to bardzo miło z jego strony, ale Rust i cały tuzin innych języków łącznie nawet z Javą też. W czasach dockera to czy to jeden plik czy kilka ma niewielkie znaczenie. Ważniejsze jest już ile łącznie to waży. A na tym polu znowu Go przegrywa z Rust.
Szybciej nie da się napisać czegoś z API


@patrolez: szybkość pisania to głównie kwestia znajomości języka, jego bibliotek i praktyki. Pisanie typowych API i CRUDów jest proste w każdym nowoczesnym języku. Ale spróbuj zrobić prosty broadcast na kilka serwisów i już w Go musisz kombinować prawą ręką do lewego ucha dookoła głowy, bo język nie ma wielu mechanizmów które byłyby przydatne: https://stackoverflow.com/questions/36417199/how-to-broadcast-message-using-channel
@BeginEnd: a masz inne zastosowania? Zastanów się dwa razy nad odpowiedzą.


@patrolez: Tak, moje główne zadanie to nie są rzeczy sieciowe. Piszę apki w C / C++ robiące coś innego, a obsługa sieci to tylko niemiły dodatek który muszę robić żeby odebrać jakiś request raz na godzinę przesłać odpowiedź. Dlatego zależy mi na tym aby dobrać taki język lub framework który będzie prosty, nie wymagał dużo pracy przy utrzymywaniu kodu
@seanconnery: próg jest niższy tylko pozornie. Ilość rzeczy które musisz rozumieć dogłębnie aby pisać prawidłowy produkcyjny kod Go (lub Java) jest podobna jak ilość rzeczy którą musisz ogarniać aby pisać prawidłowy kod w Rust. Różnica jest tylko taka, że jak napiszesz coś głupiego w Rust to oberwiesz po łapkach od kompilatora, a w Go/Java nie. I stąd pozorna trudność Rust. Ludzie się wkurzają, że kompilator nie puszcza im złego kodu, więc