2010-10-13 2 views
16

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

Вопросы:

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

  • Можно ли назвать класс в рубине «типом».

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

  • Является ли структура C структурой типа?

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

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

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

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

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

ответ

13

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

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

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

Как системы статического, так и динамического типов предшествуют 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

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

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

10

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

Яркое доказательство того, что языки программирования имеют систему типов, состоит в том, что у вас есть предикаты, чтобы спросить, что такое «метка» определенного значения. В языках OO это обычно оператор instanceof, но могут потребоваться некоторые другие формы (оператор is, оператор typeof, функция is_a() или специализированные функции: , 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 
+1

s/Java/C++/:-) – 2010-10-13 12:23:42

+0

+1 для того, чтобы не использовать динамически типизированные и слабо типизированные как синонимы –

+2

В Haskell вы не можете сопоставить шаблон по типу значения, а только по его структуре. Тип значения всегда статически известен и не может быть запрошен во время выполнения. Кстати, я не согласен с тем, что типы должны запрашиваться во время выполнения для языка, который нужно ввести. C, скорее всего, имеет типы, но не эквивалент оператора 'typeof'. – sepp2k

3

страница википедии на Type 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 слабо типизированным, если у вас есть символ и хотите, чтобы бросить его в файл, это позволит вам, следующее не может даже сделать предупреждение в умолчанию НКУ:

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

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

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

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

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

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

2

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

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

Можно ли назвать класс в рубине «типом».

Да.

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

Да.

Является ли структура C структурой типа?

Да.

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

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

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

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

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

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

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

Да.

Должны ли слова «нетипизированные» и «динамически типизированные» означать одно и то же?

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

+0

ваш ответ выглядит так, как будто вы просто скопировали мои и использовали правильные цитаты вместо списков. ;-) – 2010-10-14 15:13:37

+0

@nebukadnezzar: Вы действительно не обеспечили много проницательности, но для многих из этих вопросов прямое «да» является единственным разумным ответом. С другой стороны, я по крайней мере потрудился дать некоторые объясненные ответы. –

+0

Действительно, вы сделали это, и я не хотел подразумевать, что ваш пост плох. Я просто указывал на очевидное :-) – 2010-10-14 16:42:59

2

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

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

Смежные вопросы