*********
后记
*********

为什么选择 Python？
===================

Python 的优势
-------------

尽管必须快速执行的代码是用编译型语言实现的，但 Sage 的主要实现语言是 Python（见 [Py]_ ）。
Python 具有以下几点优势：


-  **对象保存** 在 Python 中得到了很好的支持。Python 广泛支持将（几乎）任意对象保存到磁盘文件或数据库中。

-  源代码中对函数和包的 **文档** 支持非常好，包括自动提取文档和自动测试所有示例。
   这些示例会定期自动测试，并保证如预期工作。

-  **内存管理**：Python 现有的内存管理器和垃圾收集器设计精巧且强大，
   可以正确处理循环引用，并允许文件中的局部变量。

-  Python 拥有许多对 Sage 用户非常有用的 **包**：数值分析和线性代数，2D 和 3D 可视化，
   网络（用于分布式计算和服务，例如通过 twisted），数据库支持等。

-  **可移植性**：Python 在大多数平台上，只需几分钟即可轻松从源代码编译 Python。

-  **异常处理**：Python 拥有复杂且精巧的异常处理系统，即使代码出现错误，程序也能优雅地恢复。

-  **调试器**：Python 包含调试器，因此当代码由于某种原因失败时，
   用户可以访问详尽的堆栈跟踪，检查所有相关变量的状态，并上下移动堆栈。

-  **性能分析器**：Python 拥有性能分析器，它会运行代码并创建一份详细报告，说明每个函数被调用的次数和时间。

-  **一门语言**：不同于 Magma、Maple、Mathematica、Matlab、GP/PARI、GAP、Macaulay 2、Simath 等
   那样为数学编写一门 **新语言**，我们使用 Python 语言，它是一种流行的计算机语言，
   由数百名经验丰富的软件工程师积极开发和优化。Python 是一个重要的开源成功案例，拥有成熟的开发流程（见 [PyDev]_ ）。


.. _section-mathannoy:

预解析器：Sage 与 Python 之间的区别
-----------------------------------

Python 的一些数学方面可能会令人困惑，因此 Sage 在多个方面的行为与 Python 不同。


-  **指数运算符的表示法**： ``**`` vs ``^``。在 Python 中，
   ``^`` 表示“异或”，而不是指数运算。因此在 Python 中我们有：

   .. CODE-BLOCK:: pycon

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

   ``^`` 的这种用法可能略显奇怪，并且对于纯数学研究来说效率不高，因为“异或”函数很少使用。
   为了方便起见，Sage 在将所有命令行传递给 Python 之前都会进行预解析，
   将不在字符串中的 ``^`` 替换为 ``**``:

   ::

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

   Sage 中的按位异或运算符是 ``^^``。这也适用于就地运算符对于就地运算符 ``^^=``：

   ::

       sage: 3^^2
       1
       sage: a = 2
       sage: a ^^= 8
       sage: a
       10

-  **整数除法**：Python 表达式 ``2/3`` 并不像数学家们所预期的那样：``2/3`` 返回浮点数 ``0.6666...``。
   请注意 ``//`` 是欧几里得除法，``2//3`` 返回 ``0``。

   我们在 Sage 解释器中通过将整型字面量包装在 ``Integer( )`` 中，并使除法作为有理数的构造函数来处理这个问题。例如：

   ::

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

-  **长整数**：Python 原生支持除 C int 类型外的任意精度整数。
   这些原生整数的性能显著低于 GMP 所提供的。Sage 使用 GMP C 库来实现任意精度整数。


与某些人为了内部项目修改 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/>`_ 也有一些有用的信息，
你还可以查看 ``sage-devel`` Google 讨论组。

如何引用 Sage？
===============

如果你在论文中使用了 Sage，当引用使用 Sage 的计算时，包含以下内容：
如果你使用 Sage 撰写论文，请将以下内容添加到参考文献中来引用使用 Sage 完成的计算

.. CODE-BLOCK:: text

    [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? 并引用这些系统。如果你不确定计算使用了哪个软件，
可以随时在 ``sage-devel`` Google 讨论组上提问。有关这一点的进一步讨论，请参阅 :ref:`section-univariate`。

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

如果你恰好刚刚读完这篇教程，并且知道花了多长时间，请在 ``sage-devel`` Google 讨论组上告诉我们。

祝使用 Sage 愉快！
