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

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

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

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

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

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

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

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


person Peter Cooper    schedule 06.02.2012    source источник
comment
Неправильное использование терминологии другими людьми не должно формировать ваши привычки - просто используйте (более) правильную фразу. Очевидно, вы должны знать о проблеме для чтения.   -  person Raphael    schedule 06.02.2012
comment
Я всегда считал, что переменные нетипизированы, так как любая переменная может содержать данные любого типа. Тип того, что находится в переменной, может меняться динамически.   -  person Izkata    schedule 06.02.2012
comment
en.wikipedia.org/wiki/Type_system   -  person noobninja    schedule 05.06.2016
comment
Также (снова говоря о естественном языке, чем о компьютерных языках) нетипизированный = однотипный (один тип для всех значений).   -  person philipxy    schedule 15.10.2016


Ответы (9)


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

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

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

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

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

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

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

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

PS: И, FWIW, я одновременно являюсь академическим исследователем систем типов и неакадемическим разработчиком JavaScript, поэтому мне приходится жить с расколом. :)

person Andreas Rossberg    schedule 06.02.2012
comment
Это очень полезно и, возможно, даже мой любимый ответ с точки зрения того, что он дает некоторую историю. - person Peter Cooper; 07.02.2012
comment
@PeterCooper Кстати, вам может быть интересно узнать, что одна из основных ветвей формальной семантики основана (каламбур) на типизированных лямбда-исчислениях; например Семантика Монтегю. Но как декларативная, не генерирующая система, я лично всегда отделял набор текста в таких системах, как Montague Semantics, от набора текста на языках программирования. - person knowtheory; 09.02.2012
comment
Это не совсем верно в отношении истории типов. Они даже старше, чем работы Черча по лямбда-исчислению. Рассел использовал типы, чтобы избежать парадоксов при построении теории множеств. - person Sam Tobin-Hochstadt; 12.04.2013
comment
@ SamTobin-Hochstadt, да, верно. Я рассказал только о той части истории, которая непосредственно касается основ ЛП. Я уточню. - person Andreas Rossberg; 12.04.2013
comment
Я не совсем понимаю, почему выражение «динамически типизировано» здесь неверно. Конечно, он динамически проверяется во время выполнения, но он также динамически типизируется. Переменная x (в JS) может быть помечена как число, а затем помечена как строка. Почему термин «динамически типизированный» не является хорошим описателем такого поведения? Это потому, что x - это всего лишь ссылка на что-то, что может быть либо числом, либо строкой? И что средство проверки типов проверяет те вещи, на которые есть ссылки, а не сам x? А что сам х не набирается? Ооо ... Думаю, я понял. - person Yousif Al-Y; 13.07.2015

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

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

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

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

person Norman Ramsey    schedule 06.02.2012
comment
Я думаю, что в CS (включая академические круги) существует более широкая проблема, заключающаяся в том, что имена используются без строгого определения. Это резко контрастирует с математикой и (большинством?) Науками. Огромное количество споров (например, по поводу ООП), кажется, происходит из-за отсутствия правильных определений. Очень назойливый. - person Konrad Rudolph; 06.02.2012
comment
@KonradRudolph: Интересно, может ли отсутствие правильных определений возникать отчасти из-за споров, а не из-за отсутствия правильных определений. Некоторые термины приобретают эмоциональную валентность (положительную или отрицательную), и сторонники конкретных языков затем определяют эти термины таким образом, чтобы включать или исключать их языки (и исключают или включают их любимые враждебные языки). В качестве математического примера - если бы еще были люди, поддерживающие наивную теорию множеств вместо аксиоматической теории множеств, вы можете быть уверены, что они назвали бы свои собственные взгляды аксиоматической теорией множеств и определили бы наивную теорию множеств. - person ruakh; 06.02.2012
comment
теория множеств в некотором более узком смысле, исключающая самих себя. - person ruakh; 06.02.2012
comment
@Norman, я удивлен, что вы назвали это неправильным использованием - как вы знаете, понятие типа предшествует так называемым динамически типизированным языкам на десятилетия, и то, что последний вызывает тип, имеет мало общего с первым. Так что я думаю, будет справедливо сказать, что неправильное использование - это наоборот. - person Andreas Rossberg; 06.02.2012
comment
типы: диапазон значений, приемлемых по определению (int от 2 147 483 647 до -2 147 483 648). Тип в объектно-ориентированном понимании также может быть композицией или модификацией ранее определенного типа. Таким образом, тип в некоторой степени доступен во всех языковых системах. Я перефразирую определение типа Криса Дейта. - person Josh Robinson; 07.02.2012
comment
@Norman: Когда дело доходит до языков программирования и особенно систем типов, если вы чувствуете, что информация в Википедии низкого качества, не оставляйте ее в покое и улучшайте ее. (просто троллинг) - person Gyom; 08.02.2012
comment
@Gyom Я отказался от улучшения Википедии в тот день, когда понял, что процесс Википедии вознаграждает изменение, а не экспертизу. Мое время лучше потратить на улучшение ТАК :-) - person Norman Ramsey; 10.02.2012
comment
@KonradRudolph, это очень обширная проблема в информатике - вещи, как правило, получают названия до того, как мы их понимаем. Один из моих любимых примеров - компилятор. И моя любимая структура данных называется хеш, таблица, словарь, ассоциативный массив и, возможно, еще кое-что, что я сейчас не могу вспомнить. Я научился с этим жить. - person Norman Ramsey; 10.02.2012
comment
@NormanRamsey: ..и добро пожаловать! (спасибо за эту интересную точку зрения на WP. Теперь мне нужно подумать об этом!) - person Gyom; 10.02.2012
comment
@NormanRamsey (Привет, профессор Рэмси! CS152 был великолепен. Взгляните на здесь, если у вас будет возможность?) - это старое, но как вы думаете, то, что вы сказали о WP, совпадает с тем, что любой академический эксперт в какой-либо области сказал бы о статьях в своей области знаний, или PL штука объективно хуже? - person Stephen Lin; 01.03.2013
comment
@StephenLin Я считаю, что PL объективно хуже, чем, скажем, с математикой вроде хорошо обоснованной индукции. - person Norman Ramsey; 10.03.2013
comment
@Gyom Я думаю, вы немного преувеличиваете неточность Википедии. У академических кругов есть свои проблемы ... Мудрый практик может видеть сквозь блестящие BS академических кругов и видеть мимо неточностей Википедии, чтобы лучше понять. - person Sprague; 21.11.2013
comment
За пределами академических кругов я видел, как нетипизированные используются для обозначения таких вещей, как B и сборка, как вы упомянули. Я предпочитаю это использование, и кажется, что оно распространено за пределами академических кругов (по крайней мере, когда люди говорят с любым уровнем строгости). - person CoffeeTableEspresso; 17.04.2019

Я изучил это и обнаружил, что ответ на ваш вопрос простой и удивительно «да»: академические типы CS или, по крайней мере, некоторые из них, действительно используют «нетипизированный» для обозначения «динамически типизированный». Например, в третьем издании Programming Languages: Principles and Practices (Кеннет С. Лауден и Кеннет А. Ламберт, опубликовано 2012 г.) говорится следующее:

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

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

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


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

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

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

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

Чарльз Консель, 1990 г. [ссылка]

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

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

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

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

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

person ruakh    schedule 06.02.2012
comment
Ух ты. Шокирует. Спасибо за информацию. - person afrischke; 06.02.2012
comment
Именно такую ​​цитату я искал, спасибо! Меня вроде пугает то, что книга имеет в среднем 2 звезды на Amazon, поэтому приветствуется больше цитирований, но это отличное начало. - person Peter Cooper; 06.02.2012
comment
@PeterCooper: Я отредактировал свой ответ, чтобы добавить больше цитат. Они обходят проблему с рейтингами Amazon, используя опубликованные статьи: насколько я знаю, они все еще могут быть мусором, но, по крайней мере, нам не нужно беспокоиться о том, что Amazon говорит нам об этом. :-П - person ruakh; 06.02.2012
comment
Нелогично путать нетипизированный с динамически типизированным. Разработчики не должны быть алогичными. - person rotman; 07.02.2012

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

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

person Adam Mihalcin    schedule 06.02.2012
comment
AFAIK Те же проблемы применимы к лямбда-выражению. Хотя вы можете передать функцию для моего текущего положения в функцию, которая вычисляет мое расстояние от цели, вы также можете передать ту же функцию моего текущего положения в функцию, которая вычисляет затяжки плюс с вики, лучше для вашего носа. То, что вы можете, не означает, что это действительно так - как в случае с любой динамической системой. - person Steve; 06.02.2012
comment
@Steve Мусор в вывозе мусора - дело любого языка программирования и не имеет отношения к понятию типов. Даже в строго типизированном языке, таком как OCaml или SML, я могу передать Северный полюс в функцию, которая вычисляет мое расстояние от цели (и нет, мое текущее положение не является Северным полюсом). - person Adam Mihalcin; 06.02.2012
comment
Просто хотел добавить для людей за пределами академических кругов: такие вещи, как сборка, также будут считаться нетипизированными. - person CoffeeTableEspresso; 17.04.2019
comment
Исходное лямбда-исчисление нетипизировано, поскольку в его формализмах нет ссылок на типы. Можно сформулировать систему как единую, что является допустимой точкой зрения, но исходные формулировки вообще не ссылаются на типы. - person Keith Pinson; 06.11.2020

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

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

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

person Community    schedule 06.02.2012
comment
Я думаю, что ключевое различие заключается не между значениями и переменными, а между значениями и выражениями: в языке со статической типизацией выражения имеют типы, тогда как в языке с динамической типизацией , действуют только значения. (Имена переменных, конечно, являются одним из видов выражения.) - person ruakh; 06.02.2012

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

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

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

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

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

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

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

person Dave Mason    schedule 03.08.2012
comment
Проголосовали. Приятно знать, что все языки с динамической типизацией безопасны по типу. Но то же самое не относится к языкам со статической типизацией. Вы имеете в виду, что все или большинство языков со статической типизацией являются типо-небезопасными? - person Tim; 22.09.2016
comment
Проголосовали. (1) Рад узнать, что все языки с динамической типизацией являются типобезопасными, но Javascript имеет динамическую типизацию и слабую типизацию, см. stackoverflow.com/questions/964910/. (2) Но то же самое не относится к языкам со статической типизацией. Вы имеете в виду, что все или большинство языков со статической типизацией являются типо-небезопасными? - person Tim; 22.09.2016
comment
Очень немногие языки являются статически типобезопасными, если вы включаете возможность сбоя приведения, выхода за границы нижнего индекса или исключений нулевого указателя в качестве типов (и большинство людей действительно включают по крайней мере сбой приведения в качестве ошибки типа). Rust, например, более статически типобезопасен, чем Java, потому что у вас не может быть нулевого указателя. Java является динамически типобезопасной в том смысле, что вы получаете исключения для любой недопустимой операции, и все указывается (кроме собственных методов). Аналогично Rust (за исключением обозначенного небезопасного кода). - person Dave Mason; 31.01.2017
comment
Однако C ++, C даже не являются динамически безопасными по типу, потому что в языке есть неуказанные части, и если вы выполните одну из неопределенных операций, буквально что-нибудь будет законным ответом от языка (значения несвязанные переменные могут измениться, вирусы могут заразить вашу программу, программа может записать все на ваш диск и затем дать сбой, программа может даже сделать то, что вы ожидаете :-). - person Dave Mason; 31.01.2017
comment
@ Дэйв Мейсон: Не определено. Существует огромная разница между неопределенным и неопределенным в C. Неопределенное поведение - это, по сути, незаконные действия, которые могут делать то, что вы описали, - в то время как неопределенное, по сути, означает определяемое реализацией где реализация не должна документировать это (здесь и там есть некоторые нюансы, поэтому это является упрощением). Таким образом, вызов поведения unspecified совершенно законен (фактически, это делается всякий раз, когда кто-то пишет, скажем, вызов функции). - person Tim Čas; 04.06.2017
comment
Я не согласен с приведенным утверждением, что Javascript имеет слабую типизацию. Все операции над значениями определены. Нет возможности дамп ядра. Если вы хотите узнать больше, я предлагаю this - это не идеально, но гораздо более детализировано и полно. @TimCas Вы правы, что стандарт C99 определяет неопределенное / неопределенное / определенное реализацией отдельно, но все они относятся к тому, что я называю неопределенным выше. например написание вызовов функций, зависящих от порядка оценки параметров. - person Dave Mason; 06.06.2017
comment
@DaveMason: Вы смешиваете языковую безопасность и силу печатной дисциплины. Черт, посмотри на свою чертову ссылку. - person Tim Čas; 06.06.2017

Этот вопрос касается семантики

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

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

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

Однако - и переходя к точке зрения Брендана - если я скажу вам, что «Мой возраст 12» - тогда 12 имеет тип - по крайней мере, мы знаем, что это числовой. С контекстом все имеет тип - независимо от языка.

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

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

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

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

Семантика.

ИЗМЕНИТЬ

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

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

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

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

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

Очевидно, не имеет значения, имеет ли Javascript какое-либо представление о «типах».

person Steve    schedule 06.02.2012
comment
-1. Вопрос спрашивает, используется ли определенное слово в определенных кругах с определенным значением, и ваш ответ состоит в том, чтобы объяснить, что вопрос заключается в том, имеет ли слово такое значение? На самом деле, я думаю, вы проделали замечательную работу, объяснив все, что OP, похоже, уже знает, не добавляя вообще ничего нового. . . - person ruakh; 06.02.2012
comment
Кажется, есть несколько вопросов, необходимых для построения определения, возможно? Это принудительное исполнение типов (статическое или динамическое) и наличие определенных типов. Значит, в JavaScript есть типы, но его можно считать нетипизированным из-за отсутствия проверки действительности типа перед выполнением операции? - person Peter Cooper; 06.02.2012
comment
@ruakh - я понимаю вашу точку зрения. Однако OP спросил: is there something deeper to this that I am missing и, я думаю, непонимание того, что это семантическая проблема, является более глубокой проблемой, поэтому я приложил все усилия, чтобы добавить любой лакомый кусочек, который мог. - person Steve; 06.02.2012
comment
@PeterCooper - Посмотрите мою правку и скажите, добавляет ли это что-нибудь для вас (поскольку вы сказали JavaScript has types в своем ответе). - person Steve; 06.02.2012
comment
Я так думаю. Мне нужно позволить ему погрузиться и немного перечитать его :-) Одно большое впечатление, которое я получаю от чтения этих ответов (и других об этом на SO), - это немного скользкий, расплывчатый термин (отсюда и семантика) и всем, кто использует это, было бы хорошо посоветовать прояснить, что они имеют в виду, если контекст не совсем ясен :-) - person Peter Cooper; 06.02.2012
comment
«Очевидно, не имеет значения, имеет ли Javascript какое-либо представление о типах». Не правда. Как я намекал в своем ответе, независимо от контекста, вы не можете рассматривать 12 как функцию. Поскольку у JavaScript действительно есть тип функции (или, в зависимости от вашей точки зрения, несколько типов функций), это важное различие. - person Adam Mihalcin; 06.02.2012
comment
Еще немного о моем предыдущем комментарии: Тот факт, что у JavaScript нет интерфейсов или классов в стиле C ++ / Java / .NET, не означает, что у него нет типов. - person Adam Mihalcin; 06.02.2012
comment
По логике вашего примера EDIT вы можете взять функцию head для списков (возвращает первый элемент), которая определена в любом (непустом) списке. В Haskell его тип forall a. [a] -> a. Однако head [] завершится ошибкой (выдаст ошибку времени выполнения). Существуют (зависимо типизированные) языки, в которых вы можете определить head, чтобы они использовались только в непустых списках. Таким образом, обобщая ваш пример, для любого языка, допускающего программы, которые «могут давать сбой во время выполнения», любое внутреннее понятие типов не имеет значения. Поэтому ясно, что понимание типов в Haskell вообще не имеет значения. ;-) - person nobody; 07.02.2012

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

Обновление: возможно, путаница возникает из-за того, что в некоторых текстах говорится о том, что «переменные не типизированы» в Javascript (что верно). Но это не означает автоматически, что язык нетипизирован (что было бы неверно).

person afrischke    schedule 06.02.2012
comment
Ассемблер имеет очень слабое представление о типах. По крайней мере, в x86 все является целым числом, но некоторые целые числа отличаются по размеру от других. Это даже до того, как перейти к MMX, x87 и другим расширениям исходной спецификации x86. - person Adam Mihalcin; 06.02.2012
comment
Я не согласен. В Javascript у меня могут быть объекты, которые я создал, чтобы быть обезьянами, и объекты, которые я создал, чтобы быть людьми, и некоторые функции могут быть разработаны для работы только с людьми, другие - только с обезьянами, а третьи - только с вещами с оружием. Независимо от того, говорилось ли когда-либо на языке о существовании такой категории объектов, как предметы с оружием, это не имеет отношения к сборке (нетипизированной), как и к Javascript (динамической). Все дело в логической целостности - и единственная ошибка будет заключаться в использовании чего-то, что не поддерживает этот метод. - person Steve; 06.02.2012
comment
@Adam Mihalcin Верно. [Макро] ассемблерные языки могут, конечно, иметь представление о типах в разной степени. (Посмотрите, например, на Typed Assembly Language.) Я все еще думаю, что моя точка зрения остается в силе. - person afrischke; 06.02.2012
comment
@ Стив, я не уверен, смогу ли я следовать за тобой. OP спросил, нет ли в кругах CS различий между динамически типизированными и нетипизированными. Это не имеет ничего общего с тем, считаете ли вы, что практически нет разницы между тем, как Javascript и сборка обрабатывают биты в памяти. Согласно тому, что я прочитал (и мне пришлось искать это специально, поскольку я не программист Javascript): стандарт ECMAScript / Javascript определяет 6 типов данных (логические, строковые, неопределенные, числовые, нулевые и объектные) и в любой момент со временем значение относится к одному конкретному типу ... - person afrischke; 06.02.2012
comment
... Теперь это концепция (у большинства) языков ассемблера нет (все, что есть, - это биты и байты), так что imho это знаменует четкое различие между Javascript и сборкой. - person afrischke; 06.02.2012

Согласитесь с Бренданом - контекст решает все.

Мое мнение:

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

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

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

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

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

person Dan Yoder    schedule 06.02.2012