Оптимизация использования рантайма

Введение

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

Среды разработки и используемые рантаймы

Любая современная среда разработки, исключая только Assembler, содержит библиотеки функций. И чем дальше развивается язык программирования, тем этих библиотек становится больше. Сегодня программисту уже не обязательно на память знать алгоритмы сортировок и другие часто используемые функции. Достаточно найти подключить необходимую библиотеку и задача будет выполнена. Это называется - повторное использование кода. Идея очень хорошая и экономит время программиста и соответсвенно сокращает бюджет проекта. Однако за это мы платим наличием на жестком диске и в оперативной памяти несколькими десятками совершенно одинаковых кусков кода. Это не эффективно. Производители компиляторов задумались и появился рантайм.

Рантайм - это некоторая библиотека, которая прилагается к каждой программе написанной с использованием компилятора. Это может выглядеть явно, как некоторый файл, например, dll или не явно, когда код рантайма статически прилинковывается к программе. В рантайме содержатся все доступные для компилятора библиотеки функций языка, указанные в программе. Часто оптимизация сборки рантайма отсутствует и туда включается вообще все библиотеки функции, которые существуют в языке независимо от того, пользуется ими программист или нет.

Статическая линковка

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

Динамическая линковка

Динамическая линковка позволяет оставить рантайм в отдельном файле и установить связь с функциями библиотеки в момент загрузки программы. В современных системах это динамическая библиотека с расширением dll. К файлу рантайма могут обращаться несколько программ, собранных одной версией компилятора. Библиотека загружается в память компьютера один раз и каждая программа может к ней обращаться без ограничений. За загрузкой и выгрузкой библиотек следит операционная система, что облегчает программирование. По пути динамической линковки идет сейчас развитие основной части программного обеспечения.

Ограничения при использовании динамического рантайма

Прежде всего, это версии. Каждая новая версия рантайма несет за собой в операционную систему новую dll библиотеку. А в современных условиях это мегабайты дополнительных кодов. При этом от одной версии к другой изменения в самом коде библиотеки крайне незначительны. Некоторые продвинутые компиляторы при смене версии рантайма делают обновление и более ранних версий, заменяя прежние версии dll на перенаправители (врапперы) вызовов к новой библиотеке.

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

Рантайм операционной системы

Ни для кого не секрет, что части операционных систем и их компоненты пишутся на языках высокого уровня. А это значит, что в операционной системе также присутствует свой рантайм. Динамическое либо статическое линкование определяется возрастом системы и ее путем развития. Часто в силу энтропии присутствуют оба варианта.

Компоненты операционной системы

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

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

Как написать максимально эффективную программу

Здесь мы приведем основные тезисы, рассмотренные в этой статье. Следование этим правилам позволит вам разрабатывать максимально эффективные программы и тратить меньше времени и средств на поддержку.

  1. Используйте динамическую линковку;
  2. Используйте рантайм компилятора;
  3. По возможности используйте рантайм операционной системы;
  4. Максимально используйте библиотеки, входящие в состав операционной системы, для решения ваших задач.

Перспективы развития

С точки зрения тезисов, изложенных в статье идеальное взаимодействие операционной системы и прикладной программы должно выглядеть так:

  1. Ядро системы со своим микро-рантаймом, необходимым для выполнения своих функций ядра. Предельно оптимизированная библиотека. Входит в состав ядра в случае монолитного ядра, либо отдельная библиотека в случае микроядра.
  2. Рантайм компилятора операционной системы. Построен как дополнение к микро-рантайму ядра. Пользуется функциями микро-рантайма.
  3. Рантаймы компиляторов. Построены, как дополнение к рантайму операционной системы. Транслируют вызовы к функциям рантайма операционной системы, микро-рантайму ядра и включенным в состав операционной системы библиотекам. Дополняют специфические для языка библиотеки функций.
  4. Прикладная программа. Пользуется рантаймом компилятора. Если необходимо, пользуется напрямую сторонними библиотеками.

Заключение

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