Jump to content

    

Мухожук

Участник
  • Content Count

    6
  • Joined

  • Last visited

Community Reputation

0 Обычный
  1. То есть получается, что в стандарте С нет как такового строго детерминированного описания модели абстрактной машины (но такие машины заданы в других языках программирования). Она описана грубыми штрихами, и в силу этого у разработчиков компиляторов C большая свобода трактовать ее по своему, но не выходя за минимальные требования стандарта, и из-за этого видимо такое обилие implementation и undefined behaviour?
  2. Нет, на меня не повлияла абстракция Java. Я в такие технологии не лезу, я до этого изучал ассемблер IA-32 в плоской модели памяти под Ubuntu 32-bit. Я с одной стороны как бы понимаю, что язык С преподносится как портабельный ассемблер и объекты данного языка должны максимально эффективно отображаться на аппаратные возможности той или иной архитектуры под которые создается компилятор. Но с другой стороны получается, что язык С - это язык высокого уровня и программируя на нем я, в отличие от того же ассемблера, не мыслю в терминах архитектуры ЭВМ, а мыслю в терминах более высокой абстракции - ну то есть абстрактной машины С. Получается стандарт языка С он же описывает некоторую общую абстрактную машину, в которой память такой машины состоит из С-байтов и как бы получается стандарт не может запретить мне выбрать байт такой С машины размерностью отличной от 8 бит, даже если нативный байт аппаратуры для которой создается компилятор и равен 8 бит. Я понимаю, что при этом будет сложнее реализовать компилятор, нежели если бы я выбрал тип char равным 8 бит. С другой стороны у абстрактной машины С нет регистров, а в аппаратуре есть. Ну в этом и различие получается между абстрактной машиной и реальной аппаратурой.
  3. Я так понял... Документ ANSI/ISO C90, в нем многократно встречается термин "abstract machine". Может я не правильно его понимаю...
  4. У меня хреновый английский, в стандарте путанно написано для меня и существует дуализм байта и char. Представление каждого символа должно помещаться в байте. В этом контексте я и использовал понятие байта, как байта абстрактной С машины и разделяю его с понятием аппаратного байта. А 8 бит всегда - это октет. Хмм.. не могу редактировать свой же пост... Я сегодня читал статью на английском, там приводили пример машины PDP-10 где только один аппаратный тип данных - 36-битное слово. И там сказано, что при реализации языка С для такой машины разработчики компилятора определили свой "байт" размером в 9 бит и симулировали его двумя 36-битными словами: первое указывало на слово, второе указывало смещение в этом слове. Компилятор использовал битовые маски и сдвиги для представления такого Cишного "байта". И также у них был вариант не противоречя стандарту реализовать 12- и 18- разрядные "байты", так как 36 кратно данным величинам.
  5. Ну насколько я понял, если я пишу программу на языке C как на языке высокого уровня, то я пишу программу для некоторой абстрактной машины, а не для конкретной аппаратной платформы. Стандарт языка С определяет поведение такой абстрактной машины. В частности, он задает, что модель памяти такой машины это массив байтов определенной разрядности. Разрядность байта указана в CHAR_BIT. Размеры типов объектов данных языка кратны размеру байта. По сути моя программа оперирует объектами данных в памяти абстрактной машины. Разработчик компилятора должен для меня, как программиста на языке С, создать такую абстрактную машину. Ну то есть отобразить ее на ту или иную аппаратную платформу. На аппаратной платформе есть своя оперативная память, со своими аппаратными байтами. Допустим, это IA-32 и размер ее аппаратного байта равен 8 бит. Но получается, абстрактность машины языка C гипотетически не обязывает размер байта в С быть равным именно 8 бит. Допустим, я захотел создать свой компилятор языка C под IA-32 и своим суверенным желанием выбрал размер байта в моем компиляторе 16 бит. Я так понял, согласно стандарту я могу так сделать и описать размерность типов данных в limits.h. То есть получается, я когда пишу программу на С, я мыслю в терминах этой абстрактной машины и пока задача не касается каких-то платформозависимых вещей, я не озабочен устройством платформы на которой моя программа в дальнейшем будет исполняться.
  6. Здравствуйте. Изучаю язык ANSI C89... Насколько я понял, язык С определяется стандартом ANSI/ISO и фактически данный стандарт описывает некую абстрактную машину, на которой и исполняются программы. Задачай разработчика компилятора является реализовать такую абстрактную машину на конкретной программно-аппаратной платформе (либо голое железо, либо голое железо + ОС). В стандарте существует понятие байта как минимальной адресуемой ячейки памяти размерностью достаточной для хранения символа из базового набора символов среды исполнения. А в файле limits.h определена через #define символическая константа CHAR_BIT значением не менее 8, которая определяет разрядность байта. Правильно ли я понял, что вот это понятие байта в стандарте С относится именно к Сишному байту абстрактной машины. То есть байт языка С не тоже самое, что аппаратный байт платформы. И допустим возможна ситуация когда байт абстрактной машины будет равен 16 разрядам (#define CHAR_BIT 16) , а при этом аппаратный байт платформы на котором исполняется С программа будет равен 8 разрядам. Спасибо.