Czy „bez typu” oznacza również „dynamicznie wpisywane” w akademickim świecie CS?

166

Czytam prezentację z informacją „JavaScript nie ma typu”. Zaprzeczało to temu, co uważałem za prawdę, więc zacząłem kopać, aby dowiedzieć się więcej.

Każda odpowiedź na pytanie Czy JavaScript jest językiem bez typu? mówi, że JavaScript nie jest pozbawiony typu i oferuje przykłady różnych form statycznego, dynamicznego, silnego i słabego pisania, które znam i które mi się podobają ... więc nie była to droga.

Zapytałem więc Brendana Eicha, twórcę JavaScript, a on odpowiedział:

typy akademickie używają „bez typu” w znaczeniu „brak typów statycznych”. są wystarczająco sprytni, aby zobaczyć, że wartości mają typy (no!). kontekst ma znaczenie.

Czy specjaliści od informatyki akademickiej używają „bez typu” jako synonimu „dynamicznie wpisywana” (i czy jest to poprawne?), Czy jest coś głębszego w tym, czego mi brakuje? Zgadzam się z Brendanem, że kontekst jest ważny, ale wszelkie cytowania wyjaśnień byłyby świetne, ponieważ moje obecne książki „przejdź do” nie grają w piłkę na ten temat.

Chcę to naprawić, aby móc lepiej zrozumieć, a nawet Wikipedia nie odwołuje się do tego alternatywnego zastosowania (które i tak mogę znaleźć). Nie chcę mieć problemów z używaniem tego terminu lub kwestionowaniem jego użycia w przyszłości, jeśli się mylę :-)

(Widziałem też topowego Smalltalkera, który powiedział, że Smalltalk też jest „bez typu”, więc nie jest to jednorazowy przypadek, co skłoniło mnie do podjęcia tego zadania! :-))

Peter Cooper
źródło
5
Nadużywanie nazewnictwa przez innych nie musi kształtować twoich przyzwyczajeń - wystarczy użyć (bardziej) poprawnego wyrażenia. Oczywiście musisz być świadomy problemu z czytaniem.
Raphael
2
Zawsze uważałem, że zmienne nie mają typu, ponieważ każda zmienna może przechowywać dowolny typ danych. Rodzaj tego, co znajduje się w zmiennej, może zmieniać się dynamicznie .
Izkata
1
Ponadto (ponownie mówiąc więcej o języku naturalnym niż o językach komputerowych) „untyped” = „single-typed” (jeden typ dla wszystkich wartości).
philipxy

Odpowiedzi:

148

Tak, to standardowa praktyka w literaturze akademickiej. Aby to zrozumieć, warto wiedzieć, że pojęcie „typu” zostało wynalezione w latach trzydziestych XX wieku w kontekście rachunku lambda (właściwie nawet wcześniej, w kontekście teorii mnogości). Od tamtej pory wyłoniła się cała gałąź logiki obliczeniowej, zwana „teorią typów”. Na tych podstawach opiera się teoria języka programowania. We wszystkich tych matematycznych kontekstach „typ” ma szczególne, ugruntowane znaczenie.

Termin „dynamiczne typowanie” został wynaleziony znacznie później - i jest sprzecznością terminów w obliczu powszechnego matematycznego użycia słowa „typ”.

Na przykład, oto definicja „systemu typów”, której Benjamin Pierce używa w swoim standardowym podręczniku Typy i języki programowania :

System typów jest wykonalną syntaktyczną metodą dowodzenia braku pewnych zachowań programu poprzez klasyfikowanie fraz według rodzajów obliczanych przez nie wartości.

Zwraca też uwagę:

Czasami słowo „statyczny” jest dodawane wyraźnie - mówimy na przykład o „języku programowania z typami statycznymi” - aby odróżnić rodzaje analiz w czasie kompilacji, które rozważamy tutaj, od dynamicznego lub ukrytego pisania w językach takich jak Schemat (Sussman i Steele, 1975; Kelsey, Clinger i Rees, 1998; Dybvig, 1996), w którym znaczniki typu run-time są używane do rozróżniania różnych rodzajów struktur w stercie. Terminy takie jak „wpisywane dynamicznie” są prawdopodobnie błędne i prawdopodobnie powinny zostać zastąpione terminami „sprawdzane dynamicznie”, ale ich użycie jest standardowe.

Wydaje się, że większość osób pracujących w tej dziedzinie podziela ten punkt widzenia.

Zauważ, że tak nie jest oznacza to, że „bez typu” i „wpisane dynamicznie” są synonimami. Raczej, że to drugie jest (technicznie mylącą) nazwą dla konkretnego przypadku tego pierwszego.

PS: A FWIW, tak się składa, że ​​jestem zarówno akademickim badaczem systemów typów, jak i nieakademickim wdrażającym JavaScript, więc muszę żyć ze schizmą. :)

Andreas Rossberg
źródło
5
Jest to bardzo pomocne i może nawet być moją ulubioną odpowiedzią, jeśli chodzi o przedstawienie jej historii.
Peter Cooper
2
@PeterCooper Przy okazji możesz być zainteresowany, aby wiedzieć, że jedna z głównych gałęzi semantyki formalnej jest orzekana (ha a pun) na typowanych rachunkach lambda; np. Semantyka Montague. Ale jako system deklaratywny, nie generujący, osobiście zawsze oddzielałem pisanie w systemach takich jak Montague Semantics od pisania w językach programowania.
knowtheory
+1. "[dynamically typed] is a (technically misleading) name for a particular case of [untyped]"
Steve
1
To nie jest do końca poprawne, jeśli chodzi o historię „typów”. Są nawet starsze niż praca Churcha nad rachunkiem lambda. Russell użył typów, aby uniknąć paradoksów w konstrukcji teorii mnogości.
Sam Tobin-Hochstadt
1
@ SamTobin-Hochstadt, tak, prawda. Mówiłem tylko o tym fragmencie historii, który dotyczy bezpośrednio powstania PL. Wyjaśnię.
Andreas Rossberg,
68

Jestem akademickim informatykiem specjalizującym się w językach programowania i tak, słowo „bez typu” jest często (niewłaściwie) używane w ten sposób. Byłoby miło zarezerwować to słowo do użytku z językami, które nie mają dynamicznych tagów typu, takich jak Forth i kod asemblera, ale te języki są rzadko używane, a nawet rzadziej studiowane, ao wiele łatwiej jest powiedzieć „bez typu” niż „wpisywane dynamicznie”.

Bob Harper lubi mówić, że języki takie jak Scheme, Javascript i tak dalej powinny być traktowane jako języki wpisywane tylko z jednym typem: typ: wartość. Skłaniam się do tego poglądu, ponieważ umożliwia on zbudowanie spójnego światopoglądu przy użyciu tylko jednego rodzaju formalizmu.

PS W czystym rachunku lambda jedynymi „wartościami” są wyrazy w postaci normalnej, a jedynymi zamkniętymi wyrazami w postaci normalnej są funkcje. Jednak większość naukowców korzystających z rachunku lambda dodaje typy bazowe i stałe, a następnie albo dołączasz statyczny system typów dla lambda, albo wracasz od razu do dynamicznych tagów typów.

PPS Do oryginalnego plakatu: jeśli chodzi o języki programowania, a zwłaszcza systemy czcionek, informacje w Wikipedii są słabej jakości. Nie ufaj temu.

Norman Ramsey
źródło
12
Myślę, że istnieje szerszy problem w CS (w tym w środowisku akademickim), że nazwy są używane bez ścisłej definicji. Jest to wyraźne przeciwieństwo matematyki i (większości?) Nauk ścisłych. Ogromna liczba sporów (np. O OOP) wydaje się wynikać z tego braku odpowiednich definicji. Bardzo irytujące.
Konrad Rudolph
2
@KonradRudolph: Zastanawiam się, czy zamiast sporów wynikających z braku odpowiednich definicji, brak odpowiednich definicji może wynikać po części ze sporów. Niektóre terminy nabierają wartości emocjonalnej (pozytywnej lub negatywnej), a zwolennicy określonych języków definiują te terminy w sposób, który obejmuje lub wyklucza ich języki (oraz wyklucza lub uwzględnia ich ulubione języki „wroga”). Na przykład matematyki - gdyby nie było jeszcze ludzi wspierających naiwnej teorii mnogości nad aksjomatycznej teorii, można mieć pewność, że zadzwonią do własnych poglądów „aksjomat zestaw teoria” i określenie „naiwny
ruakh
4
@Norman, jestem zaskoczony, że nazywasz to nadużyciem - jak wiesz, pojęcie typu wyprzedza tak zwane języki dynamicznie typowane o dziesięciolecia, a to, co drugie nazywa „typem”, ma niewiele wspólnego z pierwszym. Więc myślę, że można uczciwie powiedzieć, że nadużycie jest odwrotne.
Andreas Rossberg
5
@Norman: Jeśli chodzi o języki programowania, a zwłaszcza systemy czcionek, jeśli uważasz, że informacje na Wikipedii są słabej jakości, nie zostawiaj ich w spokoju i poprawiaj je. (tylko trolling)
Gyom
3
@Gyom Zrezygnowałem z ulepszania Wikipedii w dniu, w którym zdałem sobie sprawę, że proces wikipedystów nagradza zmianę , a nie wiedzę . Lepiej spędzam czas na poprawianiu SO :-)
Norman Ramsey,
43

Przyjrzałem się temu i stwierdziłem, że odpowiedź na twoje pytanie jest prosta i zaskakująca: „tak”: akademickie typy CS, a przynajmniej niektóre z nich, używają „bez typu” w znaczeniu „dynamicznie wpisywane”. Na przykład w książce Programming Languages: Principles and Practices , Third Edition (Kenneth C. Louden i Kenneth A. Lambert, opublikowano w 2012 r.):

Języki bez statycznych systemów typów są zwykle nazywane językami bez typu (lub językami dynamicznie typowanymi ). Takie języki obejmują Scheme i inne dialekty Lisp, Smalltalk i większość języków skryptowych, takich jak Perl, Python i Ruby. Należy jednak pamiętać, że język bez typu niekoniecznie pozwala programom na uszkodzenie danych - oznacza to po prostu, że wszystkie testy bezpieczeństwa są wykonywane w czasie wykonywania. […]

[ link ] (uwaga: pogrubienie w oryginale) i dalej używa słowa „bez typu” tylko w ten sposób.

Uważam to za zaskakujące (z tych samych powodów, które podają afrischke i Adam Mihalcin), ale tak jest. :-)


Edytowano, aby dodać: więcej przykładów można znaleźć, podłączając się "untyped languages"do Google Book Search. Na przykład:

[…] To jest główny mechanizm ukrywania informacji w wielu nietypowych językach. Na przykład system PLT [4] wykorzystuje generatywne structs, […]

- Jacob Matthews i Amal Ahmed, 2008 [ link ]

[…] Przedstawiamy analizę czasu wiązania dla nietypowego języka funkcjonalnego […]. […] Został wdrożony i jest używany w częściowym ewaluatorze dla dialektu schematu wolnego od skutków ubocznych. Analiza jest jednak na tyle ogólna, że ​​ma zastosowanie do niecisłych języków funkcjonalnych, takich jak Haskell. […]

- Charles Consel, 1990 [ link ]

Nawiasem mówiąc, po przejrzeniu tych wyników wyszukiwania mam wrażenie, że jeśli badacz pisze o „nietypowym” języku funkcjonalnym, to najprawdopodobniej uważa go za „bez typu” w tym samym sensie, co bez typu lambda rachunek różniczkowy, o którym wspomina Adam Mihalcin. Przynajmniej kilku badaczy wspomina Scheme i rachunek lambda jednym tchem.

To, czego wyszukiwanie nie mówi, oczywiście, to czy są badacze, którzy odrzucają tę identyfikację i nie uważają tych języków za „bez typu”. Cóż, znalazłem to:

Wtedy zdałem sobie sprawę, że tak naprawdę nie ma kołowości, ponieważ języki dynamicznie typowane nie są językami bez typu - po prostu typy nie są zwykle od razu oczywiste z tekstu programu.

- ktoś (nie wiem kto), 1998 [ link ]

ale oczywiście większość ludzi, którzy odrzucają tę identyfikację, nie czułaby potrzeby, aby to wprost powiedzieć.

ruakh
źródło
2
Łał. Wstrząsający. Dzięki za informację.
afrischke
Dokładnie takiego rodzaju cytatu, jakiego szukałem, dzięki! Trochę mnie przeraża, że ​​książka ma średnio 2 gwiazdki na Amazonie, więc mile widziano więcej cytatów, ale to świetny początek.
Peter Cooper
@PeterCooper: Zmieniłem odpowiedź, aby dodać więcej cytatów. Omijają problem z ocenami Amazon, opierając się na opublikowanych artykułach: z tego, co wiem, nadal mogą być śmieciami, ale przynajmniej nie musimy się martwić, że Amazon nam to powie. :-P
ruakh
Mylenie wyrażenia „bez typu” z „wpisanym dynamicznie” jest nielogiczne. Programiści nie powinni być nielogiczni.
rotman
10

Bez typu i dynamicznie wpisywane absolutnie nie są synonimami. Językiem, który jest najczęściej nazywany „bez typu”, jest Rachunek Lambda, który jest właściwie językiem niezatyfikowanym - wszystko jest funkcją, więc możemy statycznie udowodnić, że typem wszystkiego jest funkcja. Język z typami dynamicznymi ma wiele typów, ale nie dodaje sposobu, aby kompilator mógł je statycznie sprawdzić, zmuszając kompilator do wstawiania sprawdzeń środowiska uruchomieniowego dla typów zmiennych.

Następnie JavaScript jest językiem dynamicznie typowanym: możliwe jest pisanie programów w JavaScript w taki sposób, że jakaś zmienna xmoże być liczbą, funkcją, ciągiem znaków lub czymś innym (i określenie, który z nich wymagałby rozwiązania problemu zatrzymania lub czegoś trudny problem matematyczny), więc możesz zastosować xargument, a przeglądarka musi sprawdzić w czasie wykonywania, czy xjest to funkcja.

Adam Mihalcin
źródło
AFAIK Te same problemy dotyczą wyrażenia Lambda. Chociaż możesz być w stanie przekazać funkcję "mojej aktualnej pozycji" do funkcji, która oblicza "moją odległość od celu", możesz również przekazać tę samą funkcję "moja aktualna pozycja" do funkcji, która oblicza "są zaciągnięcia plus z vicks lepiej na nos ”. To, że możesz, nie oznacza, że ​​jest to poprawne - tak jak w przypadku każdego systemu dynamicznego.
Steve
5
@Steve Garbage in garbage out dotyczy każdego języka programowania i nie ma związku z pojęciem typów. Nawet w silnie pisanym języku, takim jak OCaml lub SML, mogę przekazać Biegun Północny do funkcji obliczającej „moją odległość od celu” (i nie, moja obecna pozycja nie jest biegunem północnym).
Adam Mihalcin
Chciałem tylko dodać, dla osób spoza środowiska akademickiego: rzeczy takie jak montaż również będą się liczyć jako nietypowe.
CoffeeTableEspresso
6

Oba stwierdzenia są poprawne, w zależności od tego, czy mówisz o wartościach, czy o zmiennych. Zmienne JavaScript są bez typu, wartości JavaScript mają typy, a zmienne mogą wahać się w zakresie dowolnego typu wartości w czasie wykonywania (tj. „Dynamicznie”).

W JavaScript i wielu innych językach wartości, a nie zmienne, mają typy. Wszystkie zmienne mogą obejmować wszystkie typy wartości i mogą być traktowane jako „dynamicznie wpisane” lub „bez typu” - z punktu widzenia sprawdzania typu zmienna, która nie ma / niepoznawalnego typu, a zmienna, która może przyjmować dowolny typ, jest logicznie i praktycznie równoważna . Kiedy teoretycy typów mówią o językach i typach, zwykle o tym mówią - zmienne przenoszące typy - ponieważ są zainteresowani pisaniem programów do sprawdzania typów i kompilatorów itd., Które działają na tekście programu (tj. Zmiennych), a nie na uruchomionym programie w pamięci (tj. wartości).

W przeciwieństwie do innych języków, takich jak C, zmienne mają typy, ale wartości nie. W językach takich jak Java zmienne i wartości mają typy. W C ++ niektóre wartości (te z funkcjami wirtualnymi) mają typy, a inne nie. W niektórych językach możliwa jest nawet zmiana typów przez wartości, chociaż zwykle jest to uważane za zły projekt.


źródło
5
Myślę, że kluczowym rozróżnieniem nie są wartości i zmienne , ale wartości i wyrażenia : w języku z typami statycznymi wyrażenia mają typy, podczas gdy w języku z typami dynamicznymi tylko wartości. (Nazwy zmiennych są oczywiście jednym rodzajem wyrażenia.)
ruakh
4

To pytanie dotyczy semantyki

Jeśli podam ci te dane: 12jaki 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 109co jest 12takż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 uints - możesz rzutować i przekazywać wszystko, co chcesz - a wartości zostaną po prostu zinterpretowane jako uints. 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 12ma 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.

Steve
źródło
4
-1. Pytanie dotyczy tego, czy w pewnych kręgach używane jest określone słowo o określonym znaczeniu, a Twoja odpowiedź polega na wyjaśnieniu, że jest to kwestia tego, czy słowo to ma takie znaczenie? Naprawdę myślę, że wykonałeś godną podziwu robotę, wyjaśniając wszystko, co wydaje się już wiedzieć OP, bez dodawania niczego nowego. . .
ruakh
Wydaje się, że do zbudowania definicji potrzeba kilku pytań? Wymuszenie typu (statyczne lub dynamiczne) i obecność określonych typów. Więc JavaScript ma typy, ale można go uznać za „bez typu” ze względu na brak sprawdzenia poprawności typu przed wykonaniem operacji?
Peter Cooper,
@ruakh - rozumiem twoją perspektywę. Jednak OP zapytał: is there something deeper to this that I am missingi myślę, że niezrozumienie, że jest to kwestia semantyczna, jest głębszą sprawą - więc zrobiłem, co mogłem, by wrzucić wszystko, co mogłem.
Steve,
@PeterCooper - Zobacz moją edycję i powiedz mi, czy to coś dla Ciebie doda (skoro powiedziałeś JavaScript has typesw swojej odpowiedzi).
Steve,
2
„Oczywiście, czy Javascript w ogóle rozumie„ typy ”, nie ma znaczenia”. Nie prawda. Jak zasugerowałem w mojej odpowiedzi, bez względu na kontekst, nie można traktować 12 jako funkcji. Ponieważ JavaScript ma typ funkcji (lub, w zależności od twojego punktu widzenia, wiele typów funkcji), jest to ważna różnica.
Adam Mihalcin
4

Chociaż prawdą jest, że większość badaczy CS, którzy piszą o typach, zasadniczo traktuje tylko języki z typami dającymi się wyprowadzać składniowo jako języki typowane, o wiele więcej z nas używa języków dynamicznie / latentnie wpisanych na maszynie, którzy nie lubią tego użycia.

Uważam, że istnieją 3 typy [SIC] języków:

Bez typu - tylko operator określa interpretację wartości - i generalnie działa na wszystkim. Przykłady: asembler, BCPL

Statycznie typowane - wyrażenia / zmienne mają skojarzone z nimi typy, które określają interpretację / ważność operatora w czasie kompilacji. Przykłady: C, Java, C ++, ML, Haskell

Typowane dynamicznie - wartości mają skojarzone z nimi typy, a ten typ określa interpretację / ważność operatora w czasie wykonywania. Przykłady: LISP, Scheme, Smalltalk, Ruby, Python, Javascript

O ile mi wiadomo, wszystkie języki dynamicznie typowane są bezpieczne dla typów - tzn. Tylko prawidłowe operatory mogą operować na wartościach. Ale to samo nie dotyczy języka z typami statycznymi. W zależności od mocy stosowanego systemu typów, niektórzy operatorzy mogą być sprawdzani tylko w czasie wykonywania lub wcale. Na przykład większość języków z typami statycznymi nie obsługuje poprawnie przepełnienia liczb całkowitych (dodanie 2 dodatnich liczb całkowitych może dać ujemną liczbę całkowitą), a odwołania do tablic poza granicami albo nie są w ogóle sprawdzane (C, C ++), albo są sprawdzane tylko w w czasie wykonywania. Co więcej, niektóre systemy typów są tak słabe, że użyteczne programowanie wymaga kresek ucieczki (rzutowania w C i rodzinie), aby zmienić typ wyrażeń w czasie kompilacji.

Wszystko to prowadzi do absurdalnych twierdzeń, na przykład, że C ++ jest bezpieczniejszy niż Python, ponieważ jest (wpisywany statycznie), podczas gdy prawda jest taka, że ​​Python jest samoistnie bezpieczny, podczas gdy można odstrzelić sobie nogę w C ++.

Dave Mason
źródło
Głosowano za. Dobrze wiedzieć, że „wszystkie języki dynamicznie wpisywane są bezpieczne dla typów”. „Ale to samo nie jest prawdą w przypadku języka z typowaniem statycznym”, czy masz na myśli, że wszystkie lub większość języków z typowaniem statycznym nie są bezpieczne?
Tim
Głosowano za. (1) Cieszę się, że „wszystkie języki dynamicznie wpisywane są bezpieczne”, ale Javascript jest pisany dynamicznie i słabo, patrz stackoverflow.com/questions/964910/… . (2) „Ale to samo nie jest prawdą w przypadku języka z typami statycznymi”, czy masz na myśli, że wszystkie lub większość języków z typami statycznymi są niebezpieczne?
Tim
Bardzo niewiele języków jest statycznie bezpiecznych dla typów, jeśli jako typy uwzględnisz możliwość niepowodzenia rzutowania, wyjątków poza zakresem indeksu dolnego lub wskaźnika o wartości null (a większość ludzi uwzględnia przynajmniej niepowodzenie rzutowania jako błąd typu). Na przykład Rust jest bardziej statycznie bezpieczny dla typów niż Java, ponieważ nie można mieć wskaźnika pustego. Java jest dynamicznie bezpieczna dla typów, ponieważ otrzymujesz wyjątki dla każdej nielegalnej operacji i wszystko jest określone (z wyjątkiem metod natywnych). Podobnie Rust (z wyjątkiem „niebezpiecznego” kodu, który jest tak oznaczony).
Dave Mason
Jednak C ++, C nie są nawet dynamicznie bezpieczne dla typów, ponieważ istnieją "nieokreślone" części języka, a jeśli wykonasz jedną z "nieokreślonych" operacji, dosłownie wszystko jest prawną odpowiedzią z języka (wartości niepowiązanych zmiennych mogą zmiana, wirusy mogą zainfekować twój program, program mógłby napisać na całym dysku, a następnie zawiesić się, program mógł nawet zrobić to, czego się spodziewałeś :-).
Dave Mason
@DaveMason: Undefined. Istnieje ogromna różnica między „nieokreślonym” i „nieokreślonym” w C. Niezdefiniowane zachowanie to w zasadzie nielegalne rzeczy, które mogą zrobić to, co opisałeś - podczas gdy nieokreślone zasadniczo oznacza „zdefiniowane w implementacji, gdzie implementacja nie musi tego dokumentować „(tu i tam są pewne niuanse, więc jest to uproszczenie). Wywołanie nieokreślonego zachowania jest zatem całkowicie legalne (w rzeczywistości robi się to za każdym razem, gdy ktoś pisze, powiedzmy, wywołanie funkcji).
Tim Čas
2

Nie jestem informatykiem, ale byłbym raczej zdziwiony, gdyby słowa „bez typu” były rzeczywiście używane jako synonim „dynamicznie typowane” w społeczności CS (przynajmniej w publikacjach naukowych), ponieważ imho te dwa terminy opisują różne pojęcia. Język z typami dynamicznymi ma pojęcie typów i wymusza ograniczenia typu w czasie wykonywania (nie można na przykład podzielić liczby całkowitej przez ciąg w Lisp bez otrzymywania błędu), podczas gdy język bez typu nie ma żadnego pojęcia typów w wszystko (np. asembler). Nawet artykuł Wikipedii o językach programowania (http://en.m.wikipedia.org/wiki/Programming_language#Typed_versus_untyped_languages) czyni to rozróżnienie.

Aktualizacja: Może zamieszanie wynika z faktu, że niektóre teksty mówią coś do tego stopnia, że ​​„zmienne nie są wpisywane” w JavaScript (co jest prawdą). Ale to nie oznacza automatycznie, że język jest bez typu (co byłoby fałszywe).

afrischke
źródło
1
Asembler ma bardzo słabe pojęcie o typach. Przynajmniej w x86 wszystko jest liczbą całkowitą, ale niektóre liczby całkowite mają inny rozmiar niż inne. To jeszcze przed wejściem do MMX, x87 i innych rozszerzeń oryginalnej specyfikacji x86.
Adam Mihalcin
Muszę się nie zgodzić. 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ą być zaprojektowane do działania tylko na „Ludziach”, inne tylko na „Małpach” oraz 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 („dynamiczny”). To kwestia logicznej integralności - a jedynym błędem byłoby użycie czegoś, co nie ma broni z tą metodą.
Steve
@Adam Mihalcin True. Języki asemblera [makro] mogą oczywiście mieć pewne pojęcie typów w różnym stopniu. (Sprawdź na przykład „Typed Assembly Language”). Nadal jednak uważam, że mój punkt widzenia jest prawdziwy.
afrischke
3
@Steve Nie jestem pewien, czy mogę Cię śledzić. W PO zapytano, czy w kręgach CS nie ma rozróżnienia na „dynamicznie wpisywane” i „bez typu”. Nie ma to nic wspólnego z tym, czy wierzysz, że praktycznie nie ma różnicy między tym, jak JavaScript i asemblacja traktują bity w pamięci. Zgodnie z tym, co przeczytałem (i musiałem to sprawdzić, ponieważ nie jestem programistą Javascript): Standard ECMAScript / Javascript definiuje 6 typów danych (Boolean, String, Undefined, Number, Null i Object) iw dowolnym momencie z czasem wartość jest jednego konkretnego typu ...
afrischke
1
... To jest koncepcja, której (większość) języków asemblera nie ma (wszystko, co jest, to bity i bajty), więc imho to oznacza wyraźne rozróżnienie między Javascriptem a assemblerem.
afrischke
1

Zgadzam się z Brendanem - kontekst jest wszystkim.

Moje podanie:

Pamiętam, że byłem zdezorientowany około 2004 roku, ponieważ pojawiły się kłótnie dotyczące tego, czy Ruby nie był typowany, czy dynamicznie wpisywany. Ludzie ze starej szkoły C / C ++ (których byłem jednym z nich) myśleli o kompilatorze i mówili, że Ruby nie ma typu.

Pamiętaj, że w języku C nie ma typów środowiska uruchomieniowego, są tylko adresy i jeśli wykonywany kod zdecyduje się traktować wszystko, co znajduje się pod tym adresem, jako coś, czego nie ma, to ups. To zdecydowanie nietypowe i bardzo różni się od dynamicznie wpisywanego.

W tym świecie „pisanie” dotyczy tylko kompilatora. C ++ miał „mocne typowanie”, ponieważ testy kompilatora były bardziej rygorystyczne. Java i C były bardziej „słabo typowane” (pojawiły się nawet spory o to, czy Java jest napisana silnie, czy słabo). Języki dynamiczne były w tym kontinuum „bez typu”, ponieważ nie miały sprawdzania typu kompilatora.

Dzisiaj, dla praktykujących programistów, jesteśmy tak przyzwyczajeni do języków dynamicznych, że oczywiście myślimy o braku typu, który oznacza brak kompilatora lub sprawdzania typu interpretera, co byłoby niesamowicie trudne do debugowania. Ale był tam okres, w którym nie było to oczywiste, aw bardziej teoretycznym świecie CS może nawet nie mieć znaczenia.

W pewnym sensie nic nie może być pozbawione typu (lub prawie nic, w każdym razie), ponieważ musisz mieć zamiar manipulowania wartością, aby napisać sensowny algorytm. To świat teoretycznego CS, który nie zajmuje się szczegółami implementacji kompilatora lub interpretera dla danego języka. Więc „bez typu” jest (prawdopodobnie nie wiem) całkowicie bez znaczenia w tym kontekście.

Dan Yoder
źródło