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

Jaki język programowania bez null/nil w 2024?
AN
AN
  • Rejestracja:ponad rok
  • Ostatnio:8 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:dzień
  • 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 9 godzin
  • Lokalizacja:Laska, z Polski
  • Postów:10056
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:prawie 22 lata
  • Ostatnio:dzień
3

Kotlin

elwis
  • Rejestracja:ponad 18 lat
  • Ostatnio:16 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:4 minuty
  • Postów:8409
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 22 godziny
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:16 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 6 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:4 miesiące
  • 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 6 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:dzień
  • Postów:2287
10

C, ale zamiast NULL to wpisuj 0.

jarekr000000
"c peoples" zawsze był z nimi problem
Satanistyczny Awatar
  • Rejestracja:ponad 6 lat
  • Ostatnio:około 15 godzin
  • Postów:699
2

Assembly.

Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)