Czy "untyped" oznacza również "dynamicznie pisane" w Akademickim świecie CS?

Czytam slide deck, który stwierdza " JavaScript nie jest typowany."To zaprzeczyło temu, co uważałem za prawdę, więc zacząłem kopać, aby spróbować dowiedzieć się więcej.

Każda odpowiedź na czy JavaScript jest językiem nietypowym? mówi, że JavaScript jest a nie nieopisany i oferuje przykłady różnych form statycznego, dynamicznego, silnego i słabego pisania, które znam i jestem zadowolony.. więc to nie była droga.

Więc zapytałem Brendana Eich, twórcę JavaScript, i on powiedział:

Typy akademickie używają "untyped", aby oznaczać "brak typów statycznych". są na tyle inteligentni, że widzą, że wartości mają typy (duh!). kontekst ma znaczenie.

Czy akademiccy informatycy używają słowa "untyped" jako synonimu "dynamicznie wpisywanego" (i czy to jest poprawne?) a może jest w tym coś głębszego, czego mi brakuje? Zgadzam się z Brendanem, że kontekst jest ważny, ale wszelkie cytaty wyjaśnień byłyby świetne, ponieważ moje obecne książki" idź do " nie grają w piłkę na ten temat.

Chcę to przygwoździć, abym mógł poprawić swoje zrozumienie i ponieważ nawet Wikipedia nie odnosi się do tego alternatywnego użycia(które i tak mogę znaleźć). Nie chcę mieszać ani z używaniem terminu, ani kwestionować jego użycie w przyszłości, jeśli się mylę: -)

(widziałem też topowego Smalltalkera, który twierdzi, że Smalltalk też jest "nietypowany", więc nie jest to jednorazowy,co mnie zainspirowało do tego zadania! :-))

Author: Community, 2012-02-06

9 answers

Tak, to standardowa praktyka w literaturze akademickiej. Aby to zrozumieć, warto wiedzieć, że pojęcie "typu" zostało wynalezione w latach 30. w kontekście rachunku lambda (w rzeczywistości, jeszcze wcześniej, w kontekście teorii mnogości). Od tego czasu pojawiła się cała gałąź logiki obliczeniowej, która jest znana jako "teoria typów". Teoria języka programowania opiera się na tych fundamentach. I we wszystkich tych matematycznych kontekstach "typ" ma szczególne, ugruntowane znaczenie.

The terminologia "typowanie dynamiczne" została wymyślona znacznie później - i jest to sprzeczność w kategoriach 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 tractable metodą składniową do udowodnienia braku niektórych zachowań programu, klasyfikując frazy według rodzaje wartości, które obliczają.

On również uwagi:

Słowo "static" jest czasami dodawane wprost-mówimy o "statycznie pisany język programowania", na przykład-aby odróżnić rodzaje analiz czasu kompilacji, które rozważamy tutaj z dynamiczne lub utajone typowanie występujące w językach takich jak Scheme (Sussman i Steele, 1975; Kelsey, Clinger, and Rees, 1998; Dybvig, 1996), gdzie znaczniki typu run-time są używane do rozróżniania różnych rodzajów struktury w stercie. Terminy takie jak "dynamicznie pisane" są zapewne błędnych i powinny być prawdopodobnie zastąpione przez " dynamicznie sprawdzane," ale użycie jest standardowe.

Większość ludzi pracujących w terenie wydaje się dzielić ten punkt widzenia.

Zauważ, że nie oznacza to , a nie, że synonimy "untyped" i "Dynamic typed" są synonimami. Raczej, że ta ostatnia jest (technicznie myląca) nazwą dla konkretnego przypadku tej pierwszej.

PS: A FWIW, tak się składa, że jestem zarówno badacz akademicki w systemach typu, jak i nieakademicki realizator JavaScript, więc muszę żyć z schismą. :)

 139
Author: Andreas Rossberg,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-04-12 16:25:44

Jestem akademickim informatykiem specjalizującym się w językach programowania, i tak, słowo "untyped" jest często (błędnie) używane w ten sposób. Byłoby miło zarezerwować słowo do użycia w językach, które nie mają dynamicznych znaczników typu, takich jak Forth i Kod asemblacji, ale te języki są rzadko używane i jeszcze rzadziej badane, a o wiele łatwiej jest powiedzieć "nietypowane" niż "dynamicznie wpisane".

Bob Harper lubi mówić, że języki takie jak Scheme, Javascript i tak dalej należy traktować języki typowane tylko z jedną wartością type:. Skłaniam się ku temu poglądowi, ponieważ umożliwia on konstruowanie spójnego światopoglądu za pomocą tylko jednego typu formalizmu.

P. S. w rachunku lambda jedynymi "wartościami" są terminy w postaci normalnej, a jedynymi zamkniętymi pojęciami w postaci normalnej są funkcje. Ale większość naukowców, którzy używają rachunku lambda dodać typy bazowe i stałe, a następnie albo włączyć STATYCZNY system typów dla lambda lub jesteś z powrotem do dynamiczne znaczniki typu.

P. P. S. do oryginalnego plakatu: jeśli chodzi o języki programowania, a zwłaszcza systemy typów, informacje na Wikipedii są niskiej jakości. Nie ufaj mu.

 62
Author: Norman Ramsey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-02-07 18:54:20

Przyjrzałem się temu i odkryłem, że odpowiedź na twoje pytanie jest po prostu, i zaskakująco, "tak": akademickie typy CS, a przynajmniej niektóre z nich, używają "untyped", aby oznaczać"dynamicznie wpisywane". Na przykład Programming Languages: Principles and Practices , Third Edition (by Kenneth C. Louden and Kenneth A. Lambert, published 2012) mówi Tak:

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

[link ] (Uwaga: pogrubienie w oryginale) i dalej używa "untyped" właśnie w ten sposób.

Uważam to za zaskakujące (z tych samych powodów, które afrischke i Adam Mihalcin dają), ale tu jesteś. :-)


Aby dodać: Możesz znaleźć więcej przykładów, podłączając "untyped languages" do wyszukiwarki Google Book Search. Na przykład:

[ ... ] jest to podstawowy mechanizm ukrywania informacji w wielu nieopisanych językach. Na przykład schemat PLT [4] wykorzystuje generatywne struct s, [ ... ]

- Jacob Matthews i Amal Ahmed, 2008 [link]

[[2]} [...], przedstawiamy analizę czasu wiązania dla nieopisanej funkcjonalności język [ ... ]. [...] Został zaimplementowany i jest używany w częściowym ewaluatorze dla efektu ubocznego wolnego od schematów [ ... ] Analiza ta jest jednak na tyle ogólna, aby była ważna dla niestandardowych typowanych języków funkcyjnych, takich jak Haskell. […]

- Charles Consel, 1990 [link ]

Nawiasem mówiąc, moje wrażenie, po przejrzeniu tych wyników wyszukiwania, jest to, że jeśli badacz pisze o" nietypowanym "języku funkcyjnym, (s)bardzo prawdopodobnie uważa go za" nietypowany " w ten sam sens co nietryfikowany rachunek lambda, o którym wspomina Adam Mihalcin. Przynajmniej kilku badaczy wspomina schemat i rachunek lambda w tym samym oddechu.

Co poszukiwania nie mówią, oczywiście, czy są badacze, którzy odrzucają tę identyfikację inie uważają tych języków za "nietypowane". Cóż, znalazłem to:

Potem zdałem sobie sprawę, że naprawdę nie ma kolistości, ponieważ dynamicznie pisane języki nie są nietypowane języki - chodzi o to, że typy nie są zwykle od razu oczywiste z tekstu programu.

- someone (I can ' t tell who), 1998 [link ]

Ale oczywiściewiększość ludzi, którzy odrzucają tę identyfikację, nie czułaby potrzeby wyraźnego mówienia tego.

 40
Author: ruakh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-02-06 04:18:21

Nieopisane i dynamicznie pisane nie są absolutnie synonimami. Językiem, który jest najczęściej nazywany "untyped" jest rachunek Lambda, który jest w rzeczywistości językiem unityped-wszystko jest funkcją, więc możemy statycznie udowodnić, że typ wszystkiego jest funkcją. Dynamicznie typowany język ma wiele typów, ale nie dodaje sposobu, aby kompilator sprawdzał je statycznie, zmuszając kompilator do wstawiania kontroli runtime typów zmiennych.

Wtedy JavaScript jest język pisany dynamicznie: możliwe jest pisanie programów w JavaScript tak, że jakaś zmienna x może być liczbą, funkcją, łańcuchem znaków lub czymś innym (i określenie, które z nich wymagałoby rozwiązania problemu zatrzymania lub jakiegoś trudnego problemu matematycznego), więc można zastosować x do argumentu i przeglądarka musi sprawdzić w czasie wykonywania, że x Jest funkcją.

 7
Author: Adam Mihalcin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-02-06 01:12:19

Oba polecenia są poprawne, w zależności od tego, czy mówimy o wartościach czy zmiennych. Zmienne JavaScript nie są typowane, wartości JavaScript mają typy, A zmienne mogą wahać się nad dowolnym typem wartości w czasie wykonywania (np.'dynamicznie').

W JavaScript i wielu innych językach wartości, a nie zmienne zawierają typy. Wszystkie zmienne mogą obejmować wszystkie typy wartości i mogą być uważane za "wpisywane dynamicznie "lub" nietypowane " - z punktu widzenia sprawdzania typu zmiennej, która ma Typ no / unknowable i zmienna, która może przyjąć dowolny typ, są logicznie i praktycznie równoważne. Kiedy teoretycy typów mówią o językach i typach, zwykle mówią o tym-zmiennych niosących typy-ponieważ są zainteresowani pisaniem sprawdzaczy typów i kompilatorów itd., które operują na tekście programu (np. zmiennych), a nie uruchomionym programie w pamięci (np. wartości).

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

 4
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-02-06 12:58:59

To pytanie dotyczy semantyki

Jeśli podam ci te dane: 12 jaki jest typ? Nie masz pewności. Może być liczbą całkowitą-może być zmiennoprzecinkową - może być łańcuchem znaków. W tym sensie są to bardzo "nieprzepisane" dane.

Jeśli dam ci wyimaginowany język, który pozwala używać operatorów takich jak" Dodaj"," odejmuj "i" konkatenuj "na tych danych i innych dowolnych danych, "typ" jest nieco nieistotny (dla mojego wyimaginowanego języka) (przykład: być może add(12, a) daje 109, które jest 12 plus wartość ascii a).

Porozmawiajmy przez chwilę o C. C w zasadzie pozwala Ci robić, co chcesz, z dowolnymi dowolnymi danymi. Jeśli używasz funkcji, która zajmuje dwa uint s - możesz rzucić i przekazać wszystko, co chcesz - a wartości będą po prostu interpretowane jako uints. W tym sensie C jest "nietypowane" (jeśli traktujesz to w taki sposób).

Jednakże-i dochodząc do sedna sprawy-jeśli powiem ci, że " mój wiek jest 12 " - wtedy 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 jest jednym z semantyki. Jakie jest Znaczenie słowa "Nietykalni"? Myślę, że Brendan uderzył w głowę, kiedy powiedział "żadnych typów statycznych" - bo to wszystko może oznaczać. Ludzie naturalnie klasyfikują rzeczy do typów. Intuicyjnie wiemy, że między samochód i małpa-nigdy nie uczono ich rozróżniania.

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" nazwę " bez powodowania błędu składni... ale to nie znaczy, że to logiczna operacja.

Javascript może pozwolić ci robić różnego rodzaju szalone rzeczy bez uwzględniania ich "błędów". To nie znaczy, że to, co robisz, jest logiczne. To dla dewelopera ćwiczyć.

Czy system / język, który nie wymusza bezpieczeństwa typu w czasie kompilacji / budowania/interpretacji, jest "nietypowany" lub "typowany dynamicznie"?

Semantyka.

EDIT

Chciałem dodać coś tutaj, ponieważ niektórzy ludzie wydają się być coraz dogonić "tak, ale Javascript ma pewne "typy"".

W komentarzu do czyjejś odpowiedzi powiedziałem:

W Javascript mogę mieć obiekty, które zbudowałem jako "Małpy" i obiekty, które zbudowałem, to "ludzie", a niektóre funkcje mogą być zaprojektowane tak, aby działały tylko na" ludziach", inne tylko na" małpach", a jeszcze inne tylko na"rzeczach z bronią". To, czy język kiedykolwiek został poinformowany, że istnieje taka kategoria obiektów jak "rzeczy z bronią", jest tak samo nieistotne dla assembly ("untyped"), jak dla Javascript ("dynamic"). To wszystko kwestia logicznej integralności - a jedynym błędem byłoby użycie czegoś, co nie ma broni w tej metodzie.

Tak więc, jeśli uważasz, że Javascript ma jakieś" 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 się od systemu nietypowanego" - powinieneś zobaczyć z powyższego przykładu, że każde "pojęcie typów" ma wewnętrznie jest naprawdę nieistotne.

Aby wykonać tę samą operację z C#, na przykład, potrzebuję interfejsu o nazwie ICreatureWithArms lub czegoś podobnego. Nie tak w Javascript - nie tak w C lub ASM.

Wyraźnie, to, czy Javascript ma jakiekolwiek pojęcie o "typach", nie ma znaczenia.

 2
Author: Steve,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-02-06 01:22:11

Nie jestem informatykiem, ale byłabym raczej zaskoczona, gdyby w społeczności CS 'a (przynajmniej w publikacjach naukowych) słowo" untyped "było używane jako synonim" dynamicznie wpisywanego", ponieważ imho te dwa terminy opisują różne pojęcia. Dynamicznie typowany język ma pojęcie typów i wymusza ograniczenia typów w czasie wykonywania (nie można na przykład podzielić liczby całkowitej przez ciąg znaków w Lispie bez uzyskania błędu), podczas gdy nietypowany język nie ma pojęcia typów w wszystkie (np. asembler). Nawet artykuł na Wikipedii O językach programowania (http://en.m.wikipedia.org/wiki/Programming_language#Typed_versus_untyped_languages) czyni to rozróżnienie.

Update: być może zamieszanie wynika z faktu, że niektóre teksty mówią coś w takim stopniu ,że "zmienne nie są wpisywane" w Javascript (co jest prawdą). Ale to nie oznacza automatycznie, że język jest nietypowany (co byłoby fałszywe).

 1
Author: afrischke,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-02-06 02:34:58

Zgadzam się z Brendanem-kontekst jest wszystkim.

Moje ujęcie:

Pamiętam, że byłem zdezorientowany, około 2004 roku, ponieważ pojawiły się argumenty na temat tego, czy Ruby nie był typowany czy dynamicznie. Ludzie starej szkoły C / c++ (z których byłem jednym) myśleli o kompilatorze i mówili, że Ruby nie jest typowany.

Pamiętaj, że w C nie ma typów runtime, są tylko adresy i jeśli kod, który jest wykonywany, zdecyduje się traktować to, co jest pod tym adresem jako coś, to nie jest, UPS. To zdecydowanie nie jest typowane i bardzo różni się od dynamicznie wpisywanych.

W tym świecie "typowanie" polega na kompilatorze. C++ miał "silne typowanie", ponieważ kontrole kompilatora były bardziej rygorystyczne. Java i C były bardziej "słabo pisane" (były nawet argumenty o tym, czy Java była mocno czy słabo pisana). Języki dynamiczne były, w tym kontinuum, "nietypowane", ponieważ nie miały sprawdzania typu kompilatora.

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

W jakimś głębokim sensie, nic nie może być nieopisane (lub prawie nic, w każdym razie), ponieważ musisz mieć jakiś zamiar manipulowania wartością, aby napisać znaczący algorytm. To jest świat teoretycznego CS, który nie zajmuje się ze specyfiką implementacji kompilatora lub interpretera dla danego języka. Więc "untyped" jest (prawdopodobnie, Nie wiem) całkowicie bez znaczenia w tym kontekście.

 1
Author: Dan Yoder,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-02-06 04:43:44

Chociaż prawdą jest, że większość badaczy CS, którzy piszą o typach, zasadniczo uważa tylko języki z typami składnikowymi za języki typowane, jest o wiele więcej z nas, którzy używają dynamicznie / latentnie wpisywanych języków, którzy przyjmują obrażenia w tym użyciu.

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

Untyped - tylko operator decyduje o interpretacji wartości - i generalnie działa na wszystkim. Przykłady: Asembler, BCPL

Statycznie wpisane-wyrażenia / zmienne mają typy powiązane z nimi, a ten typ określa interpretację / Ważność operatora w czasie kompilacji. Przykłady: C, Java, C++, ML, Haskell

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

Według mojej wiedzy wszystkie dynamicznie pisane języki są type - safe-tzn. tylko poprawne operatory mogą operować na wartościach. Ale to samo nie dotyczy języka statycznie wpisanego. W zależności od mocy zastosowanego systemu typu, niektóre operatory mogą być sprawdzane tylko w czasie pracy, lub wcale. Na przykład, większość języków typowanych statycznie nie obsługuje poprawnie przepełnienia liczb całkowitych (dodanie 2 dodatnich liczb całkowitych może wytworzyć ujemną liczbę całkowitą), A odwołania do tablicy nie są sprawdzane w ogóle (C, C++) lub są sprawdzane tylko w czasie wykonywania. Ponadto niektóre systemy typów są tak słabe, że użyteczne programowanie wymaga Luków escape (W C i rodzinie) do zmiany typu wyrażeń w czasie kompilacji.

Wszystko to prowadzi do absurdalnych twierdzeń, takich jak to, że C++ jest bezpieczniejszy niż Python, ponieważ jest (statycznie wpisywany), podczas gdy prawda jest taka, że Python jest z natury bezpieczny, podczas gdy można odstrzelić nogę z C++.

 1
Author: Dave Mason,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-01-31 20:22:31