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

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

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

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

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

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

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

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

Ответ 1

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

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

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

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

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

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

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

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

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

Ответ 2

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

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

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

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

Ответ 3

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

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

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

Я нахожу это удивительным (по тем же причинам, что и afrischke и Adam Mihalcin), но вот вы.: -)


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

[…] This is the primary information-hiding mechanism is many untyped languages. For instance PLT Scheme [4] uses generative structs, […]

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

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

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

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

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

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

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

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

Ответ 4

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

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

Ответ 5

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

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

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

Ответ 6

Этот вопрос касается Semantics

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

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

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

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

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

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

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

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

Семантика.

ИЗМЕНИТЬ

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

В своем комментарии к кому-то другому ответу я сказал:

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

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

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

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

Ответ 7

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

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

Ответ 8

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

Мой прием:

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

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

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

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

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

Ответ 9

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

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

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

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

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

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

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