Перейти к содержанию
    

Абстрактная машина С и ее модель памяти

Здравствуйте.

Изучаю язык ANSI C89...

Насколько я понял, язык С определяется стандартом ANSI/ISO и фактически данный стандарт описывает некую абстрактную машину, на которой и исполняются программы. Задачай разработчика компилятора является реализовать такую абстрактную машину на конкретной программно-аппаратной платформе (либо голое железо, либо голое железо + ОС). В стандарте существует понятие байта как минимальной адресуемой ячейки памяти размерностью достаточной для хранения символа из базового набора символов среды исполнения. А в файле limits.h определена через #define символическая константа CHAR_BIT значением не менее 8, которая определяет разрядность байта.

Правильно ли я понял, что вот это понятие байта в стандарте С относится именно к Сишному байту абстрактной машины. То есть байт языка С не тоже самое, что аппаратный байт платформы. И допустим возможна ситуация когда байт абстрактной машины будет равен 16 разрядам (#define CHAR_BIT 16) , а при этом аппаратный байт платформы на котором исполняется С программа будет равен 8 разрядам.

Спасибо.

 

Изменено пользователем Мухожук

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

33 minutes ago, Мухожук said:

И допустим возможна ситуация когда байт абстрактной машины будет равен 16 разрядам (#define CHAR_BIT 16) , а при этом аппаратный байт платформы на котором исполняется С программа будет равен 8 разрядам.

Что понимается под "аппаратным байтом"? Если платформа способна адресовать 8 бит, то нет, невозможна.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

43 minutes ago, aaarrr said:

Что понимается под "аппаратным байтом"? Если платформа способна адресовать 8 бит, то нет, невозможна.

Ну насколько я понял, если я пишу программу на языке C как на языке высокого уровня, то я пишу программу для некоторой абстрактной машины, а не для конкретной аппаратной платформы. Стандарт языка С определяет поведение такой абстрактной машины. В частности, он задает, что модель памяти такой машины это массив байтов определенной разрядности. Разрядность байта указана в CHAR_BIT. Размеры типов объектов данных языка кратны размеру байта. По сути моя программа оперирует объектами данных в памяти абстрактной машины.

Разработчик компилятора должен для меня, как программиста на языке С, создать такую  абстрактную машину. Ну то есть отобразить ее на ту или иную аппаратную платформу. На аппаратной платформе есть своя оперативная память, со своими аппаратными байтами. Допустим, это IA-32 и размер ее аппаратного байта равен 8 бит. Но получается, абстрактность машины языка C гипотетически не обязывает размер байта в С быть равным именно 8 бит. Допустим, я захотел создать свой компилятор языка C под IA-32 и своим суверенным желанием выбрал размер байта в моем компиляторе 16 бит. Я так понял, согласно стандарту я могу так сделать и описать размерность типов данных в limits.h.

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

Изменено пользователем Мухожук

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

40 minutes ago, Мухожук said:

В частности, он задает, что модель памяти такой машины это массив байтов определенной разрядности.

За всю свою жизнь не удалось встретить байта, с разрядностью, отличной от 8. Разве что 9-битный USART или какая-то экзотика вроде старших братьев i4004. 

Если есть байт, в котором 14 бит, то речь будет идти о "слове".

2 hours ago, Мухожук said:

. . . Насколько я понял, язык С определяется стандартом ANSI/ISO и фактически данный стандарт описывает некую абстрактную машину, на которой и исполняются программы. . . . 

Какая абстрактная машина имеется ввиду, парсера, препроцессора, компилятора, или структура среды исполнения ?

На компиляторах программы не исполняются. Хотя могобыть и есть интерпретаторы C.

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

38 minutes ago, k155la3 said:

За всю свою жизнь не удалось встретить байта, с разрядностью, отличной от 8. Разве что 9-битный USART или какая-то экзотика вроде старших братьев i4004.

Техасовские DSP, например, не умеют адресовать 8 битные данные, поэтому char  у них 16 битный.

 

1 hour ago, Мухожук said:

Допустим, я захотел создать свой компилятор языка C под IA-32 и своим суверенным желанием выбрал размер байта в моем компиляторе 16 бит.

При написании программы на языке следует учитывать возможные варианты (эндианизм, размер char и т.п.), но при создании компилятора под конкретную платформу, он должен учитывать её особенности, поэтому произвольный выбор размера байта недопустим.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В принципе, я понимаю, к чему клонит автор темы.

Предположим, я, как разработчик архитектуры и ядра, могу решить, сделать своё ядро с размером минимально адресуемой единицы памяти Х бит. И это Х вовсе не обязательно должно быть равно 8. Могу сделать 4, или 5, или 12, или 14, или 19 и т.д. Получается, что разработчики компилятора языка Си под такую мою экзотическую  архитектуру должны обеспечить корректную генерацию кода под мою адресацию и размер (ширину) Х. И предоставить соответствующие описания в файлах limits.h, stdint.h и пр.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

12 minutes ago, Darth Vader said:

Могу сделать 4, или 5, или 12, или 14, или 19 и т.д.

Стандарт составлен таким образом, что меньше 8 не можете.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

6 минут назад, aaarrr сказал:

меньше 8 не можете

Согласен. Точнее могу, но тогда компилятор под такую архитектуру не будет соответствовать стандарту. В рамках стандарта реализовать компилятор не выйдет.

2 часа назад, Мухожук сказал:

Допустим, я захотел создать свой компилятор языка C под IA-32 и своим суверенным желанием выбрал размер байта в моем компиляторе 16 бит.

Это противоречит требованию

3 часа назад, Мухожук сказал:

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

Нельзя выбирать ширину байта больше, чем ширина минимально адресуемой ячейки памяти аппаратуры. Если в аппаратуре она 8 бит - значит бай будет 8 битным. Если 13 бит - то 13 битным. Это требование стандарта.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

15 часов назад, Мухожук сказал:

символическая константа CHAR_BIT значением не менее 8, которая определяет разрядность байта.

Путаете понятия. Размер байта всегда == 8бит. А вот размер типа char языка си может быть разный. байт != char.

 

12 часов назад, aaarrr сказал:

Техасовские DSP, например, не умеют адресовать 8 битные данные, поэтому char  у них 16 битный.

Не все. Это касается семейства C5000. А например семейство C6000 имеет инструкции работы с байтами и тип char в компиляторе для них имеет размер == 8бит.

Про другие семейства я не в курсе.

13 часов назад, k155la3 сказал:

Разве что 9-битный USART или какая-то экзотика вроде старших братьев i4004. 

Это не байт, байт всегда == 8 бит. Поэтому в мануалах оперируют термином "слово" или "символ" для UART.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

38 minutes ago, jcxz said:

Путаете понятия. Размер байта всегда == 8бит. А вот размер типа char языка си может быть разный. байт != char.

У меня хреновый английский, в стандарте путанно написано для меня и существует дуализм байта и char. Представление каждого символа должно помещаться в байте. В этом контексте я и использовал понятие байта, как байта абстрактной С машины и разделяю его с понятием аппаратного байта. А 8 бит всегда - это октет.

Хмм.. не могу редактировать свой же пост...

Я сегодня читал статью на английском, там приводили пример машины PDP-10 где только один аппаратный тип данных - 36-битное слово. И там сказано, что при реализации языка С для такой машины разработчики компилятора определили свой "байт" размером в 9 бит и симулировали его двумя 36-битными словами: первое указывало на слово, второе указывало смещение в этом слове. Компилятор использовал битовые маски и сдвиги для представления такого Cишного "байта". И также у них был вариант не противоречя стандарту реализовать 12- и 18- разрядные "байты", так как 36 кратно данным величинам.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

23 минуты назад, Мухожук сказал:

У меня хреновый английский, в стандарте путанно написано для меня и существует дуализм байта и char. Представление каждого символа должно помещаться в байте. В этом контексте я и использовал понятие байта, как байта абстрактной С машины и разделяю его с понятием аппаратного байта. А 8 бит всегда - это октет.

https://ru.wikipedia.org/wiki/Байт

Так что если речь идёт не о музейных экспонатах, то байт == 8 бит.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

17 hours ago, Мухожук said:

и фактически данный стандарт описывает некую абстрактную машину, на которой и исполняются программы.

Странный вывод. Откуда взялось это "фактически "? 
Компилятору нужна только грамматика и сиинтаксический анализатор, а дальше ручками под определенную архитектуру. 
Где там нужна "абстрактная машина" понять не могу. 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я так понял...

С.jpg

1 hour ago, AlexandrY said:

Странный вывод. Откуда взялось это "фактически "? 
Компилятору нужна только грамматика и сиинтаксический анализатор, а дальше ручками под определенную архитектуру. 
Где там нужна "абстрактная машина" понять не могу. 

Документ ANSI/ISO C90, в нем многократно встречается термин "abstract machine". Может я не правильно его понимаю...

ANSI.jpg

 

Изменено пользователем Мухожук

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

11 minutes ago, AlexandrY said:

Странный вывод. Откуда взялось это "фактически "? 
Компилятору нужна только грамматика и сиинтаксический анализатор, а дальше ручками под определенную архитектуру. 
Где там нужна "абстрактная машина" понять не могу. 

Возможно на ТС повлияла абстракция Java. В другом варианте - "абстрактная машина" уже имеется, в виде ARM.

В любом случае возможности компилятора ограничены аппаратными возможностями конкретного процессора и выч. системы. Можно наверное "байт" и из 3 бит "изобразить", но аппаратную поддержку это врядли будет иметь, разве что выставить Intel магарыч невероятных размеров :) 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 hour ago, k155la3 said:

Возможно на ТС повлияла абстракция Java. В другом варианте - "абстрактная машина" уже имеется, в виде ARM.

В любом случае возможности компилятора ограничены аппаратными возможностями конкретного процессора и выч. системы. Можно наверное "байт" и из 3 бит "изобразить", но аппаратную поддержку это врядли будет иметь, разве что выставить Intel магарыч невероятных размеров :) 

Нет, на меня не повлияла абстракция Java. Я в такие технологии не лезу, я до этого изучал ассемблер IA-32 в плоской модели памяти под Ubuntu 32-bit.

Я с одной стороны как бы понимаю, что язык С преподносится как портабельный ассемблер и объекты данного языка должны максимально эффективно отображаться на аппаратные возможности той или иной архитектуры под которые создается компилятор. Но с другой стороны получается, что язык С - это язык высокого уровня и программируя на нем я, в отличие от того же ассемблера, не мыслю в терминах архитектуры ЭВМ, а мыслю в терминах более высокой абстракции - ну то есть абстрактной машины С. Получается стандарт языка С он же описывает некоторую общую абстрактную машину, в которой память такой машины состоит из С-байтов и как бы получается стандарт не может запретить мне выбрать байт такой С машины размерностью отличной от 8 бит, даже если нативный байт аппаратуры для которой создается компилятор и равен 8 бит. Я понимаю, что при этом будет сложнее реализовать компилятор, нежели если бы я выбрал тип char равным 8 бит. С другой стороны у абстрактной машины С нет регистров, а в аппаратуре есть. Ну в этом и различие получается между абстрактной машиной и реальной аппаратурой. 

Изменено пользователем Мухожук

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...