Верхній тип

Матеріал з Вікіпедії — вільної енциклопедії.
Перейти до навігації Перейти до пошуку

Верхній тип у теорії типів математики, логіки й інформатики, — універсальний тип, який іноді називають універсальним супертипом, оскільки усі інші типи будь-якої системи типів є підтипами[en] кореня. Здебільшого це тип, що містить усі можливі об'єкти досліджуваної системи типів. Визначення верхнього типу є протилежністю визначенню найнижчого типу[en], або універсального підтипу, для якого кожен інший тип є супертипом і в більшості випадків це тип, який взагалі не містить об'єктів.

Підтримка у мовах програмування[ред. | ред. код]

Декілька типізованих мов програмування забезпечують явну підтримку верхнього типу.

У статично типізованих мовах обговорюються два різних поняття, що часто плутаються:

  1. Універсальний базовий клас або інший елемент у верхній частині ієрархії класів часу виконання (часто має відношення саме до об'єктно-орієнтованого програмування) або ієрархії типів; часто дозволено створювати об'єкти цього типу, або його можна знайти за допомогою рефлексії при виконанні програми
  2. Статичний тип часу компіляції[en], змінним якого можуть бути призначено будь-яке значення (або з його підмножини, наприклад, значення посилання на об'єкт), що є подібним до динамічного виведення типів

Перша концепція часто має на увазі другу: якщо існує універсальний базовий клас, то змінна, яка вказує на об'єкт цього класу, може насправді вказувати на об'єкт будь-якого класу. Тим не менш, кілька мов мають верхні типи у другому варіанті (наприклад, void * в C ++, id в Objective-C, interface {} в Go), тобто якісь статичні типи, змінні яких можуть приймати будь-яке значення, але при виконанні програми не корелюють з реальними типами, які об'єкт може мати в даній системі типів, тому такі типи не є верхніми у логіці першого визначення.

У динамічно типізованих мовах друга концепція не існує (так як будь-яке значення може бути призначено будь-якій змінній), тому обговорюється лише перша (ієрархія класів). Ця стаття в основному обговорює першу концепцію верхніх типів, але буде згадувати другу в мовах, де вона є важливою.

Наступні об'єктно-орієнтовані мови програмування містять такі універсальні базові класи:
Ім'я Мови
Object Smalltalk, JavaScript, Ruby (pre-1.9.2),[1] і деякі інші.
java.lang.Object Java. Часто пишеться без префікса пакета, просто Object. Крім того, цей клас не є супертипом примітивних типів; однак, з версії Java 1.5, автоматичне обгортання[en] дозволяє неявні або явні перетворення значень примітивних типів у Object, наприклад, ((Object)42).toString()
System.Object[2] C #, Visual Basic .NET та інші мови .NET Framework
object Python після об'єднання типу і класу[3] у версії 2.2 (справедливо тільки для об'єктів нового стилю; об'єкти старого стилю в 2.x не успадковуються від object)
TObject Object Pascal
t Lisp, багато з діалектів, в тому числі Common Lisp
Any Kotlin
Any Scala[4]
ANY Eiffel[5]
UNIVERSAL Perl 5
Variant Visual Basic до версії 6
interface{} Go
BasicObject Ruby (версія 1.9.2 і вище)

Наступні об'єктно-орієнтовані мови не мають універсального базового класу:

  • C++. Вказівник на тип void може приймати будь-який покажчик, що не є функцією, навіть якщо сам тип void не є універсальним типом, а типом-одиницею[en].
  • Objective-C. Дозволено створення нового базового класу, для цього потрібно не вказати батьківський клас іншому класу, що є достатньо незвичним випадком. Object традиційно використовується в якості базового класу під час виконання оригінального Objective-C. У бібліотеках OpenStep і Cocoa NSObject є універсальним базовим класом. Верхнім типом для посилань на об'єкти є id.
  • Swift. Так же як і у Objective-C, можливо створити новий базовий клас, якщо не вказати батьківський клас для класу. Протокол Any може приймати будь-який тип.
  • PHP.

Інші мови[ред. | ред. код]

Мови, які не є об'єктно-орієнтованими, зазвичай не мають підтримки універсального супертипу, або, іншими словами, поліморфізму на основі підтипів.

Хоча Haskell цілеспрямовано не має підтипів, він має кілька інших форм поліморфізму, включаючи параметричний поліморфізм[en]. Найбільш поширеним параметром узагальненого класу типів є forall a. a. Аналогічно в Rust, <T: ? Sized> є найзагальнішим параметром (<T> таким не є, оскільки він має на увазі Sized).

Верхній тип використовується як узагальнений тип, особливо в мовах без параметричного поліморфізму[en]. Наприклад, перед включенням у Java 5 дженериків, класи колекцій в бібліотеці Java (за винятком масивів Java) працювали з посиланнями типу Object. Таким чином, об'єкт будь-якого типу може бути вставлений в колекцію. Верхній тип також часто використовується для зберігання об'єктів невідомого типу.

У мовах зі структурною системою типів[en] верхній тип — це порожня структура. Наприклад, об'єкти в OCaml структурно типізовані; порожній об'єктний тип (тип об'єктів з відсутніми методами), < > — верхній тип типів об'єктів. Будь-який об'єкт OCaml може бути явно перетворений на цей тип, хоча результат не буде корисним. Go також використовує структурну типізацію; також усі типи реалізують порожній інтерфейс: interface {}.

Верхній тип може розглядатися як непрямий тип не статистично типізованих мов. Мови з типізацією під часу виконання часто надають операцію уточнення типу[en] для того, щоб дозволити привести об'єкт до більш конкретного типу під час виконання. У C ++ уточнення з void * не може бути здійснено безпечним способом, де під безпечним способом мається на увазі виявлення мовою програмування помилки уточнення типу під час виконання програми.

У логіці[ред. | ред. код]

Поняття вершини також зустрічається в численні висловлювань, і відповідає формулі, яка істинна в будь-якому можливому тлумаченні. Вона має аналогічне значення в численні предикатів. В описовій логіці вершина використовується для позначення набору усіх понять. Це інтуїтивно схоже на використання верхнього типу у мовах програмування. Наприклад, у Web Ontology Language (OWL), яка підтримує різні описувальні логіки, вершина відповідає класу owl:Thing, де всі класи є підкласами owl:Thing (нижній тип або порожня множина відповідає owl:Nothing).

Див. також[ред. | ред. код]

Примітки[ред. | ред. код]

  1. Class: BasicObject (Ruby 1.9.2). Процитовано 7 квітня 2014.
  2. System.Object
  3. Об'єднання типу / класу Python
  4. An Overview of the Scala Programming Language (PDF). 2006. Процитовано 7 квітня 2014.
  5. Standard ECMA-367. Eiffel: Analysis, Design and Programming Language (PDF). 2006. Процитовано 10 березня 2016.