Означает ли" нетипизированный "также" динамически типизированный " в академическом мире CS?


Я читаю слайд-Деку, в которой говорится: "JavaScript нетипизирован."Это противоречит тому, что я думал, чтобы быть правдой, поэтому я начал копать, чтобы попытаться узнать больше.

каждый ответ является ли JavaScript нетипизированным языком? говорит, что JavaScript не нетипизированные и предлагаемые примеры различных форм статического, динамического, сильного и слабого ввода, с которыми я знаком и доволен.. так что это был не тот путь.

поэтому я спросил Брендана Эйха, создателя в JavaScript, и он сказал:

академические типы используют "нетипизированные", чтобы означать"нет статических типов". они достаточно умны, чтобы видеть, что значения имеют типы (дух!). контекст имеет значение.

используют ли академически ориентированные компьютерные науки "нетипизированные "как синоним" динамически типизированных " (и это действительно?) или есть что-то более глубокое в этом, что мне не хватает? Я согласен с Бренданом, что контекст важен, но любые цитаты объяснений были бы замечательными, как мои текущие" go to " книги не играют в мяч на эту тему.

Я хочу прибить это, чтобы я мог улучшить свое понимание и потому, что даже Википедия не относится к этому альтернативному использованию (что я могу найти, во всяком случае). Я не хочу испортить ни использование термина, ни вопрос об использовании термина в будущем, если я ошибаюсь : -)

(Я также видел, как топ Smalltalker говорит, что Smalltalk тоже "нетипизирован", поэтому это не одноразовый, что и заставило меня отправиться в этот квест! : -))

9 158

9 ответов:

Да, это стандартная практика в научной литературе. Чтобы понять это, полезно знать, что понятие "тип" было изобретено в 1930-х годах в контексте лямбда-исчисления (фактически, еще раньше, в контексте теории множеств). С тех пор появилась целая отрасль вычислительной логики, которая известна как "теория типов". Теория языка программирования основана на этих основах. И во всех этих математических контекстах, "тип" имеет особый, устоявшийся значение.

термин " динамическая типизация "был изобретен гораздо позже-и это противоречие в терминах перед лицом общего математического использования слова"тип".

например, вот определение "системы типов", которое Бенджамин Пирс использует в своем стандартном учебнике типы и языки программирования:

система типов является сговорчивым синтаксическим методом для доказательства отсутствия определенной программы поведение путем классификации фраз в соответствии с виды значений, которые они вычисляют.

Он также замечает:

слово "статический" иногда добавляется явно--мы говорим о a "статически типизированный язык программирования", например-чтобы отличить виды анализа времени компиляции, которые мы рассматриваем здесь из динамическая или скрытая типизация, найденная в таких языках, как Scheme (Sussman и Стил, 1975; Kelsey, Clinger, and Rees, 1998; Dybvig, 1996), где теги типа времени выполнения используются для различения различных видов структуры в куче. Такие термины, как" динамически типизированный", возможно misnomers и, вероятно, должны быть заменены на " динамически проверенные," но использование стандарта.

большинство людей, работающих в этой области, похоже, разделяют эту точку зрения.

эта не означает, что" нетипизированный "и" динамически типизированный " являются синонимами. Скорее, что последний является (технически вводящее в заблуждение) название для конкретного случая первого.

Я ученый-компьютерщик, специализирующийся на языках программирования, и да, слово "нетипизированный" часто (неправильно) используется таким образом. Было бы неплохо зарезервировать слово для использования с языками, которые не несут теги динамического типа, такие как Forth и assembly code, но эти языки редко используются и еще реже изучаются, и гораздо проще сказать "нетипизированный", чем "динамически типизированный".

Боб Харпер любит говорить, что такие языки, как Scheme, Javascript, и так далее следует рассматривать типизированные языки только с одним типом: value. Я склоняюсь к этой точке зрения, поскольку она позволяет построить последовательное мировоззрение, используя только один тип формализма.

P. S. В чистом лямбда-исчислении, единственные "ценности" - это термины, в нормальной форме, и только закрытые термины в нормальной форме являются функциями. Но большинство ученых, которые используют лямбда-исчисление, добавляют базовые типы и константы, а затем вы либо включаете статическую систему типов для лямбда, либо вы снова возвращаетесь к тегам динамического типа.

P. P. S. к оригинальному плакату: когда дело доходит до языков программирования, и особенно систем типов, информация в Википедии имеет низкое качество. Не доверяй ему.

Я изучил его и обнаружил, что ответ на ваш вопрос просто и удивительно "да": академические типы CS или, по крайней мере, некоторые из них используют "нетипизированный", чтобы означать "динамически типизированный". Например, языки программирования: принципы и практика, третье издание (Kenneth C. Louden and Kenneth A. Lambert, опубликованное в 2012 году) говорит следующее:

языки без статических систем типов обычно называются нетипизированных языках (или динамически типизированных языков). Такие языки включают Scheme и другие диалекты Lisp, Smalltalk и большинство языков сценариев, таких как Perl, Python и Ruby. Обратите внимание, однако, что нетипизированный язык не обязательно позволяет программам повреждать данные-это просто означает, что вся проверка безопасности выполняется во время выполнения. [...]

[ссылке] (Примечание: жирный шрифт в оригинале) и продолжает использовать "нетипизированный" именно таким образом.

Я нахожу это удивительно (во многом по тем же причинам, что дают афришке и Адам Михальчин), но вот и вы. : -)


редактировать, чтобы добавить: вы можете найти больше примеров, подключив "untyped languages" в поиск книги Google. Например:

[...] Это основной механизм сокрытия информации на многих нетипизированных языках. Например, схема PLT [4] использует генеративное structs, [...]

- Джейкоб Мэтьюз и Амаль Ахмед, 2008 [ссылке]

[...], мы представляем анализ времени привязки для нетипизированного функционального языка [...]. [ ... ] Он был реализован и используется в частичном оценщике для побочного эффекта свободного диалекта схемы. Однако анализ достаточно общий, чтобы быть справедливым для нестрогих типизированных функциональных языков, таких как Haskell. [...]

- Charles Consel, 1990 [ссылке]

кстати, мое впечатление, после просмотра эти результаты поиска состоят в том, что если исследователь пишет о "нетипизированном" функциональном языке, он, скорее всего, считает его "нетипизированным" в том же смысле, что и нетипизированное лямбда-исчисление, которое упоминает Адам Михальчин. По крайней мере, несколько исследователей упоминают схему и лямбда-исчисление на одном дыхании.

поиска не скажите, конечно, есть ли исследователи, которые отвергают это отождествление, и не рассмотрим эти языки должны быть "нетипизированными". Ну, я нашел это:

- кто-то (я не могу сказать кто), 1998 [ссылке]

но, очевидно,большинство люди, которые отвергают эту идентификацию, не будут чувствовать необходимости явно говорить так.

нетипизированные и динамически типизированные абсолютно не синонимы. Язык, который чаще всего называют "нетипизированным", - это лямбда-исчисление, которое на самом деле является языком unityped-все является функцией, поэтому мы можем статически доказать, что тип всего является функцией. Динамически типизированный язык имеет несколько типов, но не добавляет способ для компилятора статически проверять их, заставляя компилятор вставлять проверки времени выполнения для типов переменных.

тогда JavaScript-это динамически типизированный язык: можно писать программы на JavaScript такие, что некоторая переменная x может быть число, или функция, или строка, или что-то еще (и определение того, какой из них потребует решения проблемы остановки или какой-то сложной математической задачи), так что вы можете применить x к аргументу и браузер должен проверить во время выполнения, что x - Это функция.

оба утверждения верны, в зависимости от того, идет ли речь о значениях или переменных. Переменные JavaScript не имеют типов, значения JavaScript имеют типы, а переменные могут варьироваться по любому типу значения во время выполнения (т. е. "динамически").

в JavaScript и многих других языках значения, а не переменные несут типы. Все переменные могут варьироваться по всем типам значений и могут считаться "динамически типизированными" или "нетипизированными" - с точки зрения проверки типа переменной, которая не имеет / непознаваемого типа, а переменная, которая может принимать любой тип, логически и практически эквивалентна. Когда теоретики типов говорят о языках и типах, они обычно говорят об этом - переменные, несущие типы, - потому что они заинтересованы в написании контролеров типов и компиляторов и т. д., которые работают с текстом программы (т. е. переменные), а не с запущенной программой в памяти (т. е. значения).

в отличие от других языков, таких как C, переменные носить, но значения не. В такие языки, как Java, переменные и значения, несут типы. В C++ некоторые значения (с виртуальными функциями) несут типы, а другие-нет. В некоторых языках даже возможно изменение типов значений, хотя это обычно считается плохим дизайном.

этот вопрос Все о семантика

если я дам вам эту информацию: 12 что это за тип? Вы не можете знать наверняка. Может быть целым числом-может быть поплавком-может быть строкой. В этом смысле это очень много "нетипизированных" данных.

если я дам вам воображаемый язык, который позволяет использовать такие операторы, как "добавить", "вычесть" и "объединить" на этих данных и некоторых других произвольных фрагментах данных, " тип " несколько не имеет значения (для мой воображаемый язык) (пример: возможно add(12, a) доходность 109 что это 12 плюс значение ascii a).

давайте поговорим C на секунду. C в значительной степени позволяет вам делать все, что вы хотите с любым произвольным фрагментом данных. Если вы используете функцию, которая принимает два uints-Вы можете бросить и передать все, что хотите - и значения будут просто интерпретироваться как uintы. В этом смысле З.-Это "нетипизированные" (если рассматривать его таким образом).

- и переходя к точке Брендана-если бы я сказал вам ,что " мой возраст 12" - тогда 12 имеет тип - по крайней мере, мы знаем, что он числовой. в контексте все тип - независимо от языка.

вот почему я сказал в самом начале - ваш вопрос является одним из семантики. Что означает "нетипизированный"? Я думаю, Брендан попал в точку, когда сказал "Нет статических типов" - потому что это все, что это может означать. Люди естественным образом классифицируют вещи по типам. Мы интуитивно знаем, что между автомобилем и обезьяной есть нечто принципиально иное - и нас никогда не учили делать эти различия.

возвращаясь к моему примеру в начале-язык, который "не заботится о типах" (per-se), может позволить вам "добавить" "возраст" и "имя" без создания синтаксической ошибки... но это не значит, что это логически обоснованная операция.

Javascript может позволить вам делать всевозможные сумасшедшие вещи, не рассматривая их "ошибки." Это не значит, что то, что вы делаете, логически обоснованно. Это для разработчика, чтобы работать.

является ли система / язык, который не обеспечивает безопасность типов во время компиляции/сборки/интерпретации "нетипизированным" или "динамически типизированным"?

семантика.

EDIT

Я хотел добавить что-то здесь, потому что некоторые люди, похоже, догоняют "да, но у Javascript есть некоторые "типы"".

в моем комментировать чужой ответ, я сказал:

в Javascript у меня могут быть объекты, которые я создал, чтобы быть "обезьянами", и объекты, которые я создал, чтобы быть "людьми", и некоторые функции могут быть разработаны для работы только с "людьми", другие-только с "обезьянами", а третьи-только с "вещами с руками". Независимо от того, было ли когда-либо сказано, что существует такая категория объектов, как "вещи с оружием", так же не имеет отношения к сборке ("нетипизированной"), как и к Javascript ("динамической"). Это все вопрос логической целостности-и единственной ошибкой было бы использование чего-то, что не имело оружия с этим методом.

выполнить ту же операцию с C#, для например, мне нужен интерфейс под названием ICreatureWithArms или что-то подобное. Не так в Javascript - не так в C или ASM.

ясно, имеет ли Javascript какое-либо понимание "типов" вообще не имеет значения.

Я не компьютерный ученый, но я был бы весьма удивлен, если бы "нетипизированные" действительно использовались в качестве синонима для "динамически типизированных" в сообществе CS (по крайней мере, в научных публикациях), поскольку imho эти два термина описывают разные понятия. Динамически типизированный язык имеет понятие типов, и он применяет ограничения типа во время выполнения (вы не можете, например, разделить целое число на строку в Lisp без получения ошибки), в то время как нетипизированный язык не имеет никакого понятия о типах все (например, ассемблер). Даже статья Википедии О языках программирования (http://en.m.wikipedia.org/wiki/Programming_language#Typed_versus_untyped_languages) делает это различие.

Update: возможно, путаница возникает из-за того, что некоторые тексты говорят что-то до такой степени, что "переменные не набираются" в Javascript (что верно). Но это не означает автоматически, что язык нетипизирован (что было бы ложным).

согласен с Бренданом - контекст-это все.

мое мнение:

Я помню, что был смущен, около 2004 года, потому что были споры о том, был ли Ruby нетипизирован или динамически типизирован. Люди старой школы C / C++ (из которых я был одним) думали о компиляторе и говорили, что Ruby был нетипизирован.

помните, что в C нет типов времени выполнения, есть только адреса, и если код, который выполняется, решает обработать все, что есть обращайтесь как - то не так, упс. Это определенно нетипизировано и очень отличается от динамически типизированного.

в этом мире "типизация" - это все о компиляторе. C++ имел "сильную типизацию", потому что проверки компилятора были более строгими. Java и C были более "слабо типизированы" (были даже аргументы о том, была ли Java сильно или слабо типизирована). Динамические языки в этом континууме были "нетипизированными", потому что у них не было проверки типа компилятора.

сегодня, для практикующие программисты, мы настолько привыкли к динамическим языкам, что мы, очевидно, думаем о нетипизированном, чтобы не иметь компилятора или проверки типа интерпретатора, что было бы безумно трудно отлаживать. Но там был период, когда это было не очевидно, и в более теоретическом мире CS может даже не иметь смысла.

в некотором глубоком смысле ничто не может быть нетипизировано (или почти ничего, во всяком случае), потому что у вас должно быть какое-то намерение манипулировать значением, чтобы написать значимый алгоритм. Это мир теоретического CS, который не имеет дело со спецификой того, как компилятор или интерпретатор реализуется для данного языка. Поэтому "нетипизированный" (вероятно, я не знаю) совершенно бессмыслен в этом контексте.

хотя верно, что большинство исследователей CS, которые пишут о типах, по существу рассматривают только языки с синтаксически выводимыми типами в качестве типизированных языков, есть намного больше из нас, использующих динамически/латентно типизированные языки, которые обижаются на это использование.

Я считаю, что существует 3 типа [SIC] языков:

Untyped - только оператор определяет интерпретацию значения-и он обычно работает на что угодно. Примеры: Ассемблер, Не нуждающийся в представлении

статически типизированные-выражения / переменные имеют типы, связанные с ними, и этот тип определяет интерпретацию/валидность оператора во время компиляции. Примеры: C, Java, C++, ML, Haskell

динамически типизированные-значения имеют типы, связанные с ними, и этот тип определяет интерпретацию/валидность оператора во время выполнения. Примеры: LISP, Scheme, Smalltalk, Ruby, Python, Javascript

насколько мне известно, все динамически типизированные языки являются типобезопасными-т. е. только действительные операторы могут работать со значениями. Но то же самое не верно для статически типизированного языка. В зависимости от мощности используемой системы типа некоторые операторы могут проверяться только во время выполнения или не проверяться вообще. Например, большинство статически типизированных языков не обрабатывают переполнение целых чисел должным образом (добавление 2 положительных целых чисел может привести к отрицательному целому числу), а ссылки на несвязанные массивы либо не проверяются вообще (C, C++), либо проверяются только во время выполнения. Кроме того, некоторые системы типов настолько слабы, что полезное программирование требует escape-люков (приведений в C и family) для изменения типа выражений во время компиляции.

все это приводит к абсурдным утверждениям, например, что C++ безопаснее Python, потому что он (статически типизированный), тогда как правда в том, что Python является внутренне безопасным, пока вы можете снимать ногу с C++.