Машинная зависимость в языках высокого уровня
Термин " машинно-зависимый" является в некотором смысле противоположным термину " переносимый" . Действительно, если программа учитывает некоторые особенности архитектуры компьютера, его операционной системы или компилятора, то при переносе ее в другую среду она перестанет работать, даже если будет там оттранслирована. С другой стороны, любой язык высокого уровня по определению должен быть машинно-независимым, поскольку программы, написанные на нем, должны работать в любой среде, где есть с него компилятор. Поэтому под машинно-зависимым программированием прежде всего будем понимать такие программы, которые
-учитывают особенности архитектуры компьютера, системы адресации памяти, организации прерываний и т.д. ;
-учитывают особенности операционной системы, либо используют ее интерфейсы, не принятые стандартно в самом языке программирования (например, библиотеки функций для работы в конкретной ОС) ;
-учитывают особенности генерируемого транслятором кода, размещения данных в памяти.
Рассмотрим в качестве примера простую строку программы и перечислим причины ее машинной зависимости
char far *p = (char far*)0xB8000000;
Здесь дано определение переменной - указателя на область байтов, который инициализирован шестнадцатеричной константой :
-ключевое слово far - означает, что данный указатель является " длинным" . С одной стороны это учитывает факт наличия в системе адресации процессора длинных и коротких адресов, а с другой стороны, особенности распределения памяти транслятором (модели памяти) ;
-то, что указатель получает конкретное числовое значение, обозначает, что он будет содержать конкретный адрес ячейки памяти (или массива), к которой будет производиться обращение через указатель. В данном случае - это начальный адрес нулевой страницы видеопамяти, что является особенностью архитектуры данного компьютера.