Весенние Профили на уровне метода?

Я понимаю их на примерах. :)

Во-первых, Лексическая область (также называемая Static Scope) в синтаксисе C-like:

void fun()
{
    int x = 5;

    void fun2()
    {
        printf("%d", x);
    }
}

Каждый внутренний уровень может получить доступ к своим внешним уровням.

Существует другой способ, называемый Dynamic Scope, используемый первой реализацией Lisp, снова в C-подобном синтаксисе:

void fun()
{
    printf("%d", x);
}

void dummy1()
{
    int x = 5;

    fun();
}

void dummy2()
{
    int x = 10;

    fun();
}

Здесь fun может либо получить доступ к x в dummy1, либо dummy2 или любой x в любой функции, вызывающей fun с x, объявленной в нем.

dummy1();

будет печатать 5,

dummy2();

будет печатать 10.

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

Я считаю, что статическое оглавление легче для глаза. Большинство языков пошло так, в конце концов, даже Lisp (можно сделать оба, правильно?). Динамическое масштабирование похоже на передачу ссылок на все переменные вызываемой функции.

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

if(/* some condition */)
    dummy1();
else
    dummy2();

Цепочка вызовов зависит от условия выполнения. Если это правда, то цепочка вызовов выглядит так:

dummy1 --> fun()

Если условие ложно:

dummy2 --> fun()

Внешняя область действия fun в обоих случаях равна caller плюс вызывающий абонент и т. д. .

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

20
задан membersound 28 October 2014 в 09:52
поделиться