После компиляции трансляция?

285
16 января 2017, 20:39

Изучаю WinApi, столкнулся в одной книге с таким описанием:

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

И тут меня возник вопрос:

При компиляции C++ кода с применением WinApi мы получаем файлы .obj на языке ассемблера которые компонуются (так? не уверен что прав). Возможна ли при этом трансляция? Т.е. graphics device interface (GDI)(как я предполагаю набор структур и функций) выступает в роли аналога Java-машины, благодаря которой возможна трансляция в промежуточный байт-код?

Answer 1

Никакого промежуточного байт-кода нет.
Имеется в виду "слоистая" структура программного обеспечения операционной системы. Приложение вызывает функции операционной системы - функции GDI, которые находятся в своих DLL, например, и которые уже обращаются к конкретному аппаратному обеспечению. Опять же, через еще один слой - драйверов.

Т.е., например, имеем стандартный оператор

fstream << "Hello, world";

Он внутри стандартной библиотеки обращается к функциям Windows, скорее всего к WriteFile. Соответствующий код этой функции в Kernel32.dll будет уже обращаться к конкретным драйверам - разобравшись, где и на каком носителе этот файл - к драйверам USB, диска или еще чего. Которые уже на аппаратном уровне будут выполнять запись.

Т.е. ваша программа не должна знать, как работать с тем или иным устройством - для этого есть иные слои программного обеспечения. И программа будет работать независимо от того, выполняется ли она на машине с SDD, обычным винтом или работает с сетевым файлом на другом конце света. В программе есть только обращение к функции в Kernel32.dll, и которого и близко нет в исходном тексте.

Так более-менее понятно?

Answer 2

В этой фразе

Вместо этого оно (Windows-приложение) обращается к функциям GDI, GDI транслирует эти обращения к программным драйверам физических устройств, обеспечивая аппаратную независимость приложений

слово "транслирует" используется не в том смысле, как трансляция программ. Это означает, что делегирует конкретную работу по выполнению запроса драйверам физических устройств. То есть вводится промежуточный слой в виде Windows API, который является промежуточным интерфейсом между прикладной программой и физическими устройствами с их драйверами. Это позволяет прикладной программе не знать детали, что происходит на физическом уровне. Эти детали скрыты в Windows API, которое для приложений предоставляет общий интерфейс.

READ ALSO
Функция со switch с переменным количеством case

Функция со switch с переменным количеством case

Допустим, у меня есть несколько таких блоков:

322
ImageMagick C++ API бинарное (1 bit per pixel) изображение

ImageMagick C++ API бинарное (1 bit per pixel) изображение

Существует ли возможность создания 1-битных изображений и конвертации в этот формат изображений иных форматов с помощью библиотеки imagemagick?...

315
Движение игрока в Box2D после прыжка

Движение игрока в Box2D после прыжка

В игре присутствует модель игрокаСуть в том, что при нажатии W игрок просто летит вверх

323
Имеется ли число в enum

Имеется ли число в enum

Программа читает число с flash-памяти внешнего устройства (целое, 1 байт, беззнаковое)Для его программной интерпретации используется перечисление:

352