2013-03-09 2 views
2

Если у меня есть переменная int d; // some comment. Будет ли это лучше, чем int daysElapsedSinceBlahBlahBlahBlah без комментариев. Это более прочный корпус, но разве это потеряет память?Являются ли длинными переменными имена потерей памяти?

+3

Это, скорее всего, потребует обсуждения. Речь идет не о конкретной проблеме программирования, с которой вы сталкиваетесь, или о том, как подойти к ней. На мой взгляд, это не подходит для SO. Кроме того, это сильно зависит от контекста. –

+3

@BenjaminGruenbaum Проблема программирования (по крайней мере гипотетическая) четко изложена. Контекстная зависимость должна быть частью ответа – SomeWittyUsername

+0

@icepack Это вопрос предпочтения, этот вопрос открыт. –

ответ

4

Это зависит исключительно от языка и его реализации, но я могу привести несколько примеров, основанных на нескольких языках, которые я знаю.

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

В Java компилятор исключает имена локальных переменных и перезаписывает код для использования смещений относительно стека. Имена полей (т. Е. Переменные на уровне класса) сохраняются в скомпилированном байт-коде. Это требуется в основном из-за того, что классы скомпилированы индивидуально и могут быть связаны динамически во время выполнения, поэтому компилятор не может одновременно оптимизировать состояние всей программы. Другие имена полей причины сохраняются, потому что они доступны через reflection. Во время выполнения виртуальная машина может генерировать собственный код, который в основном использует адреса памяти и собственные регистры процессора в виде C & C++. Имена полей хранятся в памяти в любом случае для отражения, и поэтому могут быть связаны любые дополнительные загруженные классы. Средние программные оптимизаторы &, такие как ProGuard, могут сделать все символические имена намного короче.

В языках с функцией eval, таких как JavaScript и PHP, даже локальные имена переменных должны храниться теоретически, так как к ним можно получить доступ по имени через строки времени выполнения. Хороший интерпретатор может оптимизировать это, чтобы использовать быстрые адреса памяти в случаях, когда он может доказать, что конкретная переменная не открывается по имени.

В настоящих линейных интерпретаторах, таких как очень старые реализации BASIC, имена переменных должны храниться всегда, потому что интерпретатор работает непосредственно из исходного кода. Он забывает о каждой строке, когда он переходит к следующему, поэтому он не имеет возможности отслеживать переменные, кроме как их имена в источнике. Поскольку полный исходный код должен храниться в памяти во время выполнения, и он часто ограничивался 64 КБ или меньше, имена переменных действительно имели значение! Код из этой эры часто использовал (и повторно использовал) загадочные короткие имена из-за этого (но также по другим причинам, например, как код BASIC иногда печатался в журналах, которые нужно ввести, и на этих платформах не было особенно приятных клавиш или редакторов.)

Если вы программируете для переводчика с 1980-х годов или ранее, имена идентификаторов в любом случае настолько дешевы, что вы не должны беспокоиться об этом. Выбирайте имена, которые достаточно длинны, чтобы быть понятными, и достаточно короткие, чтобы их можно было быстро прочитать. Пусть компилятор беспокоится об остальном или запустит оптимизатор или minifier в коде после его написания.

7

Вы отметили это как language-agnostic, но этот пример соответствует семейству C-языков. В C-подобных языках имя переменной не должно терять память, это всего лишь метка для компилятора. В результирующем двоичном коде он будет заменен адресом памяти.

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

6

Переменные имена never занимает память. По крайней мере, не достаточно, чтобы даже начать беспокоиться об этом. Хотя в какой-либо языковой реализации будут храниться имена переменных где-то (иногда язык даже требует этого), пространство, которое они занимают, абсолютно крошечное по сравнению со всем остальным, что летает. Просто используйте то, что лучше всего по другим показателям (читаемость, соглашения и т. Д.).

Смежные вопросы