<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>Послесловие — Sage Tutorial in Russian v5.9</title> <link rel="stylesheet" href="_static/sage.css" type="text/css" /> <link rel="stylesheet" href="_static/pygments.css" type="text/css" /> <script type="text/javascript"> var DOCUMENTATION_OPTIONS = { URL_ROOT: '', VERSION: '5.9', COLLAPSE_INDEX: false, FILE_SUFFIX: '.html', HAS_SOURCE: true }; </script> <script type="text/javascript" src="_static/jquery.js"></script> <script type="text/javascript" src="_static/underscore.js"></script> <script type="text/javascript" src="_static/doctools.js"></script> <script type="text/javascript" src="_static/translations.js"></script> <link rel="shortcut icon" href="_static/favicon.ico"/> <link rel="top" title="Sage Tutorial in Russian v5.9" href="index.html" /> <link rel="next" title="Дополнение" href="appendix.html" /> <link rel="prev" title="Использование SageTeX" href="sagetex.html" /> <link rel="icon" href="_static/sageicon.png" type="image/x-icon" /> </head> <body> <div class="related"> <h3>Просмотр</h3> <ul> <li class="right" style="margin-right: 10px"> <a href="genindex.html" title="Словарь-указатель" accesskey="I">словарь</a></li> <li class="right" > <a href="py-modindex.html" title="Python Module Index" >модули</a> |</li> <li class="right" > <a href="appendix.html" title="Дополнение" accesskey="N">следующий</a> |</li> <li class="right" > <a href="sagetex.html" title="Использование SageTeX" accesskey="P">предыдущий</a> |</li> <a href="../index.html"><img src="_static/sagelogo.png" style="vertical-align: middle" title="Sage Logo"></a> <li><a href="index.html">Sage Tutorial in Russian v5.9</a> »</li> </ul> </div> <div class="document"> <div class="documentwrapper"> <div class="bodywrapper"> <div class="body"> <div class="section" id="id1"> <h1>Послесловие<a class="headerlink" href="#id1" title="Ссылка на этот заголовок">¶</a></h1> <div class="section" id="python"> <h2>Почему Python?<a class="headerlink" href="#python" title="Ссылка на этот заголовок">¶</a></h2> <div class="section" id="id2"> <h3>Преимущества Python<a class="headerlink" href="#id2" title="Ссылка на этот заголовок">¶</a></h3> <p>Основной язык реализации Sage — это Python (см. <a class="reference internal" href="bibliography.html#py">[Py]</a>), однако код, который должен обрабатываться быстро, написан на компилируемом языке. У Python есть ряд преимуществ:</p> <ul class="simple"> <li><strong>Сохранение объектов</strong> широко используется в Python. В Python присутствует поддержка сохранения (почти) любых объектов на диск или в базу данных.</li> <li>Замечательная поддержка <strong>документации</strong> функций и пакетов в исходном коде, включая автоматический доступ к документации и автоматическое тестирование всех примеров. Примеры проверяются автоматически на регулярной основе и их правильная работоспособность гарантирована.</li> <li><strong>Управление памятью</strong>: Python имеет продуманный и стабильный менеджер памяти и сборщик мусора, которые исправно работают с циклическими ссылками и позволяют использовать локальные переменные в файлах.</li> <li>Python имеет <strong>множество пакетов</strong>, доступных уже сейчас, которые могут быть интересны пользователям Sage: численный анализ и линейная алгебра, 2D и 3D визуализация, сеть (для распределенных вычислений и серверов, например с помощью twisted), поддержка баз данных и т.д.</li> <li><strong>Портируемость:</strong> Python с легкостью компилируется на большинстве платформ в считанные минуты.</li> <li><strong>Работа с исключениями:</strong> Python содержит сложный и продуманный механизм работы с исключениями, благодаря чему программы продолжают работать даже при возникновении ошибок в вызываемом ими коде.</li> <li><strong>Отладчик:</strong> Python включает в себя отладчик, так что когда программа не работает по какой-то причине, пользователь может получить доступ к истории стека, проверить состояние необходимых переменных, перемещаться по стеку.</li> <li><strong>Профилировщик:</strong> существует профилировщик Python, который запускает код и создает отчет по количеству вызовов и времени работы каждой функции.</li> <li><strong>Язык:</strong> Вместо того, чтобы писать <strong>новый язык</strong> для математики, как это было сделано для Magma, Maple, Mathematica, Matlab, GP/PARI, GAP, Macaulay 2, Simath, и т.д., мы используем язык Python, который является популярным языком программирования; он активно развивается и оптимизируется сотнями опытных специалистов по программному обеспечению (см. <a class="reference internal" href="bibliography.html#pydev">[PyDev]</a>).</li> </ul> </div> <div class="section" id="sage-python"> <span id="section-mathannoy"></span><h3>Пре-парсер: Различия между Sage и Python<a class="headerlink" href="#sage-python" title="Ссылка на этот заголовок">¶</a></h3> <p>В некоторых математических аспектах Python может ввести в заблуждение, поэтому Sage ведет себя немного другим образом.</p> <ul> <li><p class="first"><strong>Обозначение возведения в степень:</strong> <tt class="docutils literal"><span class="pre">**</span></tt> вместо <tt class="docutils literal"><span class="pre">^</span></tt>. В Python, <tt class="docutils literal"><span class="pre">^</span></tt> означает “исключительно или (xor)”, а не возведение в степень, так в Python:</p> <div class="highlight-python"><div class="highlight"><pre><span class="gp">>>> </span><span class="mi">2</span><span class="o">^</span><span class="mi">8</span> <span class="go">10</span> <span class="gp">>>> </span><span class="mi">3</span><span class="o">^</span><span class="mi">2</span> <span class="go">1</span> <span class="gp">>>> </span><span class="mi">3</span><span class="o">**</span><span class="mi">2</span> <span class="go">9</span> </pre></div> </div> <p>Использование <tt class="docutils literal"><span class="pre">^</span></tt> может показаться странным; это не так важно для математических исследований, потому как “исключительно или” используется довольно редко. Для удобства, Sage использует пре-парсер для проверки кода перед тем, как он передается в Python, и символ <tt class="docutils literal"><span class="pre">^</span></tt> (если он не находится в строке) заменяет на <tt class="docutils literal"><span class="pre">**</span></tt>:</p> <div class="highlight-python"><div class="highlight"><pre><span class="go">sage: 2^8</span> <span class="go">256</span> <span class="go">sage: 3^2</span> <span class="go">9</span> <span class="go">sage: "3^2"</span> <span class="go">'3^2'</span> </pre></div> </div> </li> <li><p class="first"><strong>Деление целых чисел:</strong> Выражение <tt class="docutils literal"><span class="pre">2/3</span></tt> в Python означает не то, чего ожидает математик. В Python, если <tt class="docutils literal"><span class="pre">m</span></tt> и <tt class="docutils literal"><span class="pre">n</span></tt> - целые числа, то <tt class="docutils literal"><span class="pre">m/n</span></tt> также целое число, если быть точнее, то целая часть от деления <tt class="docutils literal"><span class="pre">m</span></tt> на <tt class="docutils literal"><span class="pre">n</span></tt>. Следовательно <tt class="docutils literal"><span class="pre">2/3=0</span></tt>. В сообществе Python обсуждается вариант изменения оператора так, чтобы <tt class="docutils literal"><span class="pre">2/3</span></tt> возвращало число с плавающей точкой <tt class="docutils literal"><span class="pre">0.6666...</span></tt>, а <tt class="docutils literal"><span class="pre">2//3</span></tt> возвращало <tt class="docutils literal"><span class="pre">0</span></tt>.</p> <p>В интерпретаторе Sage мы используем обозначение <tt class="docutils literal"><span class="pre">Integer(</span> <span class="pre">)</span></tt> и деление используем как конструктор для рациональных чисел. Например:</p> <div class="highlight-python"><div class="highlight"><pre><span class="go">sage: 2/3</span> <span class="go">2/3</span> <span class="go">sage: (2/3).parent()</span> <span class="go">Rational Field</span> <span class="go">sage: 2//3</span> <span class="go">0</span> <span class="go">sage: int(2)/int(3)</span> <span class="go">0</span> </pre></div> </div> </li> <li><p class="first"><strong>Большие целые числа:</strong> Python имеет встроенную поддержку целых чисел произвольной точности в дополнение к C-int’ам. Они намного медленнее, чем то, что предоставляет GMP, а также имеют свойство: символ <tt class="docutils literal"><span class="pre">L</span></tt> в конце, чтобы отличать их от переменных типа int (и это не изменится в ближайшем будущем). Sage использует целые числа произвольной точности с помощью GMP C-библиотеки, и они выводятся на экран без L.</p> </li> </ul> <p>Вместо изменения интерпретатора Python (как поступили некоторые люди для внутренних проектов), мы используем Python как есть, и применяем пре-парсер для IPython так чтобы поведение командной строки IPython соответствовало ожиданиям математиков. Это означает, что любой существующий код на Python может быть использован в Sage. Однако, нужно придерживаться стандарта Python при написании пакетов, которые будут импортированы в Sage.</p> <p>(Чтобы установить пакет Python, который, скажем, вы нашли в интернете, следуйте инструкции, но запускайте <tt class="docutils literal"><span class="pre">sage</span> <span class="pre">-python</span></tt> вместо <tt class="docutils literal"><span class="pre">python</span></tt>. Очень часто это означает, что нужно ввести <tt class="docutils literal"><span class="pre">sage</span> <span class="pre">-python</span> <span class="pre">setup.py</span> <span class="pre">install</span></tt>.)</p> </div> </div> <div class="section" id="sage"> <h2>Как принять участие в разработке Sage?<a class="headerlink" href="#sage" title="Ссылка на этот заголовок">¶</a></h2> <p>Если вы хотите помочь в разработке Sage, это будет оценено по достоинству! Помощь может варьироваться от внесения изменений в код до дополнения справочной информации и нахождения багов.</p> <p>Поищите информацию для разработчиков на главной странице Sage; кроме всего прочего, вы можете найти список проектов, связанных с Sage, отсортированных по приоритету и категории. <a class="reference external" href="http://www.sagemath.org/doc/developer/">Руководство разроботчика Sage</a> содержит полезную информацию; вы также можете узнать больше в Google-группе <tt class="docutils literal"><span class="pre">sage-devel</span></tt>.</p> </div> <div class="section" id="id6"> <h2>Как правильно ссылаться на Sage?<a class="headerlink" href="#id6" title="Ссылка на этот заголовок">¶</a></h2> <p>Если вы используете Sage для написания работы, пожалуйста, укажите, что вычисления были произведены с помощью Sage. Включите</p> <div class="highlight-python"><pre>[Sage] William A. Stein et al., Sage Mathematics Software (Version 4.3). The Sage Development Team, 2009, http://www.sagemath.org.</pre> </div> <p>в раздел библиографии (заменяя 4.3 версией Sage, которую вы используете). Кроме того, пожалуйста, постарайтесь отследить, какие компоненты Sage были использованы для вычислений, например PARI?, GAP?, Singular? Maxima?, и укажите эти системы. Если вы сомневаетесь о том, какое программное обеспечение используется для вычислений, задайте вопрос в Google-группе <tt class="docutils literal"><span class="pre">sage-devel</span></tt>. См. <a class="reference internal" href="tour_polynomial.html#section-univariate"><em>Полиномы одной переменной</em></a> для дальнейшего обсуждения этой темы.</p> <hr class="docutils" /> <p>Если вы прочитали это руководство от начала до конца, и у вас есть соображения по поводу времени, затраченного на него, пожалуйста, выскажите свое мнение в Google-группе <tt class="docutils literal"><span class="pre">sage-devel</span></tt>.</p> <p>Наслаждайтесь Sage!</p> </div> </div> </div> </div> </div> <div class="sphinxsidebar"> <div class="sphinxsidebarwrapper"> <h3><a href="index.html">Содержание</a></h3> <ul> <li><a class="reference internal" href="#">Послесловие</a><ul> <li><a class="reference internal" href="#python">Почему Python?</a><ul> <li><a class="reference internal" href="#id2">Преимущества Python</a></li> <li><a class="reference internal" href="#sage-python">Пре-парсер: Различия между Sage и Python</a></li> </ul> </li> <li><a class="reference internal" href="#sage">Как принять участие в разработке Sage?</a></li> <li><a class="reference internal" href="#id6">Как правильно ссылаться на Sage?</a></li> </ul> </li> </ul> <h4>Предыдущий раздел</h4> <p class="topless"><a href="sagetex.html" title="предыдущая глава">Использование SageTeX</a></p> <h4>Следующий раздел</h4> <p class="topless"><a href="appendix.html" title="следующая глава">Дополнение</a></p> <h3>На этой странице</h3> <ul class="this-page-menu"> <li><a href="_sources/afterword.txt" rel="nofollow">Показать исходный текст</a></li> </ul> <div id="searchbox" style="display: none"> <h3>Быстрый поиск</h3> <form class="search" action="search.html" method="get"> <input type="text" name="q" size="18" /> <!-- The shading of the "Go" button should be consistent --> <!-- with the colour of the header and footer. See the file --> <!-- doc/common/themes/sage/theme.conf for colours used by --> <!-- the Sage theme. --> <input type="submit" style="background-color: #B8B9F6" value="Искать" /> <input type="hidden" name="check_keywords" value="yes" /> <input type="hidden" name="area" value="default" /> </form> <p class="searchtip" style="font-size: 90%"> Введите слова для поиска или имя модуля, класса или функции. </p> </div> <script type="text/javascript">$('#searchbox').show(0);</script> </div> </div> <div class="clearer"></div> </div> <div class="related"> <h3>Просмотр</h3> <ul> <li class="right" style="margin-right: 10px"> <a href="genindex.html" title="Словарь-указатель" >словарь</a></li> <li class="right" > <a href="py-modindex.html" title="Python Module Index" >модули</a> |</li> <li class="right" > <a href="appendix.html" title="Дополнение" >следующий</a> |</li> <li class="right" > <a href="sagetex.html" title="Использование SageTeX" >предыдущий</a> |</li> <a href="../index.html"><img src="_static/sagelogo.png" style="vertical-align: middle" title="Sage Logo"></a> <li><a href="index.html">Sage Tutorial in Russian v5.9</a> »</li> </ul> </div> <div class="footer"> © Copyright 2005--2011, The Sage Development Team. При создании использован <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.1.3. </div> <script type="text/javascript"> /*global jQuery, window */ /* Sphinx sidebar toggle. Putting this code at the end of the body * enables the toggle for the live, static, and offline docs. Note: * sage.misc.html.math_parse() eats jQuery's dollar-sign shortcut. */ var jq = jQuery; jq(document).ready(function () { var bar, bod, bg, fg, key, tog, wid_old, wid_new, resize, get_state, set_state; bod = jq('div.bodywrapper'); bar = jq('div.sphinxsidebar'); tog = jq('<div class="sphinxsidebartoggle"></div>'); /* Delayed resize helper. Not perfect but good enough. */ resize = function () { setTimeout(function () { tog.height(bod.height()); }, 100); }; jq(window).resize(function () { resize(); }); /* Setup and add the toggle. See Sphinx v0.5.1 default.css. */ fg = jq('div.sphinxsidebar p a').css('color') || 'rgb(152, 219, 204)'; bg = jq('div.document').css('background-color') || 'rgb(28, 78, 99)'; wid_old = '230px'; wid_new = '5px'; tog.css('background-color', bg) .css('border-width', '0px') .css('border-right', wid_new + ' ridge ' + bg) .css('cursor', 'pointer') .css('position', 'absolute') .css('left', '-' + wid_new) .css('top', '0px') .css('width', wid_new); bod.css('position', 'relative'); bod.prepend(tog); resize(); /* Cookie helpers. */ key = 'sphinxsidebar='; set_state = function (s) { var date = new Date(); /* Expiry in 7 days. */ date.setTime(date.getTime() + (7 * 24 * 3600 * 1000)); document.cookie = key + encodeURIComponent(s) + '; expires=' + date.toUTCString() + '; path=/'; }; get_state = function () { var i, c, crumbs = document.cookie.split(';'); for (i = 0; i < crumbs.length; i += 1) { c = crumbs[i].replace(/^\s+/, ''); if (c.indexOf(key) === 0) { return decodeURIComponent(c.substring(key.length, c.length)); } } return null; }; /* Event handlers. */ tog.mouseover(function (ev) { tog.css('border-right-color', fg); }).mouseout(function (ev) { tog.css('border-right-color', bg); }).click(function (ev) { if (bod.hasClass('wide')) { bod.removeClass('wide'); bod.css('margin-left', wid_old); bar.css('width', wid_old); bar.show(); set_state('visible'); } else { set_state('hidden'); bar.hide(); bar.css('width', '0px'); bod.css('margin-left', wid_new); bod.addClass('wide'); } resize(); }); /* Hide the normally visible sidebar? */ if (get_state() === 'hidden') { tog.trigger('click'); } else { set_state('visible'); } }); </script> </body> </html>