Stwórz profil

Musisz wpisać swoje imię
Musisz wpisać swoje nazwisko
Musisz wpisać poprawny e-mail
Musisz wpisać hasło (min. 8 znaków)
Musisz zaakceptować regulamin

Stanisław P. Software designer

Temat: Jakie są wady i zalety dynamicznego typowania w językach...

Czy o tym już nie powiedziano wszystkiego? Znowu się sprowadza do porównywania "języki takie jak C i Java są dużo szybsze od Pythona i Rubiego"... meh. Jeśli ktoś jest zainteresowany rzeczywistą dyskusją to LtU, czy nawet Wikipedia mają porządne porównania. Paul Graham pisał też o lispie (http://www.paulgraham.com/avg.html i inne) jeśli chodzi o punkt "o ile są narzędzami włożonymi w ręce zdolnych ludzi, pozwalają na bezprecedensową produktywność." Norvig wspomniał o klasycznie zdesignowanych systemach / popularnych patternach w http://norvig.com/design-patterns/ gdzie większość przykładów sprowadza się do jednej linii, albo zupełnie nie są potrzebne...

Są jakieś nowe interesujące rzeczy w tym temacie?
10.06.2011, 01:53

Piotr L. IT - projekt &
implementacje

Temat: Jakie są wady i zalety dynamicznego typowania w językach...

Sebastian Zontek:
Ciekawe odpowiedzi na to pytanie znajdziecie pod adresem:

http://wisdio.com/pl/Jakie-sa-wady-i-zalety-dynamiczne....

A co Wy myślicie na ten temat?

Odpowiem tutaj:
- materiał bardzo ogólnikowy, tezy chybione lub nieprawdziwe

A konkretnie:
Łatwość programowania: dynamiczne typowanie pozwala programiście nie przejmować się jeszcze jednym detalem przy pisaniu kodu i skupić się na ważniejszych aspektach (takich jak logiczna poprawność kodu). Tym samym może nawet przyczynić się do zmniejszenia ilości popełnianych błedów.

- w językach tego typu nie chodzi o łatwość a szybkość programowania (łatwo się programuje np. w Logo, ale nie jest to język efektywny ;-) )
- to że zmienne są dynamicznie typowane nie przyczynia się do mniejszej liczby błędów
- jest raczej odwrotnie - większość błędów wychwytywanych w czasie kompilacji tylko przeszkadza, nie są faktycznymi błędami (bo liczba jest liczbą), a wynikają tylko ze statycznego typowania
- skąd się ta teza wzięła? prawdopodobnie z tego że w językach typowanych dynamicznie pisze się przyjemniej więc środowisko mniej stresujące, więc koniec końców popełniamy mniej błędów

Wsparcie dla "duck typing": dzięki luźniejszemu podejściu do interfejsów i struktur danych API często są potężniejsze, a sam kod łatwiejszy w refaktoringu.
- co to znaczy "potężniejsze"?? ;-)

Gorsza wydajność: w przypadku języków statycznych kompilator może wykorzystać wiedzę o typach do przeprowadzenia szerokiej gamy optymizacji. Brak dynamicznego typowania jest prawdopodobnie podstawowym powodem, dla którego języki takie jak C i Java są dużo szybsze od Pythona i Rubiego. Zaawansowane kompilatory dla języków dynamicznych ("tracing JIT", np. V8 lub PyPy) potrafią dokonywać optymizacji typowych dla języków statycznych, jednak narzut związany ze "śledzeniem" typów wciąz pozostaje.

- (?!#), częściowa nieprawda lub ogólnienie.

Proponuję trochę się zainteresować tematami typu Psyco, Matplotlib, NumPy i zapytać siebie samego, dlaczego Python używany jest w matematyce.

Owszem, goły język jest wolniejszy, ale od czego są moduły (napisane zresztą np. w C - patrz Boost.Python lub w Free Pascalu) dostępne są też kompilatory typu psyco.
Różnica w wydajności jest, ale zaniedbywalna.
Podobnie współczesny świat opiera się (w większości) na SQL-u a nie na programach w C grzebiących po plikach...

Nie można porównywać wydajności C i Pythona, bo ten drugi, w krytycznych sekcjach ma prostą możliwość wykorzystania tego pierwszego.
Tak jak C i wstawki assemblerowe, tak Python i C współgrają razem.

Dynamiczne typowanie to dla mnie kolejny krok w ewolucji programowania - zrzucenie na komputer martwienie sie o typy danych.

ASM -> C -> C++ -> Java -> PHP/Python/Ruby

Dlatego właśnie powstają kolejne języki oparte na JVM - widocznie Java nie jest najbardziej produktywnym językiem.

Dynamiczne typowanie wkracza też do C++ - patrz Boost.Variant.
PO-LE-CAM!Piotr L. edytował(a) ten post dnia 25.10.11 o godzinie 21:02
10.06.2011, 10:03

Stanisław P. Software designer

Temat: Jakie są wady i zalety dynamicznego typowania w językach...

Może lepsze pytanie to, co tak naprawdę jest problemem w szybkości programowania - czy statyczne typowanie, czy deklaracja typów.

python: x = 1 + 2

ruby: x = 1 + 2

scala: val x = 1 + 2

haskell: .... where x = 1 + 2

2 statycznie typowane, dwa dynamicznie... a skąd wiadomo które? Oczywiście z int'ami jest prosto, problem zaczyna się z:

java: List<int> x = new ArrayList<int>(); x.add(1);

I na co komu te wszystkie ozdobniki? Tak w dynamicznych jak i statycznych:

python: x = [1]

haskell: .... where x = [1]Stanisław P. edytował(a) ten post dnia 10.06.11 o godzinie 10:55
10.06.2011, 10:52

Wojciech Soczyński Programista
eksplorator -
blog.wsoczynski.pl

Temat: Jakie są wady i zalety dynamicznego typowania w językach...

Z mojego doświadczenia w pracy z tworzeniem aplikacji, zarówno prostych stronek jak i aplikacji dedykowanych mogę stwierdzić następującą zależność:

czym system jest bardziej skomplikowany, tym statyczne (a przynajmniej silne) typowanie jest bardziej przydatne.

Dlaczego ? W prostych stronkach zwykle wykonujemy operacje na stringach i tak naprawdę całość sprowadza się do przetwarzania tekstu. Typowanie tylko zawadza. Natomiast gdy mamy skomplikowany kawałek software'u, silne (i/lub statyczne) typowanie pozwala nam nałożyć ograniczenia na nasz kod (constrainty), dzięki czemu będzie on bardziej spójny.

Co więcej statyczne typowanie bardzo dobrze współpracuje z wszelkiej maści edytorami (IDE) oferując nam podpowiadanie składni, które oczywiście można emulować w różny sposób (np. przy pomocy phpDoc w przypadku PHP).

Zwróćmy też uwagę (wracając do stron internetowych), że jeżeli "walidujemy formularz" to tak naprawdę wymuszamy typ naszych danych. Pomijając już proste przypadki typu liczba/ tekst to każde reguły walidacji (constrainty) to tak naprawdę opis jakiegoś typu (chociażby głupi adres email - też jest typem!).

Dynamiczne typowanie ma tą zaletę, że możemy robić więcej rzeczy "magicznie" przy pomocy różnego rodzaju klas proxy, dekoratorów czy innych wrapperów. Podobne podejście w językach statycznie typowanych pełnią adnotację.

Kończąc ten chaotyczny wywód, mogę powiedzieć, że wybór pomiędzy statycznym a dynamicznym typowaniem to w zasadzie kwestia gustu. Bezsprzecznie statycznie typowane języki mogą być efektywniej wykonywane. Z drugiej strony dynamicznie typowane języki będą prostsze w nauce. Poza tym chciałbym też zauważyć, że istnieją języki statycznie typowane (np. Scala) gdzie kompilator nie jest tak nachalny w kontroli typów - nie pyta o typ, jeżeli może się go sam domyślić, osobiście bardzo podoba mi się to podejście i sądzę, że jest to pewnego rodzaju złoty środek.

Btw. ciekawy artykuł o tym jaka moc drzemie w typowaniu statycznym - http://blog.tmorris.net/understanding-practical-api-de...Wojciech Soczyński edytował(a) ten post dnia 10.06.11 o godzinie 11:24
10.06.2011, 10:54

Łukasz K. Artysta Programista

Temat: Jakie są wady i zalety dynamicznego typowania w językach...

Inne pytanie. Co lepsze: terenówki czy wyścigówki? ;)
10.06.2011, 18:47

Wojciech Soczyński Programista
eksplorator -
blog.wsoczynski.pl

Temat: Jakie są wady i zalety dynamicznego typowania w językach...

Łukasz K.:
Inne pytanie. Co lepsze: terenówki czy wyścigówki? ;)
"Bulwarówki" :P
10.06.2011, 21:23

Mikołaj Siedlarek web software
engineer

Temat: Jakie są wady i zalety dynamicznego typowania w językach...

Na pojedyńczych zmiennych to porównanie w ogóle nie ma sensu, bo tylko kretyn raz trzyma w zmiennej 'a' w tej samej przestrzni raz stringa a za chwilę boola. Cała magia dynamicznego typowania ujawnia się w najwspanialszym elemencie Pythona (ciekaw jestem czy ktoś się zgodzi) jakim są różnego rodzaju kolekcje. Moim zdaniem tu siedzi cała wygoda dynamicznego typowania.

[edit]

Tak, słyszałem o polimorfizmie. Dlatego mówię o wygodzie.Mikołaj Siedlarek edytował(a) ten post dnia 13.06.11 o godzinie 16:17
13.06.2011, 16:15

Stanisław P. Software designer

Temat: Jakie są wady i zalety dynamicznego typowania w językach...

Mikołaj Siedlarek:
Na pojedyńczych zmiennych to porównanie w ogóle nie ma sensu, bo tylko kretyn raz trzyma w zmiennej 'a' w tej samej przestrzni raz stringa a za chwilę boola.
No prawie. Ale czasem przez pomyłkę pożesz przypisać inta jednego typu do zmiennej też inta ale który ma znaczyć cokolwiek innego. W silnie, statycznie typowanych Ci się to nie uda jeśli wartości będziesz poprawnie tagował np. Nie bez powodu w kernelu na przykład adresy kernel-space i user-space są opakowane w structy które dają wrażenie typowania trochę silniejszego.
W silnych dynamicznych najwyżej dowiesz się konkretnie jakie typy pomyliłeś, ale po pierwsze dopiero w czasie wykonania, po drugie przy użyciu zamiast przy przypisaniu.

Albo patrząc z innej strony: jeśli tylko kretyn trzyma w tej samej zmiennej najpierw stringa, a potem boola, to znaczy że i tak piszesz kod tak jakby był statycznie typowany. W takim razie co masz konkretnie przeciwko dodaniu tego sprawdzenia do samego języka?
13.06.2011, 17:52

Mikołaj Siedlarek web software
engineer

Temat: Jakie są wady i zalety dynamicznego typowania w językach...

Stanisław P.:
Albo patrząc z innej strony: jeśli tylko kretyn trzyma w tej samej zmiennej najpierw stringa, a potem boola, to znaczy że i tak piszesz kod tak jakby był statycznie typowany. W takim razie co masz konkretnie przeciwko dodaniu tego sprawdzenia do samego języka?

Duck typing i właśnie pythonowe kolekcje
13.06.2011, 19:47

Stanisław P. Software designer

Temat: Jakie są wady i zalety dynamicznego typowania w językach...

Mikołaj Siedlarek:
Duck typing i właśnie pythonowe kolekcje
Jakieś konkretne przykłady - można przez to rozumieć naprawdę dużo rzeczy. Na konkretnie podane zadanie łatwiej jest odpowiedzieć. W jakim przypadku widzisz przewagę jednego nad drugim w przypadku kolekcji?
14.06.2011, 01:56

Piotr L. IT - projekt &
implementacje

Temat: Jakie są wady i zalety dynamicznego typowania w językach...

Stanisław P.:
Mikołaj Siedlarek:
Duck typing i właśnie pythonowe kolekcje
Jakieś konkretne przykłady - można przez to rozumieć naprawdę dużo rzeczy. Na konkretnie podane zadanie łatwiej jest odpowiedzieć. W jakim przypadku widzisz przewagę jednego nad drugim w przypadku kolekcji?

Stosuję dynamiczne typowanie w C++ (boost::variant + otoczka), dzięki temu nie muszę się zastanawiać w
niekrytycznych funkcjach jakiego rodzaju struktura jest argumentem - list, vector czy set.
Po prostu na niej operuję.

Oczywiście w C++ są iteratory, tylko że one akurat nie pozwalają w locie na zignorowanie typu danych - nie pobiorę elementu do sumy jeśli jest stringiem.

"duck typing" - jak i wiele innych elementów można zrobić w każdym języku:


// C++ a'la '9x

class MyBase {
public:
enum Features {
dfPlywa = 1,
dfKwacze = 2
}
virtual unsigned int getFeatures() { return 0; }
virtual void Kwacz() { /* nothing here */ }
};

class Duck: public MyBase {
public:
virtual unsigned int getFeatures() { return dfKwacze; }
virtual void Kwacz() { cout << "Kwa, kwa..." << endl; }
};

MyBase *obj = getNextAnimal();
if ((obj->getFeatures() & dfKwacze) != 0)
obj->Kwacz();
Piotr L. edytował(a) ten post dnia 25.10.11 o godzinie 21:02
14.06.2011, 09:21

Mikołaj Siedlarek web software
engineer

Temat: Jakie są wady i zalety dynamicznego typowania w językach...

Wiem że można w C++, dlatego dopisałem jeszcze:
Tak, słyszałem o polimorfizmie. Dlatego mówię o wygodzie.

Ta wygoda o której mówię to uniwersalne kolekcje dla wszystkich typów danych a także kilku na raz. Wszystko się da w innych językach, ale przecież nie o to chodzi.

Także API i zewnętrzne biblioteki nabierają uniwersalności. Bo jeżeli w C++ nie zostaną zaprojektowane tak żeby wspierać duck typing (a to chyba nadal rzadkość) to nie uradzisz. A w Pythonie jak jakaś metoda chce plik, to możesz jej dać cokolwiek plikopodobnego, np strumień, zależnie od swoich potrzeb.

Jeszcze raz - ja wiem że się da, ale wygoda i szybkość.
14.06.2011, 11:04

Stanisław P. Software designer

Temat: Jakie są wady i zalety dynamicznego typowania w językach...

Piotr Likus:
"duck typing" - jak i wiele innych elementów można zrobić w każdym języku:
To nie jest niestety duck typing w tym przypadku. Byłby jakby te klasy nie miały wspólnej klasy w hierarchii. W dodatku każda dodatkowa własność nowej klasy musi zmodyfikować MyBase. Ble...

Z drugiej strony Mikołaj, mówisz że "wygoda o której mówię to uniwersalne kolekcje dla wszystkich typów danych a także kilku na raz" - a czym to się różni od trzymania w jednej zmiennej najpierw jednego typu, potem innego?

a=kolekcja['foo']
a=kolekcja['bar']

Co nas uchroni przed tym, że jedno a to string, a drugie to bool jak wcześniej? Oczywiście znasz swój kod i wiesz że nigdzie to się nie zdarzy... no chyba, że ta kolekcja jest przekazana do innej funkcji której nie napisałeś. I wtedy już jest za późno, bo dowiadujesz się o problemie dopiero jak chcesz tej kolekcji użyć. A przecież można zdefiniować co ma trafić do kolekcji. Ba! Można nawet zrobić kolekcję która sprawdza właściwości, zamiast typów, nawet statycznie...
14.06.2011, 11:29

Mikołaj Siedlarek web software
engineer

Temat: Jakie są wady i zalety dynamicznego typowania w językach...

Stanisław P.:
Z drugiej strony Mikołaj, mówisz że "wygoda o której mówię to uniwersalne kolekcje dla wszystkich typów danych a także kilku na raz" - a czym to się różni od trzymania w jednej zmiennej najpierw jednego typu, potem innego?

Ok, wygląda na to że muszę rozwinąć moją tezę o trzymaniu rzeczy w jednej zmiennej.

Kiedy tworzy się zmienną to po co żeby coś w niej trzymać. Jeśli tworzę zmienną 'liczba_czegoś' to trzymam tam sobie zapewne liczbę, jeżeli tworzę zmienną 'imię' to trzymam zapewne stringa. I o ile normalne jest że imię może zmienić się na inne imię to u mało normalne jest że nagle zacznie trzymać wartości boolowskie. Zupełnie w porządku jest dla mnie stworzenie zmiennej 'random_things' i trzymanie w niej raz stringa a raz budyniu, ale nie bardzo potrafię wymyślić taką potrzebę w prawdziwym życiu a i kod to gmatwa i czyni nieczytelnym.

Kolekcje natomiast są o wiele bardziej uniwersalne. To czy string czy bool nie zawsze mnie obchodzi - może mnie na przykład obchodzić raczej na jaką wartość boolowską rzutują.

Konfilkty tego typu zdarzają się niezbyt często rozsądnemu programiście, a i oszczędność czasu na deklarowaniu typów wszystkiego jest znaczna.

[edit]

Jak mogłem zapomnieć! Uniwersalność słowników - to jest przykład koronny radości z dynamicznego typowania.Mikołaj Siedlarek edytował(a) ten post dnia 14.06.11 o godzinie 14:38
14.06.2011, 14:36

Stanisław P. Software designer

Temat: Jakie są wady i zalety dynamicznego typowania w językach...

Do wygody można mieć różne podejście. Wygodnie oczywiście jest tak zacząć projekt. Ale później?
Przecież wiesz konkretnie co do takiego słownika chcesz włożyć a czego nie. Oczywiście jeśli to prototyp to może być to jeszcze nie zdefiniowane zbyt dobrze, ale jak masz już coś co ma być utrzymywane przez dłuższy czas, to sprawa powinna być kompletnie znana - pakujesz tam typy A, B, C, albo coś co implementuje blah().
Więc co tak naprawdę daje w późniejszej fazie dynamizm? Przy statycznie zdefiniowanej kolekcji możesz mieć i klucze i wartości typu jakiego tylko chcesz. Możesz ich nawet nie ograniczać wogóle, dostając praktycznie taki sam słownik jak w Pythonie.

Ale tym razem masz pewność, że ani Ty ani kto inny przez pomyłkę nie wpakuje kompletnie niezwiązanej wartości. Jeśli interesuje Cię tylko to jak rzutują na typ X, to możesz nawet przyjmować tylko takie kolekcje których elementy na X rzutować możesz - obojętnie jakie to elementy są.

W skrócie -> nie rozumiem wypowiedzi typu "Kolekcje natomiast są o wiele bardziej uniwersalne." Taką samą kolekcje możesz mieć i przy typowaniu statycznym i dynamicznym. Ale w jednym możesz ją zawęzić, żeby API było bardziej bezpieczne, w drugim nie.
14.06.2011, 16:26

Mikołaj Siedlarek web software
engineer

Temat: Jakie są wady i zalety dynamicznego typowania w językach...

Stanisław P.:
W skrócie -> nie rozumiem wypowiedzi typu "Kolekcje natomiast są o wiele bardziej uniwersalne." Taką samą kolekcje możesz mieć i przy typowaniu statycznym i dynamicznym. Ale w jednym możesz ją zawęzić, żeby API było bardziej bezpieczne, w drugim nie.

A w drugim nie mogę nie zawęzić. Chodzi o czas -- mając dobrych programistów piszesz w Pythonie o wiele szybciej niewiele tracąc. Dziwię się trochę twojej postawie w tym wszystkim, bo przecież sam używasz Pythona.

[edit]

W prawdziwym świecie czas jest ważniejszy niż daleko posunięte bezpieczeństwo wewnętrznego API. Nigdy nie miałem przyjemności pracować przy projekcie w którym byłoby inaczej.Mikołaj Siedlarek edytował(a) ten post dnia 14.06.11 o godzinie 16:47
14.06.2011, 16:45

Stanisław P. Software designer

Temat: Jakie są wady i zalety dynamicznego typowania w językach...

Piszę w wielu językach. Pythona akurat wybieram jako najlepsze wyjście dla języków skryptowych. W większych projektach preferuję Scala. W jeszcze innych bardziej sieciowych Erlanga. Dla desktopu w C#. Po co się ograniczać ;)

Trochę właśnie nie zgadzam się z tą tezą o szybszym pisaniu w Pythonie. Jeśli trzymamy się "standardowych jezyków": W porównaniu do C / C++ - ze względu na elastyczność, wyższy poziom abstrakcji, lepszą obsługę błędów, na pewno jest szybciej. W porównaniu do Javy - ze względu na eliminację wielu linii które są tylko po to, żeby obejść sztywny język, na pewno szybciej.

W porównaniu do nowych, zwięzłych języków - nie wiem. Scala, C# i inne są całkiem zwięzłe, elastyczne i zapewniają dużo większy komfort jeśli chodzi o kontrolę przy kompilacji. Oczywiście - programu który zmodyfikuje kilka plików w prosty sposób nie będę w nich pisał. Ale do większej aplikacji? Lift czy Pyramid... ciekawy wybór ;)
14.06.2011, 18:09

Piotr L. IT - projekt &
implementacje

Temat: Jakie są wady i zalety dynamicznego typowania w językach...

Mikołaj Siedlarek:
W prawdziwym świecie czas jest ważniejszy niż daleko posunięte bezpieczeństwo wewnętrznego API. Nigdy nie miałem przyjemności pracować przy projekcie w którym byłoby inaczej.

Idealizujesz. Gdyby tak było, COBOL dawno by już umarł, a w C grzebano by tylko na wydziale archeologii.

API na pewno jest ważne - zwłaszcza na poziomie OS.
Języki skryptowe/dynamicznie typowane to po prostu wyższy poziom, jeśli masz tylko z nimi do czynienia to pozazdrościć, ale to nie cały świat.
14.06.2011, 20:55

Mikołaj Siedlarek web software
engineer

Temat: Jakie są wady i zalety dynamicznego typowania w językach...

Piotr Likus:
Mikołaj Siedlarek:
W prawdziwym świecie czas jest ważniejszy niż daleko posunięte bezpieczeństwo wewnętrznego API. Nigdy nie miałem przyjemności pracować przy projekcie w którym byłoby inaczej.

Idealizujesz. Gdyby tak było, COBOL dawno by już umarł, a w C grzebano by tylko na wydziale archeologii.

API na pewno jest ważne - zwłaszcza na poziomie OS.
Języki skryptowe/dynamicznie typowane to po prostu wyższy poziom, jeśli masz tylko z nimi do czynienia to pozazdrościć, ale to nie cały świat.

Trochę chyba faktycznie przemawia przeze mnie mój field of interest, nie nakładniam do skryptowania mikrokontrolerów w pralkach w każdym razie ;)
14.06.2011, 21:01



Wyślij zaproszenie do