Разница между константой внутри процедуры и снаружи

Это, вероятно, очень глупый вопрос, но кроме видимости, есть ли реальная разница между const внутри proc и снаружи?

const foo = "FOO"

proc test() =
  const bar = "BAR"
  echo foo & bar

test()

Например, когда внутри, стек увеличивается и уменьшается для этого const каждый раз, когда вызывается proc, или, поскольку это const, он просто хранится в статической ячейке памяти на время работы приложения?

Я спрашиваю конкретно о Ниме, но также приветствуются размышления о различиях/сходствах в других языках.


person Lye Fish    schedule 01.04.2015    source источник


Ответы (1)


Если вы посмотрите на сгенерированный код C, вы увидите эту строку:

STRING_LITERAL(TMP139, "FOOBAR", 6);

Это говорит нам о том, что foo & bar оценивалось во время компиляции.

nimbase.h имеет это:

#define STRING_LITERAL(name, str, length) \
  static const struct {                   \
    TGenericSeq Sup;                      \
    NIM_CHAR data[(length) + 1];          \
  } name = {{length, length}, str}

const в Ниме — это гораздо больше, чем статическая ячейка памяти. Но похоже, что в этом случае мы получаем строку "FOOBAR" в статической ячейке памяти. Однако, если мы заменим эти строки числами, например, 1 и 3, в сгенерированном коде будет просто литерал 4 без какой-либо памяти.

Теперь собственно вопрос. Единственная разница здесь заключается в области, в которой видны константы.

Если это не было упрощено таким образом (например, если вы написали echo foo\\echo bar), мы можем снова обратиться к сгенерированному коду и увидеть два идентичных (за исключением содержания) объявления STRING_LITERAL.

person Oleh Prypin    schedule 01.04.2015
comment
Спасибо. Я вижу, как большая часть кода будет оптимизирована в моем простом примере, но ваше последнее предложение, похоже, отвечает тому, что мне нужно. - person Lye Fish; 01.04.2015