Информация об изменениях

Сообщение Re[16]: понимание ООП Алана Кея от 28.03.2023 19:53

Изменено 28.03.2023 20:00 vdimas

Re[16]: понимание ООП Алана Кея
Здравствуйте, korvin_, Вы писали:

V>>Expression<T> и его наследники не являются first class citizen.

V>>С т.з. языка это "пользовательские типы данных".
V>>В общем, требование first class citizen надуманное.
_>First-class citizen и built-in — ортогональные вещи.
_>First-class citizen — это:
_>

_>Robin Popplestone gave the following definition: All items have certain fundamental rights.
_>All items can be the actual parameters of functions
_>All items can be returned as results of functions
_>All items can be the subject of assignment statements
_>All items can be tested for equality.

_>последний пункт неоднозначный, но «пользовательские/встроенные типы данных» тут совершенно не при чём.

Что показывает, что ретроспектива развития IT, об которую мы тут зацепились, очень даже на пользу. ))

Теперь на пальцах.
Во времена, когда этот мем появился, чаще нельзя было передавать пользовательские типы данных по значению.

Например, в языке Си:
typedef struct {
    int i, j;
} S;

S func1(S arg); // ошибка компиляции


Но можно передать по указателю:
typedef struct {
    int i, j;
} S;

void func1(const S * arg, S * result); // OK

Соответственно, структура S не являлась первоклассной сущностью, а указатель являлся.

Первоклассные сущности имели неизвестную структуру, именно поэтому вопросы передачи и возврата таких значений тогдашние компиляторы были вынуждены брать на себя.
"Ортогональность" появилась позже, по мере развития ЯВУ, но тогда и определение надо было доработать.

И да, на твоё замечание я уже отвечал:

V>>Expression<T> и его наследники не являются first class citizen.
НС>В языке C# — являются.

Только в том смысле, что наследуются от Object, который first class citizen.
Так можно про любой GC-тип дотнета сказать. ))

Первоклассной сущностью в C# являются ссылки на объекты, но не сами объекты, внезапно.

И целый ряд допущений/ограничений был сделан для value-type, чтобы сделать его первоклассной сущностью, а именно: дефолтная ингициализация памяти структуры байтами-нулями, дефолтное побитовое копирование содержимого структур, невозможность переопределения перечисленного.

В общем, Expression<T> не являются отдельной первоклассной сущностью AST, по крайней мере не большей, чем некий MyExpression<T>, то бишь никакого уникального признака "first citizen" у них нет. И даже не являются встроенными типами неизвестной структуры. Это просто вынужденный костыль, бо разработка Roslyn была только в проекте.

Для сравнение, результат typeof(T) в дотнете можно назвать первоклассной сущностью.
Хотя тип Type и описан как "обычный объект", но это просто обертка (Decorator) к типу неизвестной (непрозрачной) структуры, представляющей из себя бинарные кишки платформы.

Напротив, иерархия Expression<T> строится на абсолютно прозрачных типах юзверского уровня, и определение этих типов, разумеется, даётся в библиотечном виде.
Re[16]: понимание ООП Алана Кея
Здравствуйте, korvin_, Вы писали:

V>>Expression<T> и его наследники не являются first class citizen.

V>>С т.з. языка это "пользовательские типы данных".
V>>В общем, требование first class citizen надуманное.
_>First-class citizen и built-in — ортогональные вещи.
_>First-class citizen — это:
_>

_>Robin Popplestone gave the following definition: All items have certain fundamental rights.
_>All items can be the actual parameters of functions
_>All items can be returned as results of functions
_>All items can be the subject of assignment statements
_>All items can be tested for equality.

_>последний пункт неоднозначный, но «пользовательские/встроенные типы данных» тут совершенно не при чём.

Что показывает, что ретроспектива развития IT, об которую мы тут зацепились, очень даже на пользу. ))

Теперь на пальцах.
Во времена, когда этот мем появился, чаще нельзя было передавать пользовательские типы данных по значению.

Например, в языке Си:
typedef struct {
    int i, j;
} S;

S func1(S arg); // ошибка компиляции


Но можно передать по указателю:
typedef struct {
    int i, j;
} S;

void func1(const S * arg, S * result); // OK

Соответственно, структура S не являлась первоклассной сущностью, а указатель являлся.

Первоклассные сущности имели неизвестную структуру, именно поэтому вопросы передачи и возврата таких значений тогдашние компиляторы были вынуждены брать на себя.
"Ортогональность" появилась позже, по мере развития ЯВУ, но тогда и определение надо было доработать.

И да, на твоё замечание я уже отвечал:

V>>Expression<T> и его наследники не являются first class citizen.
НС>В языке C# — являются.

Только в том смысле, что наследуются от Object, который first class citizen.
Так можно про любой GC-тип дотнета сказать. ))

Строго говоря, первоклассной сущностью в C# являются ссылки на объекты, но не сами объекты, внезапно.
Ну и, я считаю объекты Object, Delegate, String, Array тоже первоклассными, помимо примитивных типов.

Причём, типы конкретных делегатов или конкретных массивов с некоторой точки зрения нифига не встроенные, а порождаются в процессе компиляции.
Смотри, насколько скользскими становятся рассуждения даже хотя бы даже о встроенности или нет массивов.

Плюс целый ряд допущений/ограничений был сделан для value-type, чтобы сделать его первоклассной сущностью, а именно: дефолтная ингициализация памяти структуры байтами-нулями, дефолтное побитовое копирование содержимого структур, невозможность переопределения перечисленного.

В общем, Expression<T> не являются отдельной первоклассной сущностью AST, по крайней мере не большей, чем некий MyExpression<T>, то бишь никакого уникального признака "first citizen" у них нет. И даже не являются встроенными типами неизвестной структуры. Это просто вынужденный костыль, бо разработка Roslyn была только в проекте.

Для сравнение, результат typeof(T) в дотнете можно с некоторой натяжкой назвать отдельной первоклассной сущностью.
Хотя тип Type и описан как "обычный объект", но это просто обертка (Decorator) к типу неизвестной (непрозрачной) структуры, представляющей из себя бинарные кишки платформы.

Напротив, иерархия Expression<T> строится на абсолютно прозрачных типах юзверского уровня, и определение этих типов, разумеется, даётся в библиотечном виде.