<?xml version="1.0" encoding="utf-8" ?><rss version="2.0" xmlns:tt="http://teletype.in/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:media="http://search.yahoo.com/mrss/"><channel><title>Steve O'Neil</title><generator>teletype.in</generator><description><![CDATA[Writer, translator, human.]]></description><image><url>https://teletype.in/files/59/6d/596d1ee1-0d66-49b6-b495-80b55d52fff3.jpeg</url><title>Steve O'Neil</title><link>https://teletype.in/@steveon</link></image><link>https://teletype.in/@steveon?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=steveon</link><atom:link rel="self" type="application/rss+xml" href="https://teletype.in/rss/steveon?offset=0"></atom:link><atom:link rel="next" type="application/rss+xml" href="https://teletype.in/rss/steveon?offset=10"></atom:link><atom:link rel="search" type="application/opensearchdescription+xml" title="Teletype" href="https://teletype.in/opensearch.xml"></atom:link><pubDate>Thu, 16 Apr 2026 10:47:51 GMT</pubDate><lastBuildDate>Thu, 16 Apr 2026 10:47:51 GMT</lastBuildDate><item><guid isPermaLink="true">https://teletype.in/@steveon/S8CSfpMFF4w</guid><link>https://teletype.in/@steveon/S8CSfpMFF4w?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=steveon</link><comments>https://teletype.in/@steveon/S8CSfpMFF4w?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=steveon#comments</comments><dc:creator>steveon</dc:creator><title>Механика XS</title><pubDate>Wed, 19 May 2021 08:54:06 GMT</pubDate><description><![CDATA[Original: https://theworld.com/~swmcd/steven/perl/pm/xs/intro/index.html]]></description><content:encoded><![CDATA[
  <p>Original: <a href="https://theworld.com/~swmcd/steven/perl/pm/xs/intro/index.html" target="_blank">https://theworld.com/~swmcd/steven/perl/pm/xs/intro/index.html</a></p>
  <p>Author: <a href="https://theworld.com/~swmcd/steven/" target="_blank">Steven McDougall</a></p>
  <p>Translated by <a href="https://www.wowessays.com/" target="_blank">Wowessays</a></p>
  <p><strong>Введение</strong></p>
  <p>Эта статья посвящена XS. В ней объясняется, что это такое, зачем он нужен, как он работает и как его использовать. Она включает в себя полный, рабочий пример модуля XS, а также модуль-заглушку, который вы можете использовать в качестве отправной точки для своего собственного кода. Целью данной статьи является предоставление исходных данных и информации, необходимой для написания собственных модулей XS.<br /></p>
  <p>Эта статья состоит из пяти частей:</p>
  <ul>
    <li>|November| <a href="https://theworld.com/~swmcd/steven/perl/pm/xs/intro/index.html" target="_blank">Introduction</a>| motivation, definitions, examples|</li>
    <li>|December| <a href="https://theworld.com/~swmcd/steven/perl/pm/xs/concepts.html" target="_blank">Architecture</a>| the Perl interpreter, calling conventions, data representation|</li>
    <li>|January| <a href="https://theworld.com/~swmcd/steven/perl/pm/xs/tools/index.html" target="_blank">Tools</a>| h2xs, xsubpp, DynaLoader|</li>
    <li>|February| <a href="https://theworld.com/~swmcd/steven/perl/pm/xs/modules/modules.html" target="_blank">Modules</a>| Math::Ackermann, Set::Bit|</li>
    <li>|March| <a href="https://theworld.com/~swmcd/steven/perl/pm/xs/nw/NW.html" target="_blank">Align::NW</a>| Needleman-Wunsch global optimal sequence alignment|</li>
  </ul>
  <p></p>
  <h3><strong>Что это такое</strong></h3>
  <p>XS - это (фонетический?) акроним для eXternal Subroutine, где external означает внешний по отношению к Perl, т.е. написанный на каком-то другом языке, например, C или C++. С помощью XS мы можем вызывать подпрограммы языка C непосредственно из кода Perl, как если бы они были подпрограммами Perl.</p>
  <p><br />В узком смысле XS - это название языка-клея, который используется для определения интерфейсов подпрограмм и преобразования данных, необходимых для вызова языка C из Perl. В более широком смысле, XS включает в себя систему программ и средств, которые работают вместе, чтобы это произошло: <em>h2xs, MakeMaker, xsubpp, DynaLoade</em>r и сам язык XS. Обо всем этом мы поговорим позже.</p>
  <h3><strong>Почему это так</strong></h3>
  <p>Perl - это швейцарская армейская бензопила, но все же есть вещи, которые не следует делать на Perl. Например:</p>
  <ul>
    <li>очень требовательные к процессору вещи, например, численное интегрирование</li>
    <li>вещи, требующие много памяти.</li>
    <li>системное программное обеспечение, например, драйверы устройств</li>
    <li>вещи, которые уже были написаны на других языках.<br /></li>
  </ul>
  <p>В целом, Perl - это <em>язык прикладного программирования</em>. Он предоставляет мощные средства, такие как автоматическая типизация данных, автоматическое управление памятью, хэш-таблицы и регулярные выражения. Это позволяет легко собирать приложения, не обращая внимания на каждую мелочь. Компромисс заключается в том, что эти средства требуют значительных затрат во время выполнения.</p>
  <p>В отличие от них, языки C и C++ являются примерами <em>языков системного программирования</em>. Они обеспечивают контроль над каждым циклом процессора и каждым байтом, поэтому внутренние циклы могут быть быстрыми, а критические структуры данных - маленькими. Компромисс заключается в том, что вы должны программировать каждый цикл процессора и каждый байт во всей программе: даже те части, которые не привязаны к процессору.</p>
  <p>XS позволяет нам получить лучшее из обоих миров. С XS мы можем использовать Perl для основной части нашего кода, а C - только для тех частей, которые требуют тонкого контроля над системными ресурсами.</p>
  <h3><strong>Дорожная развилка</strong></h3>
  <p>Теперь вам нужно решить, хотите ли вы писать XS или просто хотите выполнить работу.<br />Если вы хотите просто выполнить работу, подумайте об использовании упрощенного генератора обёрток и интерфейсов (<a href="http://www.swig.org/" target="_blank">SWIG</a>). SWIG - это инструмент разработки программного обеспечения, который соединяет различные языки прикладного программирования, такие как Perl, Python и Tcl, с различными языками системного программирования, такими как C, C++ и Objective-C.</p>
  <p>SWIG очень прост в использовании. В самом простом случае вы просто передаете ему свой файл .c, указываете язык приложения, и он делает все остальное. Вот пример, взятый из документации SWIG:</p>
  <pre>unix&gt; swig -perl5 -module example example.c
unix&gt; gcc -c example.c example_wrap.c
unix&gt; ld -G example.o example_wrap.o -o example.so
unix&gt; perl5.005
use example;
print example::factorial(4), &quot;\n&quot;;
&lt;ctrl-d&gt;
24</pre>
  <p>Я мог бы написать учебник по SWIG, но это было бы излишне: SWIG уже имеет <a href="http://www.swig.org/doc.html" target="_blank">обширную документацию</a>. SWIG доступен в Интернете, он бесплатен и работает. Если вы хотите просто выполнить работу, то этот SWIG для вас.</p>
  <h3><strong>Изучение XS</strong></h3>
  <p>Если вы хотите писать на XS, вы должны изучить его. Изучить XS очень сложно по двум причинам.<br />Первая заключается в том, что основные документы по Perl, такие как perlxs и perlguts, молчаливо предполагают, что вы уже понимаете XS. Соответственно, они опускают или замалчивают важные предположения и справочную информацию. Это звучит плохо, но на самом деле это <a href="https://theworld.com/~swmcd/steven/perl/pm/xs/intro/index.html#common" target="_blank">довольно распространено</a> в мире Unix.</p>
  <p>Вторая причина заключается в том, что вы не можете выучить XS. Не как таковой. Не сверху вниз. Эта проблема гораздо глубже, чем первая, и она проистекает не из неадекватности документации, а из того, чем XS является и чем не является.</p>
  <p>Документация Perl называет XS языком, но это не так. XS - это набор макросов. Процессор языка XS - это программа под названием <em>xsubpp</em>, где pp - <a href="https://theworld.com/~swmcd/steven/perl/pm/xs/intro/index.html#pp" target="_blank">сокращение от PreProcessor</a>, а PreProcessor - вежливый термин для расширителя макросов. xsubpp расширяет макросы XS в биты кода C, необходимые для соединения интерпретатора Perl с вашими подпрограммами языка C.</p>
  <p>Поскольку XS не является языком, ему не хватает структуры. В коде на языке Си структура есть, но вы ее не видите, потому что она скрыта за макросами. Это делает практически невозможным изучение XS на его собственных условиях.</p>
  <p><strong>Возвращение к основам</strong><br />Чтобы изучить XS, вы должны работать снизу вверх. Вы должны изучить API Perl C. Вы должны понять внутренние структуры данных Perl. Вы должны понять, как работает стек Perl и как подпрограмма на языке C получает к нему доступ. Вы должны понимать, как подпрограммы на языке C подключаются к исполняемому файлу Perl. Вы должны понимать пути данных через модуль DynaLoader, которые связывают имя подпрограммы Perl с точкой входа подпрограммы C.<br />Как только вы поймете все это, вам не понадобится XS: вы можете писать код непосредственно на Perl C API, и ваш код на C будет компоноваться и выполняться под интерпретатором Perl.</p>
  <p>Если вы будете писать код непосредственно для Perl C API, вы обнаружите, что это трудно, чревато ошибками, утомительно и повторяется. Вы постоянно пишете одни и те же маленькие кусочки кода для перемещения параметров в стек Perl и обратно; для преобразования данных из внутреннего представления Perl в переменные C; для проверки нулевых указателей и других плохих вещей. Когда вы совершаете ошибку, вы не получаете плохой вывод: у вас падает интерпретатор.</p>
  <p><strong>Прозрение</strong><br />В конце концов, вы начинаете понимать, как <a href="https://theworld.com/~swmcd/steven/perl/pm/xs/intro/index.html#advantage" target="_blank">выгодно</a> обернуть эти маленькие кусочки кода в макросы, чтобы написать их один раз и больше о них не беспокоиться. И что вы знаете, кто-то уже написал несколько макросов для вас; есть даже расширитель макросов под названием <em>xsubpp</em>.</p>
  <p>Теперь вы понимаете, что такое XS.</p>
  <h3><strong>Достаточно сложная проблема</strong></h3>
  <p>Первое, что вам нужно для написания модуля XS - это программа, которую вы совершенно не можете написать на прямом Perl. Писать на C и XS, когда можно было бы писать на Perl, было бы вопиющим неумением быть ленивым.</p>
  <p>Когда-то моим любимым средством обработки чисел было быстрое преобразование Фурье, но сейчас, когда я думаю о нем, оно кажется мне <a href="https://theworld.com/~swmcd/steven/perl/pm/xs/intro/index.html#dated" target="_blank">устаревшим</a>. Оно такое классическое, такое линейное, такое старомодное. Кроме того, он работает за O(n*log(n)), что почти не поддается обработке на Perl.</p>
  <p>Вместо этого я собираюсь написать алгоритм динамического программирования <a href="https://theworld.com/~swmcd/steven/perl/pm/xs/intro/index.html#NW" target="_blank">Нидлмана-Вунша (NW)</a> для глобального оптимального выравнивания последовательностей. Выравнивание последовательностей - важная проблема в передовой области <a href="http://www.nhgri.nih.gov/" target="_blank">геномики</a>. Вот вам пару полезных статей:</p>
  <ul>
    <li>Некоторые <a href="https://theworld.com/~swmcd/steven/perl/pm/xs/intro/robbins.html" target="_blank">мотивы</a> проблем выравнивания последовательностей</li>
    <li><a href="https://theworld.com/~swmcd/steven/perl/lib/Game/Stones/Stones.html" target="_blank">Краткое описание</a> динамического программирования в применении к более простой задаче</li>
    <li><a href="https://www.maths.tcd.ie/~lily/pres2/sld003.htm" target="_blank">Описание</a> NW алгоритма</li>
    <li><a href="https://theworld.com/~swmcd/steven/perl/pm/xs/intro/align" target="_blank">Прямая реализация</a> алгоритма NW на языке Perl</li>
  </ul>
  <p><br />Выравнивание последовательностей - это комбинаторная задача, и наивные алгоритмы работают за экспоненциальное время. Алгоритм Нидлмана-Вунша работает за (более или менее) <a href="https://theworld.com/~swmcd/steven/perl/pm/xs/intro/index.html#order" target="_blank">O(n^3)</a>, что все еще достаточно плохо, чтобы сообщество геномики использовало <a href="http://www.biocceleration.com/BioXLH-general.html" target="_blank">специализированное оборудование</a> и <a href="http://www.yeastgenome.org/" target="_blank">сетевые базы данных</a> для выравнивания.</p>
  <p>В качестве контрольной точки я выровнял 2 последовательности по 200 символов каждая. Это довольно скромная задача по стандартам геномики. Реализация Perl выравнивает их за 200 или 400 секунд. Точное время не имеет значения: это займет больше времени, чем я готов ждать.</p>
  <p>Шаг O(n^3) в алгоритме NW - это заполнение матрицы оценок; все остальное выполняется за <a href="https://theworld.com/~swmcd/steven/perl/pm/xs/intro/index.html#linear" target="_blank">линейное время</a>. Я написал программу на языке Си, которая заполняет матрицу оценок.</p>
  <ul>
    <li><a href="https://theworld.com/~swmcd/steven/perl/pm/xs/intro/align.c" target="_blank">align.c</a></li>
    <li><a href="https://theworld.com/~swmcd/steven/perl/pm/xs/intro/align.h" target="_blank">align.h</a></li>
    <li><a href="https://theworld.com/~swmcd/steven/perl/pm/xs/intro/main.c" target="_blank">main.c</a></li>
  </ul>
  <p>Она выполняет эталонное выравнивание 200x200 за 3 секунды, или примерно в 100 раз быстрее, чем реализация Perl.</p>
  <p>Я не хочу переписывать остальную часть реализации Perl на C. Части алгоритма сложны, и он в значительной степени полагается на Perl для ведения домашнего хозяйства и управления памятью. Это тот тип кода, который является радостью в Perl и бременем в C.</p>
  <p>Вместо этого я хочу использовать реализацию C для заполнения матрицы оценок, использовать реализацию Perl для всего остального и использовать XS для обращения от одного к другому. В следующих четырех частях этой статьи мы рассмотрим, как это сделать.</p>
  <h3><a href="https://theworld.com/~swmcd/steven/perl/pm/xs/concepts.html" target="_blank">Следующий месяц: Архитектура</a></h3>
  <p>Ранее я утверждал, что XS нужно изучать снизу вверх. Оказалось, что &quot;снизу&quot; - это архитектура фон Неймана для компьютеров с хранимыми программами, и оттуда придется долго подниматься вверх. Вместо того чтобы идти этим путем, мы начнем с самого верха и пройдем путь вниз путем анализа. Это даст нам концепции, необходимые для понимания XS.</p>
  <p>Нам предстоит изучить много материала, но либо вы понимаете архитектуру, лежащую в основе XS, либо вы хрустящий и хорошо разбираетесь в кетчупе.</p>
  <h2>ПРИМЕЧАНИЯ</h2>
  <p><em>довольно распространенный</em><br />        Я до сих пор помню свое недоумение, когда впервые наткнулся на man-        страницу awk.<br /><em>pp - сокращение от PreProcessor</em><br />        На самом деле pp - это сокращение от Perl Pseudocode, но звучит неплохо...<br /><em>преимущество</em><br />        Еще одним преимуществом кодирования в XS является то, что это защищает ваш код от изменений в Perl C API.<br /><em>датировано</em><br />        1965 год, как это бывает.<br />        J. В. Кули и Дж. В. Тьюки, &quot;Алгоритм машинного вычисления сложных рядов Фурье&quot;, Математика вычислений, том 19, 1965, стр. 297-301.<br /><em>Нидлман-Вунш</em><br />        Нидлман, С.Б. и Вунш, К.Д. 1970. &quot;Общий метод, применимый к поиску сходства в аминокислотных последовательностях двух белков&quot; Журнал молекулярной биологии. 48: 443-453.<br />        <em>См. также</em><br />        Смит, Т.Ф. и Уотерман, М.С. 1981. &quot;Идентификация общих молекулярных подпоследовательностей&quot; Журнал молекулярной биологии. 147: 195-197<br /><em>O(n^3)</em><br />        O(n^2), если штраф за разрыв-открытие равен нулю<br /><em>линейное время</em><br />        Алгоритму Смита-Ватермана требуется O(n^2) времени, чтобы найти клетку с наивысшим баллом в матрице.</p>

]]></content:encoded></item></channel></rss>