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.
- Rejestracja:ponad rok
- Ostatnio:8 miesięcy
- Postów:30

- Rejestracja:prawie 2 lata
- Ostatnio:4 miesiące
- Postów:149
Scala, a jeśli jednak aspekty funkcyjne okażą się zbyt hardkorowe, to Kotlin - https://kotlinlang.org/docs/null-safety.html#0

- Rejestracja:prawie 15 lat
- Ostatnio:około 9 godzin
- Lokalizacja:Laska, z Polski
- Postów:10056
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.
x == null
, gdy jest to możliwe

- Rejestracja:ponad 18 lat
- Ostatnio:16 dni
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.

- Rejestracja:około 11 lat
- Ostatnio:4 minuty
- Postów:8409
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ść.

- Rejestracja:około 6 lat
- Ostatnio:około 22 godziny
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.

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?




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ł)

- Rejestracja:ponad 18 lat
- Ostatnio:16 dni
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 kluczowymdyn
. - 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).


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.

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ą


- Rejestracja:ponad 8 lat
- Ostatnio:około 6 godzin
- Lokalizacja:U krasnoludów - pod górą
- Postów:4707
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.
Object
to największe zło (poza getClass()
, bo to akurat ma sens) Javy i dziwię się, że ktoś to lubi xd

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).


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

- Rejestracja:ponad 8 lat
- Ostatnio:około 6 godzin
- Lokalizacja:U krasnoludów - pod górą
- Postów:4707
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ć.



Doesn'thavekell
?

- Rejestracja:ponad 8 lat
- Ostatnio:dzień
- Postów:2287
C, ale zamiast NULL to wpisuj 0.


- Rejestracja:ponad 6 lat
- Ostatnio:około 15 godzin
- Postów:699
Assembly.