Где хранится код программы во время ее выполнения

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

Отслеживать
67.7k 209 209 золотых знаков 76 76 серебряных знаков 218 218 бронзовых знаков
задан 30 дек 2022 в 12:34
3 1 1 бронзовый знак

Это связано с тем, что char — это число от -128 до 127 (чаще всего), и пытаться запихнуть в него строковый литерал нет никакого смысла

30 дек 2022 в 12:45

3 ответа 3

Сортировка: Сброс на вариант по умолчанию

Это связано с тем, что в объявлении

char s = «some_text»;

вы выделяете ровно 1 (прописью: один) байт для хранения всего текста. Что, очевидно, не работает.

char s = ‘s’;
Отслеживать
ответ дан 30 дек 2022 в 12:45
215k 15 15 золотых знаков 117 117 серебряных знаков 228 228 бронзовых знаков

Строки программы имеют тип массива букв char [ ] и они хранятся в коде программы, которая защищена от изменения.
Поэтому ваша запись

Так бегает охранник в сабвей серф #Shorts


char *s = «smth»;

создаёт переменную с типом указателя на первую букву константной строки и чтобы не было удивления от ошибок краха памяти надо объявлять её так :

char const * s = «smth» ; s [ i ] — там буква с типом char const

или указателем на сам массив :

char const ( * p ) [ ] = ( char const ( * ) [ ] ) smth» ; ( * p ) [ i ] — там буква с типом char const

и чтобы была возможность изменять данную строку нужно создавать её копию так :

char s [ ] = «smth» ; s [ 0 ] = ‘S’ ; — новую строку можно менять, заменяя буквы
char st [ 60 ] ; strncpy ( st , «smth» , 59 ) ; st [ 59 ] = ‘0’ ;

Источник: ru.stackoverflow.com

Особенности внутреннего представления программы и ее исполнения

Все данные, хранящиеся в памяти компьютера, представляются в двоичной системе счисления в виде машинных слов – наборов двоичных разрядов (совокупность битов – нулей и единиц). Биты объединяются в последовательности: байты, слова и т.д. Минимальный размер машинного слова для хранения, обработки и передачи данных – 8 битов (1 байт). Все остальные слова кратны ему.

Ст андарт ное машинное слово имеет разрядность, соответствующую разрядности процессора (32 разряда или 4 байта). Какой смысл заключен в данных, какими символами они выражены – буквенными или цифровыми, что означает то или иное число – все это определяется программой обработки.

Все данные, необходимые для решения практических задач, подразделяются на несколько типов, причем понятие тип связывается не только с представлением данных в адресном пространстве, но и со способом их обработки . Данные могут быть отнесены к одному из двух типов: основному (простому), форма представления которого определяется архитектурой компьютера, или сложному, конструируемому пользователем для решения конкретных задач. Данные простого типа это – символы, числа и т.п. элементы, дальнейшее дробление которых не имеет смысла.

Кирилл Тихонов — Оптимизации времени компиляции. Даем больше информации компилятору

Из элементарных данных формируются структуры (сложные типы) данных. Основу компьютерной архитектуры составляет прямо адресуемая памят ь : массив элементарных ячеек памяти, номера кот орых называют ся адресами . Каждому участку оперативной памяти, который может вместить один байт или слово, присваивается адрес (порядковый номер).

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

Поэтому на самом низком уровне адрес можно рассматривать как целое число. Все формы представления данных (целые со знаком и без него, вещественные, символы) проецируются в двоичное представление и в машинные слова. Но. : хранятся числовые значения в памяти, начиная с младшего байта, в порядке, обратном привычному нам при записи чисел (Рис.1.4).

Читайте также:
Как называется программа для работы с базами данных

Процессор имеет в своем составе набор машинных слов – регист ров . В зависимости от назначения они могут хранить как данные, так и адреса памяти. Рис. 1.4. Организация памяти компьютера

Программирование – лекция 1 (лекции Стрикелевой Л.В.) 13

Сегментация программы

Следующий важный принцип организации памяти – сегментация. Сегмент ом называется непрерывная область памяти, хранящая данные одного вида (назначения) и имеющая собственную систему относительной адресации и ограничения доступа. К программированию это имеет отношение потому, что при трансляции разные компоненты программы попадают в различные сегменты программного кода.

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

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

Сегментация поддерживается в процессоре при помощи регистров двух видов. Базовый регист р сегмент а содержит его начальный адрес. Регистры, работающие с данными сегмента, содержат относительный адрес данных от начала сегмента, или смещение . Результирующий адрес получается путем сложения содержимого этих регистров.

Таким образом, каждый сегмент имеет собственную «систему координат», связанную с его началом (Рис.1.5). Если программа использует только сегментную адресацию, то сегменты можно перемещать по памяти при сохранении работоспособности программы: достаточно перенастроить соответствующие им базовые регистры. Выполняемая программа состоит из нескольких сегментов.

Некоторые из них создаются при трансляции, другие – при загрузке и при работе программы. В принципе, программа может иметь несколько сегментов одного вида. Рис. 1.5. Сегментация программы

Сегмент Регистры Что содержит Когда создается
Сегмент команд CSсегментный, Программный код (операции, трансляция
IPадрес команды операторы)
Сегмент данных DS – сегментный Глобальные (статические) трансляция
данные
Сегмент стека SS – сегментный, Локальные данные функций, при загрузке
Программирование – лекция 1 (лекции Стрикелевой Л.В.) 14
SP– указатель стека «история» работы
программы
Динамическая DS – сегментный Динамические переменные, при загрузке,
память создаваемые при работе выполнении
программы
Динамически CS– сегментный, Программный код при загрузке
связываемые IP– адрес команды разделяемых библиотек
библиотеки
(DLL)

Следующий элемент архитектуры тоже имеет отношение к внутреннему представлению программы – вирт уальное адресное прост ранст во (вирт уальная памят ь). Его идея состоит в том, что каждая программа имеет свое, независимое от других, виртуальное адресное пространство (виртуальную память), в котором размещаются сегменты программы, определяются адреса и т.п. В процессоре имеется скрытая от программ система отображения виртуальных адресов на физические адреса., Вирт уальное адресное прост ранст во находится под управлением операционной системы и реализует защиту памяти программ, ее разделение (сегменты динамически связываемых библиотек), загрузку программы в память «по частям» и иллюзию наличия неограниченной памяти. Для нас из всего этого важно то, что внутренне представление программы в виртуальной памяти занимает все адресное пространство, как будто других программ и операционной системы в памяти нет вовсе.

Процесс исполнения программного кода

Процесс исполнения программного кода в общих чертах представлен на Рис.1.6. Действующими лицами этого процесса являются: • программный код – последовательность команд, размещенная в сегменте кода (CS), на начало которого ссылается одноименный регистр процессора; Рис. 1.6. Кодовое представление программы • каждая команда имеет в сегменте свой относительный адрес (от начала сегмента), регистр процессора IP (Instruction Pointer) содержит адрес очередной выполняемой команды . В программировании на языках высокого уровня с IP ассоциируется очень важное понятие – т екущая т очка выполнения программы; • команда представляет собой машинное слово, обычно переменной длины, и

Читайте также:
Как оценивается автомобиль по программе трейд ин
Программирование – лекция 1 (лекции Стрикелевой Л.В.) 15

состоит из нескольких полей. Обязательным полем является код операции, который указывает на выполняемое командой действие. Совокупность команд процессора называется сист емой команд.

В системе команд обязательно присутствуют следующие виды операций: o команды перемещения и обработ ки данных выполняют перенос данных между ячейками памяти и регистрами данных процессора, а также все действия по их обработке (mov, add, sub); o команды проверки сост ояний (условий) проверяют результат выполнения операций, состояния регистров процессора, устройств ввода-вывода и т.п. (test); o команды условного и безусловного переходов определяют адрес следующей команды (выполняют переход в программе) в зависимости от результата проверки некоторого условия. Если условие выполняется, то происходит переход, иначе выполняется следующая за ней команда. • вторым элементом команды являются операнды: в команде в явном или неявном виде должны содержаться адреса операндов; это могут быть регистры процессора, содержащие данные, и ячейки памяти; • переменные, используемые в программы, при трансляции «становятся» областями памяти в различных сегментах данных (сегменты данных, стека, динамической памяти), где получают свои адреса.

В командах, работающих с памятью, в том или ином виде имеется информация, позволяющая вычислить (или просто взять) этот адрес; • в нашем примере большинство команд переноса и обработки данных являются двухадресными – результат операции совпадает с первым операндом (команду сложения add ax, 454 следует понимать как ax=ax+b); • в нашем примере используется непосредст венная адресация для констант (их значение находится в самой программе, add ax, #10) и прямая адресация для ячеек памяти (в команде содержится их адрес, add ax, 454); • в командах безусловного (jmp) и условного (jmi – «переход, если меньше нуля») должен быть определен адрес следующей команды: в нашем примере он задан в относительной форме – в виде смещения (расстояния) от следующей команды до той, куда производится переход. Выполнение программы происходит, в общих чертах, таким образом: • процессор, используя регистры CS:IP выбирает из памяти очередную команду и расшифровывает ее. После этого IP увеличивается и ссылается на следующую команду (в зависимости от длины текущей, например, IP=IP+3); • если это команда переноса или перемещения данных, то процессор формирует адреса операндов в зависимости от способа адресации, после чего выполняет действия, указанные в команде; • если это команда проверки условия, то проверяется указанный операнд, и устанавливаются признаки выполнения различных условий (равно 0, не равно 0, больше 0 и т.п.); • если в команде условного перехода проверяемое условие выполняется, то программа «переходит» по адресу, содержащемуся в команде. В нашем примере это смещение из команды просто добавляется к IP (IP=IP+<смещение>). Иначе ничего не происходит и выбирается следующая команда. Сравнивая систему команд компьютера с другими способами представления программ в известных технологиях программирования, можно заметить, что внутреннее представление

Программирование – лекция 1 (лекции Стрикелевой Л.В.) 16

Источник: studfile.net

Адресация памяти и переменные

У каждого компьютера есть оперативная память . Что же это такое, какими свойствами обладает и, самое главное, какая нам от этого польза?

Каждая программа (в том числе и программы , написанные на Java) перед выполнением загружается в оперативную память . В оперативной памяти находится код программы (который исполняется процессором) и данные программы (которые в память помещает сама программа).

Что же такое оперативная память и на что она похожа?

Представьте себе Excel Страница в Exсel’е состоит из ячеек , и у каждой ячейки есть её уникальный номер ( A1 , A2 , . B1 , B2 ). Зная номер ячейки , всегда можно записать в неё какое-то значение или же получить значение, которое там хранится. Память компьютера устроена очень похоже.

Читайте также:
Программа эксель это текстовый редактор

Программа и её данные во время работы хранятся в памяти . Вся память компьютера представлена в виде маленьких ячеек – байт . У каждой ячейки есть её уникальный номер – 0 , 1 , 2 , 3 , . ; (нумерация начинается с нуля). Зная номер ячейки , мы можем сохранить в эту ячейку какие-то данные. Или взять их из неё. В одних ячейках хранится код программы – набор команд для процессора, в других – данные этой программы. Номер ячейки также называют адресом ячейки .

Процессор умеет исполнять команды из загруженной в память программы. Почти все команды процессора — это что-то типа: взять данные из некоторых ячеек → сделать с ними что-то → результат поместить в другие ячейки

Объединяя сотни простых команд, мы получаем сложные и полезные команды.

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

На заре компьютерной отрасли программы работали просто с номерами ячеек памяти, но потом для удобства программистов ячейкам стали давать имена. Уникальное имя переменной — это в первую очередь для удобства программистов: программа во время работы отлично справилась бы и с номерами.

2. Переменные в памяти

Всего в Java есть 4 типа данных для хранения целых чисел. Это byte , short , int и long .

Тип Размер, байт Происхождение имени
byte 1 Byte , т.к. занимает один байт памяти
short 2 Сокращение от Short Integer
int 4 Сокращение от Integer
long 8 Сокращение от Long Integer

Также в Java есть 2 вещественных типа — float и double:

Тип Размер, байт Происхождение имени
float 4 Сокращение от Floating Point Number
double 8 Сокращение от Double Float

Каждый раз, когда выполнение программы доходит до команды создания переменной, ей выделяется небольшая область памяти (размер зависит от типа переменной).

Адресом переменной считается адрес первой ячейки выделенного под нее блока памяти.

Java-программам запрещено напрямую обращаться к памяти. Вся работа с памятью происходит только через Java-машину.

3. Тип String в памяти

Тип String может хранить большие объемы данных, поэтому это не просто тип данных, а полноценный класс.

Сами данные типа String (текст) помещаются в специальный объект, под который выделяется память, а уже адрес этого объекта помещается в переменную, под которую тоже выделяется память.

Переменная a типа int занимает 4 байта и хранит значение 1 .

Переменная b типа int занимает 4 байта и хранит значение 10,555 . Запятая — это не дробная часть числа, а разделение разрядов. Дробная часть отделяется точкой

Переменная d типа double занимает 8 байт и хранит значение 13.001 .

Переменная str типа String занимает 4 байта и хранит значение G13 — адрес первой ячейки объекта, содержащего текст.

Объект типа String (содержащий текст) хранится отдельным блоком памяти. Адрес его первой ячейки хранится в переменной str .

4. Почему в программировании всё нумеруют с нуля

Люди очень часто удивляются, почему в программировании почти везде принято считать с нуля. Дело в том, что есть очень много ситуаций, когда считать с нуля удобнее (хотя есть и ситуации, когда удобнее считать с 1 ).

Самая простая из таких ситуаций — это адресация памяти. Если вашей переменной выделили 4 байта памяти и у вас есть X – адрес первого байта, то какие будут адреса у всех байтов? X + 0 , X + 1 , X + 2 , X + 3 . Вот мы уже и получили группу байтов с индексами 0 , 1 , 2 , 3 .

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

Источник: javarush.com

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru