Подтвердить что ты не робот

Связаны ли типы и OO?

Попытка понять, подразумевают ли типы OO и наоборот.

Вопросы:

  • Что такое тип?

  • Можно ли назвать класс в ruby ​​ "типом".

  • В javascript встроенные функции/объекты, такие как Array, String, Function... Являются ли они типами?

  • Является ли тип C struct a?

  • Как можно набирать язык, даже если он не поддерживает OO? Напр. Haskell. Является ли это, что типы в таких языках являются "типами данных" без поведения (методов) в объектах/классах в ООПЛ? Каковы существенные различия в типах между языками, которые имеют типы, но не OO и langs, которые поддерживают OO.

  • Если классы/объекты являются типами, не означает ли OO типы?

  • Можете ли вы иметь систему типов без типичных иерархий, видимых в OO langs?

  • Так как clojure поддерживает типы подсказок, можно ли это называть в каком-то смысле? он не статически типизирован.

  • Знают ли слова "нетипизированные" и "динамически типизированные" то же самое?

4b9b3361

Ответ 1

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

Динамический тип является свойством "объекта" (не обязательно объекта OO), который будет проверяться автоматически во время выполнения программы. Каждый основной статически типизированный язык имеет некоторые динамические типы... например. функция деления статически определена, чтобы принимать два числа и возвращать число, но динамически определяемое таким образом, чтобы второе число не могло быть равно нулю. Существуют статически типизированные языки, для которых "ненулевое число" может быть статически проверенным типом. Во многих статически типизированных языках (например, Java) non-null является динамическим типом, тогда как в Haskell это статический тип. И т.д.

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

Обе системы статического и динамического типов предшествуют OO, и оба имеют отличные языки без OO для их представления (например, схемы и SML). Фактически, они предшествуют компьютерному программированию, как мы его знаем. См. Нетипизированные и просто типизированные лямбда-калькуляции, которые относятся к 1930 и 40-м годам.

Более подробно обсуждение различий см.: http://web.archive.org/web/20080822101209/http://www.pphsg.org/cdsmith/types.html

Для одного подхода к рассмотрению некоторых свойств как статических, так и динамических типов см. http://james-iry.blogspot.com/2010/05/types-la-chart.html

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

Нетипизированное лямбда-исчисление, в отличие от "реального" языка программирования, обладает тем свойством, что любое синтаксически допустимое выражение может "добиваться прогресса", без необходимости проверять любые свойства, которые могут привести к поведению undefined. Там нет эквивалента деления на ноль, разыменования нуля или отправки сообщения объекту, который не может его обработать. Таким образом, можно было бы утверждать, что нетипизированный LC не имеет системы динамического типа, даже если он нетипизирован.

Ответ 2

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

Ясное доказательство того, что языки программирования имеют систему типов, заключается в том, что у вас есть предикаты, чтобы спросить, что такое "метка" определенного значения. В языках OO это обычно оператор instanceof, но он может принимать некоторые другие формы (оператор is, оператор typeof, is_a()) или специализированные функции: is_string, is_array). В Haskell это достигается с помощью сопоставления с образцом.

Честно говоря, я не видел нетипизированного языка, то есть языков, которые вообще не имеют типов. То, что я видел до сих пор, это языки, которые:

- non-inferred statically strongly typed: Java
- inferred statically strongly typed: Haskell
- dynamic strongly (explicit coercion between types) typed: Python
- dynamic loosely (implicit coercion between types) typed: PHP, JavaScript 

Ответ 4

На странице wikipedia Тип System есть хорошая цитата о том, что такое тип:

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

Итак, структура C - это тип, и вам не нужны объекты для типов.

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

В C:

int x = 'a' + 13; // 110
char x = 'a' + 13); // 'n'

В Python

>>> 'a' + 13
TypeError: cannot concatenate 'str' and 'int' objects

В разных случаях они оба разумны. Это приводит к строго типизированному или слабо типизированному различию. На строго типизированном языке, таком как Python, вы не можете превратить один тип в другой. C слабо напечатан, если у вас есть char и вы хотите передать его ФАЙЛУ, он позволит вам, следующее не делает предупреждение по умолчанию gcc:

FILE m = (*(FILE*) 'a')

Это не означает, что C не имеет типов, только в некоторых ситуациях возможен переход от одного типа к несвязанному типу. Там есть континуум на разных языках.

Haskell строго типизирован, если функция принимает определенные типы аргументов, и вы пытаетесь вызвать ее разными типами, которые она не собирается компилировать. (По вашему вопросу, Haskell не является OO, но, безусловно, имеет типы.)

factorial 0 = 1
factorial n = n * factorial (n - 1)

Если вы попытаетесь вызвать факториал со строкой: factorial ( "HI" ), это не сработает. Обратите внимание, что вам не нужно было говорить, что n было числом. Компилятор понял это. Это называется type inferrence. Сильная типизация не означает, что вам нужно явно указывать типы. Некоторые языки могут гарантировать отсутствие ошибок типа без аннотаций C и Java.

Обратите внимание, как Haskell выдал ошибку во время компиляции. Это другое полезное различие: статическое и динамическое типирование. Статическая типизация ловит ошибки во время компиляции. Динамическая типизация ловит их во время выполнения. Питон выше поймал ошибку типа во время выполнения, поэтому Python динамически типизирован (он также сильно типизирован). Паскаль, как и Haskell, строго типизирован и статически типизирован

Ответ 5

Что такое тип?

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

Можно ли назвать класс в ruby ​​ "типом".

Да.

В javascript встроенные функции/объекты, такие как Array, String, Function... Являются ли они типами?

Да.

Является ли C struct a type?

Да.

Как можно набрать язык, даже если он не поддерживает OO? Напр. Haskell. Является ли это, что типы в таких языках являются "типами данных" без поведения (методов) в объектах/классах в ООПЛ? Каковы существенные различия в типах между языками, которые имеют типы, но не OO и langs, которые поддерживают OO.

Определение типов не имеет ничего общего с OO.

Если классы/объекты являются типами, не означает ли OO типы?

Формально определение OO не имеет ничего общего с типами; объекты представляют собой инкапсуляции государственной информации и операций над ней. Однако эти два понятия часто полезны вместе.

Можете ли вы иметь систему типов без типичных иерархий, видимых в OO langs?

Да. Язык C имеет систему типов, но не имеет никакой системы объектов.

Так как clojure поддерживает типы подсказок, можно ли это называть в каком-то смысле? он не статически типизирован.

Да.

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

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

Ответ 6

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

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

Ответ 7

Поздно к партии, но прочитайте эту статью Уильямом Куком:

http://www.cs.utexas.edu/~wcook/Drafts/2009/essay.pdf

Танец между OO и типами был для меня загадкой, прежде чем я прочитал это.