********
Posfacio
********

Por quê o Python?
=================

Vantagens do Python
-------------------

A primeira linguagem de implementação do Sage é o Python (veja [Py]_),
embora rotinas que precisam ser muito rápidas são implementadas em uma
linguagem compilada. O Python possui várias vantagens:

-  **Salvar objetos** é bem suportado em Python. Existe suporte
   extenso em Python para salvar (na grande maioria dos casos) objetos
   arbitrários em arquivos em disco ou em uma base de dados.

-  Suporte excelente para **documentação** de funções e pacotes no
   código fonte, incluindo extração automática de documentação e teste
   automático de todos os exemplos. Os exemplos são automaticamente
   testados regularmente para garantir que funcionam como indicado.

-  **Gerenciamento de memória:** O Python agora possui um sistema de
   gerenciamento de memória e "garbage collector" muito bem pensados e
   robustos que lidam corretamente com referências circulares, e
   permitem variáveis locais em arquivos.

-  O Python possui **diversos pacotes** disponíveis que podem ser de
   grande interesse para os usuários do Sage: análise numérica e
   álgebra linear, visualização 2D e 3D, comunicação via rede (para
   computação distribuída e servidores, por exemplo, via twisted),
   suporte a base de dados, etc.

-  **Portabilidade:** O Python é fácil de compilar a partir do código
   fonte em poucos minutos na maioria das arquiteturas.

-  **Manuseamento de exceções:** O Python possui um sofisticado e bem
   pensado sistema de manuseamento de exceções, através do qual
   programas podem facilmente se recuperar mesmo se ocorrerem erros no
   código que está sendo executado.

-  **Debugador:** O Python inclui um debugador, de modo que quando
   alguma rotina falha por algum motivo, o usuário pode acessar
   extensiva informação sobre a pilha de cálculos e inspecionar o
   estado de todas as variáveis relevantes.

-  **Profiler:** Existe um profiler para o Python, o qual executa
   programas e cria um relatório detalhando quantas vezes e por quando
   tempo cada função foi executada.

-  **Uma Linguagem:** Em vez de escrever uma **nova linguagem** para
   matemática como foi feito para o Magma, Maple, Mathematica, Matlab,
   GP/PARI, GAP, Macaulay 2, Simath, etc., nós usamos a linguagem
   Python, que é uma linguagem de programação popular que está
   sendo desenvolvida e otimizada ativamente por centenas de
   engenheiros de software qualificados. O Python é uma grande
   história de sucesso em desenvolvimento com código aberto com um
   processo de desenvolvimento maduro (veja [PyDev]_).

.. _section-mathannoy:

O Pré-Processador: Diferenças entre o Sage e o Python
-----------------------------------------------------

Alguns aspectos matemáticos do Python podem ser confusos, logo o Sage
se comporta diferentemente do Python em diversas situações.

-  **Notação para exponenciação:** ``**`` versus ``^``. Em Python,
   ``^`` significa "xor", não exponenciação, logo em Python temos

   ::

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

   Esse uso de ``^`` pode parecer estranho, e é ineficiente para
   pesquisa em matemática pura, pois a função "ou exclusivo" é
   raramente usada. Por conveniência, o Sage pre-processa todos as
   linhas de comandos antes de passá-las para o Python, substituindo
   ocorrências de ``^`` que não estão em strings por ``**``:

   ::

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

-  **Divisão por inteiros:** A expressão em Python ``2/3`` não se
   comporta da forma que um matemático esperaria. Em Python 2, se ``m``
   e ``n`` são inteiros (int), então ``m/n`` também é um inteiro
   (int), a saber, o quociente de ``m`` dividido por ``n``. Portanto
   ``2/3=0``. Tem havido discussões na comunidade do Python para
   modificar o Python de modo que ``2/3`` retorne um número de
   precisão flutuante (float) ``0.6666...``, e ``2//3`` retorne ``0``.

   Nós lidamos com isso no interpretador Sage, encapsulando inteiros
   literais em ``Integer()`` e fazendo a divisão um construtor para
   números racionais. Por exemplo:

   ::

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

-  **Inteiros longos:** O Python possui suporte nativo para inteiros
   com precisão arbitrária, além de int's do C. Esses são
   significantemente mais lentos do que os fornecidos pela biblioteca
   GMP, e têm a propriedade que eles são impressos com o sufixo ``L``
   para distingui-los de int's (e isso não será modificado no futuro
   próximo). O Sage implementa inteiros com precisão arbitrária usando
   a biblioteca C do GMP, e esses são impressos sem o sufixo ``L``.

Em vez de modificar o interpretador Python (como algumas pessoas
fizeram para projetos internos), nós usamos a linguagem Python
exatamente com ela é, e escrevemos um pré-processador para o IPython de
modo que o comportamento da linha de comando seja o que um matemático
espera. Isso significa que qualquer programa existente em Python pode
ser usado no Sage. Todavia, deve-se obedecer as regras padrão do
Python para escrever programas que serão importados no Sage.

(Para instalar uma biblioteca do Python, por exemplo uma que você
tenha encontrado na internet, siga as instruções, mas execute ``sage
-python`` em vez de ``python``. Frequentemente isso significa digitar
``sage -python setup.py install``.)

Eu gostaria de contribuir de alguma forma. Como eu posso?
=========================================================

Se você quiser contribuir para o Sage, a sua ajuda será muito bem
vinda! Ela pode variar desde substancial quantidade de código, até
contribuições com respeito à documentação ou notificação de defeitos
(bugs).

Explore a página na web do Sage para informações para desenvolvedores;
entre outras coisas, você pode encontrar uma lista longa de projetos
relacionados ao Sage ordenados por prioridade e categoria. O `Guia
para desenvolvedores do Sage
<http://doc.sagemath.org/html/en/developer/>`_ (em inglês) também possui
informações úteis, e você pode também visitar o grupo de discussões
``sage-devel`` no Google Groups.

Como eu faço referência ao Sage?
================================

Se você escrever um artigo usando o Sage, por favor faça referência
aos cálculos feitos com o Sage incluindo

::

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

na sua bibliografia (substituindo 8.7 pela versão do Sage que você
está usando). Além disso, procure observar quais componentes do Sage
você está usando em seus cálculos, por exemplo, PARI, Singular, GAP,
Maxima, e também site esses sistemas. Se você está em dúvida sobre
qual software está sendo usado em seus cálculos, fique à vontade para
perguntar no grupo ``sage-devel`` do Google Groups. Veja
:ref:`section-univariate` para mais discussões sobre esse aspecto.

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

Se por acaso você leu este tutorial do começo ao fim em uma só vez, e
faz idéia de quanto tempo você levou, por favor nos informe no grupo
``sage-devel`` do Google Groups.

Divirta-se com o Sage!
