Типы и ОО связаны? - PullRequest
       21

Типы и ОО связаны?

16 голосов
/ 13 октября 2010

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

Вопросы:

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

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

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

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

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

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

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

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

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

Ответы [ 7 ]

13 голосов
/ 13 октября 2010

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

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

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

Как статические, так и динамические системы типов предшествуют OO, и оба имеют отличные неOO языки для их представления (например, Scheme и 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 голосов
/ 13 октября 2010

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

Явным доказательством того, что языки программирования имеют систему типов, является тот факт, что у вас есть предикаты, чтобы спросить, какую «метку» имеет определенное значение. В языках ОО это обычно оператор 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 
5 голосов
/ 13 октября 2010

Я только что наткнулся на это сегодня, возможно, у вас есть хороший вклад:

Что нужно знать перед обсуждением систем типа

3 голосов
/ 13 октября 2010

На странице Википедии в Система типов есть хорошая цитата о том, что такое тип:

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

Итак, структура 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 и вы хотите привести его к FILE, он позволит вам, следующее даже не выдает предупреждение в gcc по умолчанию:

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

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

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

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

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

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

2 голосов
/ 13 октября 2010

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

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

2 голосов
/ 13 октября 2010

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

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

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

Да.

В javascript собственные функции / объекты, такие как Массив, Строка, Функция ... Они являются типами?

Да.

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

Да.

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

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

Если классы / объекты являются типами, разве ОО не подразумевает типы?

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

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

Да.В языке Си есть система типов, но совсем нет объектной системы.

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

Да.

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

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

1 голос
/ 15 мая 2011

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

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

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

...