********
Nachwort
********

Warum Python?
=============

Vorteile von Python
-------------------

Sage ist hautsächlich in der Programmiersprache Python implementiert (siehe [Py]_).
Jedoch ist Code, bei dem Geschwindigkeit ausschlaggebend ist, in einer
kompilierten Sprache implementiert. Python hat folgende Vorteile:


-  **Speichern von Objekten** wird in Python gut unterstützt. Für das
   Speichern von (nahezu) beliebigen Objekten auf Festplatten oder in
   Datenbanken sind in Python weitgehende Hilfsmittel vorhanden.

-  Exzellente Unterstütztung für die **Dokumentation** von Funktionen
   und Paketen im Quellcode, einschließlich der automatischen
   Erstellung der Dokumentation und automatisches Testen aller
   Beispiele. Die Beispiele werden regelmäßig automatisch getestet und
   es wird garantiert, dass sie wie angegeben funktionieren.

-  **Speicherverwaltung**: Python besitzt nun einen gut durchdachten
   und robusten Speicherverwalter und einen Speicherbereiniger, der
   zirkuläre Referenzen korrekt behandelt und lokale Variablen in
   Dateien berücksichtigt.

-  Python besitzt mittlerweile **viele Pakete**, die für Sagenutzer
   sehr reizvoll sein könnten: numerische Analysis und lineare
   Algebra, 2D und 3D Visualisierungen, Vernetzungen (für verteilte
   Berechnungen und Server, z.B. mithilfe von twisted),
   Datenbankunterstützung, usw.

-  **Portabilität:** Python kann auf den meisten Systemen
   unkompliziert, innerhalb von Minuten aus dem Quellcode kompiliert
   werden.

-  **Fehlerbehandlung:** Python besitzt ein ausgeklügeltes und wohl
   durchdachtes System für die Behandlung von Ausnahmebedingungen,
   mit dem Programme sinnvoll weiterarbeiten können, sogar wenn bei
   ihrem Aufruf Fehler auftreten.

-  **Debugger:** Python beinhaltet einen Debugger. Folglich kann der
   Benutzer, falls der Code aus irgendeinem Grund fehlschlägt, auf
   eine ausgiebige Stack-Ablaufverfolgung zugreifen, den Zustand
   aller relevanter Variablen betrachten, und sich auf dem Stack nach
   oben oder unten bewegen.

-  **Profiler:** Es gibt einen Python-Profiler, welcher Code
   ausführt und einen Bericht erstellt, in dem detailliert
   aufgestellt wurde wie oft und wie lange jede Funkion aufgerufen
   wurde.

-  **Eine Sprache:** Anstatt eine **neue Sprache** für mathematische
   Software zu schreiben, wie es für Magma, Maple, Mathematica, Matlab,
   GP/PARI, GAP, Macaulay 2, Simath, usw. gemacht wurde, benutzen wir
   die Programmiersprache Python, eine beliebte Programmiersprache, die
   von hunderten begabten Softwareingenieuren rege weiterentwickelt und
   optimiert wird. Python ist eine bedeutete Open-Source
   Erfolgsgeschichte mit einem ausgereiften Entwicklungsprozess. (siehe [PyDev]_).


.. _section-mathannoy:

Der Pre-Parser: Unterschiede zwischen Sage und Python
-----------------------------------------------------

Aus mathematischer Sicht kann Python in verschiedener Weise verwirrend
sein, also verhält sich Sage an manchen Stellen anders als Python.

-  **Notation für Exponentiation:** ``**`` versus ``^``. In Python
   bedeutet  ``^`` "xor", und nicht Exponentiation, also gilt in
   Python:

   ::

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

   Diese Benutzung von ``^`` kann merkwürdig erscheinen und sie ist
   ineffizient für mathematische Anwender, da die
   "Exklusives-Oder"-Funktion nur selten verwendet wird.
   Um dies zu beheben parst Sage alle Kommandozeilen bevor es diese zu
   Python weitergibt und ersetzt jedes Auftreten ``^``, das in keinem
   String vorkommt mit ``**``:

   ::

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

-  **Integerdivision:** Der Pythonaudruck ``2/3`` verhält sich nicht
   so, wie es Mathematiker erwarten würden. In Python 2 wird, falls ``m`` und
   ``n`` Integer sind, auch ``m/n`` als Integer behandelt, es ist
   nämlich der Quotient von ``m`` geteilt durch ``n``. Daher ist
   ``2/3=0``.  Es wurde in der Pythoncommunity darüber geredet, ob in
   Python die Division geändert werden sollte, so dass ``2/3`` die
   Gleitkommazahl ``0.6666...`` zurückgibt und ``2//3`` das Ergebnis
   ``0`` hat.

   Wir berücksichtigen dies im Sage-Interpreter indem wir
   Integer-Literale mit  ``Integer( )`` versehen und die Division als
   Konstruktor für rationale Zahlen behandeln. Zum Beispiel:

   ::

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

-  **Große ganze Zahlen:** Python besitzt von Hause aus Unterstützung
   für beliebig große ganze Zahlen zusätzlich zu C-ints. Diese sind
   bedeutend langsamer als die von GMP zur Verfügung gestellten und sie
   haben die Eigenschaft, dass die mit einem ``L`` am Ende ausgegeben
   werden um sie von ints unterscheiden zu können (und dies wird sich
   in naher Zeit nicht ändern). Sage implementiert beliebig große
   Integers mit Hilfe der GMP C-Bibliothek, und diese werden ohne
   ``L`` ausgegeben.


Anstatt den Python-Interpreter zu verändern (wie es mache Leute für
interne Projekte getan haben), benutzen wir die Sprache Python
unverändert und haben einen Prä-Parser geschrieben, so dass sich
die Kommandozeilen-IPython-Version so verhält, wie es Mathematiker
erwarten würden. Dies bedeutet, dass bereits existierender Python-Code
in Sage so verwendet werden kann wie er ist. Man muss jedoch immernoch
die standardmäßigen Python-Regeln beachten, wenn man Pakete schreibt,
die in Sage importiert werden können.

(Um eine Python-Bibliothek zu installieren, die Sie zum Beispiel im
Internet gefunden haben, folgen Sie den Anweisungen, aber verwenden
sie ``sage -python`` anstelle von ``python``.  Oft bedeutet dies, dass
``sage -python setup.py install`` eingegeben werden muss.)


Ich möchte einen Beitrag zu Sage leisten. Wie kann ich dies tun?
================================================================

Falls Sie für Sage einen Beitrag leisten möchten, wird Ihre Hilfe hoch
geschätzt! Sie kann von wesentlichen Code-Beiträge bis zum Hinzufügen
zur Sage-Dokumention oder zum Berichten von Fehlern reichen.


Schauen Sie sich die Sage-Webseite an um Informationen für Entwickler
zu erhalten; neben anderen Dingen können Sie eine lange Liste nach
Priorität und Kategorie geordneter, zu Sage gehörender Projekte finden.
Auch der `Sage Developer's Guide <http://doc.sagemath.org/html/en/developer/>`_
beinhaltet hilfreiche Informationen, und Sie können der ``sage-devel``
Google-Group beitreten.


Wie zitiere ich Sage?
=====================

Falls Sie ein Paper schreiben, das Sage verwendet, zitieren Sie bitte
die Berechnungen die Sie mithilfe von Sage durchgeführt haben, indem
Sie

::

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

in Ihrem Literaturverzeichnis hinzufügen. (Ersetzen Sie hierbei 8.7 mit der von
Ihnen benutzten Version von Sage.) Versuchen Sie bitte weiterhin
festzustellen welche Komponenten von Sage in Ihrer Berechnung
verwendet wurden, z.B. PARI?, GAP?, Singular? Maxima? und zitieren Sie
diese Systeme ebenso. Falls Sie nicht sicher sind welche Software Ihre
Berechnung verwendet, können Sie dies gerne in der ``sage-devel``
Google-Gruppe fragen. Lesen Sie :ref:`section-univariate` um weitere
Information darüber zu erhalten.

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

Falls Sie gerade das Tutorial vollständig durchgelesen haben, und noch
wissen wie lange Sie hierfür gebraucht haben, lassen Sie und dies bitte
in der ``sage-devel`` Google-Gruppe wissen.

Viel Spass mit Sage!
