Wpis z mikrobloga

Ostatnio gdzieś trafiłem na opinię (chyba nawet na mirko):

Nie rozumiem, czemu wszyscy się tak jarają Go czy innymi nowymi językami,

skoro nisza jest już zajęta. Nie ma takiej rzeczy jakiej C++ nie zaimplementuje

w kolejnej wersji standardu.


Słowa mogą byś trochę inne, bo piszę z pamięci.

W związku z tym postanowiłem zrobić porównanie między #jezykc, #cplusplus, #go
i #rustlang.

Wołam jeszcze #programowanie, bo inni mogą też być zainteresowani.

0 - https://en.wikipedia.org/wiki/Hindley%E2%80%93Milner_type_system
1 - pozwala na automatyczne rzutowanie między typami numerycznymi, i.e. char ↔ int
2 - można symulować przy pomocy interface{}, ale wtedy tracimy kontrolę nad typami
3 - podobne jak w Lispie, przykładowo err!(a -> b) może być interpretowane jako:

match a {
Err(_) => b,
_ => ()
}

4 - http://www.cs.rit.edu/~ats/books/ooc.pdf
5 - wielodziedziczenie
6 - poprzez klasy wirtualne
7 - zamiast tego jest typ Optional
8 - może być metoda o tej samej nazwie, ale musi być zaimplementowana dla różnych
traitsów (interfejsów w Ruscie)
9 - GCC pozwala na VLA poprzez rozszerzenia kompilatora

PS
Jak czegoś brakuje lub jest niejasne to dać znać. Uściślę.
Pobierz
źródło: comment_RUfc3dgtOJczYBlwsrFNdD5iUWEm90XO.jpg
  • 23
@Hauleth: Interfejsy - cała biblioteka standardowa to jedno wielkie uƶycie duck-typingu, np. wszystkie algorytmy oczekują iteratorów o konkretnym zachowaniu, bez wspólnej klasy bazowej, tak więc [6] jest tylko w połowie prawdziwe.

cpp11 wprowadził interfejs do GC, ale nie widziałem tego w uƶyciu ;)

VLA nie ma w STL w potocznym rozumieniu (miało być w cpp14), raczej daj X i [9] z rozszerzeniem kompilatora/kontenerami

Propsy za uwzględnienie D!

@Ginden: Za 2
@sylwke3100: async jest słabe w cpp 11/14, spodziewałbym się, ƶe w 17 będzie deprecated albo zostanie zmienione (teraz zwraca unikalny typ std::future na skalę biblioteki standardowej, który pomimo tego, ƶe jest tego samego typu co utworzone przez Ciebie std::future nie pozwala na skasowanie jak wątek działa), poza tym chyba @Ginden mówił o słowach kluczowych na modłę C#.
@KrzaQ2: Ma C++ ma interfejsy w klasycznym tego słowa znaczeniu, ale ciężko by STL go używał (w końcu to sugeruje już nazwa).

Co do uwzględnienia D to siedziałem w nim jeszcze za czasów 1.0 i wojny Tango vs Phobos, więc trochę historii znam :D Ostatnio mniej siedziałem, bo zająłem się głównie web devem
@KrzaQ2: Mnie to nie boli, bo ostatnio głównie #rustlang. Co do tematu to tabela miała zawierać porównanie języków, a nie implementacji różnych części języka (zwłaszcza biblioteki standardowej). Porównywałem funkcjonalności 1:1 więc trzeba przyznać, że C++ ma interfejsy, to że są ułomne to już inna sprawa. Nawet z szablonami jest problem, bo jak podasz coś co nie jest iteratorem to miłego szukania w logu z GCC (chyba, że już to poprawili).
Co do tematu to tabela miała zawierać porównanie języków, a nie implementacji różnych części języka (zwłaszcza biblioteki standardowej).


@Hauleth: spoko, chodziło mi o to, ƶe [6] określa metody wirtualne jako implementację polimorfizmu, a to tylko połowa prawdy (+podałem przykład - stdlib)

Nawet z szablonami jest problem, bo jak podasz coś co nie jest iteratorem to miłego szukania w logu z GCC

Koncepty powoli wchodzą, więc będzie lepiej (poza tym, tutaj to
@KrzaQ2: Dla tego używam clanga jako głównego kompilatora na moim Ubunciaku. Co nie zmienia faktu, że C++ dziwnym językiem jest, i im szybciej odejdzie do lamusa tym więcej osób będzie zdrowych psychicznie.
@Hauleth: Meh, wolałbym aby go poprawili (idzie im to całkiem sprawnie), niƶ odrzucili. W ruście nie podoba mi się syntax :/ (co innego D, to taki C++ done right pod tym względem)
@KrzaQ2: zwłaszcza z referencjami do r-wartości. Ogólnie tam się robi dość ostry #!$%@? z różnymi krzaczkami, tak, że powoli więcej jest non-alnum niż reszty, ale może to moje osobiste zdanie.

D sobie nagrabił początkowym podziałem na Tango vs Phobos. Aktualnie jest trochę w tyle, bo są nowe języki, które mają podobne zadanie, a oferują wiele więcej (jak np. HMTS w Ruscie). A co Ci się nie podoba w składni? Bo zaciekawiłeś
HMTS


@Hauleth: Co to? Google nie jest zbyt pomocne.

Jeśli chodzi o syntax - typ zmiennej po prawej stronie. Nie mogę na to patrzeć, to jest gorsze niƶ deklarowanie tablic od środka w C/C++ czy [(a,b) for a in y for b in z if foo] w pythonie
@KrzaQ2: Hindley-Milner Type System - przy okazji rozwiązuje on Twój problem z typem zmiennej po prawej, nie musisz wcale podawać typu (poza szczególnymi przypadkami). Chyba, że chodzi Ci o deklaracje funkcji, tam ciężko to obejść, ale IMHO jest to dobre rozwiązanie, dlaczego? fn(i32, i32) -> i32 jest matematycznym zapisem funkcji ZxZ -> Z. Co do argumentów, to też nie jest to specjalnie uciążliwe jak się pomyśli, że to upraszcza składnię,
@Hauleth: deklaracje funkcji jeszcze bym zrozumiał, mam na myśli int foofoo: int. O ile to jeszcze byłoby ok, to int bar = 42 jest zdecydowanie lepsze od bar: int = 42