To pytanie dotyczy semantyki
Jeśli podam ci te dane: 12
jaki to jest typ? Nie masz pewności. Może to być liczba całkowita - może to być liczba zmiennoprzecinkowa - może być ciągiem znaków. W tym sensie jest to bardzo dużo „nietypowych” danych.
Jeśli podam wam wyimaginowany język, który pozwala na użycie operatorów takich jak „dodawanie”, „odejmowanie” i „łączenie” na tych danych i innych dowolnych fragmentach danych, to „typ” jest nieco nieistotny (dla mojego języka wyobrażonego) (przykład : być add(12, a)
wydajności 109
co jest 12
także wartości ASCII a
).
Porozmawiajmy przez chwilę o C. C prawie pozwala ci robić, co chcesz, z dowolnymi danymi. Jeśli używasz funkcji, która zajmuje dwa uint
s - możesz rzutować i przekazywać wszystko, co chcesz - a wartości zostaną po prostu zinterpretowane jako uint
s. W tym sensie C jest „bez typu” (jeśli potraktujesz to w taki sposób).
Jednak - i dochodząc do sedna Brendana - jeśli powiem ci, że „mój wiek jest 12
” - to 12
ma typ - przynajmniej wiemy, że jest numeryczny. Z kontekstem wszystko ma swój typ - niezależnie od języka.
Dlatego powiedziałem na początku - twoje pytanie dotyczy semantyki. Jakie jest znaczenie „bez typu”? Myślę, że Brendan trafił w sedno, kiedy powiedział „żadnych statycznych typów” - bo to wszystko, co może oznaczać. Ludzie w naturalny sposób dzielą rzeczy na typy. Intuicyjnie wiemy, że między samochodem a małpą jest coś zasadniczo innego - nigdy nie uczono nas, jak dokonywać takich rozróżnień.
Wracając do mojego przykładu na początku - język, który "nie dba o typy" (per se), może pozwolić ci "dodać" "wiek" i "imię" bez generowania błędu składniowego ... ale to nie oznacza, że jest to logicznie uzasadniona operacja.
Javascript może pozwolić ci robić różne szalone rzeczy bez uważania ich za "błędy". To nie znaczy, że to, co robisz, jest logicznie uzasadnione. To dla programisty do rozwiązania.
Czy system / język, który nie wymusza bezpieczeństwa typów w czasie kompilacji / budowania / interpretacji, jest „bez typu” lub „wpisywany dynamicznie”?
Semantyka.
EDYTOWAĆ
Chciałem coś tutaj dodać, ponieważ niektórzy ludzie wydają się być złapani na „tak, ale Javascript ma kilka„ typów ””.
W komentarzu do cudzej odpowiedzi powiedziałem:
W Javascript mógłbym mieć obiekty, które utworzyłem jako „Małpy” i obiekty, które utworzyłem jako „Ludzie”, a niektóre funkcje mogą działać tylko na „Ludziach”, inne tylko na „Małpach”, i jeszcze inni tylko na „Things With Arms”. To, czy w języku kiedykolwiek powiedziano, że istnieje taka kategoria obiektów jak „rzeczy z bronią”, jest równie nieistotne dla asemblera („bez typu”), jak dla JavaScript („dynamiczne”). To kwestia logicznej integralności - a jedynym błędem byłoby użycie czegoś, co nie ma broni z tą metodą.
Tak więc, jeśli uważasz, że JavaScript ma pewne „pojęcie typów” wewnętrznie - i stąd „typy dynamiczne” - i myślisz, że jest to w jakiś sposób „wyraźnie różniące się od systemu bez typu” - powinieneś zobaczyć z powyższego przykładu, że jakiekolwiek „pojęcie typy, które ma wewnętrznie, jest naprawdę nieistotne.
Aby wykonać tę samą operację z C #, na przykład, POTRZEBUJĘ interfejsu o nazwie ICreatureWithArms
lub czegoś podobnego. Inaczej w Javascript - nie w C czy ASM.
Oczywiście to, czy Javascript w ogóle rozumie „typy”, nie ma znaczenia.