@0x0000002F

Как работают переменные в низкоуровневом понятии?

Я знаю, что такое переменная. Это некий именованный "контейнер" для хранения информации и ее получения по имени. Но я не совсем понимаю, как это работает на низком уровне языка. То есть, при записи и чтении переменной по имени (например, классический myVar), как язык понимает, что это именно та и не другая переменная? Возможно, плохо гуглил.
  • Вопрос задан
  • 342 просмотра
Решения вопроса 1
dollar
@dollar
Делай добро и бросай его в воду.
Если не вникать в регистры и тонкости адресации, то переменные хранятся в памяти по определённым адресам. В этом вся их суть.

Имя переменной существует только на уровне языка программирования. Хотя это зависит от языка. В скриптовых языках, например, имя также хранится в памяти, но это уже нюансы. В компилируемом языке имя переменной нужно только для наглядности и понимания логики программы, и во время компиляции это имя превращается в адрес.

Готовая скомпилированная программа (например, exe-шник) выполняется процессором, который ни о каких переменных не в курсе. Для процессора просто есть инструкции по типу записать по такому-то адресу такое-то значение и т.п.

К слову, языки программирования составлены так, чтобы быть удобными и читаемыми для человека. Машине такой формат не очень удобен. Поэтому текст программы переводится в машинный код (либо в байт-код в случае скриптовых языков), и только затем исполняется на более низком уровне. Таким образом, сам язык программирования ничего не делает и не понимает. Это просто набор правил того, как описать свои алгоритмы. Программист пишет программу, потому эту программу скармливает компилятору (или интерпретатору), переводя её в код, и затем уже с кодом работает процессор. Как-то так.

Чтобы реально разобраться, нужно познакомиться с ассемблером. Имхо, очень полезно пройтись по основам ассемблера в начале, чтобы потом уже с пониманием подойти к изучению более высокоуровневых языков программирования.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
wataru
@wataru
Разработчик на С++, экс-олимпиадник.
Тут много уровней.

Самое простое - компилятор запоминает, что вот myvar - это переменная, которая лежит вот там-то в памяти. Грубо говоря, эти все имена переменных - это псевдонимы для адресов памяти. Если он видит в коде myvar = a + 1;, то он генерирует инструкцию, которая читает из фиксированного адреса переменной a, прибавляет 1 и сохраняет результат в адрес для переменной myvar.

Все немного усложняется из-за оптимизирующих компиляторов. Они могут какую-то переменную вообще не держать в оперативной памяти, а только в виде регистра процессора.
Ответ написан
sotvm
@sotvm
Умный поймёт, а дураку и так всё равно.
регистры процессора
там нет майвар :)
там есть только 0|1 в указанном адресе,
если натянуть сову на глобус, то ближе всего к этому ассемблер
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы