***********
Послесловие
***********

Почему Python?
==============

Преимущества Python
-------------------

Основной язык реализации Sage — это Python (см. [Py]_), однако код, который
должен обрабатываться быстро, написан на компилируемом языке. У Python есть
ряд преимуществ:


-  **Сохранение объектов** широко используется в Python. В Python присутствует
   поддержка сохранения (почти) любых объектов на диск или в базу данных.

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

-  **Управление памятью**: Python имеет продуманный и стабильный менеджер
   памяти и сборщик мусора, которые исправно работают с циклическими ссылками
   и позволяют использовать локальные переменные в файлах.

-  Python имеет **множество пакетов**, доступных уже сейчас, которые могут
   быть интересны пользователям Sage: численный анализ и линейная алгебра,
   2D и 3D визуализация, сеть (для распределенных вычислений и серверов,
   например с помощью twisted), поддержка баз данных и т.д.

-  **Портируемость:** Python с легкостью компилируется на большинстве платформ
   в считанные минуты.

-  **Работа с исключениями:** Python содержит сложный и продуманный механизм
   работы с исключениями, благодаря чему программы продолжают работать даже
   при возникновении ошибок в вызываемом ими коде.

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

-  **Профилировщик:** существует профилировщик Python, который запускает код и
   создает отчет по количеству вызовов и времени работы каждой функции.

-  **Язык:** Вместо того, чтобы писать **новый язык** для математики, как это
   было сделано для Magma, Maple, Mathematica, Matlab, GP/PARI, GAP, Macaulay 2,
   Simath, и т.д., мы используем язык Python, который является популярным языком
   программирования; он активно развивается и оптимизируется сотнями опытных
   специалистов по программному обеспечению (см. [PyDev]_).


.. _section-mathannoy:

Пре-парсер: Различия между Sage и Python
----------------------------------------

В некоторых математических аспектах Python может ввести в заблуждение, поэтому
Sage ведет себя немного другим образом.


-  **Обозначение возведения в степень:** ``**`` вместо ``^``. В Python,
   ``^`` означает "исключительно или (xor)", а не возведение в степень, так
   в Python:

   ::

       >>> 2^8
       10
       >>> 3^2
       1
       >>> 3**2
       9

   Использование ``^`` может показаться странным; это не так важно для
   математических исследований, потому как "исключительно или" используется
   довольно редко. Для удобства, Sage использует пре-парсер для проверки кода
   перед тем, как он передается в Python, и символ ``^`` (если он не находится
   в строке) заменяет на ``**``:

   ::

       sage: 2^8
       256
       sage: 3^2
       9
       sage: "3^2"
       '3^2'

-  **Деление целых чисел:** Выражение ``2/3`` в Python означает не то, чего
   ожидает математик. В Python 2, если ``m`` и ``n`` - целые числа, то ``m/n``
   также целое число, если быть точнее, то целая часть от деления ``m`` на
   ``n``. Следовательно ``2/3=0``. В сообществе Python обсуждается вариант
   изменения оператора так, чтобы ``2/3`` возвращало число с плавающей точкой
   ``0.6666...``, а ``2//3`` возвращало ``0``.

   В интерпретаторе Sage мы используем обозначение ``Integer( )`` и деление
   используем как конструктор для рациональных чисел. Например:

   ::

       sage: 2/3
       2/3
       sage: (2/3).parent()
       Rational Field
       sage: 2//3
       0
       sage: int(2)/int(3)   # py2
       0

-  **Большие целые числа:** Python имеет встроенную поддержку целых чисел
   произвольной точности в дополнение к C-int’ам. Они намного медленнее, чем то,
   что предоставляет GMP, а также имеют свойство: символ ``L`` в конце, чтобы
   отличать их от переменных типа int (и это не изменится в ближайшем будущем).
   Sage использует целые числа произвольной точности с помощью GMP C-библиотеки,
   и они выводятся на экран без L.


Вместо изменения интерпретатора Python (как поступили некоторые люди для
внутренних проектов), мы используем Python как есть, и применяем пре-парсер
для IPython так чтобы поведение командной строки IPython соответствовало
ожиданиям математиков. Это означает, что любой существующий код на Python
может быть использован в Sage. Однако, нужно придерживаться стандарта Python
при написании пакетов, которые будут импортированы в Sage.

(Чтобы установить пакет Python, который, скажем, вы нашли в интернете, следуйте
инструкции, но запускайте ``sage -python`` вместо ``python``. Очень часто это
означает, что нужно ввести ``sage -python setup.py install``.)

Как принять участие в разработке Sage?
======================================

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

Поищите информацию для разработчиков на главной странице Sage; кроме всего
прочего, вы можете найти список проектов, связанных с Sage, отсортированных по
приоритету и категории. `Руководство разроботчика Sage
<http://doc.sagemath.org/html/en/developer/>`_ содержит полезную информацию; вы
также можете узнать больше в Google-группе ``sage-devel``.

Как правильно ссылаться на Sage?
================================

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

::

    [Sage] SageMath, the Sage Mathematics Software System (Version 8.7),
           The Sage Developers, 2019, https://www.sagemath.org.

в раздел библиографии (заменяя 8.7 версией Sage, которую вы используете).
Кроме того, пожалуйста, постарайтесь отследить, какие компоненты Sage были
использованы для вычислений, например PARI?, GAP?, Singular? Maxima?, и укажите
эти системы. Если вы сомневаетесь о том, какое программное обеспечение
используется для вычислений, задайте вопрос в Google-группе ``sage-devel``.
См. :ref:`section-univariate` для дальнейшего обсуждения этой темы.

------------

Если вы прочитали это руководство от начала до конца, и у вас есть соображения
по поводу времени, затраченного на него, пожалуйста, выскажите свое мнение в
Google-группе ``sage-devel``.

Наслаждайтесь Sage!
