Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

9899 - Полный справочник по языку Си Выпуск 1: Абстрактная машина


Информационный Канал Subscribe.Ru


"9899"
Полный справочник по языку Си
Выпуск 1: Абстрактная машина
Переносимость программ
В 1973-м специалисты корпорации AT&T переписали ядро операционной системы Unix с языка ассемблера для PDP-11 на язык Си. Как следствие, уже к середине 70-х ставшая переносимой Unix функционировала на целом ряде популярных платформ и получила распространение в индустрии. Итогом 80-х для самого языка стало наличие Си-компиляторов на всех сколько-нибудь значимых платформах. Сегодня, любая коммерческая платформа, не оснащенная Си-компилятором обречена остаться без должной программной поддержки, а значит и без продаж.
Свойство переносимости любого кода заключено в том, что в качестве целевой платформы такого кода выбрана не некоторая конкретная платформа, а абстрактная машина. С точки зрения производителя инструментария компилятор, библиотеки и другие сопутствующие утилиты реализуют эту абстрактную машину на базе реальных платформ. При этом под соответствием инструментария стандарту понимается соответствие реализации абстрактной машины требованиям стандарта, предметом описания которого она и является.
По сути, степень соответствия стандарту определяет, как много переносимого (вообще говоря) кода может быть использовано. Не удивительно, что именно соблюдение стандарта интересует пользователей больше всего при выборе средств разработки.
Параметризованность абстрактных машин Си и Си++
В отличие от C# и Java, языки Си и Си++ допускают свободу в выборе множества конкретных свойств своих абстрактных машин. Например, отрицательные целые числа могут представляться как в дополнительном коде, так и в форме "знак и модуль" (sign and magnitude). Случается даже, что при использовании одного и того же компилятора для одной и той же платформы приходится иметь дело с разными абстрактными машинами. Например, размер объектов типа int может назначаться опцией командной строки компилятора.
Такая параметризованность абстрактных машин с одной стороны способствует эффективности программ, с другой ― требует хорошего знания гарантий стандарта относительно их устройства. Это тем более справедливо тогда, когда код жертвует переносимостью, закладываясь на такую семантику исполнения, которая поддерживается конкретным пакетом разработки, но отличается от или не гарантируется для стандартных абстрактных машин. Часть таких отступлений можно оправдать увеличением эффективности, часть ― необходимостью выполнения специфических для платформы операций. В любом случае, локализация таких фрагментов кода обычно значительно удешевляет и перенос продукта на другие платформы, и его сопровождение.
Оптимизации и абстрактные машины
Даже имея в виду возможность выбрать удобные параметры абстрактных машин Си и Си++, их реализации практически для любой платформы были бы неэффективными в отсутствие правила "как если бы" ("as if" rule), позволяющего производить любые оптимизации до тех пор, пока полученный код выполняется так, как если бы он выполнялся без этих оптимизаций. Например, согласно стандартам, операнды большинства арифметических операций перед вычислением самой операции приводятся к т. н. общему арифметическому типу (common arithmetic type). И если бы не возможность оптимизировать, каждая такая операция неизбежно требовала бы выполнения преобразований своих операндов даже тогда, когда в них нет необходимости (например, когда типы обоих операндов совпадают с их общим арифметическим типом). Другими следствиями отсутствия оптимизаций в этом примере были бы, во-первых, необходимость создавать лишние временные объекты для размещения в них результатов преобразований и, во-вторых, невозможность использовать (возможно) существующие эффективные инструкции целевой платформы, выполняющие арифметические действия над разнотипными операндами, а также над целочисленными операндами с разрядностью, меньшей чем у объектов типа int (т. к. общий арифметический тип не может иметь меньшую разрядность).
Следствием действия правила "как если бы" можно считать появление квалификаторов типов volatile, ограничивающего действие правила и restrict, появившегося в диалекте C99 и указывающего на возможность оптимизации сверх позволенных правилом в общем случае. Семантика обоих квалификаторов будет подробно изложена далее, как часть абстрактной машины.
Далее...
В следующем выпуске, через две недели, мы начнем изложение абстрактных машин языков Си и Си++ с устройства моделей памяти.
Если у Вас появились замечания, касающиеся рассылки, или даже если Вам просто интересна эта рассылка, и уж тем более если Вы готовы сделать деловое предложение, пожалуйста, напишите нам. Мы будем рады каждому Вашему письму.
С лучшими пожеланиями в Новом году,
редакция рассылки "9899"
© Иван Косарев, 2004. Все права защищены. Публикация и цитирование разрешены только с письменного согласия автора.

http://subscribe.ru/
E-mail: ask@subscribe.ru
Отписаться
Убрать рекламу

В избранное