| [🛈Start+] | [🥋Trad. Taekwon-Do+] | [🧮Mathematik] | [📙Forschung & Lehre+] | [🐧GNU/Linux+] | 
| [🔑Impressum+] | [🛀Autogenes Training+] | [💡Physik] | [⚙️Technik+] | [💾Progs: C+++] | 
| Sprache: 🇩🇪 | [♟️Schach] | [🔭Astronomie] | [📜LATEX] | [🕹️Spiele+] | 
|  |  |  | 
| [💾Progs: C++] | [🖪Progs: Alter C++‑Code] | 
![[Grafik mit TuX und GNU als Maskottchen von GNU/Linux]](images/tux_gnu_jmb_2025.gif) 
![[Wikipedia-de-Icon]](images/Wikipedia_logo_de.gif) Embedded Systemen
 (wie Settop-Boxen),
 über
Embedded Systemen
 (wie Settop-Boxen),
 über ![[Wikipedia-de-Icon]](images/Wikipedia_logo_de.gif) Raspberry Pi
(dieser Einplatinencomputer wird z.B. auch an Schulen
gerne verwendet), Smartphones/Tablets,
 Desktops, Servern, Mainframes bis hin zu Supercomputern
 zu Hause.
Raspberry Pi
(dieser Einplatinencomputer wird z.B. auch an Schulen
gerne verwendet), Smartphones/Tablets,
 Desktops, Servern, Mainframes bis hin zu Supercomputern
 zu Hause.
![[Wikipedia-de-Icon]](images/Wikipedia_logo_de.gif) GNU Compiler Collection
(GCC)
eine sehr gewichtige Rolle.
Sie ist zentraler Bestandteil des GNU‑Systems,
startete als reiner C‑Compiler und kann mittlerweile
die Programmiersprachen: 
C (gcc), C++ (g++), Objective‑C,
Objective‑C++, Fortran (gfortran, Verwendung), Ada,
D (gdc)𝔻 ,
Go (gccgo) und BRIG (HSAIL)
übersetzen [mit cpp
als C‑Präprozessor für C, C++ und
 Objective C]
(vgl. von GCC unterstützte
Computersprachstandards) – zudem gibt es
einen GCC Cobol Anwärter gcobol
(noch Out‑Of‑Tree,
aber nach 16 Monaten [vgl. LWN‑Artikel,
 15.03.2022, sowie offizielle Ankündigung,
 14.03.2022] wurde er nun
als arbeitsfähiger Cobol‑85‑Kompilierer getestet;
vgl. LWN‑Artikel vom 10.02.2023;
{nicht zu verwechseln mit GnuCOBOL,
der Cobol nach C kompiliert und danach
gcc aufruft, um ausführbaren Code
zu erzeugen}; am 13.12.2024 wurden 8 Patche zur Überprüfung
zugeschickt, die das Erstellen und Benutzen
des COBOL Front‑Ends ermöglichen –
und nach Phoronix, 16.02.2025, besteht die Hoffnung,
dass gcobol noch in GCC 15.1
aufgenommen werden kann – was sich auch
bestätigte, siehe Phoronix, 11.03.2025),
zudem wurden die WIP Patche zum ALGOL 68
Front‑End  (gac)
am 01.01.2025 eingesandt
(leider wird es aber [noch? –
bzgl. GCC 15.1] nicht aufgenommen,
auch wenn offiziell algol68@gcc.gnu.org als 
Mail‑Liste erlaubt und ebenso ein Git‑Branch
abgenickt wurde; vgl. Phoronix 09.03.2025)
und es wird immer konkreter über eine Aufnahme
der Sprache Rust diskutiert🏗️ .
GNU Compiler Collection
(GCC)
eine sehr gewichtige Rolle.
Sie ist zentraler Bestandteil des GNU‑Systems,
startete als reiner C‑Compiler und kann mittlerweile
die Programmiersprachen: 
C (gcc), C++ (g++), Objective‑C,
Objective‑C++, Fortran (gfortran, Verwendung), Ada,
D (gdc)𝔻 ,
Go (gccgo) und BRIG (HSAIL)
übersetzen [mit cpp
als C‑Präprozessor für C, C++ und
 Objective C]
(vgl. von GCC unterstützte
Computersprachstandards) – zudem gibt es
einen GCC Cobol Anwärter gcobol
(noch Out‑Of‑Tree,
aber nach 16 Monaten [vgl. LWN‑Artikel,
 15.03.2022, sowie offizielle Ankündigung,
 14.03.2022] wurde er nun
als arbeitsfähiger Cobol‑85‑Kompilierer getestet;
vgl. LWN‑Artikel vom 10.02.2023;
{nicht zu verwechseln mit GnuCOBOL,
der Cobol nach C kompiliert und danach
gcc aufruft, um ausführbaren Code
zu erzeugen}; am 13.12.2024 wurden 8 Patche zur Überprüfung
zugeschickt, die das Erstellen und Benutzen
des COBOL Front‑Ends ermöglichen –
und nach Phoronix, 16.02.2025, besteht die Hoffnung,
dass gcobol noch in GCC 15.1
aufgenommen werden kann – was sich auch
bestätigte, siehe Phoronix, 11.03.2025),
zudem wurden die WIP Patche zum ALGOL 68
Front‑End  (gac)
am 01.01.2025 eingesandt
(leider wird es aber [noch? –
bzgl. GCC 15.1] nicht aufgenommen,
auch wenn offiziell algol68@gcc.gnu.org als 
Mail‑Liste erlaubt und ebenso ein Git‑Branch
abgenickt wurde; vgl. Phoronix 09.03.2025)
und es wird immer konkreter über eine Aufnahme
der Sprache Rust diskutiert🏗️ .![[Wikipedia-de-Icon]](images/Wikipedia_logo_de.gif) LLVM /
LLVM / ![[Wikipedia-de-Icon]](images/Wikipedia_logo_de.gif) Clang
 (aktuelle Version 20.1.4 vom 30.04.2025;
 vgl. vorige Major‑Version 20.1.0 vom 04.03.2025 [Phoronix, 04.03.2025 und dortigem
 Vergleich zwischen
 GCC 15 und LLVM Clang 20],
 zuvor 19.1.0 vom 17.09.2024 [Phoronix, 17.09.2025],
 davor 18.1.0 vom 06.03.2025 [Phoronix, 06.03.2025],
 zuvor 17.0.1 vom 19.09.2023 [Phoronix, 19.09.2023],
 davor 16.0.0 vom 18.03.2023
  mit C++‑Default‑Standard GNU++17,
 vgl. Phoronix‑Artikel, 18.03.2023)
gibt es zwar belebende Konkurrenz
(unter Intel x86_64 liegt er mit GCC dicht auf,
bei IBM POWER9 liegt Clang aber 20% zurück
[Phoronix, 23.07.2019] –
GCC erwies sich aber als schneller beim Kompilieren
von Linux für 64‑bit ARM und x86_64 [Phoronix, 02.09.2020; aktuelle Benchmarks
zwischen LLVM Clang und GCC bietet
für AMD EPYC Genoa der Phoronix‑Artikel, 30.05.2023];
viele Architekturen werden nicht unterstützt
[laut Homepage
produktiv für X86‑32, X86‑64
und ARM nutzbar];
aber Clang ist erste Wahl auf macOS –
so wie Microsoft Visual Studio erste Wahl
auf Windows ist),
aber weder ist Clang Freie Software wie GCC,
noch ist sie auf so vielen Plattformen und
für so viele Architekturen verfügbar
(und erst mit Clang 9/10 ist nach Unterstützung
von asm goto
der Mainline‑Kernel
für die x86_64‑Plattform
größtenteils compilierbar
[das amdgpu‑Problem
soll ab Kernel 5.4‑rc1 behoben sein],
zudem liegen die Benchmarks sehr dicht beisammen
[vgl. Phoronix, 12.09.2019];
Listen unterstützter Standards liegen aktuell
für  C
 sowie für C++ vor,
siehe auch Sprach‑Kompatibilität;
Härtung der beiden Compiler 
      LVM/Clang und GCC behandelt der LWN-Artikel;
dennoch ist ein generelles Übersetzen
des Linux‑Kernels mit Clang
trotz viel Bemühungen noch nicht gelungen;
wohl aber in einigen Bereichen
wie z.B. Android bereits etabliert).
Clang
 (aktuelle Version 20.1.4 vom 30.04.2025;
 vgl. vorige Major‑Version 20.1.0 vom 04.03.2025 [Phoronix, 04.03.2025 und dortigem
 Vergleich zwischen
 GCC 15 und LLVM Clang 20],
 zuvor 19.1.0 vom 17.09.2024 [Phoronix, 17.09.2025],
 davor 18.1.0 vom 06.03.2025 [Phoronix, 06.03.2025],
 zuvor 17.0.1 vom 19.09.2023 [Phoronix, 19.09.2023],
 davor 16.0.0 vom 18.03.2023
  mit C++‑Default‑Standard GNU++17,
 vgl. Phoronix‑Artikel, 18.03.2023)
gibt es zwar belebende Konkurrenz
(unter Intel x86_64 liegt er mit GCC dicht auf,
bei IBM POWER9 liegt Clang aber 20% zurück
[Phoronix, 23.07.2019] –
GCC erwies sich aber als schneller beim Kompilieren
von Linux für 64‑bit ARM und x86_64 [Phoronix, 02.09.2020; aktuelle Benchmarks
zwischen LLVM Clang und GCC bietet
für AMD EPYC Genoa der Phoronix‑Artikel, 30.05.2023];
viele Architekturen werden nicht unterstützt
[laut Homepage
produktiv für X86‑32, X86‑64
und ARM nutzbar];
aber Clang ist erste Wahl auf macOS –
so wie Microsoft Visual Studio erste Wahl
auf Windows ist),
aber weder ist Clang Freie Software wie GCC,
noch ist sie auf so vielen Plattformen und
für so viele Architekturen verfügbar
(und erst mit Clang 9/10 ist nach Unterstützung
von asm goto
der Mainline‑Kernel
für die x86_64‑Plattform
größtenteils compilierbar
[das amdgpu‑Problem
soll ab Kernel 5.4‑rc1 behoben sein],
zudem liegen die Benchmarks sehr dicht beisammen
[vgl. Phoronix, 12.09.2019];
Listen unterstützter Standards liegen aktuell
für  C
 sowie für C++ vor,
siehe auch Sprach‑Kompatibilität;
Härtung der beiden Compiler 
      LVM/Clang und GCC behandelt der LWN-Artikel;
dennoch ist ein generelles Übersetzen
des Linux‑Kernels mit Clang
trotz viel Bemühungen noch nicht gelungen;
wohl aber in einigen Bereichen
wie z.B. Android bereits etabliert).
![[Wikipedia-de-Icon]](images/Wikipedia_logo_de.gif) Programmiersprache D mit objektorientierten,
imperativen sowie deklarativen / funktionalen Sprachelementen
wird seit 1999 von Walter Bright entwickelt,
der 2001 die erste Version (D1)
des Compilers veröffentlichte –
2007 wurde diese unter Mitwirkung
von Andrei Alexandrescu durch D2 abgelöst
(und entwickelte sich seither inkrementell
 in über 100 Veröffentlichungen:
 aktuell ist 2.098.1 vom 19.12.2021,
 siehe Download bzw. Liste aller Versionen);
die D‑Standardlaufzeitbibliothek namens Phobos
wurde vom 2006 einsteigenden Andrei Alexandrescu
entwickelt.
D übernimmt die meisten Sprachmittel
der Sprache C,
verzichtet im Gegensatz zu C++ aber
auf die Kompatibilität dazu
(hält aber die ABI‑Kompatibilität,
so dass alle Programme und Bibliotheken,
ggf. über Funktionen und Wrapper,
nutzbar bleiben – die Anbindung von C++-Code
unterliegt dagegen Einschränkungen).
Programme können in D ohne Zeiger
geschrieben werden –
anders als Java ist es aber dennoch möglich,
Zeiger bei Bedarf nahezu wie in C zu benutzen
und so maschinennah zu programmieren.
D verfügt über Klassenvorlagen und
überladbare Operatoren, bietet Design by contract und Module und
besitzt Sprachmittel wie integrierte Unit‑Tests und
String Mixins;
Automatische Speicherbereinigung (Garbage Collector)
ist im Gegensatz zu z.B. C/C++ fester, wenn auch
prinzipiell optionaler Bestandteil der Sprache.
 DMD, der Digital Mars D‑Compiler,
bildet die Referenzimplementierung,
von Walter Bright für die x86/x86-64‑Versionen
von Windows, Linux, macOS und FreeBSD erhältlich.
Der GNU D Compiler GDC verbindet
das Frontend von DMD mit dem GCC‑Backend
(ab GCC 9.1),
so wie der LLVM D Compiler LDC das Frontend
von DMD mit dem LLVM‑Backend verbindet.
Ebenso wurden die Compiler Dil und Dang
in D selbst programmiert, die kompatibel zu LLVM sind.
Mit Poseidon existiert sogar eine in D geschrieben IDE,
die Autovervollständigung sowie Refactoring unterstützt
und einen integrierten Debugger bietet –
unter den IDEs zum Programmieren in D
sei auch auf den D Extended EDitor hingewiesen.
GNU Debugger und WinDbg unterstützen D rudimentär
(Stand: Ende 2019).
Programmiersprache D mit objektorientierten,
imperativen sowie deklarativen / funktionalen Sprachelementen
wird seit 1999 von Walter Bright entwickelt,
der 2001 die erste Version (D1)
des Compilers veröffentlichte –
2007 wurde diese unter Mitwirkung
von Andrei Alexandrescu durch D2 abgelöst
(und entwickelte sich seither inkrementell
 in über 100 Veröffentlichungen:
 aktuell ist 2.098.1 vom 19.12.2021,
 siehe Download bzw. Liste aller Versionen);
die D‑Standardlaufzeitbibliothek namens Phobos
wurde vom 2006 einsteigenden Andrei Alexandrescu
entwickelt.
D übernimmt die meisten Sprachmittel
der Sprache C,
verzichtet im Gegensatz zu C++ aber
auf die Kompatibilität dazu
(hält aber die ABI‑Kompatibilität,
so dass alle Programme und Bibliotheken,
ggf. über Funktionen und Wrapper,
nutzbar bleiben – die Anbindung von C++-Code
unterliegt dagegen Einschränkungen).
Programme können in D ohne Zeiger
geschrieben werden –
anders als Java ist es aber dennoch möglich,
Zeiger bei Bedarf nahezu wie in C zu benutzen
und so maschinennah zu programmieren.
D verfügt über Klassenvorlagen und
überladbare Operatoren, bietet Design by contract und Module und
besitzt Sprachmittel wie integrierte Unit‑Tests und
String Mixins;
Automatische Speicherbereinigung (Garbage Collector)
ist im Gegensatz zu z.B. C/C++ fester, wenn auch
prinzipiell optionaler Bestandteil der Sprache.
 DMD, der Digital Mars D‑Compiler,
bildet die Referenzimplementierung,
von Walter Bright für die x86/x86-64‑Versionen
von Windows, Linux, macOS und FreeBSD erhältlich.
Der GNU D Compiler GDC verbindet
das Frontend von DMD mit dem GCC‑Backend
(ab GCC 9.1),
so wie der LLVM D Compiler LDC das Frontend
von DMD mit dem LLVM‑Backend verbindet.
Ebenso wurden die Compiler Dil und Dang
in D selbst programmiert, die kompatibel zu LLVM sind.
Mit Poseidon existiert sogar eine in D geschrieben IDE,
die Autovervollständigung sowie Refactoring unterstützt
und einen integrierten Debugger bietet –
unter den IDEs zum Programmieren in D
sei auch auf den D Extended EDitor hingewiesen.
GNU Debugger und WinDbg unterstützen D rudimentär
(Stand: Ende 2019).
![[Wikipedia-de-Icon]](images/Wikipedia_logo_de.gif) Wikipedia
 oder z.B. den Artikel
 in Heise‑Magazinen: iX, 12/2019, S. 150, und iX, 13/2020, S. 26-29,
 dem Buch Programming in D
 by Ali Çehreli (inkl. kostenlosem
Wikipedia
 oder z.B. den Artikel
 in Heise‑Magazinen: iX, 12/2019, S. 150, und iX, 13/2020, S. 26-29,
 dem Buch Programming in D
 by Ali Çehreli (inkl. kostenlosem ![[PDF-Icon]](images/pdf_icon.gif) PDF)
oder schlicht einer Internet‑Suche nach dem
Stichwort Dlang.
 PDF)
oder schlicht einer Internet‑Suche nach dem
Stichwort Dlang.
![[Wikipedia-de-Icon]](images/Wikipedia_logo_de.gif) Linker machen ... dennoch ist dieser
ein wichtiger Bestandteil und somit
hier eine Übersicht der von GCC
verwendeten Linker für 🐧GNU/Linux:
Linker machen ... dennoch ist dieser
ein wichtiger Bestandteil und somit
hier eine Übersicht der von GCC
verwendeten Linker für 🐧GNU/Linux:
![[Wikipedia-de-Icon]](images/Wikipedia_logo_de.gif) GNU‑Linker und
      Bestandteil der
GNU‑Linker und
      Bestandteil der ![[Wikipedia-de-Icon]](images/Wikipedia_logo_de.gif) GNU Binary Utilities
      (vgl. 📍binutils weiter unten);
GNU Binary Utilities
      (vgl. 📍binutils weiter unten);![[Wikipedia-de-Icon]](images/Wikipedia_logo_de.gif) Google entwickelter Linker, 
      der über das Compiler Flag -fuse-ld=gold
      oder über makefile, d.h. über Setzen
      der LD‑Umgebungsvariable auf ld.gold,
      verwendet werden kann; er beschränkt sich
      auf das ELF‑Binärformat, nutzt also nicht
      wie ld die BFD‑Bibliothek, ist aber
      wie der ld Bestandteil der
Google entwickelter Linker, 
      der über das Compiler Flag -fuse-ld=gold
      oder über makefile, d.h. über Setzen
      der LD‑Umgebungsvariable auf ld.gold,
      verwendet werden kann; er beschränkt sich
      auf das ELF‑Binärformat, nutzt also nicht
      wie ld die BFD‑Bibliothek, ist aber
      wie der ld Bestandteil der ![[Wikipedia-de-Icon]](images/Wikipedia_logo_de.gif) GNU Binary Utilities
      (vgl. 📍binutils [ab 2.19]
      weiter unten);
GNU Binary Utilities
      (vgl. 📍binutils [ab 2.19]
      weiter unten);![[Wikipedia-de-Icon]](images/Wikipedia_logo_de.gif) Linker
      der LLVM‑Compiler‑Architektur,
      der ELF, PE/COFF, Mach‑O und WebAssembly
      unterstützt und hauptsächlich von Rui Ueyama
      entwickelt wurde;
Linker
      der LLVM‑Compiler‑Architektur,
      der ELF, PE/COFF, Mach‑O und WebAssembly
      unterstützt und hauptsächlich von Rui Ueyama
      entwickelt wurde;![[Wikipedia-de-Icon]](images/Wikipedia_logo_de.gif) Debugger GDB,
dessen aktuelle Version GDB 15.1 am 07. Juli 2024
 herauskam (zuvor GDB 14.2 am 03. März 2024;
 davor GDB 14.1 am 03. Dez. 2023, vgl. Phoronix‑Artikel vom 03.12.2023;
zuvor LWN‑Artikel zu GDB 13.1
vom 20.02.2023 oder Phoronix‑Artikel vom 19.02.2023;
davor erschien am 01. Mai 2022 GDB 12.1,
vgl. Ankündigung;
zuvor wurde GDB 11.2 am 16. Jan. 2022
veröffentlicht, vgl. Ankündigung; die vorige Version ist
 GDB 11.1 vom 12. Sep. 2021, siehe Ankündigung auf LWN,
hier der generelle Link zur letzten GDB‑Ankündigung durch GNU;
die vorige Version 10.2 stammt vom 25.04.2021,
das erste Bugfix‑Release 10.1 wurde auf LWN angekündigt,
diese und andere Versionen wurden auch
in Phoronix‑Artikeln behandelt:
10.1 am 24.10.2020 sowie
die u.a. Multi‑Target Debugging bringende vorige
Version 9 am 11.01.2020;
siehe auch Online‑Dokumentation).
GDB unterstützt die Programmiersprachen:
Ada, Assembler, C, C++, D, Fortran, Go, Objective-C, OpenCL,
Modula‑2, Pascal und Rust.
Debugger GDB,
dessen aktuelle Version GDB 15.1 am 07. Juli 2024
 herauskam (zuvor GDB 14.2 am 03. März 2024;
 davor GDB 14.1 am 03. Dez. 2023, vgl. Phoronix‑Artikel vom 03.12.2023;
zuvor LWN‑Artikel zu GDB 13.1
vom 20.02.2023 oder Phoronix‑Artikel vom 19.02.2023;
davor erschien am 01. Mai 2022 GDB 12.1,
vgl. Ankündigung;
zuvor wurde GDB 11.2 am 16. Jan. 2022
veröffentlicht, vgl. Ankündigung; die vorige Version ist
 GDB 11.1 vom 12. Sep. 2021, siehe Ankündigung auf LWN,
hier der generelle Link zur letzten GDB‑Ankündigung durch GNU;
die vorige Version 10.2 stammt vom 25.04.2021,
das erste Bugfix‑Release 10.1 wurde auf LWN angekündigt,
diese und andere Versionen wurden auch
in Phoronix‑Artikeln behandelt:
10.1 am 24.10.2020 sowie
die u.a. Multi‑Target Debugging bringende vorige
Version 9 am 11.01.2020;
siehe auch Online‑Dokumentation).
GDB unterstützt die Programmiersprachen:
Ada, Assembler, C, C++, D, Fortran, Go, Objective-C, OpenCL,
Modula‑2, Pascal und Rust.
![[Wikipedia-de-Icon]](images/Wikipedia_logo_de.gif) emacs (echter Bestandteil
des GNU‑Projekts – ebenso IDE;
 siehe Homepage bzw. Artikel von Heise‑Online vom 01.08.2023
zum neuen Emacs 29.1)
beliebt ist.
Beide Editoren haben eine steile Lernkurve,
wachsen aber hervorragend mit.
Einfache Editoren haben den entscheidenden Nachteil,
dass man später umsteigen muss;
wer aber dennoch erst einmal diese Hürde
nicht nehmen will, sei auf
joe, gedit, jedit oder kate verwiesen.
emacs (echter Bestandteil
des GNU‑Projekts – ebenso IDE;
 siehe Homepage bzw. Artikel von Heise‑Online vom 01.08.2023
zum neuen Emacs 29.1)
beliebt ist.
Beide Editoren haben eine steile Lernkurve,
wachsen aber hervorragend mit.
Einfache Editoren haben den entscheidenden Nachteil,
dass man später umsteigen muss;
wer aber dennoch erst einmal diese Hürde
nicht nehmen will, sei auf
joe, gedit, jedit oder kate verwiesen.
![[Wikipedia-de-Icon]](images/Wikipedia_logo_de.gif) GNAT Programming Studio (
GNAT Programming Studio (![[Wikipedia-de-Icon]](images/Wikipedia_logo_de.gif) GNAT,
GNAT,
![[Wikipedia-de-Icon]](images/Wikipedia_logo_de.gif) GPS Homepage),
GPS Homepage),
![[Wikipedia-de-Icon]](images/Wikipedia_logo_de.gif) Code::Blocks,
Code::Blocks,
![[Wikipedia-de-Icon]](images/Wikipedia_logo_de.gif) Lazarus,
Lazarus,
![[Wikipedia-de-Icon]](images/Wikipedia_logo_de.gif) MonoDevelop,
MonoDevelop,
![[Wikipedia-de-Icon]](images/Wikipedia_logo_de.gif) NetBeans,
NetBeans,
![[Wikipedia-de-Icon]](images/Wikipedia_logo_de.gif) Eclipse CDT (C/C++ Development Tooling),
Eclipse CDT (C/C++ Development Tooling),
![[Wikipedia-de-Icon]](images/Wikipedia_logo_de.gif) CodeLite,
CodeLite,
![[Wikipedia-de-Icon]](images/Wikipedia_logo_de.gif) Bluefish,
Bluefish,
![[Wikipedia-de-Icon]](images/Wikipedia_logo_de.gif) Geany,
Geany,
![[Wikipedia-de-Icon]](images/Wikipedia_logo_de.gif) Anjuta (GNOME),
Anjuta (GNOME),
![[Wikipedia-de-Icon]](images/Wikipedia_logo_de.gif) Qt Creator (Homepage of qt.io, Phoronix‑Artikel zur Version 12
 vom 23.11.2023, Phoronix‑Artikel zur Version 11
 vom 20.07.2023, Phoronix‑Bericht zur Version 10
 vom 29.03.2023 bzw. Phoronix‑Bericht vom 14.10.2021),
Qt Creator (Homepage of qt.io, Phoronix‑Artikel zur Version 12
 vom 23.11.2023, Phoronix‑Artikel zur Version 11
 vom 20.07.2023, Phoronix‑Bericht zur Version 10
 vom 29.03.2023 bzw. Phoronix‑Bericht vom 14.10.2021),
![[Wikipedia-de-Icon]](images/Wikipedia_logo_de.gif) KDevelop (KDE; Homepage,
 Phoronix‑Bericht vom  07.09.2020 oder 
 vom 02.02.2020 oder auf Deutsch den Heise‑Bericht
 über die vorige Version 5.5 bzw.
 06.08.2019 Phoronix‑Bericht
 oder auf Deutsch den Heise‑Bericht
 über die alte Version 5.4 – bzw. auf Deutsch den Heise‑Bericht
 vom 08.09.2020 über die aktuelle Fassung 5.6 mit frischem Bugfix‑Release 5.6.1
 vom 11.12.2020 – vgl. Neuigkeiten).
KDevelop (KDE; Homepage,
 Phoronix‑Bericht vom  07.09.2020 oder 
 vom 02.02.2020 oder auf Deutsch den Heise‑Bericht
 über die vorige Version 5.5 bzw.
 06.08.2019 Phoronix‑Bericht
 oder auf Deutsch den Heise‑Bericht
 über die alte Version 5.4 – bzw. auf Deutsch den Heise‑Bericht
 vom 08.09.2020 über die aktuelle Fassung 5.6 mit frischem Bugfix‑Release 5.6.1
 vom 11.12.2020 – vgl. Neuigkeiten).
![[Wikipedia-de-Icon]](images/Wikipedia_logo_de.gif) Makefiles
 (das vom Utility
Makefiles
 (das vom Utility ![[Wikipedia-de-Icon]](images/Wikipedia_logo_de.gif) make verwendet wird;
make verwendet wird; ![[Wikipedia-de-Icon]](images/Wikipedia_logo_de.gif) GNU make ist aktuell
in Version 4.4.1 (26.02.2023) verfügbar und 
erschien am 31.10.2022 in Version 4.4,
vgl. Phoronix & LWN;
zuvor am 19.01.2020 in Version 4.3, vgl. Phoronix & LWN;
siehe dessen Einsatz unterhalb des Makefile‑Beispiels;
vgl.
GNU make ist aktuell
in Version 4.4.1 (26.02.2023) verfügbar und 
erschien am 31.10.2022 in Version 4.4,
vgl. Phoronix & LWN;
zuvor am 19.01.2020 in Version 4.3, vgl. Phoronix & LWN;
siehe dessen Einsatz unterhalb des Makefile‑Beispiels;
vgl. ![[Wikipedia-de-Icon]](images/Wikipedia_logo_de.gif) GNU Autoconf),
der die nötigen Eingaben
auf ein sinnvolle Maß reduzieren kann
(vgl. Eine Einführung in Makefiles,
kleine Einführung für C und Makefiles,
O'Reilly-Einführung in Makefiles,
GNU make Manual) –
hier ein sinnvolles kleines Beispiel für Makefile:
GNU Autoconf),
der die nötigen Eingaben
auf ein sinnvolle Maß reduzieren kann
(vgl. Eine Einführung in Makefiles,
kleine Einführung für C und Makefiles,
O'Reilly-Einführung in Makefiles,
GNU make Manual) –
hier ein sinnvolles kleines Beispiel für Makefile:
# ******************************************************************************
# * 'Makefile' des Verzeichnisses '~/mycpp/jmb/'                               *
# *                                                                            *
# * J.M.B.  [URL: https://www.jmb-edu.de/cpp_programming.html#makefileexamp]   *
# *                                                                            *
# * Lizenz:   (c) 2019 unter GPLv3: https://www.gnu.org/licenses/gpl-3.0.txt   *
# *                                                                            *
# * Erstellung:           05.08.2019                                           *
# *                                                                            *
# * Letzte Umgestaltung:  04.09.2019  (Phase 2; vgl. Phase 1 vom 08.08.2019)   *
# ******************************************************************************
# * Dafuer sorgen, dass 'all' und 'clean' auch dann ausgefuehrt werden,
#   wenn die jeweils entsprechende Datei existieren sollte:
.PHONY: all     clean   exampd  exampf  example_debug   example c       cf
# * Beim Hilfstext nicht durch doppelte Ausgabe verwirren, also das Kommando
#   nicht vor der Ausfuehrung ausgeben:
.SILENT:        info    help    h
# * Definitionen von sinnvollen Compiler-Flag-Kombinationen als Variable
#   (hier ist noch viel Raum fuer Verbesserungen - nur ein Anfang):
# o Debug Modus: optimierte Debugging-Faehigkeit mit allen Standard- sowie
#   allen Extra-Warnungen (zum Lernen beim Edit-Compile-Debug-Zyklus):
cppflagsd = -Og -Wall -Wextra
# o Space Modus: optimiert bzgl. Groesse und alles von -O2, das dem nicht
#   zuwider laeuft (falls man es mal brauchen sollte ;):
cppflagss = -Os
# o Final Modus: optimiert haerter bzgl. Kompilierzeit und Geschwindigkeit
#   des Binarys.
cppflagsf = -O2
# * Fuer Namensgebung der Backup-Datei Datum und Zeit als String besorgen:
bckdate := $(shell date +%Y%m%0e%0k%M%S)
bckname := ~/Downloads/mycpp_jmb_$(bckdate).tgz
humdate := $(shell date +%a.,\ %0e.%m.%Y,\ %0k:%M:%S)
humdatedate := $(shell date +%a.,\ %0e.%m.%Y)
humdatetime := $(shell date +%0k:%M:%S)
# ** Das nun kommende erste Target wird ausgefuehrt, wenn 'make' ohne
#    Argument, d.h. der Angabe des Targets, aufgerufen wird:
# * Hilfstext (zur Uebersicht, was alles gemacht werden kann; siehe Screenshot unten):
info help h:
                -echo "Zur Zeit sind die folgenden Parameter moeglich:         ^***************"
                -echo "  ep = ed = edit = e:                                     * Hilfs-Text *"
                -echo "    Quelltext des Programms mit vim editieren,             * zu 'make' *"
                -echo "  em:                                                     * von J.M.B. *"
                -echo "    Editieren von 'Makefile' mit vim,                   ^***********   *"
                -echo "  exampd = example_debug = c:                                      *   *"
                -echo "    Kompilieren & Linken von 'example_debug' & 'ls -l' vom Binary, *   *"
                -echo "  exampf =  example = cf:                                          *   *"
                -echo "    Kompilieren & Linken von 'example' und 'ls -l' vom Binary,     *   *"
                -echo "  all {= exampd & exampf}:                                         *   *"
                -echo "    Erzeugen beider Binaries: 'example_debug' & 'example',         *   *"
                -echo "  r:                                                               *   *"
                -echo "    Aufrufen von 'example_debug args' & Fehlercode ausgeben,       *   *"
                -echo "  run:                                                             *   *"
                -echo "    Aufrufen von 'example args' - danach Fehlercode ausgeben,      *   *"
                -echo "  clean:                                                           *   *"
                -echo "    Hausputz (: 'example_debug' loeschen),                         *   *"
                -echo "  superclean:                                                      *   *"
                -echo "    Fruehlingsputz (% 'clean' + loeschen von 'example'),           *   *"
                -echo "  backup = bck                                   **** [jmb-edu.de] *   *"
                -echo "    Erstellen einer tgz-Sicherung,               *  ****************   *"
                -echo "  help = h = info = '' {d.h. ohne Target}:       * Have Fun with GNU!  *"
                -echo "    Diesen Hilfstext ausgeben.                   ***********************"
                -echo "  == GNU 'make' ${MAKE_VERSION} gestartet am $(humdatedate), um $(humdatetime) Uhr ! =="
# * Was man unter `mach alles' verstehen soll (z.B. mehrere Binaries bauen;
#   dieses Target ist zumeist das erste und wird bei 'make' ausgefuehrt):
all:    exampd  exampf
# * Sprungpunkt/Target fuer das Programm (Name und was damit passieren soll):
# -a) Optimiert fuer optimale Debbuging-Faehigkeit, allen Standard-
#     sowie den Extra-Warnungen (zum Lernen beim Edit-Compile-Debug-Zyklus):
exampd c example_debug:         example.cpp
                -g++ $(cppflagsd) example.cpp -o example_debug
                -ls -l example_debug
# - b) Optimiert fuer Kompilierzeit und Geschwindigkeit des Binarys:
exampf cf example:              example.cpp
                -g++ $(cppflagsf) example.cpp -o example
                -ls -l example
# ... fuer weitere Verbesserungen siehe z.B.:
#  https://developers.redhat.com/blog/2018/03/21/compiler-and-linker-flags-gcc/
# * Editieren:
# o ... des Programm-Quellcodes:
ep ed edit e:
                -vim example.cpp
# o ... des Makefiles:
em:
                -vim Makefile
# * Binary aufrufen, danach Fehlercode auslesen (0 = OK; sonst = KO):
r:
                -./example_debug $(filter-out $@,$(MAKECMDGOALS)); echo "Fehlercode: "$$?" !"
# * Fuer andere als die ausgewiesenen Targets mache nichts
#   (wegen r/run-Optionen noetig, sie sonst je eine Fehlermeldung gaeben) -
#   Vorsicht: 'make quark' macht nichts - auch keine Fehlermeldung!:
%:
                @:
run:
                -./example $(filter-out $@,$(MAKECMDGOALS)); echo "Fehlercode: "$$?" !"
# * Waere Compilieren und Ausfuehren gewuenscht, dies auskommentieren:
#cr:    c       r
# * Hausputz (Problemreste und Debug-Binary werden geloescht):
clean:
                -rm -f core *.o *.bak *~ example_debug
# * Fruehlingsputz (auch das finale Binary wird nun geloescht):
superclean:     clean
                -rm -f example
# * Sicherung (als gezipptes tar-Archiv):
backup bck:     clean   exampd
                -echo "Sichere in: '$(bckname)' ..."
                -cd .. ; tar cfvz $(bckname) jmb/ ; cd jmb
# Zu beachten ist, dass nach "TARGET:" bzw. am leeren Zeilenanfang Tabs
# stehen muessen - Leerzeichen funktioniert nicht - ebenso zwischen
# multiple targets, die von einem anderen (hier 'all' oder 'bck')
# aufgerufen werden!
# Somit darf man auch nicht Copy&Paste machen (Blanks werden dann durch
# Leerzeichen ersetzt), sondern kopieren oder ueber 'tar' sichern ...
# ******************************************************************************
# * Das war's ...  Viel Spass beim eigenen Experimentieren und Programmieren ! *
# ******************************************************************************
if [ -f "$HOME/.alias" ]; then
  . "$HOME/.alias"
fi
![[Wikipedia-de-Icon]](images/Wikipedia_logo_de.gif) Meson,
das die Betriebssysteme GNU/Linux, macOS
und Windows – die Compiler GCC, LLVM/Clang,
Visual Sudio und andere – viele Programmiersprachen
wie C, C++, D, Fortran, Java und Rust
unterstützt (Offizielle Website; erschienen
im Jahr 2013 – aktuell ist die Meson‑Version 1.9.0
vom 25.08.2025, vgl. auch Release Notes und Phoronix‑Artikel
zu früheren Versionen wie Meson 1.8.0 (Phoronix-Artikel) vom 28.04.2025, Meson 1.6.0 vom 20.10.2024, Meson 1.2.0 vom 08.08.2023, Meson 1.1.0 vom 10.04.2023, Meson 1.0.0 vom 23.12.2022 bzw. Meson 0.64 vom 06.11.2022;
      siehe mold).
Meson,
das die Betriebssysteme GNU/Linux, macOS
und Windows – die Compiler GCC, LLVM/Clang,
Visual Sudio und andere – viele Programmiersprachen
wie C, C++, D, Fortran, Java und Rust
unterstützt (Offizielle Website; erschienen
im Jahr 2013 – aktuell ist die Meson‑Version 1.9.0
vom 25.08.2025, vgl. auch Release Notes und Phoronix‑Artikel
zu früheren Versionen wie Meson 1.8.0 (Phoronix-Artikel) vom 28.04.2025, Meson 1.6.0 vom 20.10.2024, Meson 1.2.0 vom 08.08.2023, Meson 1.1.0 vom 10.04.2023, Meson 1.0.0 vom 23.12.2022 bzw. Meson 0.64 vom 06.11.2022;
      siehe mold).
![[Wikipedia-de-Icon]](images/Wikipedia_logo_de.gif) Versionsverwaltung (Englisch:
Version Control System, VCS) ist ein System,
das zur Erfassung von Änderungen an Dokumenten
oder Dateien verwendet wird.
Alle Versionen werden in einem Archiv mit Zeitstempel
und Benutzerkennung gesichert und können später
wiederhergestellt werden.
Versionsverwaltung (Englisch:
Version Control System, VCS) ist ein System,
das zur Erfassung von Änderungen an Dokumenten
oder Dateien verwendet wird.
Alle Versionen werden in einem Archiv mit Zeitstempel
und Benutzerkennung gesichert und können später
wiederhergestellt werden.![[Wikipedia-de-Icon]](images/Wikipedia_logo_de.gif) git
('global information tracker'; Website;
Anfang April 2005 gestartet und bereits
ab Linux 2.6.12-rc3 vom 20.04.2005
in Verwendung; aktuell: 2.42.0 vom 21.08.2023).
git
('global information tracker'; Website;
Anfang April 2005 gestartet und bereits
ab Linux 2.6.12-rc3 vom 20.04.2005
in Verwendung; aktuell: 2.42.0 vom 21.08.2023).
![[Wikipedia-de-Icon]](images/Wikipedia_logo_de.gif) Programmiersprache
wird verwendet, um über verständlichere Tokens und
eine logische Struktur einen
Programmiersprache
wird verwendet, um über verständlichere Tokens und
eine logische Struktur einen ![[Wikipedia-de-Icon]](images/Wikipedia_logo_de.gif) Algorithmus
bzw. Datenstrukturen zu implementieren,
die der Rechner entsprechend verarbeiten kann,
nachdem ein
Algorithmus
bzw. Datenstrukturen zu implementieren,
die der Rechner entsprechend verarbeiten kann,
nachdem ein ![[Wikipedia-de-Icon]](images/Wikipedia_logo_de.gif) Compiler und
Compiler und ![[Wikipedia-de-Icon]](images/Wikipedia_logo_de.gif) Linker
den Quelltext in ein Binärprogramm in
Linker
den Quelltext in ein Binärprogramm in ![[Wikipedia-de-Icon]](images/Wikipedia_logo_de.gif) Maschinensprache
umwandelt, die der Computer ausführen kann
(
Maschinensprache
umwandelt, die der Computer ausführen kann
(![[Wikipedia-de-Icon]](images/Wikipedia_logo_de.gif) Interpreter
können alternativ statt eines Compiler verwendet werden,
sind aber langsamer, da die Erzeugung
des Maschinencodes zur Laufzeit erfolgt).
Interpreter
können alternativ statt eines Compiler verwendet werden,
sind aber langsamer, da die Erzeugung
des Maschinencodes zur Laufzeit erfolgt).
![[Wikipedia-de-Icon]](images/Wikipedia_logo_de.gif) Lochkarten
dem Computer eingegeben:
1GL (1st Generation Language).
Lochkarten
dem Computer eingegeben:
1GL (1st Generation Language).
![[Wikipedia-de-Icon]](images/Wikipedia_logo_de.gif) Assembler verwendet,
um besser zu merkende
Assembler verwendet,
um besser zu merkende ![[Wikipedia-de-Icon]](images/Wikipedia_logo_de.gif) Mnemonics
statt einer Kette von 0|1‑en
eingeben zu können:
2GL (2nd Generation Language),
wobei aber immer noch das Vorgehen des Computers
direkt vorgegeben wird.
Mnemonics
statt einer Kette von 0|1‑en
eingeben zu können:
2GL (2nd Generation Language),
wobei aber immer noch das Vorgehen des Computers
direkt vorgegeben wird.
![[Wikipedia-de-Icon]](images/Wikipedia_logo_de.gif) C,
C,
![[Wikipedia-de-Icon]](images/Wikipedia_logo_de.gif) Fortran
und
Fortran
und ![[Wikipedia-de-Icon]](images/Wikipedia_logo_de.gif) Cobol,
als erste Programmiersprachen der dritten Generation
eingeführt:
3GL (3rd Generation Language).
Cobol,
als erste Programmiersprachen der dritten Generation
eingeführt:
3GL (3rd Generation Language).
![[Wikipedia-de-Icon]](images/Wikipedia_logo_de.gif) Programmiersprache C wurde 1969‑1973
von
Programmiersprache C wurde 1969‑1973
von ![[Wikipedia-de-Icon]](images/Wikipedia_logo_de.gif) Dennis A. Ritchie
 (09.09.1941‑12.10.2011; er alleine ist
für das C‑Design verantwortlich)
in den
Dennis A. Ritchie
 (09.09.1941‑12.10.2011; er alleine ist
für das C‑Design verantwortlich)
in den ![[Wikipedia-de-Icon]](images/Wikipedia_logo_de.gif) Bell Laboratories
(AT&T‑Forschungsabteilung)
für die Programmierung des damals
neuen Unix‑Betriebssystems entwickelt,
wobei C aus der zuvor von
Bell Laboratories
(AT&T‑Forschungsabteilung)
für die Programmierung des damals
neuen Unix‑Betriebssystems entwickelt,
wobei C aus der zuvor von ![[Wikipedia-de-Icon]](images/Wikipedia_logo_de.gif) Ken L. Thompson
(*04.02.1043) und Dennis Ritchie 1969/70
geschriebenen Programmiersprache B entwickelt wurde.
Für C ist noch
Ken L. Thompson
(*04.02.1043) und Dennis Ritchie 1969/70
geschriebenen Programmiersprache B entwickelt wurde.
Für C ist noch ![[Wikipedia-de-Icon]](images/Wikipedia_logo_de.gif) Brian W. Kernighan
(*01.01.1942) zu nennen, der als Co‑Autor
des prominenten C‑Buchs und damit
ersten C‑Standards bekannt ist.
Brian W. Kernighan
(*01.01.1942) zu nennen, der als Co‑Autor
des prominenten C‑Buchs und damit
ersten C‑Standards bekannt ist.
| 1978 | Buch The C Programming Language: K&R C | 
| 1989 | C Norm ANSI X3.159‑1989: ANSI C / C89 | 
| 1990 | C Norm ISO/IEC 9899:1990: C90 (=C89; mit GCC über -ansi, -std=c90 oder -std=iso9899:1990) | 
| 1995 | Minimale Erweiterung als C Norm ISO/IEC 9899/AMD1:1995: C95 (mit GCC über -std=iso9899:199409) | 
| 1999 | C Norm {u.a. mit Ergänzungen von C++} ISO/IEC 9899:1999: C99 {formerly C9X} (mit GCC über -std=c99 oder -std=iso9899:1999) | 
| 2011 | ISO‑Standard {u.a. bessere Kompatibilität mit C++} ISO/IEC 9899/2011: C11 {anfänglich C1X} (mit GCC über -std=c11 oder -std=iso9899:2011) | 
| 2018 | Minimale Erweiterung als C Norm ISO/IEC 9899/2018: C18 bzw. C17 | 
| 2023 | ?? Erweiterung als C Norm ISO/IEC 9899/2022: {anfänglich C2x} C23 (mit GCC 14 über -std=c23, -Wc11-c23-compat bzw. -std=gnu23 – entsprechend verwendet LLVM Clang 18 -std=c23) | 
![[Wikipedia-de-Icon]](images/Wikipedia_logo_de.gif) Chicken (Scheme),
Chicken (Scheme),
![[Wikipedia-de-Icon]](images/Wikipedia_logo_de.gif) EiffelStudio (Eiffel),
EiffelStudio (Eiffel), ![[Wikipedia-de-Icon]](images/Wikipedia_logo_de.gif) Esterel,
Esterel,
![[Wikipedia-de-Icon]](images/Wikipedia_logo_de.gif) CPython/PyPy,
CPython/PyPy,
![[Wikipedia-de-Icon]](images/Wikipedia_logo_de.gif) Sather,
Sather,
![[Wikipedia-de-Icon]](images/Wikipedia_logo_de.gif) Squeak (Dialekt
 von Smalltalk) und
Squeak (Dialekt
 von Smalltalk) und ![[Wikipedia-de-Icon]](images/Wikipedia_logo_de.gif) Vala.
Vala.
![[Wikipedia-de-Icon]](images/Wikipedia_logo_de.gif) GNU C Library
(glibc oder libc; aktuell ist
glibc 2.42 vom 28.07.2025,
zuvor glibc 2.41 vom 30.01.2025,
davor glibc 2.40 vom 22.07.2024,
zuvor glibc 2.39 vom 31.01.2024
 (LWN mit Link zur Original‑Ankündigung;
 vgl. auch Phoronix‑Artikel), davor glibc 2.38 vom 31.07.2023
 (LWN mit Original‑Ankündigung),
 siehe auch vorige Version glibc 2.37 vom 01.02.2023,
 davor glibc 2.36 vom 02.08.2022
 (LWN mit Original‑Ankündigung),
 siehe auch deren vorige Version glibc 2.35 vom 03.02.2022
 (LWN mit Original‑Ankündigung; vgl. auch Phoronix‑Artikel),
siehe auch vorige Version
glibc 2.34 vom 02.08.2021,
vgl. auch LWN mit
 Original‑Ankündigung oder Phoronix‑Artikel,
bzw. noch ältere Versionen wie glibc 2.33 vom 01.02.2021,
vgl. auch LWN with
 original announcement, bzw. glibc 2.32 vom 05.08.2020
[für gutes Zusammenspiel
 wird GCC 10 empfohlen], vgl. Originalhomepage
 und die Online Quellen
 weiter unten).
GNU C Library
(glibc oder libc; aktuell ist
glibc 2.42 vom 28.07.2025,
zuvor glibc 2.41 vom 30.01.2025,
davor glibc 2.40 vom 22.07.2024,
zuvor glibc 2.39 vom 31.01.2024
 (LWN mit Link zur Original‑Ankündigung;
 vgl. auch Phoronix‑Artikel), davor glibc 2.38 vom 31.07.2023
 (LWN mit Original‑Ankündigung),
 siehe auch vorige Version glibc 2.37 vom 01.02.2023,
 davor glibc 2.36 vom 02.08.2022
 (LWN mit Original‑Ankündigung),
 siehe auch deren vorige Version glibc 2.35 vom 03.02.2022
 (LWN mit Original‑Ankündigung; vgl. auch Phoronix‑Artikel),
siehe auch vorige Version
glibc 2.34 vom 02.08.2021,
vgl. auch LWN mit
 Original‑Ankündigung oder Phoronix‑Artikel,
bzw. noch ältere Versionen wie glibc 2.33 vom 01.02.2021,
vgl. auch LWN with
 original announcement, bzw. glibc 2.32 vom 05.08.2020
[für gutes Zusammenspiel
 wird GCC 10 empfohlen], vgl. Originalhomepage
 und die Online Quellen
 weiter unten).
![[Wikipedia-de-Icon]](images/Wikipedia_logo_de.gif) C23 angehoben werden
(d.h. den Dialekt GNU23; siehe Phoronix‑Artikel, 16.10.2024).
C23 angehoben werden
(d.h. den Dialekt GNU23; siehe Phoronix‑Artikel, 16.10.2024).
![[Wikipedia-de-Icon]](images/Wikipedia_logo_de.gif) Wikipedia‑Artikel).
Man sollte sich den
Wikipedia‑Artikel).
Man sollte sich den ![[YouTube-Icon]](images/youtube_inside.gif) Vortrag des Zig‑Autors anschauen,
mit einer Prise Humor!
Vortrag des Zig‑Autors anschauen,
mit einer Prise Humor!
![[Wikipedia-de-Icon]](images/Wikipedia_logo_de.gif) Gnome und
Gnome und ![[Wikipedia-de-Icon]](images/Wikipedia_logo_de.gif) XFCE oder das Bildverarbeitungsprogramm
XFCE oder das Bildverarbeitungsprogramm ![[Wikipedia-de-Icon]](images/Wikipedia_logo_de.gif) GIMP).
Für die Kernel‑Programmierung und andere
extrem effiziente Programme sieht er keinen Sinn
in C++, wie er mehrfach ausführte.
GIMP).
Für die Kernel‑Programmierung und andere
extrem effiziente Programme sieht er keinen Sinn
in C++, wie er mehrfach ausführte.
![[Wikipedia-de-Icon]](images/Wikipedia_logo_de.gif) C,
C, ![[Wikipedia-de-Icon]](images/Wikipedia_logo_de.gif) C++,
C++,
 ![[Wikipedia-de-Icon]](images/Wikipedia_logo_de.gif) Fortran – und ggf. noch
Fortran – und ggf. noch ![[Wikipedia-de-Icon]](images/Wikipedia_logo_de.gif) Python 3🥈.
Python 3🥈. 
![[Wikipedia-de-Icon]](images/Wikipedia_logo_de.gif) Zeittafel
 der Programmiersprachen
auf Wikipedia, obwohl hier nur ca. 7%
enthalten sind),
und man wird sich nur in einer richtig auskennen,
so wie man nur eine Hauptsprache
(zumeist die Muttersprache) hat.
Man sollte also gut nachdenken –
und nicht auf Java, C# oder unsinnige Zwänge
 wie
Zeittafel
 der Programmiersprachen
auf Wikipedia, obwohl hier nur ca. 7%
enthalten sind),
und man wird sich nur in einer richtig auskennen,
so wie man nur eine Hauptsprache
(zumeist die Muttersprache) hat.
Man sollte also gut nachdenken –
und nicht auf Java, C# oder unsinnige Zwänge
 wie ![[Wikipedia-de-Icon]](images/Wikipedia_logo_de.gif) objektorientiertes Programmieren oder
objektorientiertes Programmieren oder ![[Wikipedia-de-Icon]](images/Wikipedia_logo_de.gif) agile Softwareentwicklung
als ständige Verpflichtung hereinfallen.
Leider werden Schüler häufig genau mit solchen
schädlichen da oberflächlichen Dingen zuerst beworfen,
so dass ihr Weg deutlich erschwert wird.
Zumindest sollte jeder sich frühzeitig überlegen,
was vorrangig die Programmiersprache
der Wahl ist –
und dies hängt weniger vom Einsatzzweck ab:
agile Softwareentwicklung
als ständige Verpflichtung hereinfallen.
Leider werden Schüler häufig genau mit solchen
schädlichen da oberflächlichen Dingen zuerst beworfen,
so dass ihr Weg deutlich erschwert wird.
Zumindest sollte jeder sich frühzeitig überlegen,
was vorrangig die Programmiersprache
der Wahl ist –
und dies hängt weniger vom Einsatzzweck ab:
![[Wikipedia-de-Icon]](images/Wikipedia_logo_de.gif) EoL abtrat;
aktuell
ist Python 3.13.0 vom 07.10.2024;
vgl. Heise‑Artikel zu Python 3.13),
weil es im schulischen Bereich
die einzig halbwegs hochwertige Programmiersprache ist,
die vermittelt wird,
u.a. im Zusammenhang mit den
EoL abtrat;
aktuell
ist Python 3.13.0 vom 07.10.2024;
vgl. Heise‑Artikel zu Python 3.13),
weil es im schulischen Bereich
die einzig halbwegs hochwertige Programmiersprache ist,
die vermittelt wird,
u.a. im Zusammenhang mit den ![[Wikipedia-de-Icon]](images/Wikipedia_logo_de.gif) Raspberry Pis.
Aber dies muss nicht sein, wie z.B. der Artikel Raspberry Pi Pico und C/C++ –
eine gute Kombination
(Heise‑Online, 19.03.2021) zeigt.
Raspberry Pis.
Aber dies muss nicht sein, wie z.B. der Artikel Raspberry Pi Pico und C/C++ –
eine gute Kombination
(Heise‑Online, 19.03.2021) zeigt.
![[Wikipedia-de-Icon]](images/Wikipedia_logo_de.gif) Blender, die auch für 🕹️Spiele
 eingesetzt wird, in C, C++ und Python
 geschrieben wurde
(vgl. auch Projekte in
mehreren Programmiersprachen
in nachfolgender Fußnote).
Blender, die auch für 🕹️Spiele
 eingesetzt wird, in C, C++ und Python
 geschrieben wurde
(vgl. auch Projekte in
mehreren Programmiersprachen
in nachfolgender Fußnote).
![[Wikipedia-de-Icon]](images/Wikipedia_logo_de.gif) Rust
interessant wirkt
(2010‑2015 Entwicklung durch Mozilla
 zur ersten stabilen Version),
 würde ich diese von Mozilla entwickelte Sprache
 nicht direkt empfehlen, auch wenn es manche bereits jetzt
 ganz anders sehen: es muss sich erst noch zeigen,
 ob Rust die Zukunft
 der Systemprogrammierung werden wird
 wie im Beitrag vom 27.08.2019 behauptet
 (siehe auch LWN‑Kommentare).
Rust
interessant wirkt
(2010‑2015 Entwicklung durch Mozilla
 zur ersten stabilen Version),
 würde ich diese von Mozilla entwickelte Sprache
 nicht direkt empfehlen, auch wenn es manche bereits jetzt
 ganz anders sehen: es muss sich erst noch zeigen,
 ob Rust die Zukunft
 der Systemprogrammierung werden wird
 wie im Beitrag vom 27.08.2019 behauptet
 (siehe auch LWN‑Kommentare).
![[Wikipedia-de-Icon]](images/Wikipedia_logo_de.gif) Go
 (2009‑2012 Entwicklung
 durch Google zur ersten stabilen Version;
von GCC unterstützt;
mit aktueller Version Go 1.22 vom 06.02.2024,
siehe Release Notes bzw. LWN-Artikel;
und Vorversion 1.21 vom 08.08.2023,
 siehe Phoronix‑Artikel bzw. den vom 21.06.2023 zum RC;
und Vorgängerversion 1.20, siehe Phoronix‑Artikel, 01.02.2023;
 bzw. Vorversion 1.19, siehe LWN‑Artikel, 02.08.2022, bzw. deren
 Vorversion 1.18, siehe Phoronix‑Artikel, 15.03.2022;
 bzw. aktueller Dokumentation)
eher ein Spielzeug zu sein,
das allenfalls gegenüber Java oder C#
überlegen ist.
Go
 (2009‑2012 Entwicklung
 durch Google zur ersten stabilen Version;
von GCC unterstützt;
mit aktueller Version Go 1.22 vom 06.02.2024,
siehe Release Notes bzw. LWN-Artikel;
und Vorversion 1.21 vom 08.08.2023,
 siehe Phoronix‑Artikel bzw. den vom 21.06.2023 zum RC;
und Vorgängerversion 1.20, siehe Phoronix‑Artikel, 01.02.2023;
 bzw. Vorversion 1.19, siehe LWN‑Artikel, 02.08.2022, bzw. deren
 Vorversion 1.18, siehe Phoronix‑Artikel, 15.03.2022;
 bzw. aktueller Dokumentation)
eher ein Spielzeug zu sein,
das allenfalls gegenüber Java oder C#
überlegen ist.
![[YouTube-Icon]](images/youtube_inside.gif) 'Comparison between Carbon and Odin', 20.07.2022),
da hier mit 'einfach' und 'Brechen der ABI'
geworben wird, und dennoch ein Nachfolger von C++
angedacht wurde, man aber einen Syntax‑Mischmasch
aus vielen Sprachen erstellte ...
wenn man nun noch betrachtet, dass nur LLVM
aktuell anvisiert wird, sehen die Erfolgsaussichten
eher finster aus – zumal C++ eine
sich entwickelnde Programmiersprache ist.
 'Comparison between Carbon and Odin', 20.07.2022),
da hier mit 'einfach' und 'Brechen der ABI'
geworben wird, und dennoch ein Nachfolger von C++
angedacht wurde, man aber einen Syntax‑Mischmasch
aus vielen Sprachen erstellte ...
wenn man nun noch betrachtet, dass nur LLVM
aktuell anvisiert wird, sehen die Erfolgsaussichten
eher finster aus – zumal C++ eine
sich entwickelnde Programmiersprache ist.
![[Wikipedia-de-Icon]](images/Wikipedia_logo_de.gif) LibreOffice
[Schreibprogramm, Tabellenkalkulation, Präsentationsprogramm,
Zeichenprogramm, Datenbank etc.] oder
LibreOffice
[Schreibprogramm, Tabellenkalkulation, Präsentationsprogramm,
Zeichenprogramm, Datenbank etc.] oder ![[Wikipedia-de-Icon]](images/Wikipedia_logo_de.gif) SeaMonkey /
SeaMonkey / ![[Wikipedia-de-Icon]](images/Wikipedia_logo_de.gif) Mozilla Suite
[WebBrowser, E‑Mail‑Programm,
 Kalender etc.]);
Mozilla Suite
[WebBrowser, E‑Mail‑Programm,
 Kalender etc.]);
![[Wikipedia-de-Icon]](images/Wikipedia_logo_de.gif) Kommilitonen, die Informatik studierten,
ihre Zeit mit
Kommilitonen, die Informatik studierten,
ihre Zeit mit ![[Wikipedia-de-Icon]](images/Wikipedia_logo_de.gif) Miranda,
einer toten Kunstsprache und geistigen Vorbild von Haskell,
verschwenden mussten.
Miranda,
einer toten Kunstsprache und geistigen Vorbild von Haskell,
verschwenden mussten.
![[Wikipedia-de-Icon]](images/Wikipedia_logo_de.gif) objektorientiertes Programmieren zulassen
(hier scheidet C aus; Rust kennt
keine Vererbung, ab Fortran 2003 beherrscht auch
dies OOP),
damit sie auch in Sek. II verwendet werden kann.
ABER als einzig genannte Programmiersprache
(wenn auch nur in einem Aspekt)
wird
objektorientiertes Programmieren zulassen
(hier scheidet C aus; Rust kennt
keine Vererbung, ab Fortran 2003 beherrscht auch
dies OOP),
damit sie auch in Sek. II verwendet werden kann.
ABER als einzig genannte Programmiersprache
(wenn auch nur in einem Aspekt)
wird ![[Wikipedia-de-Icon]](images/Wikipedia_logo_de.gif) WHILE genannt,
die zur theoretischen Informatik gehört.
WHILE genannt,
die zur theoretischen Informatik gehört.
![[Wikipedia-de-Icon]](images/Wikipedia_logo_de.gif) C++
wurde 1979 von
C++
wurde 1979 von ![[Wikipedia-de-Icon]](images/Wikipedia_logo_de.gif) Bjarne Stroustrup
(Interview 22.08.2014)
bei AT&T als Erweiterung der Programmiersprache C
entwickelt.
Es ermöglicht ähnlich wie C eine effiziente und
maschinennahe Programmierung, lässt aber auch
ein hohes Abstraktionsniveau zu.
Zudem ist Bjarne Stroustrup der Ansicht,
dass C++ klar genug sei,
um Basiskonzepte erfolgreich zu lehren sowie
umfassend genug sei, um fortgeschrittene Konzepte und
Techniken zu lehren.
Bjarne Stroustrup
(Interview 22.08.2014)
bei AT&T als Erweiterung der Programmiersprache C
entwickelt.
Es ermöglicht ähnlich wie C eine effiziente und
maschinennahe Programmierung, lässt aber auch
ein hohes Abstraktionsniveau zu.
Zudem ist Bjarne Stroustrup der Ansicht,
dass C++ klar genug sei,
um Basiskonzepte erfolgreich zu lehren sowie
umfassend genug sei, um fortgeschrittene Konzepte und
Techniken zu lehren.
| 1985 | Erste Version von C++ | 
| 1989 | Version 2.0 von C++ | 
| 1998 | C++ Norm ISO/IEC 14882:1998:
    C++98 🎇Neu🎉: Templates, STL mit Containern und Algorithmen, Strings, I/O‑Streams | 
| 2003 | Nachbesserung der C++ Norm ISO/IEC 14882:2003: C++03 | 
| 2011 | Modern C++
ISO/IEC 14882:2011: C++11 [ab GCC 4.8.1
 und Clang 3.3 unterstützt {aus Linux‑Magazin 12/2017};
 vgl. Heise‑Artikel
 zur fertigen C++11‑Spezifikation] 🎇Neu🎉: Vereinheitlichte Initialisierung, Move‑Semantik, ![[Wikipedia-de-Icon]](images/Wikipedia_logo_de.gif) Typinferenz
      mit auto (nun kein Speicherklassen‑Specifier mehr)
      und decltype,
    Einführung der Lambda‑Funktion (auch ![[Wikipedia-de-Icon]](images/Wikipedia_logo_de.gif) anonyme Funktion genannt),
    constexpt,
    Übernahmen aus C11: z.B. long long
      (Ganzzahl mit mindestens 64 bit) oder
    Zusicherungen zur Übersetzungszeit static_assert,
    Multithreading und das Speichermodell,
    Reguläre Ausdrücke,
    Smart Pointer,
    Hash‑Tabellen,
    std::array | 
| 2014 | 1. Erweiterung von C++11 ISO/IEC 14882:2014:
 {anfänglich C++1y} C++14 [ab GCC 5.0
 und Clang 3.4 unterstützt {aus Linux‑Magazin 12/2017},
 ab GCC 6.1 Default; vgl. Heise‑Artikel zum fast fertigen C++14] 🎇Neu🎉: Verallgemeinerte Lambda‑Funktion, Verallgemeinerte constexpr‑Funktion, Erleichterte Lesbarkeit durch ' in Zahlenliteralen: 22'324'573UL, Einführung des Binärliterals: 0b0101'1110, Typdefinition bei Nutzer‑definierten Literalen: als String "123"s, Imaginärteil complex imaginaer {6.9i}; oder Zeitdauern mit h, min, s, ms, us und ns (das doppelt definierte s macht keine Probleme, da das eine auf Strings und das andere auf Zahlen operiert), auto als Rückgabetyp von Funktionen, rand() wird nicht mehr empfohlen, neues Attribut deprecated, Reader Writer Locks, Ergänzung der Standard‑Bibliothek (z.B. std::make_unique) | 
| 2017 | 2. Erweiterung von C++11 ISO/IEC 14882:2017:
 {anfänglich C++1z} C++17 [ab GCC 7
 und Clang 5 unterstützt {aus Linux‑Magazin 12/2017},
 seit GCC 9 nicht mehr experimentell,
 Default ab GCC 11 {siehe Phoronix, 27.06.2020 bzw. Phoronix, 25.04.2021};
 vgl. Heise‑Artikel zum fertigen C++17] 🎇Neu🎉: Zur besseren Compile‑Zeit tragen bei: Fold Expressions sowie constexpr if für bedingte Übersetzung, if und switch mit Initialisieren (ähnlich wie die Laufvariable in for), Structured Binding, neuer Typ std::byte zum byte‑weisen Zugriff auf den Speicher, Entfernung von auto_ptr (C++11 std::unique_ptr ist Ersatz) und Trigraphs (drei Zeichen, die Sonderzeichen darstellen, falls diese über Tastatur nicht eingebbar sind, z.B. ??= für #), std::stringview, Parallele Algorithmen der STL, Dateisystem‑Bibliothek, neue generische Container std::any, std::optional, std::variant | 
| 2020 | 3. Erweiterung von C++11 ISO/IEC 14882:2020:
 {anfänglich C++2a} C++20 (vgl. Heise‑Artikel zum Abschluss bzw. Artikel‑Serie auf Heise Developer
 von Rainer Grimm zu C++20, jeweils vom
28.10.2019 + 04.11. + 11.11. + 18.11. +
25.11. + 02.12. + 09.12. + 16.12. + 23.12.2019 +
12.01.2020 + 20.01. + 27.01. + 02.02. + 10.02. +
17.02. + 24.02. + 02.03. + 09.03. + 16.03. +
23.03. + 30.03. + 06.04. + 13.04. + 20.04. +
27.04. + 04.05. + 11.05. + 18.05. + 25.05. +
01.06. + 08.06. + 15.06. + 22.06. + 29.06. +
06.07. + 13.07. + 20.07. + 27.07. + 03.08. +
10.08. + 17.08. + 24.08. + 14.09. + 21.09. +
28.09. + 05.10. + 12.10. + 19.10. + 26.10. +
02.11. + 09.11. + 16.11. + 23.11. + 30.11. +
07.12. + 14.12. + 21.12.2020 + 11.01.2021 + 18.01. +
25.01. + 01.02. + 08.02. + 15.02. + 22.02. +
01.03. + 08.03. + 15.03. + 22.03. + 29.03. +
05.04. + 12.04.2021:
Die vier großen Neuerungen + Überblick zur Kernsprache + Überblick zur Bibliothek + Überblick zur Concurrency + Zwei Extreme und die Rettung
 dank Concepts + Concepts – die Details + Concepts –
 die Placeholder Syntax + Concepts – Syntactic Sugar + Concepts – was wir
  nicht bekommen + Vordefinierte Concepts + Concepts definieren + Die Concepts Equal und Ordering definieren + Die Concepts SemiRegular und
Regular definieren + Concepts in C++20: Eine Evolution oder
 eine Revolution? + Die Ranges‑Bibliothek + Funktionale Pattern mit der Ranges‑Bibliothek + Pythonisch mit der Ranges‑Bibliothek + Pythons range‑Funktion,
 die zweite + Die map‑Funktion von Python + Coroutinen – ein erster Überblick + Mehr Details zu Coroutinen + Ein unendlicher Datenstrom mit Coroutinen + Thread-Synchronisation mit Coroutinen + Coroutinen mit cppcoro + Mächtige Coroutinen
 mit cppcoro + Thread‑Pools
 mit cppcoro + Die Vorteile von Modulen + Ein einfaches
 math‑Modul + Module Interface Unit und
Module Implementation Unit + Module strukturieren + Weitere offene Fragen
 zu Modulen + Der Drei‑Weg‑Vergleichsoperator <=> + Mehr Details zum Spaceship‑Operator + Optimierte Vergleiche mit dem
 Spaceship Operator + Designated Initializers + Zwei neue Schlüsselwörter in C++20:
consteval und constinit + Die Lösung des Static Initialization
Order Fiasco mit C++20 + Verschiedene Template‑Verbesserungen
mit C++20 + Mächtigere Lambda‑Ausdrücke mit C++20 + Mehr Lambda‑Features
 mit C++20 + Neue Attribute mit C++20 + volatile und andere
kleine Verbesserungen in C++20 + Geschützter Zugriff auf Sequenzen
von Objekten mit std::span + constexpr std::vector und
constexpr std::string in C++20 + Neue praktische Funktionen für Container
in C++20 + std::format in C++20 + std::format um benutzterdefinierte
 Datentypen erweitern + Noch mehr praktische Werkzeuge
 in C++20 + Kalender und Zeitzonen in C++20:
 1. Tageszeit + 2. Kalendertag + 3. Umgang mit Kalendertagen + 4. Zeitzonen + Sicherer Vergleich von Ganzzahlen
in C++20 + Prüfen von C++‑Features
 mit C++20 + Bit‑Manipulationen mit C++20 + Atomare Referenzen mit C++20 + Synchronisation mit atomaren Variablen in C++20 + Performanzvergleich von Bedingungsvariablen
 und Atomics in C++20 + Semaphoren in C++20 + Latches in C++20 + Barrieren und atomare Smart Pointers
 in C++20 + Kooperatives Unterbrechen eines Threads
 in C++20 + Ein verbesserter Thread
 mit C++20 + Synchronisierte Ausgabe‑Streams mit C++20 + C++20: Einfache Futures
 mit Coroutinen implementieren + Lazy Futures mit Coroutinen
 in C++20 + C++20: Mit Coroutinen einen Future
 in einem eigenen Thread ausführen + Ein unendlicher Datenstrom dank Coroutinen
 in C++20 + Ein generischer Datenstrom mit Coroutinen
 in C++20 + Jobs starten mit Coroutinen
in C++20 + Coroutinen in C++20: Automatisches Fortsetzen
 eines Jobs auf einem anderen Thread) 🎇Neu🎉: Module (Alternative zu Headern; Präprozessor wird unnötig), Coroutinen (zur asynchronen Programmierung), Range‑Bibliothek (um Algorithmen der STL direkt auf Container anzuwenden, die Bereichs‑Objekte erlauben Verknüpfungen mit dem Pipe‑Operator und deren Definition auf unendliche Datenströme), Concepts (eine Erweiterung der Templates; siehe C++20‑Konzepte: Neue Wege mit Konzepten, Heise Developer, 08/2021), Contracts (Interfaces für Funktionen/Methoden: Vorbedingungen, Nachbedingungen und Zusicherungen während der Ausführung) {Contracts wurden für den Entwurf genehmigt, danach aber wieder gelöscht – was gut ist, kommt wieder ;} Am 15.02.2020 wurde in Prag abgestimmt, C++20 als DIS (`Draft International Standard') zur endgültigen Zustimmung und Publikation zu schicken (vgl. reddit-Artikel). Er kann nun als abgeschlossen betrachtet werden und die Arbeit am nächsten Standard kann beginnen. Der Entwurf wurde am 05.09.2020 bestätigt (siehe Phoronix, 06.09.2020). Für einen Überblick über C++20 siehe Magazin iX Developer – Modernes C++, 28.09.2020 (vgl. auch Weniger stupide Schreibarbeit: Code reduzieren mit C++20, iX 03/2021). | 
| 2023 | 4. Erweiterung von C++11 ISO/IEC 14882:2023:
 {anfänglich C++2b} C++23 C++23 ist Stand Juli 2023 inhaltlich fertig und steht zur endgültigen Abstimmung an (siehe Heise‑Artikel, Rainer Grimm, 10.07.2023): mit 'Deducing This' {ermöglicht, den implizit übergebenen this‑Zeiger in einer Mitgliedsfunktionsdefinition ähnlich wie in Python explizit zu machen und somit CRTP (Curiously Recurring Template Pattern) oder das Overload Pattern deutlich zu vereinfachen} erfolgt eine kleine, aber sehr effektive Erweiterung der Kernsprache; daneben wird die C++23‑Bibliothek viele wichtige Ergänzungen erhalten: so lässt sich die Standardbibliothek direkt mit 'import std;' importieren, die C++20‑Formatspezifikation lässt sich direkt in std::print und std::println anwenden, ferner erhalten wir aus Performancegründen flache assoziative Container wie std::flat_map – verwendbar anstelle von std::map, die Schnittstelle std::optional wird aus Gründen der Komposibilität um eine monadische Schnittstelle erweitert, der neue Datentyp std::expected hat bereits eine komponierbare Schnittstelle und kann einen erwarteten oder einen unerwarteten Wert zur Fehlerbehandlung speichern, dank std::mdspan erhalten wir einen mehrdimensionalen Span, und schließlich ist std::generator die erste konkrete Coroutine zur Erzeugung eines Zahlenstroms und Teil der in C++23 signifikant erweiterten ranges-Bibliothek; zudem (vgl. LWN‑Artikel) werden hazard pointers und user‑space read‑copy‑update (RCU) unterstützt. Vorschläge können noch bis Januar 2025 eingereicht werden. [??? erste Vorschläge umfassten: `Modular Standard Library', Bibliotheks-Unterstützung von `Coroutines', `Executors' und `Networking', auf der Sprachseite Intensivierung von `Reflection' inklusive `Introspection', Programmierung zur Compile‑Zeit und Generierung sowie `Pattern Matching' und `Contracts' ... ???] | 
| 2026 | 5. Erweiterung von C++11 ISO/IEC 14882:2026:
 {anfänglich C++2c} C++26 ... [??? erste Spekulationen vgl. Heise‑Developer, 16.11.2023 oder auch von Herb Sutter: "Summer ISO C++ standards meeting", 02. Juli 2024] | 
![[Wikipedia-de-Icon]](images/Wikipedia_logo_de.gif) Standardbibliothek
(STL: Standard Template Library oder
libstdc++, als dessen Designer gilt
Standardbibliothek
(STL: Standard Template Library oder
libstdc++, als dessen Designer gilt ![[Wikipedia-de-Icon]](images/Wikipedia_logo_de.gif) Alexander Stepanow – Link zu
seiner Homepage
mit Veröffentlichungen von Alexander A. Stepanov;
vgl. Core Guidelines).
Alexander Stepanow – Link zu
seiner Homepage
mit Veröffentlichungen von Alexander A. Stepanov;
vgl. Core Guidelines).
![[Wikipedia-de-Icon]](images/Wikipedia_logo_de.gif) Boost
 verwenden (dafür GCC den Pfad mit -L-Option angeben).
Boost stellt eine freie Sammlung
 von C++‑Quell‑Unterbibliotheken dar
(hier eine Liste
aller Boost‑Bibliotheken),
die durch Fachleute überprüft als Erweiterung
und Prüfstand zukünftiger Zusätze
von libstdc++ dienen (zukünftig ist
1.87 für den 11.12.2024 geplant, aktuell ist 1.86 vom 14.08.2024, davor 1.85 vom 15.04.2024, zuvor 1.84 vom 13.12.2023, davor 1.83 vom 11.08.2023, zuvor 1.82 vom 14.04.2023, davor 1.81 vom 14.12.2022, zuvor 1.80 vom 10.08.2022,
 davor 1.79 vom 13.04.2022,
 zuvor 1.78 vom 08.12.2021,
 davor 1.77 vom 11.08.2021,
 zuvor 1.76 vom 16.04.2021,
davor 1.75 vom 11.12.2020;
vgl. Heise‑Artikel zu Boost 1.77 vom 16.08.2021 bzw. zu Boost 1.68 vom 13.08.2018).
Boost
 verwenden (dafür GCC den Pfad mit -L-Option angeben).
Boost stellt eine freie Sammlung
 von C++‑Quell‑Unterbibliotheken dar
(hier eine Liste
aller Boost‑Bibliotheken),
die durch Fachleute überprüft als Erweiterung
und Prüfstand zukünftiger Zusätze
von libstdc++ dienen (zukünftig ist
1.87 für den 11.12.2024 geplant, aktuell ist 1.86 vom 14.08.2024, davor 1.85 vom 15.04.2024, zuvor 1.84 vom 13.12.2023, davor 1.83 vom 11.08.2023, zuvor 1.82 vom 14.04.2023, davor 1.81 vom 14.12.2022, zuvor 1.80 vom 10.08.2022,
 davor 1.79 vom 13.04.2022,
 zuvor 1.78 vom 08.12.2021,
 davor 1.77 vom 11.08.2021,
 zuvor 1.76 vom 16.04.2021,
davor 1.75 vom 11.12.2020;
vgl. Heise‑Artikel zu Boost 1.77 vom 16.08.2021 bzw. zu Boost 1.68 vom 13.08.2018).
![[Wikipedia-en-Icon]](images/Wikipedia_logo_en.gif) GCC‑Historie
[englisch, die deutsche Fassung
 ist oberflächlicher])]
GCC‑Historie
[englisch, die deutsche Fassung
 ist oberflächlicher])]
![[Wikipedia-de-Icon]](images/Wikipedia_logo_de.gif) KDE; oder auch Schreibprogramme
 wie
KDE; oder auch Schreibprogramme
 wie ![[Wikipedia-de-Icon]](images/Wikipedia_logo_de.gif) LibreOffice oder
LibreOffice oder
![[Wikipedia-de-Icon]](images/Wikipedia_logo_de.gif) AbiWord)
verwendet, im Grafikbereich (insb. bei 🕹️Spielen,
z.B.
AbiWord)
verwendet, im Grafikbereich (insb. bei 🕹️Spielen,
z.B. ![[Wikipedia-de-Icon]](images/Wikipedia_logo_de.gif) SuperTux oder
SuperTux oder
![[Wikipedia-de-Icon]](images/Wikipedia_logo_de.gif) SuperTuxKart,
 wie auch bei der
SuperTuxKart,
 wie auch bei der ![[Wikipedia-de-Icon]](images/Wikipedia_logo_de.gif) Spiel-Engine Godot [ab 4.0
soll C++11 verwendet werden; für einen
englischen Überblick siehe
Spiel-Engine Godot [ab 4.0
soll C++11 verwendet werden; für einen
englischen Überblick siehe ![[YouTube-Icon]](images/youtube_inside.gif) Godot & C++ – How, What and Why?
sowie
 Godot & C++ – How, What and Why?
sowie ![[YouTube-Icon]](images/youtube_inside.gif) Why Godot Over Unity or
 Unreal Engine? bzw. die Godot News];
 siehe Literatur zur
 Spiele‑Programmierung sowie
 🕹️Game‑Engines und
 Frameworks),
ist aber auch für numerische Berechnungen
(auch wenn es dafür, anders als
 Why Godot Over Unity or
 Unreal Engine? bzw. die Godot News];
 siehe Literatur zur
 Spiele‑Programmierung sowie
 🕹️Game‑Engines und
 Frameworks),
ist aber auch für numerische Berechnungen
(auch wenn es dafür, anders als ![[Wikipedia-de-Icon]](images/Wikipedia_logo_de.gif) Fortran,
 nicht geschaffen wurde),
Betriebssysteme
(auch wenn hierfür C und Assembler
geeigneter erscheinen)
oder Datenbankzugriffe im Einsatz.
Zudem wird auch für GCC immer mehr C++ eingesetzt,
seit Konvertierungsbemühungen 08/2012
zum damaligen GCC 4.8 für GCC selbst
verwendet – und aktuell berät man,
auf C++11 (d.h. Modern C++; und diese frühe Version
ermöglicht auch den Einsatz von GCC 5
bzw. 6; anvisiert wird der Einsatz
des C++ Speicher-Modells mit atomic classes, for each loops, besserer Multi-Threading
Unterstützung, etc.)
umzusteigen, wohingegen LLVM gerade
den Übergang zu C++14 vorbereitet (vgl. Phoronix-Artikel vom 30.09.2019).
Fortran,
 nicht geschaffen wurde),
Betriebssysteme
(auch wenn hierfür C und Assembler
geeigneter erscheinen)
oder Datenbankzugriffe im Einsatz.
Zudem wird auch für GCC immer mehr C++ eingesetzt,
seit Konvertierungsbemühungen 08/2012
zum damaligen GCC 4.8 für GCC selbst
verwendet – und aktuell berät man,
auf C++11 (d.h. Modern C++; und diese frühe Version
ermöglicht auch den Einsatz von GCC 5
bzw. 6; anvisiert wird der Einsatz
des C++ Speicher-Modells mit atomic classes, for each loops, besserer Multi-Threading
Unterstützung, etc.)
umzusteigen, wohingegen LLVM gerade
den Übergang zu C++14 vorbereitet (vgl. Phoronix-Artikel vom 30.09.2019).
![[Wikipedia-de-Icon]](images/Wikipedia_logo_de.gif) Liste
 freier Computerspiele)
Verwendung findet und
eine gewisse Nähe zu C vorhanden ist.
Wenn ich irgendwann Schülern eine Sprache
näherbringen sollte,
darf ich mich
dafür nicht schämen müssen –
und dies würde ich tun,
wenn ich die bisher an Schulen vorgefundenen Wege
beschreiten würde.
Liste
 freier Computerspiele)
Verwendung findet und
eine gewisse Nähe zu C vorhanden ist.
Wenn ich irgendwann Schülern eine Sprache
näherbringen sollte,
darf ich mich
dafür nicht schämen müssen –
und dies würde ich tun,
wenn ich die bisher an Schulen vorgefundenen Wege
beschreiten würde.![[Wikipedia-de-Icon]](images/Wikipedia_logo_de.gif) Hello World
C++‑Beispiel hingewiesen.
Hello World
C++‑Beispiel hingewiesen.
/******************************************************************************
 * C++-Programm 'example.cpp' im Verzeichnis '~/mycpp/jmb/'                   *
 *                                                                            *
 * Funktion:    "Zerlegung einer Zahl in ihre Primfaktoren"                   *
 *                                                                            *
 * J.M.B.   [URL: https://www.jmb-edu.de/cpp_programming.html#progcppexamp]   *
 *                                                                            *
 * Lizenz:  (c) 2019  unter GPLv3: https://www.gnu.org/licenses/gpl-3.0.txt   *
 *                                                                            *
 * Erstellung:           05.08.2019                                           *
 *                                                                            *
 * Letzte Umgestaltung:  07.09.2019  (Phase 2; vgl. Phase 1 vom 08.08.2019)   *
 ******************************************************************************
 */
/* Einbau von Bibliotheken der C++-Standardbibliothek: */
# include <string>                     // fuer std::string {Container-Typ}:
                                       //   std::stoi/stoll, std::to_string
# include <vector>                     // fuer std::vector {Container-Typ}
# include <iostream>                   // fuer std::cin, std::cout, std::endl
# include <sstream>                    // fuer std::stringstream/ostringstream
# include <fstream>                    // fuer std::ofstream (Datei: file)
# include <stdexcept>                  // exception - zur Ausnahme-Behandlung
# include <cmath>                      // C-Mathe-Lib in C++ fuer: std::sqrt(l)
# include <ctime>                      // " std::time_t/struct tm/time/localtime
/* Gebrauch von ANSI-Farben in kompatiblen Terminals:
 * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 * Effekt          Code   |  Farbe   Vordergrund Hintergrund |  ASCII 27 = \033
 * zuruecksetzen     0    |  schwarz       30         40     |   = ESC-Zeichen
 * fett/hell         1    |  rot           31         41     | Z.B. hell rot
 * unterstrichen     4    |  gruen         32         42     |      auf schwarz
 * invertiert        7    |  gelb/orange   33         43     |  "\033[4;31;40m"
 * fett/hell aus    21    |  blau          34         44     | Clear Screan:
 * unterstri. aus   24    |  magenta       35         45     |"\033[2J\033[1;1H"
 * invertiert aus   27    |  cyan          36         46     | Reset: "\033[0m"
 *   * Just play ! *      |  weiss/grau    37         47     |  * Have fun! *
 */
// * Globale String-Konstanten zur Festlegung der ANSI-Steuercodes, hier
// *   bzgl. STIL_VGFARBE_HGFARBE (siehe Erklaerung oben; Esc=x1B=27=\033):
const std::string              // Definition aller ANSI-ESC-Sequenzen / Farben
// Anstelle: '# define RESET "\033[0m"' fuer Praeprozessor nun:
  RESET            = "\x1B[0m",        // Reset to Defaul: zuruecksetzen
  CLRSCR           = "\x1B[2J\x1B[1;1H", // wie in C++ 'std::system("clear");'
  UL_LWHITE_BROWN  = "\x1B[1;4;37;43m",// unterstrichen weiss auf orange
  LWHITE_BROWN     = "\x1B[1;37;43m",  // weiss auf braun/orange
  UL_LYELLOW_BROWN = "\x1B[1;4;33;43m",// unterstrichen gelb auf braun/orange
  LYELLOW_BROWN    = "\x1B[1;33;43m",  // gelb auf braun/orange
  UL_LRED_BLACK    = "\x1B[1;4;31;40m",// unterstrichen rosa auf schwarz
  LRED_BLACK       = "\x1B[1;31;40m",  // rosa auf schwarz
  LYELLOW_BLACK    = "\x1B[1;33;40m",  // gelb auf schwarz
  UL_LYELLOW_GREEN = "\x1B[1;4;33;42m",// unterstrichen gelb auf gruen
  RED_BROWN        = "\x1B[31;43m";    // rot auf braun/orange
// * Globale Variable zur Festlegung, ob Ausgabe ohne ANSI-Farben gewuenscht ist
bool farbLos = false;                  // wird nur von main umgeaendert!
// * Nun eine zweiteilige Funktion zum (ggf. farbigen) Start bzw. Ende ;)
void begruessung (std::ostream& os, bool anfang, std::string prgname)
{ using std::endl;                     // endl bedeutet nun std::endl
  if (anfang)                          // * anfang: 1 = true (= Begruessung)
  { /* Begruessung */
    if (farbLos)
    {                                  // prgname = argv[0], d.h. Aufrufstring
      os << " * Programm '" << prgname << "' zur Ausgabe der Primfaktoren *";
      os << endl;
    } else
    {                                  // prgname = argv[0], d.h. Aufrufstring
      os << UL_LYELLOW_BROWN << " * Programm '" << UL_LYELLOW_GREEN << prgname;
      os << UL_LYELLOW_BROWN << "' zur Ausgabe der Primfaktoren *" << RESET;
      os << endl;
    }
  } else                               // * anfang: 0 = false (= Abschied)
  { /* Verabschiedung */
    if (farbLos)
    {
    os << " * Macht's gut, Kinners!  \U0001F609 * -<\u00A9 2019 J.M.B., GPLv3\U0001F60E>-";
    os << endl;
    } else
    {
    os << UL_LWHITE_BROWN << " * Macht's gut, Kinners! ";
    os << LYELLOW_BROWN << "\U0001F609" << UL_LWHITE_BROWN;
    os << " * -<\u00A9 2019 J.M.B., GPLv3" << RED_BROWN << "\U0001F60D";
    os << UL_LWHITE_BROWN << ">-" << RESET << endl;
    }
  }
} // Ende: void begruessung (std::ostream& os, bool anfang, std::string prgname)
// * Nun eine Funktion zur Ausgabe von Fehler-Hinweisen:
void meldeInfo (std::ostream& os, bool errMsg, std::string msgStr)
{ using std::endl;                     // endl bedeutet nun std::endl
  if (errMsg)                          // errMsg = 1: "Fehler: ..."
  { /* ehemals void fehlerInfo (std::ostream& os, std::string fehlerStr) */
    if (farbLos)
    {
    os << " * Fehler: " << msgStr << "!" << endl;
    } else
    {
    os << LRED_BLACK << " * " << UL_LRED_BLACK << "Fehler:" << RESET;
    os << " " << msgStr << "!" << endl;
    }
  } else                               // errMsg = 0: "Info: ..."
  { /* ehemals void hinweisInfo (std::ostream& os, std::string hinweisStr) */
    if (farbLos)
    {
    os << " * Info: " << msgStr << endl;
    } else
    {
    os << LYELLOW_BROWN << " * " << UL_LYELLOW_BROWN << "Info:" << RESET;
    os << " " << msgStr << endl;
    }
  }
} // Ende: void meldeInfo (std::ostream& os, bool errMsg, std::string msgStr)
void ausgabeInfotext (std::ostream& os, bool hlpMsg)
{
  if (hlpMsg)                          // hlpMsg = 1: Hilfs-Text ..."
  {
    if (!(farbLos))
     os << LYELLOW_BROWN << " * Hilfstext:" << LWHITE_BROWN << "\n";
    os << " *******************************************************************\n";
    os << " * Generelle Funktion und Spezialparameter des Programms 'example' *\n";
    os << " *-===============================================================-*\n";
    os << " * Es ist moeglich, als 1. Parameter ein Steuerflag einzugeben:    *\n";
    os << " * o Keinen Spezialparameter (d.h. kein Steuerflag):               *\n";
    os << " *   Parameter / interaktiv einzugebende Zahlen als Strings holen  *\n";
    os << " *   und nacheinander bearbeiten: jeweils Ganzzahlen zwischen      *\n";
    os << " *   2 und 18446744073709551615 (2^64-1), auch hex. wie 0x9AFE,    *\n";
    os << " *   in Primfaktoren zerlegen und die Faktoren ausgeben.           *\n";
    os << " *   Alle Nichtzahlen werden ignoriert - sie koennen aber als      *\n";
    os << " *   Zahlentrenner eingesetzt werden (wie 66,0x1B bzw. 66/12/9).   *\n";
    os << " *   Eingabe eines Zeichens: 'H' - Hilfs-, 'V'- Versions-Text und  *\n";
    os << " *   'B' - beide interaktiv abrufbar, mit '1'/'Q' abbrechen.       *\n";
    os << " * o -f --file    => Ausgabe des Parameter-Teils in eine Datei -   *\n";
    os << " *                   eine interaktive Abfrage erfolgt nicht.       *\n";
    os << " * o -m --mono    => Monochromatisch mit Default-Farben vom xterm  *\n";
    os << " * o -i --inverse => Invertierte Darstellung (mit Nostalgie \U0001F917 )   *\n";
    os << " *                   gelb auf schwarz (wie Turbo Pascal 3.0)       *\n";
    os << " * o -h --help    => Diesen Hilfstext ausgeben und beenden         *\n";
    os << " * o -v --version => Version, Datum, Autorinfo, Lizenz & beenden   *\n";
    os << " * o -b -vh -hv   => Versions- und Hilfs-Text ausgeben & beenden   *\n";
    os << " *******************************************************************";
  } else                               // hlpMsg = 1: Versions-Text ..."
  {
    if (!(farbLos))
     os << LYELLOW_BROWN << " * Versionstext:" << LWHITE_BROWN << "\n";
    os << " *******************************************************************\n";
    os << " * C++-Programm fuer GNU/Linux >example< in Version 2.00 (Phase 2) *\n";
    os << " * \u00A9 2019  J.M.B. (URL: https://www.jmb-edu.de/)  03.09.2019 GPLv3 *\n";
    os << " * [URL: https://www.jmb-edu.de/cpp_programming.html#progcppexamp] *\n";
    os << " *******************************************************************";
  }
  if (!(farbLos))
    os << RESET;
  os << std::endl;
} // Ende: void ausgabeInfotext (std::ostream& os)
// * Globale Variable fuer Dateiname
std::string outputFilename = "";  // v- spaeter mit Zeitstempel YYYYMMDDHHMMSS..
std::string myOutputFilename = "PrimZahlZerlegung_JMB.txt";// Ueberschreibschutz
// * Zwei Funktionen zum Erhalt des Datumsstrings (braucht '# include <ctime>'):
std::string addZeroIOD (std::ostream& os, std::string addStr)
{
  if (addStr.length() == 1)
  {
    addStr = std::string("0")+addStr;  // ergaenze fuehrende 0 bei einer Ziffer
  } else if ((addStr.length() == 0) || (addStr.length() > 2))  // 2 ist OK :)
  {
    meldeInfo (os, 1, "Falsche Stringlaenge in addZeroIOD!");
    return "";                         // macht nichts kaputt - Fehler sichtbar
  }
  return addStr;
} // Ende: addZeroIOD (std::ostream& os, std::string addStr)
std::string getDatStr (std::ostream& os)
{ using namespace std;                 // sollte vermieden werden; hier klein
  tm *nun;                             // ein struct fuer Zeitangaben: tm_*
  time_t now = time(0);                // Sekunden seit 00:00, Jan 1 1970 UTC
  nun = localtime(&now);               // Konvertieren in Kalenderzeit
  int dateYear = 1900 + nun->tm_year;  // Jahr:     seit 1900 (= 0)
  int dateMonth =   1 + nun->tm_mon;   // Monate:   0-11
  int dateDay =         nun->tm_mday;  // Tage:     1-31
  int timeHour =        nun->tm_hour;  // Stunden:  0-23
  int timeMin =         nun->tm_min;   // Minuten:  0-59
  int timeSec =         nun->tm_sec;   // Sekunden: 0-60 (Schaltsekunde)
  string dateTime = to_string (dateYear);  // Start dateTime mit Jahreszahl
  string addStr = addZeroIOD (os, to_string (dateMonth)); // Monat zweist. ..
  dateTime += addStr;                  // .. in addStr und diesen anfuegen
  addStr = addZeroIOD(os, to_string (dateDay));      // Tag zweistellig ..
  dateTime += addStr;                  // .. in addStr und diesen anfuegen
  addStr = addZeroIOD(os, to_string (timeHour));     // Stunden zweistellig ..
  dateTime += addStr;                  // .. in addStr und diesen anfuegen
  addStr = addZeroIOD(os, to_string (timeMin));      // Minuten zweistellig ..
  dateTime += addStr;                  // .. in addStr und diesen anfuegen
  addStr = addZeroIOD(os, to_string (timeSec));      // Sekunden zweistellig ..
  dateTime += addStr;                  // .. in addStr und diesen anfuegen
  return dateTime;                     // Zeitstring als YYYYMMDDHHMMSS zurueck
} // Ende: std::string getDatStr (std::ostream& os)
// * Globale Variable fuer Primfaktorliste:
// *   Funktion suchePrimFaktoren bestueckt sie,
// *   Funktion ausgabePrimFaktoren liest sie
// *     fuer Ausgabe aus und setzt sie zurueck.
std::vector<unsigned long long> wertepfs;
// * Globale Variable, die bei ausgabePrimFaktoren ausgelesen und
// *   ausgegeben wird und an deren Ende auch inkrementiert (+1) wird.
unsigned long long anzFaktorZerlegungen = 1;
// * Globale Variablen fuer Eingabe ueber Parameter/Tastatur ...
std::string inputStr = "";             // Einlese-String
std::string::size_type sz = 0;         // Entspricht size_t (ein Alias)
// sz dient als Marker fuer StringRest-Kopie in verwandleStringInULL !
// * Funktion zur PF-Ermittlung - der eigentliche Algorithmus (d.h. das Herz)
void suchePrimFaktoren (unsigned long long n)
{
  /* 1. Schritt: */
  // Anzahl 2-en ausgeben, durch die n (vor 1. Schritt) dividiert werden kann
  while (n%2 == 0)                     // wenn bei Division kein Rest
  {
    wertepfs.push_back (2);            // jeder Faktor wird gemerkt -> wertepfs
    n = n/2;
  }
  /* 2. Schritt: */
  // n (Anfang 2. Schritt) muss nun ungerade sein - Primfaktoren 2 wurden
  // entdeckt, somit kann man immer eine Zahl uebergehen, daher i=i+2
  for (unsigned long long i = 3; i <= std::sqrt(n); i = i+2)
  { // .. nach GCC Namspace-Fix sqrtl statt^^^^ verwenden (C++17-Voraussetzung)
    // Solange n durch i teilbar ist, wird i ausgegeben (analog 2 oben)
    while (n%i == 0)                   // wenn bei Division kein Rest
    {
      wertepfs.push_back (i);          // jeder Faktor wird gemerkt -> wertepfs
      n = n/i;
    }
  }
  /* 3. Schritt: */
  // Wenn for bis i = Wurzel n (n nach 1. Schritt) nicht n=1 (Ende 2. Schritt)
  // liefert, muss n der letzte fehlende Primfaktor der Zerlegung sein
  if (n > 2)                           // n ist der letzte fehlende PF ...
  {
    wertepfs.push_back (n);            // n wird als PF gemerkt -> wertepfs
  }
} // Ende: void suchePrimFaktoren (unsigned long long n)
void ausgabePrimFaktoren (std::ostream& os, unsigned long long wert)
{
  int pfanz = 0;                       // Anzahl Primfaktoren - hier int OK!
  std::string pfliststring = "  ";     // Def.+Initialisierung von String
  std::string dummystring = "";
  unsigned int curoutstrllength = 0;   // Laenge der aktuellen pfliststring-Z.
  unsigned int addfutstrlength= 0;     // Laenge der naechsten Ergaenzung
  const unsigned int maxlength = 75;   // Angabe der maximalen Zeilenlaenge - 1
  std::string zeilUmbrStr = ",\n *   ";
  if (!(farbLos))
    zeilUmbrStr = ",\n"+LYELLOW_BROWN+" * "+RESET+"  ";
  for (unsigned long long primfaktor : wertepfs)
  {
    if (pfanz < 1)
    {
      pfliststring += std::to_string (primfaktor);  // to_string ab C++11
      curoutstrllength = pfliststring.length();     // Startlaenge der Zeile
    } else                                          // es gab Vorgaenger: +' ,'
    {
      dummystring = std::to_string (primfaktor);
      addfutstrlength = (2+dummystring.length());
      if (!(curoutstrllength+addfutstrlength+2 < maxlength))
      {
        pfliststring += zeilUmbrStr;                // Zeilenumbruch + Platz
        curoutstrllength = addfutstrlength;         // Neuer Start Zeilenlaenge
      } else
      {
        pfliststring += ", ";                       // Komma + wenig Platz
        curoutstrllength += addfutstrlength;        // Zeilenlaenge vergroess.
      }
      pfliststring += std::to_string (primfaktor);  // aktuelle PF dem Str. zuf.
    }
    ++pfanz;
  }
  pfliststring += ".";                 // Abschlusspunkt
  if (pfanz < 2)
  {
    if (!(farbLos))
    {
      os << LYELLOW_BROWN << " * " << RESET;
    } else
    {
     os << " * ";
    }
    os << "Der " << anzFaktorZerlegungen << ". Wert '" << wert;
    os << "' ist bereits prim." << std::endl;   // \n und Flushen am Schluss
  } else
  {
    if (!(farbLos))
    {
      os << LYELLOW_BROWN << " * " << RESET;
    } else
    {
      os << " * ";
    }
    os << " Der " << anzFaktorZerlegungen << ". Wert '" << wert;
    os << "' konnte in " << pfanz << " Primfaktoren zerlegt werden:\n";
    if (!(farbLos))
    {
      os << LYELLOW_BROWN << " * " << RESET;
    } else
    {
      os << " * ";
    }
    os << pfliststring << std::endl;   // Liste als Abschluss, \n und Flushen!
  } // Angaben x86_64-Linux, signed|uns. int|long|long long ist systemabhaengig:
  if        (wert == 18446744073709551615ull)// 2^64-1 groesster 64 Bit - Wert!
  {
    meldeInfo (os, 0, "Ende von 'unsigned long long' erreicht - groesser nur mit Spezial-Libs!");
  } else if (wert >  9223372036854775807)  // 2^63-1 grosster signed 64 Bit - W!
  {
    meldeInfo (os, 0, "Hier war 'unsigned long long' statt '>long long<' notwendig!");
  } else if (wert >           4294967295)  // 2^32-1 grosster unsigned 32 Bit-W!
  {
    meldeInfo (os, 0, "Hier war 'unsigned long long' statt '>unsigned int<' notwendig!");
  } else if (wert >           2147483647)  // 2^31-1 grosster signed 32 Bit-W!
  {
    meldeInfo (os, 0, "Hier war 'unsigned long long' statt '>int<' notwendig!");
  } else if (wert >                  255)  // 2^8-1  grosster unsigned 8 Bit-W!
  {
    meldeInfo (os, 0, "Hier war 'unsigned long long' statt '>unsigned char<' notwendig!");
  } else if (wert >                  127)  // 2^7-1  grosster signed 8 Bit-W!
  {
    meldeInfo (os, 0, "Hier war 'unsigned long long' statt '>signed char<' notwendig!");
  }
  /* Vector wertepfs loeschen, damit Platz fuer neue Eintraege ist */
  wertepfs.clear();
  ++anzFaktorZerlegungen;              // Globale Variable als Zaehler: +1
} // Ende: void ausgabePrimFaktoren (std::ostream& os, unsigned long long wert)
// * Diese Funktion loescht fuehrende Zahlen (zu gross fuer ULL), indem diese
// *   im Uebergabestring geloescht werden und der Rest uebergeben wird.
// * Fuer vorzeichenlose Ganzzahl-Typen ist die Funktion schon allgemein.
std::string loescheFuehrendeZahlen (std::ostream& os, std::string stringRest)
{
  unsigned int stringRestLength = stringRest.length();  // Laenge stringRest
  if (stringRestLength == 0)
  { // die Funktion kann mit Leerstring starten und damit enden - kein Fehler!
    meldeInfo (os, 1, "Leerstring bei loescheFuehrendeZahlen sollte nicht vorkommen");
    return "";
  }
  if (!(std::isdigit(stringRest[0])))
  {
    meldeInfo (os, 1, "Aufruf von loescheFuehrendeZahlen mit 1. Zeichen keine Zahl");
    return stringRest;                 // Parameter startet mit Zahl - nix tun
  } else
  {                                    // 1. Zeichen [0] wird geloescht - mehr?
    for (unsigned int i = 1; i < stringRestLength; ++i)
    {                                  // wieviele Zeichen werden geloescht: i
      if (!(std::isdigit(stringRest[i])))  // keine Zahl, dann hier Abbruch
      {
        return (stringRest.erase(0, i)); // ab 0 {= Anfang}: i Zeichen loeschen
      }
    }
    return "";                           // alle Zeichen Zahlen - Leerstring
  }
} // Ende: string loescheFuehrendeZahlen (ostream& os, std::string stringRest)
// * Diese Funktion loescht fuehrende Nicht-Zahlen, indem diese im
// *   Uebergabestring geloescht werden und der Rest uebergeben wird.
// * Fuer vorzeichenlose Ganzzahl-Typen ist die Funktion schon allgemein,
// *   wenn man nicht strenger mit dem Anwender sein will/muss.  ;)
std::string loescheFuehrendeNichtZahlen (std::ostream& os, std::string stringRest)
{
  unsigned int stringRestLength = stringRest.length();  // Laenge stringRest
  if (stringRestLength == 0)
  { // die Funktion kann mit Leerstring starten und damit enden - kein Fehler!
    return "";
  }
  if (std::isdigit(stringRest[0]))
  {
    return stringRest;                 // Parameter startet mit Zahl - nix tun
  } else
  {                                    // 1. Zeichen [0] wird geloescht - mehr?
    if ((stringRest[0] == '-') && (std::isdigit(stringRest[1])))
      meldeInfo (os, 1, "Negative Zahlen sind nicht erlaubt: '-' wird verworfen");
    for (unsigned int i = 1; i < stringRestLength; ++i)
    {                                  // wieviele Zeichen werden geloescht: i
      if (std::isdigit(stringRest[i]))
      {
        return (stringRest.erase(0, i)); // ab 0 {= Anfang}: i Zeichen loeschen
      } else if ((stringRest[i] == '-') && (std::isdigit(stringRest[(i+1)])))
      {                                  // nur bei - Meldung - Rest stumm weg
        meldeInfo (os, 1, "Negative Zahlen sind nicht erlaubt: '-' wird verworfen");
      }                                  // alles andere wird uebergangen
    }
    return "";                           // alle Zeichen keine Zahlen - Leerstr.
  }
} // Ende: string loescheFuehrendeNichtZahlen (ostream& os, string stringRest)
// * Diese Funktion wandelt einen String in die zugehoerige ULL
// *   (groesster positiver C++-Standard-Ganzzahltyp) und faengt
// *   alle Probleme ab - da negative Werte ohne jede Kennzeichnung
// *   unsinnig konvertiert werden, wird zur Eliminierung von '-'
// *   die obige Funktion loescheFuehrendeNichtZahlen vorgeschaltet.
// * Sollte diese Funktion in anderem Zusammenhang verwendet werden,
// *   darf nicht mehr 0 angemahnt und ansonsten zum Weitermachen verwendet
// *   werden, sondern sollte ueber einen Fehlerstatus weitergegeben werden,
// *   der ggf. eine globale Variable ist als ullConvErr oder ULL global und
// *   den Boolean als Rueckgabe, da eine Funktion nur einen Rueckgabewert
// *   hat (wenn man kein Konstrukt uebergeben will) - zudem sollte als
// *   Parameter einfach "(std::string teilString)" mitgegeben werden - hier
// *   werden globale Variablen wegen komplexer KBD-Schleife verwendet ... -
// *   und der Reststring wird in dieser Funktion mit sz beschnittet ... -
// *   ansonsten ist die Funktion bereits allgemein.
unsigned long long verwandleStringInULL (std::ostream& os)
{
  unsigned long long wert = 0;         // Definition mit Startwert: Rueckgabe
  try                                  // Solange kein Fehlert auftritt ...
  {
    wert = std::stoull (inputStr,&sz,0);  // ... sollte dies die Zahl sein.
    if (wert == 0)                     // 0 wird sonst verwendet als 'continue'
    {
      meldeInfo (os, 1, "Es wurde '0' eingegeben"); // 0 bei Faktorzerlegung unsinnig
    }
  } catch (std::invalid_argument &exc) // --- Erster Handler ...
  {
    meldeInfo (os, 1, "Ungueltiger Aufrufparameter: nicht in ULL konvertierbar");
    inputStr = loescheFuehrendeZahlen(os, inputStr);
    return 0;                          // hier abbrechen, aussen weitermachen
  } catch (std::out_of_range &exc)     // --- zweiter Handler ...
  { // bei ULL bedeutet ^- dies zu gross - negativ wird nicht erkannt!
    meldeInfo (os, 1, "Ungueltiger Aufrufparameter: ausserhalb der ULL-Grenzen (zu gross)");
    inputStr = loescheFuehrendeZahlen(os, inputStr);
    return 0;                          // hier abbrechen, aussen weitermachen
  } catch( ... )                       // ... dritter Handler fuer den Rest.
  {
    meldeInfo (os, 1, "Seltsames Problem bei der Umwandlung in ULL-Grenzen aufgetreten");
    inputStr = loescheFuehrendeZahlen(os, inputStr);
    return 0;                          // hier abbrechen, aussen weitermachen
  }
  // Nur Loeschen der Zahl bei Ueberlauf/Umwandlung verlaesst zuvor - return 0:
  inputStr = inputStr.substr(sz);      // inputStr ist nun der Rest ...
  return wert;
} // Ende: unsigned long long verwandleStringInULL (std::ostream& os)
// * Nun zwei Funktionen, zuerst werden Kommandozeilen-Parameter gesucht (CLP),
// * dann wird eine Eingabe ueber die Tastatur erbeten und gelesen (KBD).
// * Wegen der zentralen Schleifen stehen sie direkt vor main ...
// Diese Funktion ermittelt die Parameter und wertet diese einzeln als String
// aus, die in jeweils eine oder mehrere Zahlen ueberfuehrt werden,
// die in einer Schleife abgearbeitet werden:
// sie sollen in Primfaktoren zerlegt und so ausgegeben werden.
unsigned long long eingabeCLPZahlZumFaktorisieren (std::ostream& os, int argc,
  const char* argv[], bool frstParamUsed)
{
  unsigned long long wert = 0;         // < 2 ist Fehlercode, > 1 ist ges. Wert
    for (int i = 1; i < argc; ++i)
    {
      if ((i == 1) && (frstParamUsed))    // 1. Parameter "-f" wegwerfen!
      {
        meldeInfo (os, 0, "1. Parameter enthielt Steuerflag - ist kein Input.");
        continue;
      }
      inputStr = argv[i];  // fuer meine Funktionen editierbar als std::string
      // * String muss mit Zahl beginnen, kein '-' oder gar Buchstabe:
      inputStr = loescheFuehrendeNichtZahlen (os, inputStr);
      while (!inputStr.empty())
      {
        wert = verwandleStringInULL (os);  // inputStr wird verwendet
// * Bedeutet: std::stoull (dummyString,&sz,0) & inputStr.substr(0,sz) kopiert.
        if (wert > 1)                    // OK, wert kann zerlegt werden
        {
          /* PFs ermitteln und in vector wertepfs speichern */
          suchePrimFaktoren (wert);
          /* PFs aus wertepfs lesen, mit "," getrennt ausgeben & "." am Ende */
          ausgabePrimFaktoren (os, wert);
        } else if (wert == 1)          // wegen Benchmark auch hier Abbruch
        {
          meldeInfo (os, 0, "Abbruch des Programms wurde gewuenscht! - Benchmark?");
          return 0;                    // Programmabbruch mit OK-Code gewuenscht
        } // = 0 wird nicht behandelt, da verwandleStringInULL Fehler meldet
        // * String muss mit Zahl beginnen, kein '-' oder gar Buchstabe:
        inputStr = loescheFuehrendeNichtZahlen (os, inputStr);
      }
    }
  if (wert == 0)                       // wenn nicht ueber return: continue
    wert = 5;                          // uninteressanter wird - unbeachtet
  return wert;                         // Weitergabe der Zahl ...
} // Ende: unsigned long long eingabeCLPZahlZumFaktorisieren (std::ostream& os,
//   \       int argc, const char* argv[], bool frstParamUsed)
// Diese Funktion liest bei Bedarf einen Sting, der in eine oder mehrere
// Zahlen ueberfuehrt wird, die in einer Schleife abgearbeitet werden:
// sie sollen in Primfaktoren zerlegt und so ausgegeben werden.
unsigned long long eingabeKBDZahlZumFaktorisieren (std::ostream& os)
{
  unsigned long long wert = 0;         // < 1 ist falsch - d.h. wiederholen,
                                       // 1 ist Fehlercode zum Programmabbruch,
                                       // > 1 ist gesuchter Wert!
  while (wert < 1)                     // Bis wert mindestens 1 ist einlesen
  {
    inputStr = "";
    // * Eingabe-Aufforderung:
    meldeInfo (os, 0, "Spezial:  'H': Hilfe \U0001F198-'B'-'V': Versionsinfo \U0001F6C8 , '1'/'Q': Abbruch \u274C.");
    meldeInfo (os, 0, "Gib ansonsten eine ganze Zahl \u2115 in [2;18446744073709551615]\u2705 ein:");
    if (farbLos)
    {
      os << " * ";
    } else
    {
      os << LYELLOW_BROWN << " * " << RESET;
    }
    os << "      \U0001F644          \U0001F635";
    os << "          \U0001F634         \U0001F612 ";
    // * Lese von Tastatur in String:
    std::getline(std::cin, inputStr);
    if (inputStr.length() == 1)
    {
      switch (inputStr[0])
      {
        case 'H': case 'h':
        { // * Hilfsinfo und Abbruch der Funktion mit '5' {= continue}
          ausgabeInfotext (os, 1);
          return 5;
        }
        case 'V': case 'v':
        { // * Versionsinfo und Abbruch der Funktion mit '5' {= continue}
          ausgabeInfotext (os, 0);
          return 5;
        }
        case 'B': case 'b':
        { // * Versionsinfo und Abbruch der Funktion mit '5' {= continue}
          ausgabeInfotext (os, 0);
          ausgabeInfotext (os, 1);
          return 5;
        }
        case '1': case 'Q': case 'q':
        { // * Programm-Abbruch: '1' - break kann (wie zuvor: '5') entfallen.
          return 0;
        } // ein Zweig: 'default : ...' als Joker ist nicht noetig.
      }
    }
    // * String muss mit Zahl beginnen, kein '-' oder gar Buchstabe:
    inputStr = loescheFuehrendeNichtZahlen (os, inputStr);
    while (!inputStr.empty())
    {
      wert = verwandleStringInULL (os);  // inputStr wird verwendet
// * Bedeutet: std::stoull (dummyString,&sz,0) & inputStr.substr(0,sz) kopiert.
      if (wert > 1)                    // OK, wert kann zerlegt werden
      {
        /* PFs ermitteln und in vector wertepfs speichern */
        suchePrimFaktoren (wert);
        /* PFs aus wertepfs lesen, mit "," getrennt ausgeben und "." am Ende */
        ausgabePrimFaktoren (os, wert);
      } else if (wert == 1)
      {
        meldeInfo (os, 0, "Abbruch des Programms wurde gewuenscht!");
        break;
      } // = 0 wird nicht behandelt, da verwandleStringInULL Fehler meldet
      // * String muss mit Zahl beginnen, kein '-' oder gar Buchstabe:
      inputStr = loescheFuehrendeNichtZahlen (os, inputStr);
    }
  }
  if (wert == 1)
  {
    wert = 0;
  }
  return wert;                         // Weitergabe der Zahl zur Faktorisierung
} // Ende: unsigned long long eingabeKBDZahlZumFaktorisieren (std::ostream& os)
// * Die folgende Funktion enthaelt den Grossteil des ehemaligen Kerns
// * von main, der wegen Uebergabe von ostream nun besser als Funktion
// * aufgerufen werden kann.
// * Es wird die Hauptfunktion als CLP = Parameter-Abfrage und als Schleife
// * KBD als interaktive Tastaturabfrage behandelt und Return-Codes ermittelt.
int abfrageSchleifePFBestimmungAusgabe (std::ostream& os, const int argc,
  const char* argv[], bool frstParamUsed)
{
  /* Zahl aus Kommandozeilen-Parameter ermitteln,
     die im Anschluss in PFs aufgespalten werden soll */
  unsigned long long wert = eingabeCLPZahlZumFaktorisieren (os, argc, argv, frstParamUsed);
  // * Variablen-Deklaration von wert als Rueckgabewert der beiden
  // * Eingabefunktionen; in abfrageSchleifePFBestimmungAusgabe bedeutet:
  // *   '> 1': continue (Programm laeuft weiter - Tastatureingabe-Schleife),
  // *  '== 1': Abbruch mit Fehlercode 1 und
  // *  '== 0': Abbruch gewuenscht, d.h. mit Code 0 fuer alles OK!
  // CLP-Einlesen nun beendet ... noch die letzten Auswertungen von wert
  if (outputFilename == myOutputFilename)
  { // * Datei-Ausgabe hat keinen KBD-Teil
    if (wert > 1)                      // Keine Abbruchbedingung bislang,
      wert = 0;                        //   also regulaeres Ende
    meldeInfo (os, 0, "Hier noch zum Abschluss der Versions- und Hilfs-Text des Programms:");
    ausgabeInfotext (os, 0);           // Versions-Text ausgeben
    ausgabeInfotext (os, 1);           // Hilfs-Text ausgeben
    return wert;                       // Verabschiedung erfolgt im main-Zweig
  }
  if (wert == 0)                       // {(wert < 2): return (wert) ginge auch}
  { // * Abbruch nach CLP gewuenscht (kein KBD) - Benchmark
    return 0;                          // dann Abbruch mit Fehlercode 0
  } else if (wert == 1)
  {                                    // Wesentliches Problem
    return 1;                          // dann Abbruch mit Fehlercode 1
  }                                    // ausser 0 und 1 bedeutet alles continue
  do                                   // Schleife bzgl. Tastatureingabe ...
  {
    /* Zahl aus Tastatureingabe (KBD; von cin) ermitteln,
       die im Anschluss in PFs aufgespalten werden soll */
    wert = eingabeKBDZahlZumFaktorisieren (os);
    if (wert == 1)                   // Wesentliches Problem
      return 1;                      // dann Abbruch mit Fehlercode 1
    if (wert == 0)                   // Abbruch durch Eingabe 1 gewaehlt
      return 0;                      // -> Abbruch ohne Fehlercode (0 = OK)
// * Zur Erinnerung, main verabschiedet (ausser Dateiausgabe) und reicht
// *   am Ende den Return-Code an das Betriebssystem/xterm/Shell weiter ...
  } while (wert > 1);                // gleichbedeutend mit !(wert == 1),
                                     // und dies sollte oben abbrechen ...
  // *** HIER SOLLTE NICHTS LANDEN - EINFACH DURCHSCHAUEN ...
  meldeInfo (os, 1, "Hier sollte - am Ende von abfrageSchleifePFBestimmungAusgabe - nichts landen");
  return 1;                            // Uebergabewert (= Fehlercode) an main
} // Ende: int abfrageSchleifePFBestimmungAusgabe (ostream& os, const int argc,
//   \       const char* argv[], bool frstParamUsed)
// * Hauptfunktion - nimmt Parameter entgegen und ermittelt ggf. einen
// * Steuer-Parameter, aendert ggf. die globale Variable farbLos und setzt
// * ggf. die an CLP durchgereichte Variable frstParamUsed (beides passiert
// * nur hier), gibt dann viele Parameter wie genauer outputstream und
// * Parameter an die Steuerfunktion abfrageSchleifePFBestimmungAusgabe
// * weiter, die die eigentliche Programmfunktionalitaet ausloest und
// * die Return-Codes liefert.
// * Im wesentlichen kuemmert sich main um die Aenderung von ostream fuer
// * unterschiedliche Ausgaben: neben cout (7. Moeglichkeit, und mit
// * Farbaenderungen auch 2.+3. Moeglichkeit) und Datei (1. Moeglichkeit)
// * waere auch in einen String denkbar, was hier eher stoeren wuerde,
// * zu Testzwecken aber praktisch ist ...:
// *     ``std::ostringstream oss{};'', so dass dieser abgfragt werden kann:
// *     ``if (oss.str() == "...") { ... }''.
int main (int argc, const char* argv[])
{                                      // Hauptfunktion mit Aufruf-Parametern
  try                                  // Absichern gegenueber Exceptions ...
  {
    std::string prgname = argv[0];     // Aufrufname des Programms
    std::string frstParamStr = "";
    bool frstParamUsed = 0;            // neue bool an CLP: 1. Param. continue
    int retStat = 0;                   // Fehlercode an OS/xterm/shell
    // nach Parameter fragen bzgl. output - bool fileOut setzen!
    if (argc > 1)                      // mindestens ein Parameter gegeben ...
      frstParamStr = argv[1];          // String hat 1. Parameter oder ist leer
    if ((frstParamStr == "-f") || (frstParamStr == "--file"))
    { // * 1. Moeglichkeit: Ausgabe in Datei
      frstParamUsed = 1;               // 1. Parameter wurde verwendet
      /* Begruessung */                // Erst auf den Bildschirm ..
      begruessung (std::cout, 1, prgname); // .. Begruessung
      myOutputFilename = std::string("PrimZahlZerlegung_")+
                         getDatStr(std::cout)+std::string("_JMB.txt");
      outputFilename = myOutputFilename;
      meldeInfo (std::cout, 0, "Die wirkliche Ausgabe erfolgt nun ueber die Datei:");
      meldeInfo (std::cout, 0, std::string(" * '")+outputFilename+std::string("'!"));
      farbLos = true;                  // keine ANSI-Farben
      std::ofstream datei {outputFilename};
      // Datei outputFilename -^ wird neu erzeugt oder bei Existenz
      // ueberschrieben (daher ggf. sinnvoller mit Zeitstempel im Namen);
      // dass Oeffnen und Schliessen ueberlaesst man sicherheitshalber
      // den Mechanismen von ofstream (Konstruktor und Destruktor) - AWG!
      /* Begruessung */                // .. nun auch in die Datei
      begruessung (datei, 1, prgname);
      meldeInfo (datei, 0, std::string("Diese Ausgabe-Datei heisst: '")+outputFilename+std::string("'!"));
      /* Hauptteil */
      retStat = abfrageSchleifePFBestimmungAusgabe (datei, argc, argv, frstParamUsed);
      if (anzFaktorZerlegungen == 1)
      { // Info, wenn Primfaktoren ueberhaupt berechnet werden sollten
        meldeInfo (datei, 1, "Es konnte keine sinnvolle Eingabe gefunden werden");
      }
      /* Verabschiedung */             // erst in die Datei ..
      begruessung (datei, 0, prgname); // Verabschiedung
      farbLos = false;                 // nun wieder mit ANSI-Farben
      if (anzFaktorZerlegungen == 1)
      { // Info, wenn Primfaktoren ueberhaupt berechnet werden sollten
        meldeInfo (std::cout, 1, "Es konnte keine sinnvolle Eingabe gefunden werden");
      }
      /* Verabschiedung */             // nun auch auf den Bildschirm ..
      begruessung (std::cout, 0, prgname); // Verabschiedung
    } else if ((frstParamStr == "-m") || (frstParamStr == "--mono"))
    { // * 2. Moeglichkeit: monochromatische Darstellung - Default von xterm
      frstParamUsed = 1;               // 1. Parameter wurde verwendet
      farbLos = true;                  // keine ANSI-Farben
      /* Begruessung */                // Auf den Bildschirm ..
      begruessung (std::cout, 1, prgname); // Begruessung monochrom
      meldeInfo (std::cout, 0, "Die wirkliche Ausgabe erfolgt nun monochromatisch:");
      /* Hauptteil */
      retStat = abfrageSchleifePFBestimmungAusgabe (std::cout, argc, argv, frstParamUsed);
      if (anzFaktorZerlegungen == 1)
      { // Info, wenn Primfaktoren ueberhaupt berechnet werden sollten
        meldeInfo (std::cout, 1, "Es konnte keine sinnvolle Eingabe gefunden werden");
      }
      /* Verabschiedung */             // Auf den Bildschirm ..
      begruessung (std::cout, 0, prgname); // Abschied monochrom
    } else if ((frstParamStr == "-i") || (frstParamStr == "--inverse"))
    { // * 3. Moeglichkeit: inverse Darstellung (gelb auf schwarz - Tur.Pascal3)
      frstParamUsed = 1;               // 1. Parameter wurde verwendet
      farbLos = true;                  // keine ANSI-Farben
      std::cout  << LYELLOW_BLACK << "\n";
      /* Begruessung */                // Auf den Bildschirm ..
      begruessung (std::cout, 1, prgname); // Begruessung invers
      meldeInfo (std::cout, 0, "Die wirkliche Ausgabe erfolgt nun invers:");
      /* Hauptteil */
      retStat = abfrageSchleifePFBestimmungAusgabe (std::cout, argc, argv, frstParamUsed);
      if (anzFaktorZerlegungen == 1)
      { // Info, wenn Primfaktoren ueberhaupt berechnet werden sollten
        meldeInfo (std::cout, 1, "Es konnte keine sinnvolle Eingabe gefunden werden");
      }
      /* Verabschiedung */             // Auf den Bildschirm ..
      begruessung (std::cout, 0, prgname); // Abschied invers
      std::cout  << RESET << std::endl;
    } else if ((frstParamStr == "-h") || (frstParamStr == "--help"))
    { // * 4. Moeglichkeit: Hilfstext
      frstParamUsed = 1;               // 1. Parameter wurde verwendet
      std::cout << CLRSCR;             // Bildschirm loeschen
      /* Begruessung */                // Auf den Bildschirm ..
      begruessung (std::cout, 1, prgname); // Begruessung zur Hilfe
      /* Hilfstext-Ausgabe */
      ausgabeInfotext (std::cout, 1);  // Hilfs-Text ausgeben
      meldeInfo (std::cout, 0, "Ende Hilfs-Text.");
      /* Verabschiedung */             // Auf den Bildschirm ..
      begruessung (std::cout, 0, prgname); // Abschied von Hilfe
    } else if ((frstParamStr == "-v") || (frstParamStr == "--version"))
    { // * 5. Moeglichkeit: Versionsinfo
      frstParamUsed = 1;               // 1. Parameter wurde verwendet
      std::cout << CLRSCR;             // Bildschirm loeschen
      /* Begruessung */                // Auf den Bildschirm ..
      begruessung (std::cout, 1, prgname); // Begruessung zum Versionstext
      /* Versions-Ausgabe */
      ausgabeInfotext (std::cout, 0);  // Versions-Text ausgeben
      meldeInfo (std::cout, 0, "Ende Versions-Text.");
      /* Verabschiedung */             // Auf den Bildschirm ..
      begruessung (std::cout, 0, prgname); // Abschied vom Versionstext
    } else if ((frstParamStr == "-b") || (frstParamStr == "-vh") || (frstParamStr == "-hv"))
    { // * 6. Moeglichkeit: Versions- und Hilfs-Text
      frstParamUsed = 1;               // 1. Parameter wurde verwendet
      std::cout << CLRSCR;             // Bildschirm loeschen
      /* Begruessung */                // Auf den Bildschirm ..
      begruessung (std::cout, 1, prgname); // Begruessung zur vollen Info
      /* Versions-Ausgabe */
      ausgabeInfotext (std::cout, 0);  // Versions-Text ausgeben
      /* Hilfstext-Ausgabe */
      ausgabeInfotext (std::cout, 1);  // Hilfs-Text ausgeben
      meldeInfo (std::cout, 0, "Ende Versions- und Hilfs-Text.");
      /* Verabschiedung */             // Auf den Bildschirm ..
      begruessung (std::cout, 0, prgname); // Abschied von vollen Info
    } else
    { // * 7. Moeglichkeit: Bildschirm - Standard {= Default}, ohne Spezial-Par.
      farbLos = false;                 // Abschluss auf cout mit ANSI-Farben
      /* Begruessung */                // Auf den Bildschirm ..
      begruessung (std::cout, 1, prgname); // Begruessung zum Standardprogramm
      meldeInfo (std::cout, 0, "Die gesamte Ausgabe erfolgt auf dem Bildschirm ...");
      /* Hauptteil */
      retStat = abfrageSchleifePFBestimmungAusgabe (std::cout, argc, argv, frstParamUsed);
      if (anzFaktorZerlegungen == 1)
      { // Info, wenn Primfaktoren ueberhaupt berechnet werden sollten
        meldeInfo (std::cout, 1, "Es konnte keine sinnvolle Eingabe gefunden werden");
      }
      /* Verabschiedung */             // Auf den Bildschirm ..
      begruessung (std::cout, 0, prgname); // Abschied vom Standardprogramm
    }
    return retStat;                    // Programm-Ende mit Fehlercode-Rueckgabe
  } catch (...)                        // Ende des try-Blocks zur Ausnahme-Beh.
  {                                    // Behandlung der Ausnahmebedingung ...
    meldeInfo (std::cout, 1, "Das Programm fand eine seltsame Ausnahmebedingung in main");
    if (anzFaktorZerlegungen == 1)
      meldeInfo (std::cout, 1, "Es konnte keine sinnvolle Eingabe gefunden werden");
    return 1;
  }
  meldeInfo (std::cout, 1, "Das Programm sollte nicht an diese Stelle gelangen");
} // Ende: int main (int argc, const char* argv[])
/******************************************************************************
 * Das war's - ein erstes Hobby - C++ - Programm - nicht zu trivial ...  :))  *
 ******************************************************************************
 */
![[Wikipedia-de-Icon]](images/Wikipedia_logo_de.gif) Kommentarbeispiele
      aus Wikipedia).
Kommentarbeispiele
      aus Wikipedia).![[Wikipedia-de-Icon]](images/Wikipedia_logo_de.gif) Fehler{code},
      den man in der Shell [unter Linux meist
      die
Fehler{code},
      den man in der Shell [unter Linux meist
      die ![[Wikipedia-de-Icon]](images/Wikipedia_logo_de.gif) Bash (26.09.2022: Bash 5.2),
      zu überprüfen
      über echo $SHELL
      mit typischer Ausgabe:
      /bin/bash] aufrufen kann:
      ./example; echo
      "Fehlercode: "$?).
Bash (26.09.2022: Bash 5.2),
      zu überprüfen
      über echo $SHELL
      mit typischer Ausgabe:
      /bin/bash] aufrufen kann:
      ./example; echo
      "Fehlercode: "$?).![[Wikipedia-de-Icon]](images/Wikipedia_logo_de.gif) Präprozessor ausgeführt,
      noch bevor der Compiler seine Arbeit aufnimmt.
      #include weist diesen an,
      die anzugebende Standard-Bibliothek
      (im obigen Beispiel Zeilen 14‑25;
      hier mit im Kommentar
      angegebenem Verwendungszweck; diese Dateien sollten sich
      im Suchpfad des Compilers befinden) oder auch
      eine weitere Quelltextdatei im aktuellen Verzeichnis
      (#include "meinModul.hpp";
      also doppelte Anführungszeichen
      statt spitze Klammern)
      einzubinden.
      In C++20 werden Möglichkeiten eingeführt,
      auch hier den Präprozessor obslet zu machen.
Präprozessor ausgeführt,
      noch bevor der Compiler seine Arbeit aufnimmt.
      #include weist diesen an,
      die anzugebende Standard-Bibliothek
      (im obigen Beispiel Zeilen 14‑25;
      hier mit im Kommentar
      angegebenem Verwendungszweck; diese Dateien sollten sich
      im Suchpfad des Compilers befinden) oder auch
      eine weitere Quelltextdatei im aktuellen Verzeichnis
      (#include "meinModul.hpp";
      also doppelte Anführungszeichen
      statt spitze Klammern)
      einzubinden.
      In C++20 werden Möglichkeiten eingeführt,
      auch hier den Präprozessor obslet zu machen.
      ![[Wikipedia-de-Icon]](images/Wikipedia_logo_de.gif) Primfaktoren
      (PFs) natürlich naheliegend. 😉 
      Was passiert aber mathematisch
      in der Funktion primeFactors:
Primfaktoren
      (PFs) natürlich naheliegend. 😉 
      Was passiert aber mathematisch
      in der Funktion primeFactors:![[Wikipedia-de-Icon]](images/Wikipedia_logo_de.gif) Primfaktorzerlegung bereits geschafft.
Primfaktorzerlegung bereits geschafft.| System: [🔧PC‑Tech‑Info] | Intel Core 2 Duo T6400@ 2,0 GHz ❹ Penryn bogomips: 3989,82 | Pentium Dual-Core T4300@ 2,1 GHz Penryn bogomips: 4189,40 | Intel Core i7-2600K@ 3,4 GHz ❸ Sandy Bridge bogomips: 6799,86 | Intel Core i7-4770T@ 2,5 GHz ❷ Haswell bogomips: 4988,40 | Intel Core i7-6700@ 3,4 GHz Skylake bogomips: 6816,00 | AMD Ryzen 5 3600@ 3,6-4,2 GHz ❶ Zen2 & RDNA 1.0 bogomips: 7186,43 | 
|---|---|---|---|---|---|---|
| real: | 35,339 s | 33,724 s | 25,132 s | 23,829 s | 17,259 s | 16,046 s | 
| user: | 35,288 s | 33,620 s | 25,107 s | 23,825 s | 17,255 s | 16,024 s | 
| sys: | 0,004 s | 0,008 s | 0,009 s | 0,005 s | 0,004 s | 0,000 s | 
![[Wikipedia-de-Icon]](images/Wikipedia_logo_de.gif) Copyright und sollte dies
      auch anmerken. Dies gibt das Recht,
      den Code zu verkaufen, aber natürlich ebenso,
      diesen im Form von
Copyright und sollte dies
      auch anmerken. Dies gibt das Recht,
      den Code zu verkaufen, aber natürlich ebenso,
      diesen im Form von ![[Wikipedia-de-Icon]](images/Wikipedia_logo_de.gif) Freier Software der Allgemeinheit
      zu überlassen
      (
Freier Software der Allgemeinheit
      zu überlassen
      (![[Wikipedia-de-Icon]](images/Wikipedia_logo_de.gif) Copyleft), so dass niemand
      diesen Code missbrauchen kann,
      sondern nur abändern und ebenfalls
      im Quellcode der Allgemeinheit zur Verfügung
      stellen muss.
      Dies macht die GNU General Public License: GPL,
      deren jüngste und mächtigste Variante
      zur Befreiung der Anwender die GPLv3 ist. 
      Der von mir nur gelinkte Text
      wird normalerweise dem Software-Quelltext
      als Datei beigelegt.
      Hier bedeutet mein Copyright nur,
      dass ich es geschrieben habe und die
Copyleft), so dass niemand
      diesen Code missbrauchen kann,
      sondern nur abändern und ebenfalls
      im Quellcode der Allgemeinheit zur Verfügung
      stellen muss.
      Dies macht die GNU General Public License: GPL,
      deren jüngste und mächtigste Variante
      zur Befreiung der Anwender die GPLv3 ist. 
      Der von mir nur gelinkte Text
      wird normalerweise dem Software-Quelltext
      als Datei beigelegt.
      Hier bedeutet mein Copyright nur,
      dass ich es geschrieben habe und die ![[Wikipedia-de-Icon]](images/Wikipedia_logo_de.gif) Nutzung freigebe –
      die Basis-Struktur kam aus einem Beispiel meiner 1. Literaturangabe
      (S. 63, Listing 4.2), 
      der Algorithmus ist wohl bekannt und im Netz
      vielfach leicht zu finden, ebenso die
Nutzung freigebe –
      die Basis-Struktur kam aus einem Beispiel meiner 1. Literaturangabe
      (S. 63, Listing 4.2), 
      der Algorithmus ist wohl bekannt und im Netz
      vielfach leicht zu finden, ebenso die ![[Wikipedia-de-Icon]](images/Wikipedia_logo_de.gif) ANSI-Farbsequenzen, die ich schon
      Ende der 1980-er in Tubo Pascal verwendete.
      In Phase 2 kamen dann weitere Ideen aus der 1. Literaturangabe (Listing 10.6
      [Exception: try/catch-Blöcke;
      oben Zeilen 637-763-769], S. 233;
      Listing 12.6 [variable Ausgabe
      via ostream], S. 261) hinzu,
      ebenso eine Literaturrecherche bzgl. ULL, Standardstring-Umgang
      und weiteren Themen, wobei auch viel Code
      verworfen bzw. umgeändert werden musste. 
      Somit ist vorrangig die spezielle Gesamtgestaltung
      mein Werk.
      Nichts hier ist also ein Copyright
      (Urheberschaft macht bei sehr Einfachem
      wenig Sinn; wenn das mal die Patentämter
      [bzw. die verantwortliche Legislative]
      begreifen würden) oder
      eine Lizenz wert ... es soll nur
      als Beispiel dienen,
      wie man mit eigener Software umgehen sollte.
ANSI-Farbsequenzen, die ich schon
      Ende der 1980-er in Tubo Pascal verwendete.
      In Phase 2 kamen dann weitere Ideen aus der 1. Literaturangabe (Listing 10.6
      [Exception: try/catch-Blöcke;
      oben Zeilen 637-763-769], S. 233;
      Listing 12.6 [variable Ausgabe
      via ostream], S. 261) hinzu,
      ebenso eine Literaturrecherche bzgl. ULL, Standardstring-Umgang
      und weiteren Themen, wobei auch viel Code
      verworfen bzw. umgeändert werden musste. 
      Somit ist vorrangig die spezielle Gesamtgestaltung
      mein Werk.
      Nichts hier ist also ein Copyright
      (Urheberschaft macht bei sehr Einfachem
      wenig Sinn; wenn das mal die Patentämter
      [bzw. die verantwortliche Legislative]
      begreifen würden) oder
      eine Lizenz wert ... es soll nur
      als Beispiel dienen,
      wie man mit eigener Software umgehen sollte.![[Wikipedia-de-Icon]](images/Wikipedia_logo_de.gif) ANSI-Escape-Sequenzen eine
ANSI-Escape-Sequenzen eine ![[Wikipedia-de-Icon]](images/Wikipedia_logo_de.gif) neue Farbe festlegen (Kommentar und Festlegung
      in Zeilen 27‑53,
      Anwendung z.B. in Zeilen 69+154+711+715),
      so gibt es auch in String-Angaben bzw. allgemein
      in
neue Farbe festlegen (Kommentar und Festlegung
      in Zeilen 27‑53,
      Anwendung z.B. in Zeilen 69+154+711+715),
      so gibt es auch in String-Angaben bzw. allgemein
      in ![[Wikipedia-de-Icon]](images/Wikipedia_logo_de.gif) C/C++ Escape-Sequenzen,
      z.B. um einen Zeilenumbruch: \n (new line;
      vgl. Zeile 120+255+292+699),
      ein Unicode-Zeichen über \Uhhhhhhhh
      zu bewirken (vgl. z.B. Zeile 77 dreimal+82+137+502+511)
      auch das doppelte Anführungszeichen: "
      zu maskieren, das ja als Beginn- bzw. Endemarke
      eines Strings dient und somit im String
      als \"
      dargestellt werden muss.
      Die Escape-Sequenzen beginnen immer
      mit einem Rückwärtsschrägstrich /
      Backslash: \\.
      Im Übrigen werden Escape-Sequenzen
      auch in Druckersprachen
      wie ESC/P (Epson) oder
      PCL (HP) verwendet,
      wenn keine Seitenbeschreibungssprachen wie PostScript
      verwendet wird.
C/C++ Escape-Sequenzen,
      z.B. um einen Zeilenumbruch: \n (new line;
      vgl. Zeile 120+255+292+699),
      ein Unicode-Zeichen über \Uhhhhhhhh
      zu bewirken (vgl. z.B. Zeile 77 dreimal+82+137+502+511)
      auch das doppelte Anführungszeichen: "
      zu maskieren, das ja als Beginn- bzw. Endemarke
      eines Strings dient und somit im String
      als \"
      dargestellt werden muss.
      Die Escape-Sequenzen beginnen immer
      mit einem Rückwärtsschrägstrich /
      Backslash: \\.
      Im Übrigen werden Escape-Sequenzen
      auch in Druckersprachen
      wie ESC/P (Epson) oder
      PCL (HP) verwendet,
      wenn keine Seitenbeschreibungssprachen wie PostScript
      verwendet wird.
      
$ ls -al example_debug example
-rwxrwxr-x 1 jmb jmb 60464 Sep  7 15:14 example_debug
-rwxrwxr-x 1 jmb jmb 56616 Sep  7 15:14 example
# d.h. 60464 = 59,05 kB / 56616 = 55.29 kB Größe
$ file example
example: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=f59476f8f7efd2f9dc548143f262f53b1191c37e, for GNU/Linux 3.2.0, not stripped
$ strings example
# Ausgabe aller Zeichenketten (Strings) des Executables (viel: 649 Zeilen)
$ readelf -x .rodata example
# Anzeigen der statischen Strings
$ nm example
# Auflisten der Symbole
$ readelf -s example
# Anzeigen der Symbole
$ readelf -h example
# Ausgabe des ELF (Binärformat unter Linux) - Headers
$ readelf --relocs example
# Klären, ob das Binary ein positionsunabhängiges Executable ist bzgl. der Bibliotheken.
$ ldd example
# Liste dynamisch gelinkter Bibliotheken (hier sechs: linux-vdso.so.1, libstdc++.so.6, libm.so.6, libgcc_s.so.1, libc.so.6, /lib64/ld-linux-x86-64.so.2)
$ ldconfig -p | grep NAME_BIBLIOTHEK
# Nachschauen, ob eine bestimmte Bibliothek auf dem System installiert ist, z.B. bei `ldconfig -p | grep libm.so.6' u.a. `... => /lib/x86_64-linux-gnu/libc.so.6'.
$ /lib/x86_64-linux-gnu/libc.so.6
# liefert am Anfang: 'GNU C Library (Ubuntu GLIBC 2.29-0ubuntu2) stable release version 2.29.' auf Xubuntu 19.04.
$ objdump -d example
# Disassemblieren des Binary bzw. des Object Files (*.o)
$ strace ./example
# Lässt das Programm ablaufen und berichtet, was es dabei tut.
![[Wikipedia-de-Icon]](images/Wikipedia_logo_de.gif) GNU Binary Utilities
(kurz binutils, ebenso Name des Pakets,
in dem neben Assembler as und Linker ld
und
GNU Binary Utilities
(kurz binutils, ebenso Name des Pakets,
in dem neben Assembler as und Linker ld
und ![[Wikipedia-de-Icon]](images/Wikipedia_logo_de.gif) gold
diese Werkzeuge für ausführbare Dateien
enthalten sind; diese werden, wie bereits ausgeführt,
typischerweise gemeinsam mit gcc,
make und
gdb verwendet;
vgl. Homepage sowie Dokumentation
zu GNU Binutils; siehe auch Phoronix‑Artikel zum Release
von 2.45 vom 27.07.2025;
 bzw. zum Phoronix‑Artikel zum Release
von 2.44 vom 02.02.2025;
 bzw. zum Phoronix‑Artikel zum Release von 2.43
vom 04.08.2024, 
bzw. zum Phoronix‑Artikel zum Release von 2.42
bzw. original Ankündigung,
beide vom 29.01.2024, Phoronix‑Artikel zum Release von 2.41
 vom 30.07.2023, Phoronix‑Artikel zum Release von 2.39
bzw. original Ankündigung,
beide vom 05.08.2022, LWN‑Bericht zum Release von 2.38
vom 09.02.2022, Phoronix‑Artikel zum Release von 2.37
vom 18.07.2021, vom Release von 2.36
 vom 24.01.2021,
 zum Start der Stabilisierungsphase
 von Binutils 2.35 vom 05.07.2020, dem Phoronix‑Artikel zu Version 2.34 vom 01.02.2020 bzw. zur Version 2.33.1 vom 12.10.2019)
zurückgegriffen wurde.
gold
diese Werkzeuge für ausführbare Dateien
enthalten sind; diese werden, wie bereits ausgeführt,
typischerweise gemeinsam mit gcc,
make und
gdb verwendet;
vgl. Homepage sowie Dokumentation
zu GNU Binutils; siehe auch Phoronix‑Artikel zum Release
von 2.45 vom 27.07.2025;
 bzw. zum Phoronix‑Artikel zum Release
von 2.44 vom 02.02.2025;
 bzw. zum Phoronix‑Artikel zum Release von 2.43
vom 04.08.2024, 
bzw. zum Phoronix‑Artikel zum Release von 2.42
bzw. original Ankündigung,
beide vom 29.01.2024, Phoronix‑Artikel zum Release von 2.41
 vom 30.07.2023, Phoronix‑Artikel zum Release von 2.39
bzw. original Ankündigung,
beide vom 05.08.2022, LWN‑Bericht zum Release von 2.38
vom 09.02.2022, Phoronix‑Artikel zum Release von 2.37
vom 18.07.2021, vom Release von 2.36
 vom 24.01.2021,
 zum Start der Stabilisierungsphase
 von Binutils 2.35 vom 05.07.2020, dem Phoronix‑Artikel zu Version 2.34 vom 01.02.2020 bzw. zur Version 2.33.1 vom 12.10.2019)
zurückgegriffen wurde.
![[Wikipedia-de-Icon]](images/Wikipedia_logo_de.gif) GNU Core Utilities bereitgestellt
(kurz coreutils, ebenso Name des Pakets,
das die gut bekannten Befehle enthält, wie z.B.:
ls, pwd, who, cat, echo,
head, sort, wc,
cut, tr, chmod, touch,
mv, rm, mkdir, rmdir,
sync, df, du, dd),
die aktuell in Version 9.5 vorliegen (siehe Official‑Announcement, 28.03.2024;
 vgl. vorige Versionen 9.4 Phoronix‑Artikel, 29.08.2023;
 9.2, Phoronix‑Artikel, 20.03.2023;
 9.1, Announcement, 15.04.2021  bzw. Phoronix‑Artikel, 16.04.2021;
zur Version 9.0 siehe Announcement, 24.09.2021).
Auch diese Befehle sind zum Teil
für Binaries relevant.
GNU Core Utilities bereitgestellt
(kurz coreutils, ebenso Name des Pakets,
das die gut bekannten Befehle enthält, wie z.B.:
ls, pwd, who, cat, echo,
head, sort, wc,
cut, tr, chmod, touch,
mv, rm, mkdir, rmdir,
sync, df, du, dd),
die aktuell in Version 9.5 vorliegen (siehe Official‑Announcement, 28.03.2024;
 vgl. vorige Versionen 9.4 Phoronix‑Artikel, 29.08.2023;
 9.2, Phoronix‑Artikel, 20.03.2023;
 9.1, Announcement, 15.04.2021  bzw. Phoronix‑Artikel, 16.04.2021;
zur Version 9.0 siehe Announcement, 24.09.2021).
Auch diese Befehle sind zum Teil
für Binaries relevant.
![[Amazon-Icon]](images/amazon_inside.gif) C++ – kurz & gut
          (aktuell zu C++17),
          2018 (3. Aufl.), 228 S.
          [Vorsicht: keine Einführung,
          dafür aktuelle Übersicht {C++20 wird
          mit den nächsten Standards erst
          wirklich benutzbar}]
 C++ – kurz & gut
          (aktuell zu C++17),
          2018 (3. Aufl.), 228 S.
          [Vorsicht: keine Einführung,
          dafür aktuelle Übersicht {C++20 wird
          mit den nächsten Standards erst
          wirklich benutzbar}]![[Amazon-Icon]](images/amazon_inside.gif) C++17 Standard Library Quick Reference:
          A Pocket Guide to Data Structures, Algorithms,
          and Functions (Englisch),
          Peter Van Weert & Marc Gregoire,
          Apress, 07/2019 (2nd Ed.),
          320 S. [kurz überflogen; Order & Download]
 C++17 Standard Library Quick Reference:
          A Pocket Guide to Data Structures, Algorithms,
          and Functions (Englisch),
          Peter Van Weert & Marc Gregoire,
          Apress, 07/2019 (2nd Ed.),
          320 S. [kurz überflogen; Order & Download]![[Amazon-Icon]](images/amazon_inside.gif) Professional C++
          (Englisch), Marc Gregoire,
          22. März 2021 (5. Ed.),
          Wrox, 1312 S. (Taschenbuch),
          Wrox, ISBN 978‑1119695400
          [beim Überfliegen; Seiten recht dünn:
                  man erkennt den Druck der Rückseite;
                  US‑Order & Download]
 Professional C++
          (Englisch), Marc Gregoire,
          22. März 2021 (5. Ed.),
          Wrox, 1312 S. (Taschenbuch),
          Wrox, ISBN 978‑1119695400
          [beim Überfliegen; Seiten recht dünn:
                  man erkennt den Druck der Rückseite;
                  US‑Order & Download]![[Amazon-Icon]](images/amazon_inside.gif) Die C++ Programmiersprache
          (Deutsche Ausgabe der Special Edition),
          Bjarne Stroustrup, Addison-Wesley Verlag,
          2000 (4. aktualisierte Auflage),
          1068 S. [in 2000 oder direkt danach
          gekaufte Originalausgabe;
          damals bis zur Hälfte gelesen]
 Die C++ Programmiersprache
          (Deutsche Ausgabe der Special Edition),
          Bjarne Stroustrup, Addison-Wesley Verlag,
          2000 (4. aktualisierte Auflage),
          1068 S. [in 2000 oder direkt danach
          gekaufte Originalausgabe;
          damals bis zur Hälfte gelesen]![[Amazon-Icon]](images/amazon_inside.gif) A Tour of C++ (C++ In Depth
          SERIES), Bjarne Stroustrup, 2018,
          239 S., Addison Wesley, 2nd Edition,
          ISBN 978-0134997834   [beim Einlesen]
 A Tour of C++ (C++ In Depth
          SERIES), Bjarne Stroustrup, 2018,
          239 S., Addison Wesley, 2nd Edition,
          ISBN 978-0134997834   [beim Einlesen]![[Amazon-Icon]](images/amazon_inside.gif) Clean Code: A Handbook of
          Agile Software Craftsmanship,
          Robert C. Martin, 2008, 464 S., Prentice Hall,
          ISBN 978-0132350884  
          [noch nicht gelesen]
 Clean Code: A Handbook of
          Agile Software Craftsmanship,
          Robert C. Martin, 2008, 464 S., Prentice Hall,
          ISBN 978-0132350884  
          [noch nicht gelesen]![[Amazon-Icon]](images/amazon_inside.gif) Git: Projektverwaltung
          für Entwickler und DevOps‑Teams.
          Inkl. Praxistipps und
          Git‑Kommandoreferenz,
          Bernd Öggl & Michael Kofler,
          27. August 2020 (1. Aufl.),
          415 S. (geb.), Rheinwerk,
          ISBN 978‑3836271868  
          [noch nicht gelesen]
 Git: Projektverwaltung
          für Entwickler und DevOps‑Teams.
          Inkl. Praxistipps und
          Git‑Kommandoreferenz,
          Bernd Öggl & Michael Kofler,
          27. August 2020 (1. Aufl.),
          415 S. (geb.), Rheinwerk,
          ISBN 978‑3836271868  
          [noch nicht gelesen]![[PDF-Icon]](images/pdf_icon.gif) Git Cheat Sheet (von GitHub Education; siehe auch Cheat Sheets: Git)
 Git Cheat Sheet (von GitHub Education; siehe auch Cheat Sheets: Git)![[Amazon-Icon]](images/amazon_inside.gif) Beginning C++ Through Game Programming,
          Michael Dawson, 06/2014, 390 S.,
          Cengage Learning, 4th Edition,
          ISBN 978-1-305-10991-9  
          [beim Einlesen; sehr einfache Basics]
 Beginning C++ Through Game Programming,
          Michael Dawson, 06/2014, 390 S.,
          Cengage Learning, 4th Edition,
          ISBN 978-1-305-10991-9  
          [beim Einlesen; sehr einfache Basics]![[Amazon-Icon]](images/amazon_inside.gif) C++ Game Programming –
          Second Edition,
          John Horton >Homepage<, 10/2019,
          746 S., Packt Publishing,
          ISBN 978-1-83864-857-2, >Download
          der Farbbilder< & >Sourcecode: grün Code,
          Download ZIP<  
          [lese quer ... SFML‑Einsatz direkt
                  von Beginn ab –
                  interessanter Einstieg]
 C++ Game Programming –
          Second Edition,
          John Horton >Homepage<, 10/2019,
          746 S., Packt Publishing,
          ISBN 978-1-83864-857-2, >Download
          der Farbbilder< & >Sourcecode: grün Code,
          Download ZIP<  
          [lese quer ... SFML‑Einsatz direkt
                  von Beginn ab –
                  interessanter Einstieg]![[Amazon-Icon]](images/amazon_inside.gif) SFML Blueprints
          (English Edition),
          Maxime Barbier, 05/2015, 298 S., Packt Publishing,
          ISBN 978-1-78439-847-7   [bestellt]
 SFML Blueprints
          (English Edition),
          Maxime Barbier, 05/2015, 298 S., Packt Publishing,
          ISBN 978-1-78439-847-7   [bestellt]![[Amazon-Icon]](images/amazon_inside.gif) SFML Game Development
          (English Edition),
          Jan Haller, Henrik Vogelius Hansson, Artur Moreira,
          06/2013, 296 S., Packt Publishing,
          ISBN 978-1-84969-684-5, >Sourcecode: grün Code,
          Download ZIP<  
          [noch nicht gelesen]
 SFML Game Development
          (English Edition),
          Jan Haller, Henrik Vogelius Hansson, Artur Moreira,
          06/2013, 296 S., Packt Publishing,
          ISBN 978-1-84969-684-5, >Sourcecode: grün Code,
          Download ZIP<  
          [noch nicht gelesen]![[Amazon-Icon]](images/amazon_inside.gif) SFML Game Development By Example
          (English Edition),  Raimondas Pupius,
          12/2015, 522 S., Packt Publishing, ISBN 978-1-78528-734-3
            [noch nicht gelesen]
 SFML Game Development By Example
          (English Edition),  Raimondas Pupius,
          12/2015, 522 S., Packt Publishing, ISBN 978-1-78528-734-3
            [noch nicht gelesen]![[Amazon-Icon]](images/amazon_inside.gif) SFML Essentials
          (English Edition),
          Milcho G. Milchev, 02/2015, 156 S., Packt Publishing, ISBN 978-1-78439-732-6
            [nicht im Besitz –
           abgelöst durch die beiden Werke
          direkt darüber
          von Haller et al. bzw. Pupius]
 SFML Essentials
          (English Edition),
          Milcho G. Milchev, 02/2015, 156 S., Packt Publishing, ISBN 978-1-78439-732-6
            [nicht im Besitz –
           abgelöst durch die beiden Werke
          direkt darüber
          von Haller et al. bzw. Pupius]
        ![[Amazon-Icon]](images/amazon_inside.gif) C++ Game Development
          By Example, Siddharth Shekar, 05/2019,
          408 S., Packt Publishing, ISBN 978-1-78953-530-3
            [noch nicht gelesen]
 C++ Game Development
          By Example, Siddharth Shekar, 05/2019,
          408 S., Packt Publishing, ISBN 978-1-78953-530-3
            [noch nicht gelesen]![[Wikipedia-de-Icon]](images/Wikipedia_logo_de.gif) Wikipedia)
Wikipedia)![[Wikipedia-de-Icon]](images/Wikipedia_logo_de.gif) TSR-Routinen
 (Terminate and Stay Resident)
sekundengenau anzeigte.
Unter DOS nicht ganz einfach.
TSR-Routinen
 (Terminate and Stay Resident)
sekundengenau anzeigte.
Unter DOS nicht ganz einfach.
![[Wikipedia-de-Icon]](images/Wikipedia_logo_de.gif) Numerik sagen)
die Programmiersprache C, nachdem die Tutoren
Numerik sagen)
die Programmiersprache C, nachdem die Tutoren
![[Wikipedia-de-Icon]](images/Wikipedia_logo_de.gif) Turbo Pascal
nicht verstanden –
als es genauso zäh mit C lief,
brach ich ab (ich bekam immer sehr gute Noten,
die Erklärungen zogen sich aber meist
eine Stunde hin, bis diese Tutoren
den jeweiligen
Turbo Pascal
nicht verstanden –
als es genauso zäh mit C lief,
brach ich ab (ich bekam immer sehr gute Noten,
die Erklärungen zogen sich aber meist
eine Stunde hin, bis diese Tutoren
den jeweiligen ![[Wikipedia-de-Icon]](images/Wikipedia_logo_de.gif) Algorithmus
verstanden ...).
Algorithmus
verstanden ...).
![[Wikipedia-de-Icon]](images/Wikipedia_logo_de.gif) patchte SW
zur astronomischen Bildverarbeitung
und änderte vorhandene Programme ab.
patchte SW
zur astronomischen Bildverarbeitung
und änderte vorhandene Programme ab. 
![[Wikipedia-de-Icon]](images/Wikipedia_logo_de.gif) Sehnenscheiden-Entzündung,
 da ich das
Sehnenscheiden-Entzündung,
 da ich das ![[Wikipedia-de-Icon]](images/Wikipedia_logo_de.gif) 10-Finger-System
nicht erlernte).
Allerdings war ich im professionellen Umfeld vorrangig
mit Scripten beschäftigt, zumal ich überwiegend
für proprietäre Unixe zuständig war.
Und privat habe ich in dieser Zeit den Computer
eher gemieden.
10-Finger-System
nicht erlernte).
Allerdings war ich im professionellen Umfeld vorrangig
mit Scripten beschäftigt, zumal ich überwiegend
für proprietäre Unixe zuständig war.
Und privat habe ich in dieser Zeit den Computer
eher gemieden.
 Bitte beachten Sie hierzu auch mein 📄Impressum.
         
Bitte beachten Sie hierzu auch mein 📄Impressum.
                 
 
| Erste Fassung: | 30. | Juli | 2019 | 
| Letzte Änderung: | 08. | September | 2025 |