Как возможно иметь чисто объектно-ориентированный язык?

Java считается языком ООП, несмотря на то, что это не совсем ООП. Java содержит 8 примитивов, и в интервью Джеймс Гослинг объясняет почему:

Билл Веннерс: Почему в Java существуют примитивные типы? Почему все не было просто объектом?

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

Таким образом, кажется, что и память, и скорость — это проблемы, которые решают примитивы Java. Однако это заставило меня задуматься, как язык может быть настоящим, чисто объектно-ориентированным?

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


person EthanBar    schedule 19.10.2017    source источник
comment
Если я не ошибаюсь, в Котлине все является Object. Там есть ключевые слова var и val и вывод типа оттуда.   -  person ND523    schedule 19.10.2017
comment
@ND523 В Kotlin все выглядит как объект, но компилятор сопоставляет их с примитивами JVM, когда это вообще возможно для экономии памяти источник   -  person EthanBar    schedule 19.10.2017
comment
JavaScript — еще один пример, где все примитивы на самом деле являются объектами. Например. let a = 4; tyeof a; (число) a.toFixed(2) (4.00). toFixed — это метод экземпляра типа/класса Number. Даже литералы завернуты в свой класс типов: (42).toFixed(2) (42.00) или "test string".toUpperCase() (ТЕСТ СТРОКА)   -  person marekful    schedule 19.10.2017
comment
Похоже, Javascript все еще имеет примитивы, но может быть принуждается к объекту за долю секунды, чтобы разрешить использование свойства и методы. Они по-прежнему являются примитивами, и объект немедленно удаляется при его использовании.   -  person EthanBar    schedule 19.10.2017
comment
@EthanBar Я вижу, что ты ищешь. Возможно, вы захотите уточнить это в вопросе.   -  person ND523    schedule 19.10.2017


Ответы (1)


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

Scala — чисто объектно-ориентированный язык в том смысле, что каждое значение является объектом.

Однако, как вы указываете (для Котлина):

компилятор сопоставляет их с примитивами JVM, когда это возможно для экономии памяти

Если ваше определение того, какими могут быть объектно-ориентированные языки, требует, чтобы все всегда представлялось как объект, то чисто объектно-ориентированный язык невозможен. Вы не можете создать язык, работающий на реальном компьютере, на котором есть только объекты. Это связано с тем, что компьютер должен иметь способ представления данных изначально. По сути, это то, чем являются примитивы в объектно-ориентированных языках: собственные формы данных, которые может представлять базовый компьютер (или виртуальная машина). Что бы вы ни делали, вам всегда потребуется какое-то необъектное представление данных, чтобы компьютер мог выполнять с ним операции. Даже если вы создали интерпретатор JavaScript, который действительно представлял примитивы как объекты, для добавления двух целых чисел интерпретатору пришлось бы загружать целые числа в регистры ЦП и использовать некоторую форму инструкции add.

Но такое объяснение как бы упускает суть объектно-ориентированного программирования. Язык программирования — это не то же самое, что программа. Языки — это всего лишь инструмент, с помощью которого мы заставляем компьютеры делать то, что нам нужно — они на самом деле не существуют во время выполнения. Вы, вероятно, скажете, что программа, написанная на Kotlin или Scala, более объектно-ориентирована, чем программа, написанная на C, несмотря на то, что оба языка компилируются в одни и те же ассемблерные инструкции во время выполнения.

Итак, если вы смягчите свое определение чистого объектно-ориентированного программирования, чтобы больше не заботиться о представлении данных во время выполнения, вы обнаружите, что чисто объектно-ориентированные языки возможны. При программировании на Scala вы никогда не взаимодействуете ни с чем, что не является объектом. Даже если ваш Int становится "примитивным" во время выполнения, это не имеет большого значения, потому что вам, как программисту, никогда не приходится об этом думать (по крайней мере, в идеальном мире, где производительность и память не имеют значения). Определение языка Scala вообще не включает понятие примитивов — они являются частью реализации языка, а не самого языка.

Что касается вашего примера Java, Java, вероятно, не является чисто объектно-ориентированным языком по большинству определений. Однако он в основном объектно-ориентированный. Java часто упоминается как объектно-ориентированный язык де-факто, потому что он был гораздо более объектно-ориентированным, чем то, что было до него.

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

person Spaceman1701    schedule 23.10.2017
comment
Спасибо за подробное объяснение. Мне нравится ваше замечание о том, что язык определяется тем, что он представляет для автора, а не тем, что он абстрагирует. - person EthanBar; 23.10.2017