Подтвердить что ты не робот

В чем разница между самоанализом и рефлексией?

Может ли кто-либо объяснить с точки зрения языка/среды агностическую разницу между этими двумя понятиями?

Также существует ряд условий, которые должны удовлетворять языки программирования, чтобы быть отражающими и/или интроспективными?

А если есть, то каковы эти условия?

4b9b3361

Ответ 1

Статья в Википедии содержит довольно приличное резюме:

При вычислении тип introspection - это способность программы проверять тип или свойства объекта во время выполнения. Некоторые языки программирования обладают этой возможностью.

Интроспекция не следует путать с рефлексией, что делает шаг вперед и является возможностью для программы манипулировать значениями, метаданными, свойствами и/или функциями объекта во время выполнения. Некоторые языки программирования, например. Java, также обладают этой возможностью.

Возьмите статически типизированную, скомпилированную программу:

SomeType function foo(int i) {
    return new SomeType(i);
}

Все типы известны и применяются во время компиляции, программа не должна даже компилироваться, если она не удовлетворяет своим собственным явным ограничениям типа. Динамические языки программирования обычно не демонстрируют такую ​​жесткость, типы переменных не обязательно известны во время компиляции. Они могут выглядеть примерно так:

function foo(i) {
    return new SomeType(i);
}

Функция не может гарантировать, что именно i точно, она просто передает ее. Это может или не может вызвать проблемы где-то, система типов не может помочь здесь. Такая проверка ошибок обычно отводится на код пользователя, для которого такой код нуждается в возможности самоанализа:

function foo(i) {
    if (!is_int(i)) {
        throw new InvalidArgumentException;
    }
    return new SomeType(i);
}

Где именно, чтобы нарисовать линию между самоанализа и рефлексии несколько спорно. Можно сказать, что интроспекция - это все, что позволяет коду проверять, что-то ( "Что я?" ), Тогда как отражение - это способность управлять самой структурой программы. Например, пример PHP:

$ref = new ReflectionClass('Foo');
$foo = $ref->newInstanceWithoutConstructor();

Приведенный выше код обходит работу над конструктором класса Foo при создании нового экземпляра. Это манипуляция кодом во время выполнения. На практике, однако, API отражения в PHP также содержит возможности самоанализа. Некоторые из этих возможностей являются дубликатом того, что можно сделать с помощью "более низких" возможностей интроспекции. Например:.

$ref = new ReflectionClass($obj);
if ($ref->getName() == 'Foo') ...

if ($obj instanceof Foo) ...

Оба фрагмента по существу делают одно и то же, но одно использует отражение, а другое - то, что будет называться интроспекцией. Как видите, едва ли есть четкая разделительная линия. Однако отражение, как правило, более мощное, чем интроспекция. Например, в PHP вы должны использовать API отражения для получения информации о типах аргументов, которые принимает функция. Это просто "пассивная" интроспекция, но относится к API отражения. В основном это вопрос практической реализации.

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

Ответ 2

Интроспекция типа:

Возможность языка программирования для изучения типа или свойств объекта во время выполнения.

Пример (Java):

String myObj1 = new String();
MyCustomObject myObj2 = new MyCustomObject();
if(myObj2 instanceof MyCustomObject) {
    System.out.println("This is an example of type interospection");
}


Отражение:

Способность языка программирования достигать ниже вещей во время выполнения.

  • Тип introspect (как показано выше)
  • Изучить и изменить объект.
  • и многое другое

Ответ 3

Отражение - это механизм, состоящий из двух методов:

  • Интроспекция

    Возможность проверить программу

  • Заступничество

    Возможность для программы изменять себя (его поведение или его состояние)

Ref. https://fr.wikipedia.org/wiki/R%C3%A9flexion_(informatique)#Introspection_et_intercession

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