Jaki język programowania bez null/nil w 2024?

Jaki język programowania bez null/nil w 2024?
AN
AN
  • Rejestracja:ponad rok
  • Ostatnio:9 miesięcy
  • Postów:30
0

Jakie są języki warte uwagi poza rustem? Przeczytałem poradnik microsoftu jak przejść z c# do rusta, ale składnia mi się nie podoba.
Jeszcze dodam, że widziałem ostatnio film z wykładu pana doktora Milewskiego dot. teorii kategorii, także nie musicie się krępować z językami funkcyjnymi.

somekind
Moderator
  • Rejestracja:około 17 lat
  • Ostatnio:3 minuty
  • Lokalizacja:Wrocław
3

Zdaniem niektórych C#, tylko wystarczy w nim wyłączyć null i po sprawie.

dalbajob
  • Rejestracja:prawie 2 lata
  • Ostatnio:4 miesiące
  • Postów:149
3

Scala, a jeśli jednak aspekty funkcyjne okażą się zbyt hardkorowe, to Kotlin - https://kotlinlang.org/docs/null-safety.html#0

edytowany 1x, ostatnio: dalbajob
Riddle
Administrator
  • Rejestracja:prawie 15 lat
  • Ostatnio:około 10 godzin
  • Lokalizacja:Laska, z Polski
  • Postów:10076
4

Zależy co rozumiesz przez null, bo różne języki rozumieją to inaczej.

Niektóre rozumieją to jako "reprezentacja braku obiektu". Inne jako super typ wszystkich typów. Jeszcze inne jako odrębny byt, prymityw z jedną wartością (taki upośledzony bool). Musiałbyś powiedzieć na jakich cechach "null"a Ci zależy, a na jakich nie.

SL
Zakładam, że brak nulli to ograniczenie w kodzie, które wymuszają eksplicite sprawdzanie, czy x == null, gdy jest to możliwe
szatkus1
  • Rejestracja:około 22 lata
  • Ostatnio:17 minut
3

Kotlin

elwis
  • Rejestracja:ponad 18 lat
  • Ostatnio:8 dni
6

A co chcesz robić? Od tego chyba należy zacząć. Do niskopoziomowych chyba Rust nie ma konkurencji (zważywszy na twoje wymaganie). Z wysokopoziomowych Haskell.

do rusta, ale składnia mi się nie podoba.

Dość słaby argument. Z doświadczenia, to może być wręcz argument za tym, żeby spróbować. Jeśli składnia Ci się nie podoba to znaczy prawdopodobnie, że to coś nowego. Tak więc pewnie zmieni to twoje myślenie o programowaniu. :) Natomiast warto zwrócić uwagę na założenia projektu: brak GC, focus na wydajność i poprawność kodu. Jeśli się z tym nie zgadzasz to Rust nie jest dla Ciebie.


edytowany 3x, ostatnio: elwis
LukeJL
  • Rejestracja:około 11 lat
  • Ostatnio:2 minuty
  • Postów:8423
4

Ogólnie to dziwne, że ludzie rezygnują z języka dlatego, że składnia się różni o kilka procent od tego, co znają. Rust to dalej składnia mainstreamowa (co innego np. Haskell). Pewne rzeczy nie zawsze są intuicyjne i czasem jest przegadanie albo koncepcje typu lifetime’y, które trzeba uwzględnić w deklaracjach, ale… gdyby ludzie nie uczyli się języka, bo w składni jest coś, co im się nie podoba, to każdy programista znałby tylko 1 język i nigdy by się nie nauczył innego, nawet HTMLa. Bo każdy kolejny język będzie wnosił pewną odmienność.


edytowany 1x, ostatnio: LukeJL
obscurity
  • Rejestracja:około 6 lat
  • Ostatnio:około 18 godzin
0
elwis napisał(a):

do rusta, ale składnia mi się nie podoba.

Dość słaby argument. Z doświadczenia, to może być wręcz argument za tym, żeby spróbować. Jeśli składnia Ci się nie podoba to znaczy prawdopodobnie, że to coś nowego. Tak więc pewnie zmieni to twoje myślenie o programowaniu. :) Natomiast warto zwrócić uwagę na założenia projektu: brak GC, focus na wydajność i poprawność kodu. Jeśli się z tym nie zgadzasz to Rust nie jest dla Ciebie.

Tzn. sam przymierzam się do nauki rusta i przykładowo jeszcze nie widziałem języka który tak by skomplikował pracę z czymś tak podstawowym jak enumy że trzeba o porównanie wartości enuma pytać na stackoverflow ;)
https://stackoverflow.com/questions/51429501/how-do-i-conditionally-check-if-an-enum-is-one-variant-or-another

Ale zgadzam się że przede wszystkim język wybiera się ze względu na zastosowanie, dostępność frameworków i społeczności w tym kierunku. Choć kotlina da się użyć do pisania apki desktopowej, rusta do webdevu, c# do machine learningu a scalę do apek mobilnych to nie polecałbym żadnej z tych opcji.


"A car won't take your job, another horse driving a car will." - Horse influencer, 1910
edytowany 1x, ostatnio: obscurity
Zobacz pozostałe 3 komentarze
Wibowit
Czemu nie mogą mieć domyślnie tego #[derive(PartialEq)]? - a co jeśli danych zawartych w enumie nie da się porównać, bo nie implementują partialeq?
obscurity
to wtedy nie dawać tego domyślnie, proste
Wibowit
to wtedy będzie jeszcze większy wtf, czemu raz działa, a raz nie
obscurity
jak dla mnie proste i logiczne wytłumaczenie i kompilator może wyjaśnić, no ale ok widocznie się nie da
LukeJL
Domyślnie to można stosować pattern matching (if let, match itp.) i też zadziała. Chociaż PartialEq też się może przydać w kontekście enumów, pamiętam, że gdzieś tego też potrzebowałem, ale nie pamiętam, gdzie dokładnie. Chyba chodziło o to, żeby móc to porównać w asercjach w testach. Albo jeszcze gdzieś indziej. Może jak porównywałem dwie zmienne ze sobą? (a nie zmienną i literał)
elwis
  • Rejestracja:ponad 18 lat
  • Ostatnio:8 dni
1
LukeJL napisał(a):

Rust to dalej składnia mainstreamowa (co innego np. Haskell).

Myślę, że to jest dość dyskusyjna sprawa. Może jest sporo nawiązań do innych języków, są klamerki, ale wiele rzeczy jest innych, a wiele rzeczy, które wydają się być znajome znaczą właściwie coś zupełnie innego. Na przykład model objektowy jest zupełnie inny niż w językach takich jak Java czy C++. Tak naprawdę dobry kod w Ruscie, dla kogoś kto nie kodował w Scali ani Haskellu prawdopowobnie nie będzie zbyt czytelny na początku.

obscurity napisał(a):

Tzn. sam przymierzam się do nauki rusta i przykładowo jeszcze nie widziałem języka który tak by skomplikował pracę z czymś tak podstawowym jak enumy że trzeba o porównanie wartości enuma pytać na stackoverflow ;)

Komplikacje w składni Rusta wynikają głównie z trzech powodów:

  • poprawność kodu wymaga pisania rzeczy, których często z lenistwa nie piszemy. Więc np. zalecaną formą sprawdzania enuma jest match, który wymaga podania wyniku dla każdej możliwej wartości. Chociaż rzeczywiście można po prostu zrobić #[derive(PartialEq)], przynajmniej jeśli enum nie korzysta typów, które tego nie implementują. Pewnie dlatego nie jest to domyślne (tym bardziej, że stosunkowo rzadko enumów używa się bez pól, wtedy PartialEq ma najwięcej sensu).
  • jasność i kontrola nad wydajnością wymaga, żeby wszystko co powoduje narzut wydajnościowy wymaga takiego lub innego oznaczenia w kodzie. Np. alokacja na stercie będzie zaznaczona przez Box<>, a użycie vtable słowem kluczowym dyn.
  • Brak GC ani manualnej alokacji pamięci wymaga tych wszystkich cyrków z lifetimami. Gwarancje memory safety z kolei wymagają reżimów referencji (borrow checker).

edytowany 6x, ostatnio: elwis
LukeJL
Ale model obiektowy to już nie składnia.
elwis
@LukeJL: Ale model obiektowy się przekłada na składnię. Nie masz class {} w którym masz zdefiniowane i pola i metody, tylko masz stuct{} z polami i wiele bloków impl {} z różnymi implementacjami metod dla traitów i zestawów parametrów. Poza tym, czy jeśli kod wygląda tak samo, ale znaczy coś innego to składnia jest taka sama czy nie? Bo w moim rozumieniu nie.
LukeJL
Nom trochę tak. Albo trait bounds, jeśli są rzeczy typu where czy dwukropek po typie generycznym. Na początku nie kumałem, o co dokładnie chodzi i czym to się różni od innych deklaracji. Więc też mimo że składnia Rusta na poziomie podstawowym bardzo mi się podoba, bo jest bardziej spójna i minimalistyczna niż np. JSowa, to jednak im bardziej w las, tym większe dziwy, które trzeba poznać i zrozumieć. Nie mówiąc już o składni makr... No ale z drugiej strony w każdym języku są dziwy. W megapopularnym TypeScripcie składnia typów też bywa porąbana. A jednak ludzie tego używają
LukeJL
Myślę, że to może bardziej kwestia tego, czy za złożoną/wydziwioną składnią idzie większa moc. Jeśli idzie, to jest to cena, którą można ponieść (w przypadku Rust jak najbardziej). Jeśli jest to tylko dziwactwo jakiegoś języka (np. ObjectiveC), to może niekoniecznie.
jarekr000000
  • Rejestracja:ponad 8 lat
  • Ostatnio:około 21 godzin
  • Lokalizacja:U krasnoludów - pod górą
  • Postów:4707
4

Z mainstreamowych poza Rustem to został Ci tylko Haskell (z godnych uwagi).
Z tym, że jeżeli składnia Rusta Ci przeszkadza, to i Haskell może Ci nie podejść, bo strzelam, że problem jest raczej w "jak coś nie wygląda jak C/C++" to jest nieczytelne. (Java, C#, JS - też się wilicza)

obscurity napisał(a):

No rozumiem to wszystko, niemniej w podstawowym użyciu powinny zachować moim zdaniem zachowanie z innych języków. Czemu nie mogą mieć domyślnie tego #[derive(PartialEq)]?

Bo domyślny equals (i hashCode) to zło znane np. z javy (i nie tylko).

Jeśli wszystkie obiekty mają equals to nic nie powstrzymuje programisty przed wpakowaniem czegoś głupiego do Set czy HashMapy, a potem mamy w najlepszym wypadku słabą wydajnośc, wycieki pamięci, a najgorszym subtelne / trudne do znalezienia bugi w logice. Szczególnie, że domyślność tego equals powoduje, że programiści nawet nie zdają sobie sprawy z istnienia jakiegoś problemu.

Tym niemniej jakaś ergonomia - w stylu, jesli moje obiekty są trywialne, to można domyślnie wygenerować PartialEq (on demand) i dodać tylko ostrzeżenie byłaby w porządku.


jeden i pół terabajta powinno wystarczyć każdemu
edytowany 5x, ostatnio: jarekr000000
SL
Dokładnie, metody dziedziczone z Object to największe zło (poza getClass(), bo to akurat ma sens) Javy i dziwię się, że ktoś to lubi xd
jarekr000000
@slsy nawet getClass może być problematyczne. KIedyś pracowałem w starym kodzie (dużo dziewiczenia), ze starym log4j, gdzie logowanie robione przez Logger.getLogger(getClass()).debug( i człowiek szukał przez godzinę, jak debug może iść z klasy Pochodna z linii 3210, jak ta klasa nawet tylu linii nie ma. (ale to raczej bardzo brzegowy przypadek, nowe loggery chyba są nawet na to odporne).
tefu
3210 to pewnie chodziło o Nokię ;-)
LukeJL
do hashmapy w Rust jest również potrzebny trait Hash: It is required that the keys implement the Eq and Hash traits, although this can frequently be achieved by using #[derive(PartialEq, Eq, Hash)] https://doc.rust-lang.org/std/collections/struct.HashMap.html
Grzyboo
  • Rejestracja:ponad 9 lat
  • Ostatnio:5 miesięcy
  • Postów:206
1

Od 2 lat moim głównym językiem jest kotlin i bardzo sobie cenię. Przyjemnie się pisze, przyjemnie się czyta. Jest relatywnie prosty i jak się zna javę to grzechem jest nie spróbować.

jarekr000000
  • Rejestracja:ponad 8 lat
  • Ostatnio:około 21 godzin
  • Lokalizacja:U krasnoludów - pod górą
  • Postów:4707
7
Grzyboo napisał(a):

Od 2 lat moim głównym językiem jest kotlin i bardzo sobie cenię. Przyjemnie się pisze, przyjemnie się czyta. Jest relatywnie prosty i jak się zna javę to grzechem jest nie spróbować.

Jestem w sumie troche fanboyem kotlina, ale nie uważam, że jest bardzo godny uczenia się.
To taka trochę Scala--, a Scala to taki Haskell po roku na Podlasiu.
Oba Scala i Kotlin są dość praktyczne, (ze względu na biblioteki + jvm), ale nie są po prostu ciekawe (nie są wystarczająco innowacyjne ani eleganckie).
Kotlin ma do tego trochę pecha być za blisko javy, więc łatwo utkwić w jakieś patologii - typu kotlin ze springiem, gdzie niby masz nowoczesny dość funkcyjny język, a kod jest i tak na poziomie visual basica.

Jakkolwiek, jeśli w perspektywie jest java vs kotlin, to nie ma nad czym się zastanawiać.


jeden i pół terabajta powinno wystarczyć każdemu
edytowany 5x, ostatnio: jarekr000000
LukeJL
Jeśli jest taki język jak Kotlin, to czemu nie ma języka Pieslin? 🐈🐕
LukeJL
a jak jest język Scala, to czemu nie ma języka Rozdziela? XD
jarekr000000
No i gdzie jest Doesn'thavekell?
LukeJL
W alternatywnym wszechświecie.
CZ
  • Rejestracja:ponad 8 lat
  • Ostatnio:około 16 godzin
  • Postów:2312
10

C, ale zamiast NULL to wpisuj 0.

jarekr000000
"c peoples" zawsze był z nimi problem
Satanistyczny Awatar
  • Rejestracja:ponad 6 lat
  • Ostatnio:13 dni
  • Postów:704
2

Assembly.

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.