<!DOCTYPE HTML PUBLIC -//W3C//DTD HTML 4.01 Transitional//EN>
<html>
  <head>
    <title>load</title>
  </head>

  <body>
    <h1>load</h1>

    <p>Команда загружает машинный код и инициализирует новые команды.</p>

    <h2>СИНТАКСИС</h2> 

    <pre>
      <strong>load</strong> <em>fileName</em> 
      <strong>load</strong> <em>fileName</em> <em>packageName</em>
      <strong>load</strong> <em>fileName</em> <em>packageName</em> <em>interp</em>
    </pre>

    <h2>ОПИСАНИЕ</h2> 

    <p>Эта команда загружает двоичный код из файла в адресное
      пространство приложения и вызывает инициализирующую процедуру
      библиотеки, чтобы включить ее в интерпретатор. Аргумент
      <em>fileName</em> есть имя файла, содержащего код. Конкретная
      форма кода различна на разных платформах, но чаще всего он
      должен быть разделяемой библиотекой, такой как <strong>.so-</strong>файлы
      для Solaris и <strong>.dll</strong>-файлы для Windows. Аргумент
      <em>packageName</em> есть имя библиотеки. Оно используется для
      определения имени инициализационной процедуры. Аргумент
      <em>interp</em> содержит имя интерпретатора (см. описание команды
      <a href=interp.html><strong>interp</strong></a>). Если аргумент
      <em>interp</em> не указан явно, то по умолчанию библиотека
      загружается в текущий интерпретатор.</p>

    <p>Как только файл загружен в адресное пространство приложения,
      вызывается одна из двух процедур инициализации нового
      кода. Обычно процедура инициализации добавляет в интерпретатор
      новые Tcl-команды. Имя процедуры определяется исходя из имени
      библиотеки и из того, является интерпретатор, в который будут
      добавляться команды, безопасным (см. команду <a
      href=interp.html><strong>interp</strong></a>). Для обычного
      интерпретатора имя процедуры <em>pkg_Init</em>, где <em>pkg</em> -
      имя библиотеки, преобразованное следующим образом: Первая буква
      переведена в верхний регистр, а все остальные - в
      нижний. Например, если имя библиотеки <strong>Foo</strong>, то имя
      инициализационной процедуры должно быть <strong>Foo_Init</strong>.</p>
    

    <p>Для безопасного интерпретатора имя процедуры должно быть
      <em>pkg_SafeInit</em>. Эта функция должна быть написана очень
      тщательно, чтобы позволить включить в безопасный интерпретатор
      только те команды библиотеки, которые безопасны при
      использовании в ненадежном коде. Дополнительная информация
      приведена в п. <a href=SafeTcl.html><strong>Safe</strong></a>.</p>

    <p>Процедура инициализации должна соответствовать следующему
      прототипу:</p>

    <pre>
      typedef int Tcl_PackageInitProc(Tcl_Interp  *<em>interp</em>);
    </pre>

    <p>Аргумент <em>interp</em> определяет интерпретатор, в который
      библиотека будет загружена. Процедура инициализации должна
      вернуть код <strong>TCL_OK</strong> или <strong>TCL_ERROR</strong> чтобы указать,
      была ли она завершена успешно. В случае ошибки она должна
      присвоить переменной <em>interp-&gt;result</em> значение указателя
      на сообщение об ошибке. Результат процедуры инициализации будет
      возвращен командой <strong>load</strong> как ее результат.</p>

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

    <p>Команда <strong>load</strong> также поддерживает библиотеки, статически
      связанные с приложением, если они зарегистрированы с
      использованием процедуры <strong>Tcl_StaticPackage</strong>. Если аргумент
      <em>fileName</em> есть пустая строка, то необходимо указывать имя
      библиотеки.</p>

    <p>Если аргумент <em>packageName</em> отсутствует или равен пустой
      строке, Tcl пытается сам сформировать имя библиотеки.  На разных
      платформах это выполняется по-разному. На Unix-платформах обычно
      для этого берется последний элемент имени файла. Если первые три
      буквы в нем - <strong>lib</strong>, то они отбрасываются. После чего
      берутся все последовательные символы, которые являются буквами
      или символом подчеркивания.  Например, если имя файла
      <strong>libxyz4.2.so</strong>, то в качестве имени библиотеки будет
      сформировано <em>xyz</em>, а при исполнении команды</p>

    <pre>
      load bin/last.so {}
    </pre>

    <p>сформируется имя библиотеки <strong>last</strong>. Если аргумент
      <em>fileName</em> равен пустой строке, то должен быть задан
      аргумент <em>packageName</em>. Команда <strong>load</strong> в таком случае
      ищет сначала статически загружаемую библиотеку (то есть,
      библиотеку, зарегистрированную с помощью процедуры
      <strong>Tcl_StaticPackage</strong>) с указанным именем. Если такая будет
      найдена, то она используется в команде. В противном случае
      ищется динамически загружаемая процедура с этим именем. Если
      загружено несколько версий одной и той же библиотеки, то Tcl
      выбирает ту, которая была загружена первой.</p>

    <h2>ОШИБКИ</h2> 

    <p>Если одна и та же библиотека загружается несколько раз из
      различных файлов, на некоторых платформах она будет загружена в
      адресное пространство несколько раз.
    </p>
  </body>
</html>