Существуют ли объектно-ориентированные языки программирования, которые не основаны на классах?

44

Существуют ли какие-либо объектно-ориентированные языки программирования , не основанные на парадигме классов?

просчеты
источник
1
Технически говоря, C. Хотя ориентация довольно сложна в смысле языка, что делает его легким. Я знаю, что это не тот ответ, который вы ищете, но если вам интересно узнать, как С может это сделать, это может дать некоторое представление о том, что на самом деле делают классы и как могут работать альтернативные подходы.
kylben
4
@kylben: «Ориентированный» - это неуместное растяжение. Вы можете ударить C по объектно-ориентированному поведению. Вы не можете забить это на ориентацию таким образом.
Дэвид Торнли

Ответы:

74

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

Это повлияло на все другие «классные» ОО языки, которые я знаю:

  • наиболее заметно Javascript,
  • классический язык программирования и среда Squeak (который построен поверх Smalltalk)
  • многопарадигмальный сценарий языка Lua .
DaveFar
источник
2
@ Адам: без статической типизации, разве это не просто синтаксический сахар?
Кевин Клайн
5
Язык @DeadMG OO - это не тот, который позволяет вам реализовывать идеи OO, а тот, который делает это за вас :)
Петр Доброгост,
4
На самом деле, и Simula (1960), и Smalltalk-71 (а также Smalltalk-72) тоже не имели классов, которые предшествовали «Я» почти на три десятилетия. Классы были добавлены только в Simula-67 и Smalltalk-74 (и Алан Кей считал их ошибкой или, точнее, необходимым злом).
Йорг Миттаг
2
@kevincline: Не уверен, на чем ты это основываешь; ОО и статическая типизация полностью ортогональны.
Пол Биггар
2
Помимо Simula (которая взяла на себя парадигму класса), Flavors был представлен в MIT в 1979 году и был предшественником CLOS, оба из которых предшествовали Self.
Мэтью Флинн
32

Такие языки, как JavaScript, основаны на прототипах , где поведение повторно используется путем клонирования существующих объектов. Статья в Википедии, на которую я ссылался, указывает на то, что Lua, ActionScript и ряд других языков следуют этой парадигме.

Томас Оуэнс
источник
2
Любой вариант ECMAScript использует парадигму прототипа.
zzzzBov
Ну, практически любой вариант. ActionScript (язык Flash) использует классы, хотя базовая виртуальная машина может реализовывать их с точки зрения прототипов.
mjfgates
@mjfgates, Actionscript 2 раньше был основан на ECMAScript и очень напоминал Javascript. Actionscript 3 отходит от этого, но все еще сохраняет свою динамичную природу. Вы можете использовать сильный или слабый тип любой переменной, так как по сути все является объектом.
J_A_X
13

Самый популярный объектно-ориентированный язык программирования в мире не имеет классов, он называется Javascript и основан на прототипах: http://en.wikipedia.org/wiki/Prototype-based_programming

bezko
источник
11
«Самый популярный объектно-ориентированный язык программирования в мире»? Я не уверен в этом утверждении вообще.
Томас Оуэнс
8
@ThomasOwens, благодаря его включению в сеть, вы можете легко сказать, что каждая современная веб-платформа (включая мобильные устройства) имеет встроенный интерпретатор JavaScript. Это очень веский аргумент, что в настоящее время это самый популярный язык на основе прототипов в существовании. (если вы не думаете, что можете привести аналогичный аргумент в пользу «
САМОГО
1
Javascript, безусловно, является одним из наиболее широко используемых языков программирования в мире, но я ожидаю, что большинство случаев использования будет простым старым императивом или процедурным, возможно, с небольшим количеством аспектно-ориентированного программирования (обратные вызовы? AJAX? Обработчики событий?) Здесь и поэтому, называя javascript «самым популярным языком ООП», не совсем оправдано.
tdammers
9
Я бы также сказал «вездесущий», чтобы обойти обсуждение его популярности.
Энтони Пеграм
3
@ Stargazer712: Мне не нравится быть фанатом языка, но он утверждает, что «самый популярный объектно-ориентированный язык программирования в мире [ed: Javascript] не имеет классов». Его можно разделить на два утверждения: «Javascript - самый популярный объектно-ориентированный язык программирования» и «Javascript не имеет классов»; с которым я согласен.
Ли Райан
6

Объектная ориентация - это общий термин для нескольких важных понятий, которые лишь частично зависят друг от друга. Например, наследование может быть объявлено в каждом конкретном случае между экземплярами, а не между классами, или весь класс может быть представлен конкретным prototypeобъектом, как писал Томас. Просто более привычно отделять описание структуры от создания экземпляра. Аналогично, позднее связывание означает, что объекты с номинально одинаковым методом не обязательно делают одно и то же при вызове, и что решение принимается во время выполнения. Это также возможно с подходом на основе прототипа. И инкапсуляция по существу полностью независима от того, являются ли ваши объекты экземплярами объявленных классов или нет.

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

Килиан Фот
источник
6

Fortress - это объектно-ориентированный язык, основанный на особенностях, а не на классах. Разница в основном в реализации композиции. Поведение объекта (определения методов) все еще определяется объявлениями в определенной точке в тексте программы. Так что в этом смысле это похоже на системы на основе классов.

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

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

Райан Калпеппер
источник
5

Ada, в редакции 1995 года, Ada является объектно-ориентированной, но, в отличие от многих других ОО-языков, она не объединяет объектно-ориентированные типы и модули в одну конструкцию, называемую «класс». Вместо того, чтобы объявлять тип как «class Foo» и помещать все связанные объявления метода внутри объявления класса, вы объявляете пакет и объявляете тип (как a record) и другие вещи внутри пакета. Это не «бесклассовый» способ, которым обладают некоторые другие упомянутые языки, это просто немного другой способ организации вещей.

Объектно-ориентированные функции Ады 95 были добавлены в существующую версию языка 1983 года; он расширил существующие записи и конструкции пакетов для поддержки наследования и др.

Кит Томпсон
источник
это то, что я запомнил, также вам нужно передать свою запись каждой функции-члену
Nikko
@Nikko: Это то, что происходит за кулисами в каждом объектно-ориентированном языке, и довольно явно в Python и CLOS (общий lisp).
Марчин
5

Io - еще один объектно-ориентированный язык на основе прототипов. Это на самом деле черпает вдохновение из нескольких языков, уже упомянутых в других ответах.

Io - это динамический язык программирования, основанный на прототипах. Идеи в Io главным образом основаны на Smalltalk (все значения являются объектами), Self (на основе прототипов), NewtonScript (дифференциальное наследование), Act1 (акторы и фьючерсы для параллелизма), Lisp (код является деревом, которое можно проверить / изменить во время выполнения) и Луа (маленький, встраиваемый).

Жолт Тёрёк
источник
4

Erlang. И да, Erlang является объектно-ориентированным языком, так как он удовлетворяет всем трем пунктам определения ОО.

Йорг Миттаг
источник