Autor Wątek: [Rozkminka] Jakim językiem programowania powinno się traktować początkujących.  (Przeczytany 19765 razy)

Offline Xender

  • Użytkownik

# Marzec 29, 2015, 00:12:40
0. Rozkminiamy w oparciu o konkretne przykłady - np. doświadczenia osobiste.
Każda teza powinna być poparta przykładem, czemu tak, a nie inaczej.
Ta wymiana zdań ma nie być bezowocnym flamem.

1. No więc, macie pod opieką nowicjusza.
Zakładamy, że nowicjusz chce się nauczyć programować.
Zakładamy, że rzeczywiście chce się nauczyć programować, a nie tylko zaliczyć przedmiot na uczelni, który ma w nazwie "programowanie" lub coś w tym stylu.

Jak nakierować takiego nowicjusza na dobry tor, żeby uczył się najbardziej efektywnie i najszybciej stał się dobrym programistą?

2. O co mi chodzi?
Bardzo często powtarzanym argumentem jest, iż jako pierwszy język do nauki programowania dobre jest coś wysokopoziomowego, np. Python, JavaScript.
Ale czy rzeczywiście?
Wiadomo, jaka jest przewaga np. Pythona nad C++ - REPL, śliczne komunikaty błędów, debugger który jest zarazem łatwy w obsłudze i potężny.

To wszystko brzmi świetnie i logicznie, ale zawsze, gdy powtarzam ten argument, mam jeden problem - nie mam żadnego potwierdzenia, że to rzeczywiście dobry sposób.
Jest tak dlatego, iż sam Pythona cenię sobie wysoko, ale wychowałem się na C++ - języku miejscami programiście wrogim, ciężkim - ale może taka zaprawa bojowa niekoniecznie jest zła?

Czy przejście GC -> ręczne zarządzanie pamięcią/RAII jest łatwiejsze/trudniejsze, niż nauczenie się ręcznego zarządzania/RAII od samego początku?
To samo pytanie o heterogeniczne kontenery. Dla mnie to killer feature języków skryptowych.
To samo o ducktyping -> interfejsy/templatki vs. 0 -> interfejsy/templatki.

Często powtarza się, iż wskaźniki to temat, który początkującym programistom C/C++ sprawia najwięcej problemów.
Szczerze, to nie pamiętam, czy miałem z nimi kiedykolwiek problem. Może tak, może nie. Zamierzchłe czasy.
Czy trudniej nauczyć się pointerów, ucząc się C/C++ najpierw, czy znając wcześniej jakiś inny język?


Tak jak napisałem w 0. - proszę, aby odpowiedzi na te pytania wynikały z konkretnych przykładów z życia.
Proszę o nie udzielanie odpowiedzi "na czuja/logikę/zdrowy rozsądek/chłopski rozum".
Za to rozwijanie tych pytań lub szukanie implikacji jak najbardziej ok.

Dziękuję i pozdrawiam.

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline Krzysiek K.

  • Redaktor
    • DevKK.net

  • +5
# Marzec 29, 2015, 00:38:34
Cytuj
Często powtarza się, iż wskaźniki to temat, który początkującym programistom C/C++ sprawia najwięcej problemów.
Od wskaźników nie uciekniesz. Co najwyżej nazwiesz je referencjami i schowasz pod maską, ale sama koncepcja pozostaje bez zmian.


Co do oryginalnego dylematu - przede wszystkim nowicjuszowi dobrze dać coś na zajawkę. Jakąś _prostą_ bibliotekę graficzną w której mógłby narysować i animować bitmapę, silnik Unity do wyklikania i oskryptowania w C#, czy nawet żółwia z Logo. Ważne by było coś na zajawkę.

Offline BrunonDEV

  • Użytkownik
    • Construgia -- RPG

# Marzec 29, 2015, 12:00:52
Cytuj
Co do oryginalnego dylematu - przede wszystkim nowicjuszowi dobrze dać coś na zajawkę. Jakąś _prostą_ bibliotekę graficzną w której mógłby narysować i animować bitmapę, silnik Unity do wyklikania i oskryptowania w C#, czy nawet żółwia z Logo. Ważne by było coś na zajawkę.

Żółwia z Logo to ja mam teraz w szkole (i do tego po polsku!), i zdecydowanie nie polecam. :P

Ja zaczynałem od nijakiego Basic 256, przy którym siedziałem jakiś rok, robiąc przykłady z "książki" (wydrukowanego zestawu ćwiczeń z Internetu) i pisząc własne "programy".

Jednakże tamtych "programów" nie da się nawet skompilować, więc szybko mi się to znudziło, nie czułem satysfakcji. Może warto jeszcze wspomnieć; miałem wtedy 7 lat. :P

Cytuj
ale wychowałem się na C++ - języku miejscami programiście wrogim, ciężkim - ale może taka zaprawa bojowa niekoniecznie jest zła?

Mi nigdy nie był, i nadal nie jest "wrogi". A może tylko mi się tak zdaje? ;)

Cytuj
silnik Unity do wyklikania i oskryptowania w C#

Ja na początek Unity nie polecam; sam zaczynałem od niego zaraz po wyżej wspomnianym Basic'u 256 i na nim niemalże wg. mnie nie da się nauczyć dobrze programować bez znajomości jakiegoś "normalnego" języka programowania. ;)

-BD.


Offline P@tyS

  • Użytkownik
    • Patys coding

  • +2
# Marzec 29, 2015, 12:26:26
Ja zacząłem w gimnazjum od pascala. Dosyć łatwo i przyjemnie było zrozumieć co się dzieje, co prawda dużo pisania, ale za to wiadomo o co chodzi: aha tu begin tam end, writeln nam pisze i przechodzi do następniej linii. Wszystko w miarę zrozumiałe i opisowe. Niestety teraz prawie nic nie widzę żeby ktoś, coś robił w pascalu.

Zaczynanie od C++ może być w sumie na początku cieżkie, tu robimy include, musimy napisac using namespace std albo pisać przy każdym cout/cin (później się dowiesz dlaczego), następnie strumień wejścia, który nam coś wczyta itd. Niestety tu dużo gorzej niż w pascalu, masa rzeczy z którymi nie wiadomo co zrobić i dlaczego.

Tak wyglądał mój początek: najpierw pascal, później c++ i dla mnie to się sprawdziło.

Obecnie javascript jest moim drugim językiem i w sumie nie jest zły, ale (ktoś to uzna za +/-) typy nie są do końca jawne, zwykłe var wg. mnie nie jest dobre na początek jak się nie zna większości typów. Dodatkowo funckje jako argument funkcji może też mieszać. Ogólnie na początek nie jest źle jak ma się kogoś kto dokładnie wytłumaczy.

Cytuj
silnik Unity do wyklikania i oskryptowania w C#
Unity mi nie przypadło do gustu. Poza tym programowanie w takim silniku może pominąć część podstaw. Później będzie się zastanawiał jak zacząć pisać w innym języku, jak w unity miał wszystko rozdrobnione na poszczególne obiekty w grze. Również dla mnie było chaotyczne. Może wynikało to ze słabej znajomości C#, ale po prostu na początek było wszystkiego za dużo naraz.

Offline Dab

  • Redaktor
    • blog

  • +5
# Marzec 29, 2015, 12:36:40
IMO cechy języka jako takie nie mają absolutnie znaczenia. Tak, ktoś kto zaczynał od C++ pewnie będzie lepiej obeznany z zarządzaniem pamięcią, ale nie będzie miał żadnego pojęcia o programowaniu obiektowym. Jeżeli ktoś zacznie od Ruby - na odwrót.

Natomiast to co jest istotne, szczególnie na początku, to możliwość stworzenia czegoś działającego. Czyli na przykład:
1. Jak trudno jest stworzyć jakiś przydatny skrypt, który wykonuje operacje na plikach?
2. Jak trudno jest stworzyć małą okienkową aplikację która pokazuje jakieś dane ściągnięte z sieci?
3. Jak trudno jest stworzyć prostą aplikację webową która pozwala zarządzać danymi?
4. Jak trudno jest stworzyć małą grę 2D/3D?

W żadnym z tych przypadków nie powinno mieć absolutnie żadnego znaczenia czy użyte będą wskaźniki, referencje, klasy czy szablony. Istotny jest efekt i to jak łatwo/trudno go osiągnąć.

W C++ (szczególnie przed C++11) w zasadzie każde z powyższych to droga przez mękę.

1. Potrzebna jest obługa filesystemu (lista plików w katalogu) i regexpy. Ups.
2. MFC? Qt? gtk? Każde to gigantyczna biblioteka z zupełnie niestandardowym (z punktu widzenia "standardowego C++") interfejsem.
3. Uhh. Nawet nie wiem gdzie zacząć. :)
4. Na Warsztacie mamy już jakieś 300 tematów o wczytywaniu tekstur w SFML (z naciskiem na FML), czekamy na Twój!

Powyższe są za to proste w innych (przykładowych) technologiach:
1. Ruby - FileUtils, regexp to bazowe elementy środowiska. Łatwo dostępne pakiety (gemy) wraz z wersjonowaniem.
2. C# - okienko można wyklikać i bez większych komplikacji dołożyć logikę.
3. PHP - nie dość że można prosto napisać aplikację, to jeszcze absolutnie każdy serwer przyjmie ją do publicznego hostowania.
4. Unity.

Plus, w przypadku C++:
1. Brak (praktycznej) standaryzacji. Robiąc projekt z zewnętrznymi zależnościami jest duża szansa na to że będziesz miał 3 klasy wektorów, 5 klas tablic i 8 odmian float4. Każda z innym formatowaniemKodu, bo_przecież C==NiczegoNieNarzuca.
2. Brak zarządzania zależnościami. Potrzebujesz zewnętrznych bibliotek? Masz problem. Potrzebujesz zewnętrznych bibliotek + chcesz mieć multiplatformowy projekt? Jeszcze gorzej.
3. Multum środowisk i kompilatorów.

Dlatego, jeszcze raz: szczególnie na początku skupiłbym się na efektach a nie znajomości języka jako takiego.
Jeżeli porzuci się z oczu klapki marki C++, można zdziwić się jak _wiele_ rzeczy jest w tym momencie niepotrzebnych. Zamiast wkuwać 4 rodzaje współdzielonych wskaźników (ba, 4 rodzaje pętli!) można w tym czasie napisać skrypt pobierający najnowsze tweety o Taylor Swift.

Źródło: dwa miliony tematów na Warsztacie i reszcie Internetu, w których adepci programowania męczą się z rzucanymi im pod nogi kłodami, takimi jak: błędy kompilatora, błędy linkera, niekompatybilność bibliotek, brak bibliotek, konfiguracja kompilatora, konfiguracja IDE, konfiguracja debuggera, niedziałający debugger, i wiele innych.

Offline ArekBal

  • Użytkownik

# Marzec 29, 2015, 13:00:35
Cytuj
Czy przejście GC -> ręczne zarządzanie pamięcią/RAII jest łatwiejsze/trudniejsze, niż nauczenie się ręcznego zarządzania/RAII od samego początku?
Nie z dnia na dzień Rzym zbudowano. Tak jak KK(czy Dab) pisze. Potrzeba nauki dodatkowych koncepcji przed osiągnięciem rezultatu utrudnia postęp. Podobnie jak niektóre komunikaty błędów i problemy z includeami, templatkami, dziedziczeniem, inicjalizacją w c++ początkującego położą na podłodze.

Cytuj
To samo pytanie o heterogeniczne kontenery. Dla mnie to killer feature języków skryptowych.
To samo o ducktyping -> interfejsy/templatki vs. 0 -> interfejsy/templatki.
heterogeniczne kontenery? Czy chodzi ci o tuple? Żaden to killer feature bez statycznego typowania(tak jak typy anonimowe).
Chciałem się odnieść do ducktypingu, ale w temacie nie o to przecież chodzi...

Uważam że statyczne typowanie będzieeee duuuużo lepsze od dynamicznego dla początkującego. Dlatego, mimo iż Javascript pomógłby noobowi zrobić na swojej pierwszej stronce kilka fajnych rzeczy, uważam że do nauki lepszy będzie C#, Java, Scala.

Cytuj
Często powtarza się, iż wskaźniki to temat, który początkującym programistom C/C++ sprawia najwięcej problemów.
Wskaźniki to najtrudniejszy concept w C.
C++ ma trylion innych bardziej skomplikowanych "featurów".

Podsumowując... Pascal był baaardzo dobrym językiem do nauki. C w wersji lite jest bardzo dobrym językiem do nauki. C++ nie jest dobrym językiem na początek.

Z tym Unity dla początkujących... No tu jest problem, bo tworzenia gier ktoś się nauczy szybko... ale podobnie z Unrealem i blueprintami. Ale jako nauka programowania to nie bardzo, bo na starcie się noobka znajdzie w takiej bańce abstrakcji z której ciężko będzie jej nos wychylić. A z drugiej strony, jak ktoś taki jak ja już jest pokaleczony w C#, potem widzi co i jak kaleczy Unity, to serce boli.
Łatwiej żyć w krainie fantazji i myśleć że Unity, czy Unreal to najlepiej zrobione silniki pod słońcem.
« Ostatnia zmiana: Marzec 29, 2015, 13:04:24 wysłana przez ArekBal »

Offline Kos

  • Użytkownik
    • kos.gd

  • +2
# Marzec 29, 2015, 13:06:14
Od wskaźników nie uciekniesz. Co najwyżej nazwiesz je referencjami i schowasz pod maską, ale sama koncepcja pozostaje bez zmian.

Veto! I to nawet pomijając arytmetykę na wskaźnikach.

Referencje (te Javowe lub Pythonowe) wskazują na obiekt, który gdzieś sobie jest. Wskaźniki mogą wskazywać na obiekt, na część obiektu (jedno z jego pól), na zmienną lokalną funkcji (potencjalnie parę ramek wyżej). Wskaźniki mogą wskazywać na wskaźniki. Potencjalny mindfuck znacznie większy niż z referencjami.

Do tego dorzuć poryte tablice z C i C++ i to jak "magicznie zamieniają się" we wskaźniki gdy np. podajesz je do funkcji. Bonus points jeżeli wytłumaczysz to adeptowi C bez używania pojęcia "lvalue-rvalue conversion". Miłej zabawy!
« Ostatnia zmiana: Marzec 29, 2015, 13:12:56 wysłana przez Kos »

Offline Krzysiek K.

  • Redaktor
    • DevKK.net

  • +3
# Marzec 29, 2015, 13:18:10
Cytuj
Ja zaczynałem od nijakiego Basic 256, przy którym siedziałem jakiś rok, robiąc przykłady z "książki" (wydrukowanego zestawu ćwiczeń z Internetu) i pisząc własne "programy".
Ech... w moich początkach to nie dość, że Internetu nie było, to jeszcze BASIC rozkminiałem na platformie z 1/4 podanej przez Ciebie wartości w nazwie. No i te zapisywanie na kasetach... :)

Cytuj
W C++ (szczególnie przed C++11) w zasadzie każde z powyższych to droga przez mękę.
C++11 dodaje jedynie parę featurów, które przykrywają parę niedogodności jak piszesz w napompowanym OOPie, RAII i takie tam. Moim zdaniem poza "auto" to żaden feature dodany w C++11 nie jest przydatny początkującemu.

Poza tym wszystkie cztery punkty rozbijają się o biblioteki, nie język. Jakiś czas temu uczyłem podstaw programowania w C++ znajomego z użyciem biblioteki Allegro (wersja jeszcze 4.x), szło to perfekcyjnie i w jeden wieczór kolejnymi przykładami do prostej gierki, więc się da.

Cytuj
Obecnie javascript jest moim drugim językiem i w sumie nie jest zły
Zależy do czego. Do pisania gier, czy jakichkolwiek rzeczy w których kod jest najeżony wektorami 2- i 3-wymiarowymi javascript jest co najmniej niewygodny. Chyba że jest już jakiś sposób, żeby owe wektory trzymać przez wartość i żeby działały na nich podstawowe operatory.

Cytuj
heterogeniczne kontenery? Czy chodzi ci o tuple? Żaden to killer feature bez statycznego typowania(tak jak typy anonimowe).
Właśnie. Jedną z potęg C++ jest statyczne typowanie, nie mówiąc już wiele o samej kompilacji przed uruchomieniem. 90% błędów jakie machnąłem kiedykolwiek pisząc w językach skryptowych w C++ było by wykrytych na etapie kompilacji.

Cytuj
Wskaźniki to najtrudniejszy concept w C.
C++ ma trylion innych bardziej skomplikowanych "featurów".
Dlatego w C++ nie zapuszczajmy się zbyt głęboko, bo obudzimy przedwieczne zuo... ;) Przy C++ narosło zdecydowanie za dużo koncepcji o jedynym słusznym stylu programowania w C++, ale osobiście to ja tego nie kupuję.

Cytuj
C w wersji lite jest bardzo dobrym językiem do nauki. C++ nie jest dobrym językiem na początek.
Jeśli C jest dobrym językiem na początek, to C++ będzie o dwa plusy lepszym. Ot, chociażby na samym starcie masz dla początkującego cin/cout zamiast printf/scanf, które to nie dość że są błędogenne, to same z siebie wymuszają chociaż liźnięcie tematu wskaźników. Podobnie jak później pominiesz milczeniem new/delete przechodząc od razu do std::vector, to możesz tak ustawić początkującego, że parę gier napisze o wskaźnikach nawet nie wiedząc.

Arduino jest tutaj eleganckim przykładem, że jest to wykonalne. Na tym chyba już miliony osób nauczyły się programować (włączając w tu wujka mojej małżonki), a jest to C++. Tyle że z podłożona taka biblioteką i oskryptowaniem, żeby całość była maksymalnie przyjazna dla użytkownika.

Cytuj
Do tego dorzuć poryte tablice z C i C++ i to jak "magicznie zamieniają się" we wskaźniki gdy np. podajesz je do funkcji. Bonus points jeżeli wytłumaczysz to adeptowi C bez używania pojęcia "lvalue-rvalue conversion". Miłej zabawy!
A gdzie można odebrać punkty? Bo już takie rzeczy tłumaczyłem bez zagłębiania się w pojęcia i problemu nie było. :)

Offline ArekBal

  • Użytkownik

# Marzec 29, 2015, 13:33:54
Cytuj
90% błędów jakie machnąłem kiedykolwiek pisząc w językach skryptowych w C++ było by wykrytych na etapie kompilacji.
Na prezentacji google widziałem że w ich projektach c++ mieli ok 55% vs ok 85% w pythonie pokryte testami. Python może nie jest najgorszy pod względem typowania(php był tuż za pythonem)... w każdym razie z wykresu wynikało że duża część testów jednostkowych to sprawdzanie typów...

Cytuj
Zależy do czego. Do pisania gier, czy jakichkolwiek rzeczy w których kod jest najeżony wektorami 2- i 3-wymiarowymi javascript jest co najmniej niewygodny. Chyba że jest już jakiś sposób, żeby owe wektory trzymać przez wartość i żeby działały na nich podstawowe operatory.
Może nie przez wartość... i nie podstawowe operatory...
http://threejs.org/docs/api/math/Vector3.html
...używanie podstawowych operatorów na wektorach jest i tak złą praktyką. No chyba że masz na myśli funkcje dot, cross itp...

Mamy też w JS ArrayBuffer który pozwoli ci zaspokoić hackerskie skłonności.
« Ostatnia zmiana: Marzec 29, 2015, 13:40:36 wysłana przez ArekBal »

Offline Krzysiek K.

  • Redaktor
    • DevKK.net

# Marzec 29, 2015, 13:56:16
Cytuj
Na prezentacji google widziałem że w ich projektach c++ mieli ok 55% vs ok 85% w pythonie pokryte testami.
Co jest statystyką kompletnie oderwaną od rzeczywistości na tym forum, gdzie pokrycie testami czegokolwiek co się tu pisze wynosi około 0%.

Cytuj
Może nie przez wartość... i nie podstawowe operatory...
Nie sądzisz, że napisałem "żeby owe wektory trzymać przez wartość i żeby działały na nich podstawowe operatory" może dlatego, że chodziło mi konkretnie o te dwie rzeczy które są niezbędne do pisania matmy geometrycznej chociaż minimalnie przypominającego wygodę? A to co Ty proponujesz nie ma z tym nic wspólnego.

Cytuj
...używanie podstawowych operatorów na wektorach jest i tak złą praktyką. No chyba że masz na myśli funkcje dot, cross itp...
Jeszcze niżej. Mam na myśli plus, minus i mnożenie. Czyli kompletne podstawy. Tym bardziej dziwi, że nie udało mi się dotąd znaleźć języka skryptowego, który by to wspierał.

Cytuj
Mamy też w JS ArrayBuffer który pozwoli ci zaspokoić hackerskie skłonności.
Spokojnie, spokojnie. Hackerstwo na bok, podstawy najpierw.

Ja po prostu bym chciał móc napisać w języku skryptowym:
velocity += vec3(0,0,-9.81) * delta;
position += velocity * delta;
i byłbym bardziej niż happy.

Oczywiście wszystko przez wartość, co by poniższe:
missile.position = player.position;nie powodowało wystrzelenia gracza razem z pociskiem. :)

Czy to aż tak wysokie wymagania, żebym musiał pisać własny język skryptowy?

Offline bies

  • Użytkownik

  • +1
# Marzec 29, 2015, 13:58:50
Dwie a może i ze trzy refleksje:
1. Stanford uczy w uproszczonej wersji JavaScript -> https://lagunita.stanford.edu/courses/Engineering/CS101/Summer2014/about. Wykłady ze Stanfordu (Stanforda?) są zazwyczaj bardzo dobre (przerobiłem kilka i nie spotkałem badziewia jakie jest nagminne na polskich uczelniach). Inna sprawa, że CS101 nie przeglądałem.

2. Khan Academy takoż -> https://www.khanacademy.org/computing/computer-programming. Wygląda dość sensownie ponieważ nastawione jest na pisz kawałek -> zobacz -> pisz -> zobacz. Czyli taki wizualny REPL.

3. O wiele ważniejszą koncepcją niż wskaźniki są first-class functions i lambdy. I nie chodzi mi tu o podejście funkcyjne (absolutnie nie, podejście funkcyjne jest o wiele trudniejsze na początku) ale o zrozumienie, że funkcja to taki sam typ jak np. liczba czy napis.

Konkludując, wybrałbym JS na początek a później Pythona / C++ (C++11 lub C++14, wcześniejszej wersji nie warto) jako że te dwa języki dobrze opanowane dają mindset do nauki wszystkiego (może poza Haskellem). Z zabawnych historii pokazywałem zespołowi (głównie Java i okolice) jak zrobić RAII za pomocą lambd w Xtend -> tylko im się oczka ze zdziwienia otwierały, że nie trzeba robić wszędzie finally.

Skąd przemyślenia: od 10 lat już kieruje zespołem programistów i staram się ich czegoś uczyć od czasu do czasu. Od 10 lat również prowadzę kursy z programowania (również od zera) na platformie SAP w SAP Traning Center i trochę ludzi już nauczyłem.
« Ostatnia zmiana: Marzec 29, 2015, 14:01:51 wysłana przez bies »

Offline głos

  • Użytkownik

# Marzec 29, 2015, 14:14:19
1. No więc, macie pod opieką nowicjusza.

wszystko rozchodzi się co rozumiesz pod pojęciem "nowicjusz".
Z mojego doświadczenia mogę powiedzieć, że wysokopoziomowy język programowania od którego zaczynasz nie ma znaczenia i dyskusja nad tym czy basic, pascal, C, C++, java, pyton jest na początek lepszy nie ma sensu. Ma to znaczenie wyłącznie przy niedouczonym ludku.

Po prostu naukę zawsze zaczynasz od architektury komputera i jezyka assembler. Wtedy uzyskasz "wymiatacza" bo on rozumie co robi. Nie operuje pojęciem "wskażnik" jak papuga powtarzająca coś czego nie rozumie.

Offline ArekBal

  • Użytkownik

# Marzec 29, 2015, 14:38:01
Cytuj
funkcja to taki sam typ jak np. liczba czy napis.
yyyy, nie. funkcja to taki sam obiekt jak obiekt("{}"). Typów podstawowych w to nie mieszaj. ;)

Wciśnij F12 i spróbuj w konsoli.
var x = 7
x.dada = function() { return 3 }
console.write(x.dada().toString())
Cytuj
x.dada is not a function
http://en.wikipedia.org/wiki/First-class_function
W praktyce wystarczy możliwość przekazywania referencji, wskaźnika, uchwytu na funkcję jako argument by można było mówić że język to obsługuje. Ale w praktyce do programowania funkcyjnego przydają się:
- apply/bind,
- funkcje anonimowe/lambdy,
- domknięcia,
- "tail-call",
- "list comprehension"
- monady jak typ wbudowany
« Ostatnia zmiana: Marzec 29, 2015, 14:40:24 wysłana przez ArekBal »

Offline bies

  • Użytkownik

# Marzec 29, 2015, 14:52:02
yyyy, nie. funkcja to taki sam obiekt jak obiekt("{}"). Typów podstawowych w to nie mieszaj. ;)
Javascriptizm -- tu masz inny język (zagadka, jaki)
> x <- 10
> y <- function(input) {input * 2}
> print(x)
[1] 10
> print(y)
function(input) {input * 2}
Chodziło mi o koncepcję a nie implementację w konkretnym języku.

Albo inny kod (język ten sam), lepiej obrazuje co chcesz zrobić w JS:
> x <- 10
> x$fun <- function(i) {i * 10}
Warning message:
In x$fun <- function(i) { : Coercing LHS to a list
> x
[[1]]
[1] 10

$fun
function (i)
{
    i * 10
}

// edit
Wszystko co wymieniasz do programowania funkcyjnego jest jak najbardziej przydatne. Ale nie uczyłbym programowania funkcyjnego osoby początkującej bo jest po prostu za trudne. Natomiast kod:
val button = new Button()
button.onClick = [MessageBox.showMessage("button.onClick executed")]
To co innego (tam, pomiędzy [] masz lambdę).
« Ostatnia zmiana: Marzec 29, 2015, 15:08:01 wysłana przez bies »

Offline Xender

  • Użytkownik

  • +2
# Marzec 29, 2015, 15:44:27
heterogeniczne kontenery? Czy chodzi ci o tuple? Żaden to killer feature bez statycznego typowania(tak jak typy anonimowe).
Chciałem się odnieść do ducktypingu, ale w temacie nie o to przecież chodzi...

Uważam że statyczne typowanie będzieeee duuuużo lepsze od dynamicznego dla początkującego. Dlatego, mimo iż Javascript pomógłby noobowi zrobić na swojej pierwszej stronce kilka fajnych rzeczy, uważam że do nauki lepszy będzie C#, Java, Scala.
Mieszasz 2 osobne cechy systemów typowania:
Rozróżnienia:
Statyczne (sprawdzane w czasie kompilacji) - dynamiczne (sprawdzane w runtime).
Silne (konwersja z longa na inta rzuca warning/błąd, bo możesz utracić informację) - słabe (dzikie konwersje całkowicie implicite - patrz: to, co robią operatory porównania w Javascript albo PHP).

Uważam, że słabe typowanie to zawsze słaby pomysł, bo prowadzi do sytuacji, które są nieintuicyjne - łamie zasadę, mówiącą, że zaskoczenie spowodowane różnicą w faktycznym działaniu mechanizmu, a typowymi założeniami kogoś, kto tej zasady dokładnie nie zna, powinno być jak najmniejsze.
To nie ma związku z tym, czy język jest odpowiedni dla początkującego, czy nie - dla to jest po prostu jedna z miar mówiąca, czy język jest dobry, czy nadaje się dla kogokolwiek.

Rzuć okiem na Pythona.
Tamtejszy system typowania jest całkiem silny - ok, natywne inty, biginty i floaty czasem się mieszają (natywny int może zostać implicite promowany do biginta; w Py3 wyniku int/int można dostać floata (ale int//int implementuje znane z C dzielenie z resztą).
Ale poza numerami, nie ma dzikich castów - z inta na string, z obiektu na string etc. np. przy porównywaniu.
Jeśli coś może pełnić rolę predykatu - "konwertuje się na boola", to niekoniecznie konwertuje się na inta (choć bool sam na inta się konwertuje - ale implicite konwersje nie łączą się w łańcuch, i bardzo dobrze).

Np. if jakaś_lista: sprawdzi, czy jakaś_lista nie jest pusta, ale int(jakaś_lista) rzuci TypeError.


To o co chodziło mi z kontenerami?
W C++ nie możesz trzymać w jednym vectorze obiektów różnych klas, nawet pochodnych z tej samej bazy.
Boost ma na to kontener, ale Boost to jednak dodatkowa libka.

W Pythonie możesz trzymać dowolne obiekty dowolnych typów w liście.
« Ostatnia zmiana: Marzec 29, 2015, 15:46:51 wysłana przez Xender »