Jump to content

    
Sign in to follow this  
Мухожук

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

Recommended Posts

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

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

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

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

Спасибо.

 

Edited by Мухожук

Share this post


Link to post
Share on other sites
33 minutes ago, Мухожук said:

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

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

Share this post


Link to post
Share on other sites
43 minutes ago, aaarrr said:

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

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

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

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

Edited by Мухожук

Share this post


Link to post
Share on other sites
40 minutes ago, Мухожук said:

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

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

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

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

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

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

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

 

 

Share this post


Link to post
Share on other sites
38 minutes ago, k155la3 said:

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

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

 

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

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

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

Share this post


Link to post
Share on other sites

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

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

Share this post


Link to post
Share on other sites
6 минут назад, aaarrr сказал:

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

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

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

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

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

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

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

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

Share this post


Link to post
Share on other sites
15 часов назад, Мухожук сказал:

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

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

 

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

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

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

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

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

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

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

Share this post


Link to post
Share on other sites
38 minutes ago, jcxz said:

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

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

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

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

Share this post


Link to post
Share on other sites
23 минуты назад, Мухожук сказал:

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

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

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

Share this post


Link to post
Share on other sites
17 hours ago, Мухожук said:

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

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

Share this post


Link to post
Share on other sites

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

С.jpg

1 hour ago, AlexandrY said:

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

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

ANSI.jpg

 

Edited by Мухожук

Share this post


Link to post
Share on other sites
11 minutes ago, AlexandrY said:

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

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

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

Share this post


Link to post
Share on other sites
1 hour ago, k155la3 said:

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

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

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

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

Edited by Мухожук

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this