Означает ли «нетипизированный» также «динамически типизированный» в академическом мире CS? - PullRequest
163 голосов
/ 06 февраля 2012

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

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

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

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

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

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

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

Ответы [ 9 ]

142 голосов
/ 07 февраля 2012

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

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

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

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

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

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

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

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

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

65 голосов
/ 06 февраля 2012

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

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

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

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

41 голосов
/ 06 февраля 2012

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

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

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

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


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

[& hellip;] Это основной механизм сокрытия информации во многих нетипизированных языках. Например, схема PLT & # x5B; 4 & # x5D; использует генеративные struct s, [& hellip;]

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

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

* * & Тысяча тридцать-семь mdash; Чарльз Консел, 1990 [ ссылка ]

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

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

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

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

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

9 голосов
/ 06 февраля 2012

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

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

5 голосов
/ 06 февраля 2012

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

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

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

3 голосов
/ 03 августа 2012

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

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

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

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

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

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

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

3 голосов
/ 06 февраля 2012

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

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

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

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

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

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

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

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

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

Семантика.

РЕДАКТИРОВАТЬ

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

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

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

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

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

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

1 голос
/ 06 февраля 2012

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

Мое мнение:

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

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

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

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

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

1 голос
/ 06 февраля 2012

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

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

...