WEBVTT

00:00:00.001 --> 00:00:07.600
Jochen: Oh, Jubiläum!

00:00:00.001 --> 00:00:19.600
Johannes: Hallo zusammen und herzlichen Glückwunsch zur 60.

00:00:00.001 --> 00:00:29.480
CF: Ja, vielen Dank, Hallo! Januar 23 haben wir gerade rekonstruiert.

00:00:00.001 --> 00:00:06.000
Dominik: Ja, hallo liebe Hörerinnen und Hörer, willkommen im Python Podcast. Heute Jubiläumsepisode 60. Hi Jochen!

00:00:06.000 --> 00:00:16.160
Dominik: Ja, hi auch an unsere Gäste. Lieber Johannes, dich kennt man schon.

00:00:07.600 --> 00:00:10.760
Jochen: Herzlichen Glückwunsch und auch herzlich willkommen, Dominik!

00:00:10.760 --> 00:00:22.640
Jochen: Ja, und auch, genau, ja, beziehungsweise, was ich, ja, genau, das, ja.

00:00:16.160 --> 00:00:26.480
Dominik: Danke. Und lieber TF, auch dir. Hallo. Du warst ja auch schon mal da, habe ich noch in Erinnerung.

00:00:19.600 --> 00:00:20.600
Johannes: Episode.

00:00:20.600 --> 00:00:44.840
Johannes: Ich habe mich schon vor der Folge auf die 30.000 Abonnenten eingeladen.

00:00:22.640 --> 00:00:24.640
Jochen: Ja.

00:00:26.640 --> 00:00:28.640
Jochen: Genau.

00:00:28.640 --> 00:00:30.640
Jochen: Ja.

00:00:29.440 --> 00:00:38.280
Dominik: Ja, wir sprechen heute über Python 3.13. Und ich würde sagen, da legen wir auch direkt los.

00:00:29.480 --> 00:00:31.480
CF: Wir haben ein paar Sachen vorgestellt, die wir noch nicht haben.

00:00:31.480 --> 00:00:33.480
CF: Aber ich hoffe, es wird ein bisschen besser.

00:00:33.480 --> 00:00:35.480
CF: Und ich hoffe, dass ihr euch auch ein bisschen mehr Zeit verbringt.

00:00:38.280 --> 00:00:42.920
Dominik: Ich wollte gerade sagen, mit den News.

00:00:38.640 --> 00:00:42.640
Jochen: Ja, wollen wir nicht, wollen wir noch News machen oder nicht?

00:00:42.640 --> 00:00:50.640
Jochen: Also Python 3.13 ist, genau, das ist natürlich irgendwie schon ein wesentlicher News-Teil.

00:00:42.920 --> 00:00:51.800
Dominik: Ja, das ist ein bisschen her, wir sind ein bisschen spät dran. Aber es ist vielleicht

00:00:44.840 --> 00:01:05.520
Johannes: Ich hoffe, dass ihr mich nicht vergessen habt.

00:00:50.640 --> 00:00:52.640
Jochen: Ja, ansonsten.

00:00:51.800 --> 00:00:54.640
Dominik: auch noch interessant. Es gibt ein paar schöne Sachen, die man darüber erzählen kann, oder?

00:00:52.640 --> 00:01:00.640
Jochen: Ja, also wollen wir direkt Python 3.13, können wir auch direkt, weil so...

00:00:54.640 --> 00:01:01.000
Dominik: Es war gar nicht so viel los, oder?

00:01:00.640 --> 00:01:02.640
Jochen: Nee, sonst war auch nicht so viel los, stimmt.

00:01:01.000 --> 00:01:26.760
Dominik: Ja.

00:01:02.640 --> 00:01:04.640
Jochen: Na, dann machen wir das doch direkt, ja.

00:01:04.640 --> 00:01:06.640
Jochen: Okay.

00:01:05.520 --> 00:01:29.640
Johannes: Ich hoffe, dass ihr mich nicht vergessen habt.

00:01:06.640 --> 00:01:13.640
Jochen: Ich hab's jetzt auch schon überall irgendwie installiert, wo ich irgendwie Projekte angefasst habe und es funktioniert super.

00:01:13.640 --> 00:01:22.640
Jochen: Und genau, ja, jetzt haben wir da so einige Dinge, vielleicht fangen wir einfach tatsächlich mit der neuen REPL an.

00:01:15.480 --> 00:01:17.480
CF: Und ich hoffe, dass ihr euch ein bisschen mehr Zeit verbringt.

00:01:22.640 --> 00:01:30.640
Jochen: Irgendwie, die halt aus dem PyPry-Projekt übernommen wurde und, ja.

00:01:26.760 --> 00:01:48.000
Dominik: Ja, also nutzt ihr schon 3.13? Alle? Außer Jochen? Das ist natürlich ein Spezialfall.

00:01:29.640 --> 00:01:49.640
Johannes: Ich hoffe, dass ihr mich nicht vergessen habt.

00:01:30.640 --> 00:01:38.640
Jochen: Ja, so eine Read-Eval-Print-Loop, irgendwie das, was man bekommt, wenn man einfach nur Python eingibt und unterdrückt.

00:01:38.640 --> 00:01:45.640
Jochen: Ah.

00:01:45.640 --> 00:01:49.640
Jochen: [Lachen]

00:01:48.000 --> 00:01:51.360
Dominik: Warum nicht Beep heißen?

00:01:49.640 --> 00:01:51.640
Jochen: [Lachen]

00:01:49.640 --> 00:02:07.640
Johannes: Ich hoffe, dass ihr mich nicht vergessen habt.

00:01:51.360 --> 00:01:52.360
Dominik: Vielen Dank.

00:01:52.360 --> 00:01:55.360
Dominik: Vielen Dank.

00:02:02.640 --> 00:02:30.260
Jochen: Ressourcen sinken in den Sinn der��men.

00:02:07.640 --> 00:02:27.640
Johannes: Ich hoffe, dass ihr mich nicht vergessen habt.

00:02:10.360 --> 00:02:36.160
Dominik: Also ich find's auch toll, weil ich bin ja zu faul für iPricen und ich mach das eigentlich

00:02:27.640 --> 00:02:39.640
Johannes: Ich hoffe, dass ihr mich nicht vergessen habt.

00:02:30.260 --> 00:02:37.260
Jochen: Ressourcen sinken in den Sinn der Massen.

00:02:36.160 --> 00:02:43.160
Dominik: sonst nochmal klassisch und toll, endlich, bunt.

00:02:37.260 --> 00:02:42.260
Jochen: Ressourcen sinken in den Sinn der Massen.

00:02:39.640 --> 00:02:59.640
Johannes: Ich hoffe, dass ihr mich nicht vergessen habt.

00:02:42.260 --> 00:03:04.260
Jochen: [kein Ton]

00:02:43.160 --> 00:03:04.360
Dominik: Ja, Back to the Future, das ist schon ein bisschen wie damals, ja.

00:03:04.360 --> 00:03:08.080
Dominik: Aber schade, dass es nicht früher noch grün war oder so, aber, naja, ein echter Hacker

00:03:08.080 --> 00:03:08.360
Dominik: und so.

00:03:08.360 --> 00:03:32.360
Dominik: Ja, ich hab's auch.

00:03:26.260 --> 00:03:46.260
Jochen: [kein Ton]

00:03:46.260 --> 00:04:00.260
Jochen: [kein Ton]

00:04:00.260 --> 00:04:20.260
Jochen: [kein Ton]

00:04:19.640 --> 00:04:29.640
Johannes: Ich hoffe, dass ihr mich nicht vergessen habt.

00:04:44.360 --> 00:05:04.360
Dominik: Ja, ich hab's auch.

00:05:04.360 --> 00:05:32.360
Dominik: Ja, ich hab's auch.

00:05:32.360 --> 00:05:56.360
Dominik: Ja, ich hab's auch.

00:06:20.360 --> 00:06:32.360
Dominik: Ja, ich hab's auch.

00:06:32.360 --> 00:06:48.360
Dominik: Ja, ich hab's auch.

00:06:40.260 --> 00:06:48.260
Jochen: [kein Ton]

00:06:48.260 --> 00:06:58.260
Jochen: [kein Ton]

00:06:48.360 --> 00:07:02.360
Dominik: Ja, ich hab's auch.

00:07:02.360 --> 00:07:28.360
Dominik: Ja, ich hab's auch.

00:07:28.360 --> 00:07:38.360
Dominik: Ja, ich hab's auch.

00:07:38.360 --> 00:07:46.360
Dominik: Ja, ich hab's auch.

00:07:54.360 --> 00:08:00.360
Dominik: Ja, ich hab's auch.

00:08:00.360 --> 00:08:02.360
Dominik: Ja, ich hab's auch.

00:08:02.360 --> 00:08:12.360
Dominik: Ja, ich hab's auch.

00:08:22.360 --> 00:08:42.360
Dominik: Ja, ich hab's auch.

00:08:42.360 --> 00:09:10.360
Dominik: Ja.

00:09:10.360 --> 00:09:32.360
Dominik: Ja, ich hab's auch.

00:09:32.360 --> 00:09:37.360
Dominik: Cool, reicht, glaube ich, auch.

00:09:37.360 --> 00:09:39.360
Dominik: Nicht? Warum steht denn das da?

00:09:39.360 --> 00:09:43.360
Dominik: Für den Headmode.

00:09:43.360 --> 00:09:45.360
Dominik: Schade.

00:09:45.360 --> 00:10:14.360
Dominik: Adidas Qoocoo, den können wir direkt wieder in das Skript reinschreiben.

00:10:14.360 --> 00:10:42.360
Dominik: Wie sagt man Dächle, Johannes?

00:10:29.480 --> 00:10:32.480
CF: Genau. Es wird jetzt quasi nicht mehr nur gesagt, das ist in Zeile 5 der Fehler,

00:10:32.480 --> 00:10:38.480
CF: sondern auch noch dieser Teil des Ausdrucks ist der Teil, der die Exception hervorgerufen hat.

00:10:38.480 --> 00:10:44.480
CF: Und das wird jetzt auch noch farbig irgendwie anders dargestellt als der Rest der Zeile.

00:10:42.360 --> 00:10:46.360
Dominik: Ja, auch sehr nützlich.

00:10:46.360 --> 00:11:11.360
Dominik: Tatsächlich so ein bisschen readable und man muss sich erstmal gucken, wo ist denn jetzt der richtige Teil vom Traceback, sondern es ist irgendwie fürs Auge schneller.

00:10:53.480 --> 00:11:01.480
CF: Das mit den Positionen, da habe ich das Feature quasi durch einen geschickten Tweet provoziert.

00:11:01.480 --> 00:11:06.480
CF: Da habe ich nämlich einen Screenshot gefälscht, wo wir, also den hat es nie,

00:11:06.480 --> 00:11:11.480
CF: das Feature hat es bei uns nicht gegeben, aber ich habe quasi einen fiktiven Traceback auf Twitter fingiert.

00:11:11.360 --> 00:11:13.360
Dominik: Ja, ich glaube, das ist jetzt das richtige Teil.

00:11:11.480 --> 00:11:15.480
CF: Und das hat dann dazu geführt, dass CYTN das wirklich entwickelt hat.

00:11:15.480 --> 00:11:18.480
CF: Das fand ich etwas.

00:11:17.360 --> 00:11:21.360
Dominik: Ja, ich glaube, das ist jetzt das richtige Teil.

00:11:18.480 --> 00:11:34.480
CF: Also ich hatte schon so einen Plan, wie ich das irgendwann mal, wir haben das ja dann auch irgendwann gekriegt.

00:11:21.360 --> 00:11:23.360
Dominik: Ja, ich glaube, das ist jetzt das richtige Teil.

00:11:34.480 --> 00:11:39.480
CF: Aber CYTN hat uns dann halt einfach ganz schnell überholt und viel mehr Leute benutzen CYTN als auch anders.

00:11:35.360 --> 00:11:45.360
Dominik: Ja, wo, wo, wo, Jochen?

00:11:39.480 --> 00:11:42.480
CF: [Abspann]

00:11:45.360 --> 00:12:05.360
Dominik: Ja.

00:11:49.480 --> 00:11:58.480
CF: [Abspann]

00:12:05.360 --> 00:12:21.360
Dominik: Ja, wo, wo, wo, Jochen?

00:12:07.480 --> 00:12:10.480
CF: [Abspann]

00:12:10.480 --> 00:12:16.480
CF: [Abspann]

00:12:16.480 --> 00:12:24.480
CF: [Abspann]

00:12:21.360 --> 00:12:49.360
Dominik: Er macht das Vorschlag, er versucht sich dran zu erinnern, was denn der Fehler schon sein könnte und versucht einen kleinen Hinweis dazu zu geben.

00:12:24.480 --> 00:12:32.480
CF: Ich meine das wird halt in jeder Version jetzt gerade so ein bisschen verbessert.

00:12:32.480 --> 00:12:38.480
CF: Es gibt schon über einige Versionen so ein festes Bestandteil von jedem C-Python Release,

00:12:38.480 --> 00:12:43.480
CF: dass sie sich echt Mühe geben, noch so ein paar der schlechten Fehlermeldungen zu verbessern.

00:12:43.480 --> 00:12:47.480
CF: Und ich unterrichte halt Python-Anfänger jedes Semester.

00:12:47.480 --> 00:12:51.480
CF: Das macht schon echt einen Unterschied, ob da dann irgendwie halt Abkürzungen vorkommen,

00:12:49.360 --> 00:13:17.360
Dominik: Ja, wo, wo, wo, wo, Jochen?

00:12:51.480 --> 00:12:56.480
CF: die wir noch nie gehört haben oder einfach nur Syntax Error ohne irgendwas anderes steht

00:12:56.480 --> 00:13:00.480
CF: und wir so ein bisschen raten müssen, was das Problem gewesen sein könnte.

00:13:00.480 --> 00:13:05.480
CF: Und das mit den Vorschlägen, also wenn man sich halt vertippt, wenn man irgendwie einen Namen vertippt,

00:13:05.480 --> 00:13:09.480
CF: das ist jetzt schon seit ein, zwei Versionen, dass sie da dann Vorschläge machen könnten,

00:13:09.480 --> 00:13:13.480
CF: was halt der existierende Name mit der kleinsten Edit Distance ist.

00:13:13.480 --> 00:13:18.480
CF: Und jetzt haben sie es eben noch zusätzlich hinzugefügt, dass es auch bei Keyword-Argumenten geht.

00:13:17.360 --> 00:13:33.360
Dominik: Ja, wo, wo, wo, wo, Jochen?

00:13:18.480 --> 00:13:47.480
CF: [KEYBOARD SPIELT]

00:13:33.360 --> 00:13:39.360
Dominik: Ja, ich würde auch sagen, wenn die ganzen Bibliotheken umgezogen sind, die man sonst so nutzt, dann direkt kann nicht mehr so lange dauern.

00:13:39.360 --> 00:14:08.360
Dominik: Wann zieht denn immer um, bei der 3.1 oder bei der Punkt 1 oder Punkt 3?

00:13:47.480 --> 00:14:00.480
CF: [KEYBOARD SPIELT]

00:14:00.480 --> 00:14:05.480
CF: Also du bist dann einer von denen, die dann die Bug-Reports machen, wenn was nicht geht.

00:14:05.480 --> 00:14:34.480
CF: [KEYBOARD SPIELT]

00:14:08.360 --> 00:14:25.360
Dominik: Ja, bei der Rest-Test-Software, den hast du ja noch nicht alles umgezogen.

00:14:25.360 --> 00:14:54.360
Dominik: Hast du zumindest, ja.

00:14:54.360 --> 00:15:18.360
Dominik: Ja, die Data-Transfer geht immer so ein bisschen langsam. Dann haben die immer diese Upper Boundaries in ihren Versionen drin und das nervt immer so ein bisschen.

00:15:03.480 --> 00:15:11.480
CF: [KEYBOARD SPIELT]

00:15:11.480 --> 00:15:15.480
CF: Weil ich auch da das Gefühl habe, dass eigentlich viele Bibliotheken sich da jetzt inzwischen echt Mühe geben

00:15:15.480 --> 00:15:20.480
CF: und halt schon bei den Betas und Release Candidates gucken, ob es geht und dann schon.

00:15:18.360 --> 00:15:25.360
Dominik: Ja.

00:15:20.480 --> 00:15:23.480
CF: Also es ist jetzt nicht mehr so, dass es ein halbes Jahr dauert oder so.

00:15:23.480 --> 00:15:31.480
CF: [KEYBOARD SPIELT]

00:15:25.360 --> 00:15:52.360
Dominik: Ja, ich bin gespannt, wie lange es diesmal dauert, tatsächlich, ja.

00:15:31.480 --> 00:15:35.480
CF: Wollen wir mit den großen Blöcken weitermachen oder willst du so ein paar der kleinen Sachen sammeln?

00:15:35.480 --> 00:15:38.480
CF: [KEYBOARD SPIELT]

00:15:38.480 --> 00:15:40.480
CF: Es gibt zwei Riesenblöcke.

00:15:39.640 --> 00:15:47.640
Johannes: Ich hoffe, dass ihr mich nicht vergessen habt.

00:15:40.480 --> 00:16:04.480
CF: [KEYBOARD SPIELT]

00:15:47.640 --> 00:15:57.640
Johannes: Ich hoffe, dass ihr mich nicht vergessen habt.

00:15:52.360 --> 00:16:02.360
Dominik: Ist das auch persistent?

00:16:02.360 --> 00:16:30.360
Dominik: Oh, da muss man jetzt aufpassen, was man da jetzt eintippt.

00:16:04.480 --> 00:16:06.480
CF: War da noch "Prince" ohne Klammern?

00:16:06.480 --> 00:16:32.480
CF: [KEYBOARD SPIELT]

00:16:30.360 --> 00:16:45.360
Dominik: Du meinst ja Snoogle.

00:16:32.480 --> 00:16:39.480
CF: Erst JIT oder erst Threads? Dann machen wir JIT. Da habe ich mir Notizen.

00:16:39.480 --> 00:16:42.480
CF: [KEYBOARD SPIELT]

00:16:42.480 --> 00:16:45.480
CF: Also beides sind ja eigentlich Sachen, die ihr so im Hinblick habt.

00:16:45.360 --> 00:16:54.360
Dominik: Vielleicht nochmal für alle Leute, die einsteigen, die noch gar keine Ahnung von Python haben, just in time. Was ist denn das und warum ist das interessant und warum ist das wichtig?

00:16:45.480 --> 00:16:57.480
CF: [KEYBOARD SPIELT]

00:16:55.360 --> 00:16:57.360
Dominik: Vielleicht nochmal so einen kurzen Aufzug lang und dann...

00:16:57.360 --> 00:16:59.360
Dominik: Ja, das ist interessant.

00:16:57.480 --> 00:17:04.480
CF: Also CPython ist ein Interpreter.

00:16:58.260 --> 00:17:18.260
Jochen: [kein Ton]

00:16:59.360 --> 00:17:09.360
Dominik: Ja, das ist interessant.

00:17:04.480 --> 00:17:08.480
CF: Also der Python-Code, der ausgeführt wird, der wird erst nach Bytecode übersetzt.

00:17:08.480 --> 00:17:13.480
CF: Und der Bytecode wird aber dann von einem in C geschriebenen Interpreter ausgeführt.

00:17:09.360 --> 00:17:37.360
Dominik: Ja, das ist interessant.

00:17:13.480 --> 00:17:15.480
CF: Und das gilt als nicht so schnell.

00:17:15.480 --> 00:17:20.480
CF: Das ist einer der Gründe, warum Python den Ruf hat, nicht so super schnell zu sein.

00:17:18.260 --> 00:17:28.260
Jochen: [kein Ton]

00:17:20.480 --> 00:17:27.480
CF: Und seit ein paar Versionen gibt es da einiges an Arbeiten vom Fasta-Python-Team,

00:17:27.480 --> 00:17:31.480
CF: was zum guten Teil von Microsoft bezahlt wird, das zu verbessern.

00:17:31.480 --> 00:17:36.480
CF: Und was die machen, ist ein, immer noch auf dem Interpreter,

00:17:36.480 --> 00:17:39.480
CF: aber sie verändern quasi die Bytecodes zur Laufzeit,

00:17:39.480 --> 00:17:43.480
CF: in Abhängigkeit von den Typen, die in den Funktionen verwendet werden.

00:17:43.480 --> 00:17:46.480
CF: Was dazu führt, dass, wenn ich an irgendeiner Stelle vor allem Integers benutze,

00:17:46.480 --> 00:17:51.480
CF: dass dann für Integers angepasster Bytecode verwendet wird,

00:17:51.480 --> 00:17:53.480
CF: was die Ausführung schneller macht.

00:17:53.480 --> 00:17:57.480
CF: Und dieser Prozess hat in Reihe 11 angefangen.

00:17:57.480 --> 00:18:00.480
CF: Und in jeder Version gibt es da eben so ein paar Verbesserungen.

00:18:00.480 --> 00:18:04.480
CF: Und wenn man dann aber darüber noch hinaus will, dann muss man eben,

00:18:04.480 --> 00:18:07.480
CF: oder was man dann eben machen kann, ist, nochmal zu einer anderen Technik greifen.

00:18:07.480 --> 00:18:09.480
CF: Das ist der sogenannte Just-in-Time-Compiler.

00:18:09.480 --> 00:18:14.480
CF: Und das ist eine Technik, die von allen schnellen JavaScript-Implementierungen

00:18:14.480 --> 00:18:16.480
CF: oder auch von Java verwendet wird.

00:18:16.480 --> 00:18:20.480
CF: Und da ist die Idee, dass man zur Laufzeit eben Maschinencode erzeugt

00:18:20.480 --> 00:18:22.480
CF: für die Funktionen, die man gerade ausführen möchte.

00:18:22.480 --> 00:18:26.480
CF: Und das hat den Vorteil, dass man, also der Grund, warum man das zur Laufzeit macht,

00:18:26.480 --> 00:18:28.480
CF: ist, weil man erst zur Laufzeit die Typen weiß,

00:18:28.480 --> 00:18:30.480
CF: die in der Python-Funktion gerade verwendet werden.

00:18:30.480 --> 00:18:34.480
CF: Und dann kann man eben Code erzeugen, der dann speziell angepasst ist

00:18:33.360 --> 00:18:47.360
Dominik: Ja, das ist interessant.

00:18:34.480 --> 00:18:37.480
CF: auf die Arten und Weisen, wie die Funktionen, die man gerade ausführt,

00:18:37.480 --> 00:18:39.480
CF: eben verwendet werden.

00:18:40.480 --> 00:18:46.480
CF: [Stille]

00:18:46.480 --> 00:18:48.480
CF: Genau. Also das ist der grundsätzliche Ansatz.

00:18:47.360 --> 00:19:15.360
Dominik: Ja, das ist interessant.

00:18:48.480 --> 00:18:51.480
CF: Man fängt eben an, das erstmal so mit dem Interpreter auszuführen

00:18:51.480 --> 00:18:53.480
CF: und dabei macht man so ein bisschen Beobachtungen,

00:18:53.480 --> 00:18:55.480
CF: was für Typen eben konkret verwendet werden,

00:18:55.480 --> 00:18:57.480
CF: führt so ein paar Statistiken mit.

00:18:57.480 --> 00:18:59.480
CF: Und nur wenn die Funktion besonders oft ausgeführt wird

00:18:59.480 --> 00:19:02.480
CF: und man dann eben mit der Zeit so ein paar Informationen zusammen hat,

00:19:02.480 --> 00:19:06.480
CF: wie die Typen so sind, dann fängt es sich an, quasi das so ein bisschen zu stabilisieren.

00:19:06.480 --> 00:19:10.480
CF: Und das ist auch dann der Zeitpunkt, wo eben die Bytecodes umgeschrieben werden,

00:19:10.480 --> 00:19:13.480
CF: quasi jetzt seit Version 3.11.

00:19:13.480 --> 00:19:19.480
CF: Und jetzt, was jetzt neu ist in 3.13, ist, dass dann eben dieser zweite Schritt hinzukommt,

00:19:15.360 --> 00:19:35.360
Dominik: Ja, das ist interessant.

00:19:19.480 --> 00:19:22.480
CF: wo man dann eben nicht nur Bytecodes umschreibt

00:19:22.480 --> 00:19:25.480
CF: und so dann für die Situation effizientere Bytecodes,

00:19:25.480 --> 00:19:28.480
CF: sondern eben auch noch, und das ist komplett optional,

00:19:28.480 --> 00:19:31.480
CF: also bisher in den Standard-Builds ist das Feature nicht drin,

00:19:31.480 --> 00:19:37.480
CF: das ist eher so ein Feature-Outlook für zukünftige Versionen,

00:19:35.360 --> 00:20:03.360
Dominik: Ja, das ist interessant.

00:19:37.480 --> 00:19:40.480
CF: dass man eben CPython auch neu bauen kann

00:19:40.480 --> 00:19:43.480
CF: mit so einem speziellen experimentellen Build-Time-Flag,

00:19:43.480 --> 00:19:47.480
CF: was eben sagt, ich möchte jetzt gerne einen JIT-Compiler einbauen.

00:19:47.480 --> 00:19:51.480
CF: Und dann wird eben zur Laufzeit dieser spezialisierte Bytecode genommen

00:19:51.480 --> 00:19:53.480
CF: und daraus Maschinencode erzeugt.

00:19:53.480 --> 00:19:56.480
CF: Und die Hoffnung ist, dass es dann eben noch schneller wird.

00:19:56.480 --> 00:19:58.480
CF: In 3.13 ist das aber leider noch nicht der Fall.

00:19:58.480 --> 00:20:01.480
CF: Also sie erzeugen quasi Maschinencode,

00:20:01.480 --> 00:20:07.480
CF: aber der macht es halt nicht wirklich, das macht es doch ziemlich schneller.

00:20:07.480 --> 00:20:09.480
CF: Das ist so ein bisschen die schlechte Nachricht.

00:20:09.480 --> 00:20:13.480
CF: Aber das ist trotzdem okay, weil das Ziel ist quasi,

00:20:13.480 --> 00:20:16.480
CF: das Fundament zu legen für Verbesserungen,

00:20:16.480 --> 00:20:19.480
CF: die dann in den nächsten Versionen hoffentlich auch wirklich dazu führen,

00:20:18.260 --> 00:20:22.260
Jochen: [kein Ton]

00:20:19.480 --> 00:20:22.480
CF: dass halt dann CPython das Sachen schneller ausführen kann.

00:20:22.260 --> 00:20:32.260
Jochen: [kein Ton]

00:20:22.480 --> 00:20:37.480
CF: [kein Ton]

00:20:37.480 --> 00:20:40.480
CF: Genau. Also so ganz kann man das nicht sagen.

00:20:40.480 --> 00:20:44.480
CF: Also die Idee gibt es schon sehr lang.

00:20:44.480 --> 00:20:47.480
CF: Also das ist ein sogenannter Template-JIT.

00:20:47.480 --> 00:20:48.480
CF: Und da ist die Idee, dass man,

00:20:48.480 --> 00:20:50.480
CF: also man hat ja dann diese spezialisierten Bytecodes,

00:20:50.480 --> 00:20:54.480
CF: also sowas wie "add two integers" oder sowas.

00:20:54.480 --> 00:20:58.480
CF: Und die Idee ist, dass man quasi für alle diese Bytecodes

00:20:58.480 --> 00:21:01.480
CF: so ein bisschen Maschinencode vorbereitet,

00:21:01.480 --> 00:21:03.480
CF: also zu dem Zeitpunkt, wo man CPython baut.

00:21:03.480 --> 00:21:09.480
CF: Und das dann, den vorbereiteten Maschinencode, also diese Templates,

00:21:09.480 --> 00:21:10.480
CF: die werden dann so zusammengruppiert.

00:21:10.480 --> 00:21:14.480
CF: Und die Idee von einem Template-JIT, die ist relativ alt.

00:21:14.480 --> 00:21:18.480
CF: Aber was jetzt neu ist, und das ist eben dieser Copy-and-Patch-Ansatz,

00:21:18.480 --> 00:21:21.480
CF: ist die Art und Weise, wie diese Templates hergestellt werden.

00:21:21.480 --> 00:21:24.480
CF: Und das ist eben die Einsicht von dem Copy-and-Patch-Ansatz.

00:21:24.480 --> 00:21:29.480
CF: Das ist ein Doktorand in Kalifornien, glaube ich, Haurang-Zu.

00:21:29.480 --> 00:21:33.480
CF: Und die Idee davon ist, dass man eben den C-Compiler benutzen kann,

00:21:33.480 --> 00:21:35.480
CF: um diese Templates vorzubereiten.

00:21:35.480 --> 00:21:37.480
CF: Und das hat viele Vorteile.

00:21:37.480 --> 00:21:39.480
CF: Also man benutzt den C-Compiler,

00:21:39.480 --> 00:21:41.480
CF: man hat so kleine Funktionen in C geschrieben,

00:21:41.480 --> 00:21:45.480
CF: benutzt den C-Compiler, um die dann nach Maschinencode zu übersetzen.

00:21:45.480 --> 00:21:49.480
CF: Und das bedeutet insbesondere, dass normalerweise,

00:21:49.480 --> 00:21:51.480
CF: wenn man einen JIT schreibt, dann muss man halt anfangen,

00:21:51.480 --> 00:21:53.480
CF: für verschiedene Maschinenarchitekturen,

00:21:53.480 --> 00:21:58.480
CF: so ein Backend quasi von Null auf, erstmal zu bauen.

00:21:58.480 --> 00:21:59.480
CF: Und das ist halt super aufwendig,

00:21:59.480 --> 00:22:01.480
CF: gerade wenn man viele Architekturen unterstützen will,

00:22:01.480 --> 00:22:03.480
CF: wie das ja bei C-Partien der Fall ist.

00:22:03.480 --> 00:22:05.480
CF: Und die Idee von dem Copy-and-Patch-Ansatz ist,

00:22:05.480 --> 00:22:06.480
CF: man benutzt den C-Compiler,

00:22:06.480 --> 00:22:09.480
CF: um sich den Maschinencode erzeugen zu lassen

00:22:09.480 --> 00:22:14.480
CF: und kopiert den dann so mit Memcopy quasi an die richtige Stelle,

00:22:14.480 --> 00:22:17.480
CF: und patcht dann eben noch so ein paar Stellen,

00:22:17.480 --> 00:22:19.480
CF: wo man dann irgendwelche Konstanten noch so

00:22:19.480 --> 00:22:22.480
CF: in den erzeugten Maschinencode so reinpatchen kann.

00:22:22.480 --> 00:22:25.480
CF: Und das so benutzt man linker Information.

00:22:25.480 --> 00:22:30.480
CF: Das ist wirklich so ein relativ kreativer Ansatz,

00:22:30.480 --> 00:22:34.480
CF: um halt mit vergleichsweise wenig Aufwand,

00:22:34.480 --> 00:22:36.480
CF: also ohne so ein komplettes Backend schreiben zu müssen,

00:22:36.480 --> 00:22:40.480
CF: trotzdem relativ schnell, relativ gut Maschinencode erzeugen kann.

00:22:41.480 --> 00:22:45.480
CF: Genau, das ist auch so ein bisschen das Problem.

00:22:45.480 --> 00:22:48.480
CF: Also man braucht dann genau die richtige LVM-Version.

00:22:48.480 --> 00:22:50.480
CF: Und wenn man die nicht installiert hat,

00:22:50.480 --> 00:22:52.480
CF: dann bringt einem auch die die Flag nicht.

00:22:51.360 --> 00:22:57.360
Dominik: Ja, das ist interessant.

00:22:52.480 --> 00:22:53.480
CF: Man kann es dann trotzdem nicht bauen.

00:22:53.480 --> 00:22:54.480
CF: Ich habe es tatsächlich noch nicht geschafft, das zu bauen,

00:22:54.480 --> 00:22:57.480
CF: weil ich irgendwie das richtige LVM noch nicht hatte oder was.

00:22:57.480 --> 00:22:58.480
CF: Aber ich glaube, die arbeiten da jetzt,

00:22:58.480 --> 00:23:02.480
CF: also ich glaube, auf dem C-Partien-Main-Branch

00:23:02.480 --> 00:23:04.480
CF: ist das jetzt auch irgendwie gelöst.

00:23:03.360 --> 00:23:21.360
Dominik: Ja, das ist interessant.

00:23:04.480 --> 00:23:05.480
CF: Da werden halt dann Sachen schon eingecheckt,

00:23:05.480 --> 00:23:08.480
CF: oder also man muss dann nicht mehr genau

00:23:08.480 --> 00:23:11.480
CF: die richtige Point-Version von der LVM installieren.

00:23:11.480 --> 00:23:13.480
CF: Aber habe ich jetzt noch nicht ausprobiert.

00:23:13.480 --> 00:23:26.480
CF: Ja, also im Prinzip haben das die meisten optimierenden Compiler.

00:23:21.360 --> 00:23:49.360
Dominik: Ja, das ist interessant.

00:23:26.480 --> 00:23:27.480
CF: Die haben halt irgendwie so eine Zwischendarstellung,

00:23:27.480 --> 00:23:31.480
CF: wo sie halt quasi diese benutzen, um Code zu optimieren.

00:23:31.480 --> 00:23:34.480
CF: Und bei LVM ist die deswegen relativ sichtbar,

00:23:34.480 --> 00:23:36.480
CF: weil sie halt gute Tools haben,

00:23:36.480 --> 00:23:38.480
CF: um die dann in so eine ASCII-Syntax zu printen

00:23:38.480 --> 00:23:40.480
CF: und auch wieder zu parsen und weiter zu verarbeiten.

00:23:40.480 --> 00:23:54.480
CF: Ja, es ist schon, also es ist jetzt schon so ein bisschen legit in 3.13.

00:23:49.360 --> 00:24:13.360
Dominik: Ja, das ist interessant.

00:23:54.480 --> 00:23:58.480
CF: Das ist schon wirklich eher so, das sind so vorbereitende Arbeiten.

00:23:58.480 --> 00:24:02.480
CF: Also die Hoffnung ist eben, dass das dann so in den nächsten Versionen,

00:24:02.480 --> 00:24:05.480
CF: also ich meine, bisher ist das relativ unbefähigend.

00:24:05.480 --> 00:24:07.480
CF: Wir haben einen JIT, der erzeugt ganz tollen Maschinencode,

00:24:07.480 --> 00:24:09.480
CF: aber es wird halt nicht schneller.

00:24:09.480 --> 00:24:15.480
CF: Also und es ist ja cool, aber halt irgendwie auch nutzlos.

00:24:13.360 --> 00:24:41.360
Dominik: Ja, das ist interessant.

00:24:15.480 --> 00:24:16.480
CF: Also warum sollte man es machen,

00:24:16.480 --> 00:24:19.480
CF: wenn sich die Performance halt dadurch gar nicht ändert.

00:24:19.480 --> 00:24:21.480
CF: Aber die Hoffnung ist eben,

00:24:21.480 --> 00:24:23.480
CF: dass sie dann, wenn sie jetzt weitere Optimierungen einbauen

00:24:23.480 --> 00:24:26.480
CF: und bei diesem Patching,

00:24:26.480 --> 00:24:30.480
CF: da kann man noch so ein paar extra Instruktionen dann wegoptimieren.

00:24:30.480 --> 00:24:33.480
CF: Das haben sie, glaube ich, jetzt auch im Main Repository

00:24:33.480 --> 00:24:35.480
CF: auch schon gemacht und die Hoffnung ist,

00:24:35.480 --> 00:24:37.480
CF: dass dann eben, wenn 3.14 dann da ist,

00:24:37.480 --> 00:24:40.480
CF: dass erstens eben dann, dass sie so ein paar Bugs gefixt haben,

00:24:40.480 --> 00:24:42.480
CF: weil hoffentlich eben ein paar Leute trotzdem

00:24:42.480 --> 00:24:45.480
CF: den experimentellen JIT halt mal ausprobieren

00:24:45.480 --> 00:24:48.480
CF: und dann vielleicht Bug Reports schicken

00:24:48.480 --> 00:24:50.480
CF: und dass sie dann halt in der nächsten Version

00:24:50.480 --> 00:24:54.480
CF: dann auch die Performance noch ein bisschen verbessern können.

00:24:54.480 --> 00:24:56.480
CF: Und insgesamt finde ich den Antrag cool,

00:24:56.480 --> 00:24:58.480
CF: weil er in Anbetracht der Tatsache,

00:24:58.480 --> 00:25:00.480
CF: dass das T-Python-Team halt jetzt nicht so groß ist,

00:25:00.480 --> 00:25:02.480
CF: was bezahlte Entwickler angeht.

00:25:02.480 --> 00:25:04.480
CF: Ich finde es halt einen relativ pragmatischen Ansatz,

00:25:04.480 --> 00:25:06.480
CF: wo sie ohne jetzt irgendwie,

00:25:06.480 --> 00:25:08.480
CF: also was ich Google V8 hat,

00:25:08.480 --> 00:25:11.480
CF: hat halt irgendwie, weiß nicht, 80 Leute oder so.

00:25:09.360 --> 00:25:19.360
Dominik: Ja, das ist interessant.

00:25:11.480 --> 00:25:18.480
CF: Und also dass sie halt quasi mit der kleinen Anzahl an Festangestellten

00:25:18.480 --> 00:25:22.480
CF: halt trotzdem mit diesem Ansatz

00:25:22.480 --> 00:25:25.480
CF: vielleicht irgendwie recht pragmatisch irgendwo hinkommen können.

00:25:25.480 --> 00:25:27.480
CF: Vielen Dank.

00:25:27.480 --> 00:25:29.480
CF: [Musik]

00:25:29.360 --> 00:25:57.360
Dominik: Ja, das ist interessant.

00:25:33.480 --> 00:25:36.480
CF: Untertitel der Amara.org-Community

00:25:36.480 --> 00:25:39.480
CF: * Musik *

00:25:45.480 --> 00:26:08.480
CF: Sehr viel kompliziert.

00:25:57.360 --> 00:26:21.360
Dominik: Ja, das ist interessant.

00:26:08.480 --> 00:26:12.480
CF: Nicht nur einen JIT, sondern drei oder vier.

00:26:12.480 --> 00:26:16.480
CF: Also dann erstmal einen, der quasi schlechten Code sehr schnell erzeugt

00:26:16.480 --> 00:26:19.480
CF: und dann etwas besser optimiert, sehr gut optimiert.

00:26:19.480 --> 00:26:23.480
CF: Dann haben Sie noch einen komplett getrennten JIT für WebAssembly.

00:26:21.360 --> 00:26:49.360
Dominik: Ja, das ist interessant.

00:26:23.480 --> 00:26:26.480
CF: Das ist schon, und dann natürlich auch wirklich dann

00:26:26.480 --> 00:26:29.480
CF: quasi richtige Backends für ganz viele verschiedene

00:26:29.480 --> 00:26:31.480
CF: Hardware-Architekturen.

00:26:31.480 --> 00:26:34.480
CF: Also das ist schon ein Aufwand, den meiner Ansicht nach

00:26:34.480 --> 00:26:38.480
CF: mit dem jetzigen Funding das C Python Team erstmal so nicht

00:26:38.480 --> 00:26:40.480
CF: hinkriegen kann.

00:26:40.480 --> 00:27:00.480
CF: Ja, genau, das stimmt.

00:26:49.360 --> 00:27:09.360
Dominik: Ja, das ist interessant.

00:27:00.480 --> 00:27:04.480
CF: Das ist so ein kleines Ding. Es gibt drei neue Plattformen in 3.13.

00:27:04.480 --> 00:27:24.480
CF: Ich glaube, irgendwie, die machen Aussagen darüber,

00:27:09.360 --> 00:27:21.360
Dominik: Ja, das ist interessant.

00:27:21.360 --> 00:27:35.360
Dominik: Ja, das ist interessant.

00:27:24.480 --> 00:27:27.480
CF: wie viele Buildboards sie haben und was sie so versprechen

00:27:27.480 --> 00:27:31.480
CF: an Support genau über die Version.

00:27:31.480 --> 00:27:33.480
CF: Da gibt es irgendwie ein PEP dazu.

00:27:33.480 --> 00:27:40.480
CF: Ich glaube, eins ist am besten.

00:27:35.360 --> 00:28:03.360
Dominik: Ja, das ist interessant.

00:27:40.480 --> 00:27:42.480
CF: Ja.

00:27:42.480 --> 00:27:44.480
CF: Ja, das stimmt.

00:28:03.360 --> 00:28:27.360
Dominik: Ja, das ist interessant.

00:28:04.480 --> 00:28:06.480
CF: * Titelsong *

00:28:18.480 --> 00:28:44.480
CF: Was ist genau die Regel, die ...

00:28:27.360 --> 00:28:55.360
Dominik: Ja, das ist interessant.

00:28:44.480 --> 00:28:46.480
CF: * Titelsong *

00:28:55.360 --> 00:29:15.360
Dominik: Ja, das ist interessant.

00:29:13.480 --> 00:29:15.480
CF: Ja, das kann ...

00:29:15.360 --> 00:29:43.360
Dominik: Ja, das ist interessant.

00:29:15.480 --> 00:29:29.480
CF: Ja, das kann ...

00:29:29.480 --> 00:29:31.480
CF: * Titelsong *

00:29:31.480 --> 00:29:48.480
CF: Ja, aber ich glaube, deswegen ist es schon noch ...

00:29:48.480 --> 00:29:50.480
CF: Ja, genau, das ist schon noch wichtig,

00:29:50.480 --> 00:29:52.480
CF: dass es jetzt halt quasi von den C-Python-Entwicklern

00:29:52.480 --> 00:29:54.480
CF: halt mit versorgt wird.

00:29:54.480 --> 00:29:56.480
CF: Ich habe jetzt noch mal nachgeschaut,

00:29:56.480 --> 00:29:58.480
CF: was genau die Tiers bedeuten.

00:29:58.480 --> 00:30:00.480
CF: Also, Tiers 1 und 2 sind halt so ein bisschen wie

00:30:00.480 --> 00:30:02.480
CF: Mac, also so macOS, Windows, Linux.

00:30:02.480 --> 00:30:05.480
CF: Tier 2 braucht man halt irgendwie Buildboards

00:30:05.480 --> 00:30:08.480
CF: und mindestens zwei C-Python-Core-Developer,

00:30:08.480 --> 00:30:10.480
CF: die eben die Plattform unterstützen.

00:30:10.480 --> 00:30:13.480
CF: Und wenn es da Buildboard-Failures gibt,

00:30:13.480 --> 00:30:17.480
CF: dann werden C-Python-Releases dadurch blockiert.

00:30:17.480 --> 00:30:22.480
CF: Und Tier 3 heißt eben Buildboard einen Core-Entwickler,

00:30:22.260 --> 00:30:30.260
Jochen: [kein Ton]

00:30:22.480 --> 00:30:24.480
CF: aber wenn es da Bugs gibt,

00:30:24.480 --> 00:30:28.480
CF: dann kann C-Python trotzdem released werden.

00:30:28.480 --> 00:30:31.480
CF: Also, das ist quasi so ein "Wir geben uns Mühe",

00:30:30.260 --> 00:30:40.260
Jochen: [kein Ton]

00:30:31.480 --> 00:30:35.480
CF: aber wenn es jetzt irgendwie nur noch einen

00:30:35.480 --> 00:30:37.480
CF: bekannten Bug auf Android gibt,

00:30:37.480 --> 00:30:39.480
CF: dann releasen wir halt möglicherweise trotzdem.

00:30:37.640 --> 00:30:57.640
Johannes: Ich hoffe, dass ihr mich nicht vergessen habt.

00:30:39.480 --> 00:30:41.480
CF: [Siehe vor]

00:30:57.640 --> 00:31:07.640
Johannes: Ich hoffe, dass ihr mich nicht vergessen habt.

00:31:04.480 --> 00:31:32.480
CF: [Kein Ton]

00:31:07.360 --> 00:31:17.360
Dominik: Ja, das ist interessant.

00:31:17.360 --> 00:31:25.360
Dominik: Ja, das ist interessant.

00:31:25.360 --> 00:31:51.360
Dominik: Ja, das ist interessant.

00:31:32.480 --> 00:31:34.480
CF: Ja, ich habe das bei meinen Studenten echt.

00:31:34.480 --> 00:31:38.480
CF: Also ich mache eine Python-Einführung für alle,

00:31:38.480 --> 00:31:40.480
CF: da dürfen Informatiker nicht hin.

00:31:40.480 --> 00:31:43.480
CF: Das heißt, ich habe auch wirklich Studierende aus allen Fächern.

00:31:43.480 --> 00:31:48.480
CF: Jetzt nicht viele, aber da gibt es dann immer wieder Teilnehmer,

00:31:48.480 --> 00:31:50.480
CF: die dann halt einfach auch nur ein Tablet haben.

00:31:50.480 --> 00:31:54.480
CF: Und ja, also da sind wir noch.

00:31:51.360 --> 00:31:59.360
Dominik: Ja, das ist interessant.

00:31:54.480 --> 00:31:56.480
CF: Die haben kein Tier 1 Gerät, genau.

00:31:56.480 --> 00:32:00.480
CF: Und die haben dann halt entweder die Möglichkeit,

00:31:59.360 --> 00:32:05.360
Dominik: Ja, das ist interessant.

00:32:00.480 --> 00:32:02.480
CF: das irgendwie über Google Collab zu machen.

00:32:02.480 --> 00:32:03.480
CF: Also ich mache alles mit Jupyter Notebooks,

00:32:03.480 --> 00:32:05.480
CF: aber das ist halt dann immer so ein bisschen nervig

00:32:05.360 --> 00:32:15.360
Dominik: Ja, das ist interessant.

00:32:05.480 --> 00:32:07.480
CF: mit die Inputdateien hochladen und so Zeug.

00:32:07.480 --> 00:32:10.480
CF: Und dann können die sich ins Rechenzentrum setzen,

00:32:10.480 --> 00:32:12.480
CF: da ist das auch installiert, aber das ist natürlich auch total nervig.

00:32:12.480 --> 00:32:14.480
CF: Du musst immer deine Übungsaufgaben dann machen.

00:32:14.480 --> 00:32:20.480
CF: Und so einen richtig guten Jupyter Support auf so einem iPad

00:32:20.480 --> 00:32:22.480
CF: gibt es halt einfach auch noch nicht.

00:32:22.480 --> 00:32:26.480
CF: Also das ist schon einfach im Vergleich zu installiert an der Konda,

00:32:26.480 --> 00:32:29.480
CF: da ist alles in Ordnung, ist das halt schon einfach sehr frickelig.

00:32:29.480 --> 00:32:45.480
CF: [kein Ton]

00:32:45.360 --> 00:32:57.360
Dominik: Ja, das ist interessant.

00:32:45.480 --> 00:32:49.480
CF: Der einer von den drei Developers in Residence ist.

00:32:49.480 --> 00:33:18.480
CF: [kein Ton]

00:32:57.360 --> 00:33:25.360
Dominik: Ja, das ist interessant.

00:33:18.480 --> 00:33:31.480
CF: [kein Ton]

00:33:31.480 --> 00:33:33.480
CF: Also ich glaube, man kann die verkaufen.

00:33:33.480 --> 00:33:36.480
CF: Also ich vermute, dass das wirklich die Art und Weise ist,

00:33:36.480 --> 00:33:38.480
CF: wie man endlich mal gutes Funding für ZBiten findet.

00:33:38.480 --> 00:33:47.480
CF: [kein Ton]

00:33:47.480 --> 00:33:55.480
CF: [kein Ton]

00:33:53.360 --> 00:34:07.360
Dominik: Ja, das ist interessant.

00:33:55.480 --> 00:33:59.480
CF: Der einzige Vorteil von AI ist, dass sie die LFTs verdrängt haben.

00:33:59.480 --> 00:34:16.480
CF: [kein Ton]

00:34:07.360 --> 00:34:31.360
Dominik: Ja, das ist interessant.

00:34:16.480 --> 00:34:19.480
CF: Und er war besser im Leben.

00:34:19.480 --> 00:34:26.480
CF: [kein Ton]

00:34:26.480 --> 00:34:30.480
CF: Wir müssen noch über den anderen JIT reden.

00:34:30.480 --> 00:34:33.480
CF: Es gibt nämlich zwei JITs in 3.13 und der eine ist der coole,

00:34:31.360 --> 00:34:51.360
Dominik: Ja, das ist interessant.

00:34:33.480 --> 00:34:35.480
CF: der quasi das irgendwann mal schneller machen soll,

00:34:35.480 --> 00:34:37.480
CF: der aber quasi standardmäßig gar nicht eingebaut ist.

00:34:37.480 --> 00:34:40.480
CF: Und dann gibt es aber den anderen, der quasi standardmäßig eingebaut ist,

00:34:40.480 --> 00:34:43.480
CF: aber für einen ganz anderen Zweck.

00:34:43.480 --> 00:34:47.480
CF: Ich glaube, in einer der Core.py Folgen ist Pablo Gallino-Sagado,

00:34:47.480 --> 00:34:49.480
CF: über den wir gerade auch schon geredet haben, sehr stolz darauf,

00:34:49.480 --> 00:34:53.480
CF: dass er quasi den ersten C-Typen JIT gemerged hat und geschrieben hat.

00:34:51.360 --> 00:35:13.360
Dominik: Ja, das ist interessant.

00:34:53.480 --> 00:34:55.480
CF: Und das ist nämlich der JIT, der benutzt wird,

00:34:55.480 --> 00:35:00.480
CF: um besseres Profiling machen zu können.

00:35:00.480 --> 00:35:04.480
CF: Und das funktioniert mit dem Linux Perf Profiler.

00:35:04.480 --> 00:35:07.480
CF: Und das Problem, wenn man jetzt so ein, also der Perf Profiler

00:35:07.480 --> 00:35:09.480
CF: ist eigentlich so ein Profiler für C.

00:35:09.480 --> 00:35:11.480
CF: Also man kann halt sehen, was macht der Kernel,

00:35:11.480 --> 00:35:14.480
CF: was macht der Linux Kernel oder was machen eben auch die C-Programme,

00:35:13.360 --> 00:35:41.360
Dominik: Ja, das ist interessant.

00:35:14.480 --> 00:35:16.480
CF: die im User Space laufen und man kann eben sehen,

00:35:16.480 --> 00:35:19.480
CF: die und die C-Funktionen werden jetzt gerade so und so oft ausgeführt.

00:35:19.480 --> 00:35:23.480
CF: Das ist so ein Sampling Profiler, also der Profiling-Umwelt ist sehr gering.

00:35:23.480 --> 00:35:27.480
CF: Das Problem ist jetzt aber, dass wenn man quasi Python-Programme profilt,

00:35:27.480 --> 00:35:29.480
CF: dann sieht man natürlich jetzt gar nicht, welche Python-Funktionen

00:35:29.480 --> 00:35:33.480
CF: wie viel Zeit verbrauchen, sondern man sieht dann die ganze Zeit nur,

00:35:33.480 --> 00:35:36.480
CF: dass halt irgendwelche Interpreter-Funktionen ausgeführt werden.

00:35:36.480 --> 00:35:39.480
CF: Und da gibt es jetzt eben dieses neue Feature, den Perf JIT.

00:35:39.480 --> 00:35:42.480
CF: Und da ist die Idee, dass man so eine ganz, ganz kleine,

00:35:41.360 --> 00:35:49.360
Dominik: Ja, das ist interessant.

00:35:42.480 --> 00:35:45.480
CF: irgendwie ein paar wenige Maschinencode-Instruktionen

00:35:45.480 --> 00:35:48.480
CF: lange Funktionen generiert zur Laufzeit.

00:35:48.480 --> 00:35:52.480
CF: Und für jede Python-Funktion eben genau eine solcher Funktion.

00:35:52.480 --> 00:35:55.480
CF: Und das hat dann den Vorteil, dass Perf eben die ganzen Python-Funktionen

00:35:55.480 --> 00:35:57.480
CF: voneinander unterscheiden kann.

00:35:57.360 --> 00:36:07.360
Dominik: Ja, das ist interessant.

00:35:57.480 --> 00:36:01.480
CF: Wenn man eben nicht nur eine interpretierige Python-Code-Funktion

00:36:01.480 --> 00:36:05.480
CF: dann sieht in Perf, sondern man sieht dann eben diese neu generierten

00:36:05.480 --> 00:36:08.480
CF: Assembly-Funktionen an Adresse sowieso.

00:36:07.360 --> 00:36:19.360
Dominik: Ja, das ist interessant.

00:36:08.480 --> 00:36:12.480
CF: Die entspricht eben der Python-Funktion F, wie auch immer.

00:36:12.480 --> 00:36:16.480
CF: Und so kann man dann eben mit Perf sehen, in welcher Python-Funktion

00:36:16.480 --> 00:36:18.480
CF: man lange Zeit verbraucht hat.

00:36:18.480 --> 00:36:24.480
CF: Es ist erstaunlich umständlich, aber Profiling ist auch echt

00:36:19.360 --> 00:36:37.360
Dominik: Ja, das ist interessant.

00:36:20.260 --> 00:36:25.260
Jochen: [kein Ton]

00:36:24.480 --> 00:36:26.480
CF: einfach ultra kompliziert.

00:36:26.480 --> 00:36:29.480
CF: Also, man hat jetzt hier so eine ganze Menge,

00:36:29.480 --> 00:36:32.480
CF: die man einfach einfach einfach einfach einfach einfach einfach

00:36:30.260 --> 00:36:40.260
Jochen: [kein Ton]

00:36:32.480 --> 00:36:36.480
CF: einfach ultra kompliziert.

00:36:36.480 --> 00:36:42.480
CF: Also es gibt ja es gibt ja irgendwie so eine große Sammlung an Profilern

00:36:37.360 --> 00:36:51.360
Dominik: Ja, das ist interessant.

00:36:42.480 --> 00:36:45.480
CF: für Python für andere Sprachen, aber cProfile hat halt einfach

00:36:45.480 --> 00:36:47.480
CF: einen riesen Overhead.

00:36:47.480 --> 00:36:49.480
CF: Dann gibt es verschiedene Sampling-Profiler für Python.

00:36:49.480 --> 00:36:52.480
CF: Wie heißt dieser? PySpy oder so? Der funktioniert, glaube ich, ziemlich gut.

00:36:50.260 --> 00:36:58.260
Jochen: [kein Ton]

00:36:51.360 --> 00:37:19.360
Dominik: Ja, das ist interessant.

00:36:52.480 --> 00:36:54.480
CF: Habt ihr den mal benutzt?

00:36:58.260 --> 00:37:08.260
Jochen: [kein Ton]

00:37:01.480 --> 00:37:03.480
CF: Aber heute war das, glaube ich, eine UI nur, oder?

00:37:03.480 --> 00:37:06.480
CF: Wo die Samples herkommen, weiß ich nicht so genau.

00:37:06.480 --> 00:37:09.480
CF: Ja, und dann gibt es also unseren quasi, WMProf, der ist aber nicht mehr

00:37:09.480 --> 00:37:12.480
CF: so richtig maintained. Also auch PyPy schon, aber CPython nicht so richtig.

00:37:12.480 --> 00:37:15.480
CF: Ist auch Sampling. Also Sampling heißt halt, dass man quasi nicht

00:37:15.480 --> 00:37:18.480
CF: jeden Funktionsaufruf mitschreibt, was halt sehr sehr hohen Overhead hat,

00:37:18.480 --> 00:37:21.480
CF: sondern einfach nur so tausendmal pro Sekunde halt guckt, welche Funktionen

00:37:19.360 --> 00:37:29.360
Dominik: Ja, das ist interessant.

00:37:21.480 --> 00:37:24.480
CF: gerade auf dem Stack sind und dann sagt, so statistisch gesehen,

00:37:24.480 --> 00:37:27.480
CF: sind das die Funktionen, die dann viel Zeit brauchen.

00:37:27.480 --> 00:37:31.480
CF: Und Perf ist halt auch so einer und der Vorteil von diesem Sampling-Ansatz

00:37:31.480 --> 00:37:34.480
CF: ist, dass man den Profiling-Overhead eben beliebig klein machen kann.

00:37:34.480 --> 00:37:37.480
CF: Man kann halt die Anzahl der Samples immer kleiner machen.

00:37:37.480 --> 00:37:40.480
CF: Und wenn es dann nur noch zehn Samples sind, dann ist es halt quasi

00:37:40.480 --> 00:37:42.480
CF: genauso schnell, wie es vorher auch war.

00:37:42.480 --> 00:37:45.480
CF: Man hat aber auch schlechtere Informationen dann sozusagen.

00:37:45.480 --> 00:37:48.480
CF: Also man kann dann quasi die Abwägung zwischen Genauigkeit der Informationen,

00:37:48.480 --> 00:37:52.480
CF: die man hat, und Overhead beliebig ausbalancieren.

00:37:52.480 --> 00:37:55.480
CF: Und Perf funktioniert halt sehr gut, wenn man da gute Informationen

00:37:55.480 --> 00:37:59.480
CF: darüber kriegt, was auf dem C-Level funktioniert.

00:37:59.480 --> 00:38:02.480
CF: Aber die Information, welche Python-Funktion da jetzt gerade involviert ist,

00:38:02.480 --> 00:38:05.480
CF: die geht halt verloren. Und die kann man dann eben wieder zurückkriegen

00:38:05.480 --> 00:38:10.480
CF: mit diesem neuen Perf-Integration-Feature, das jetzt in 3.13 released wurde.

00:38:10.480 --> 00:38:13.480
CF: Aber es ist auf jeden Fall frickelig. Also ich glaube, auf Mac ist es ja auch

00:38:13.480 --> 00:38:18.480
CF: total schwierig, weil man braucht halt so ausführbare Blöcke von Maschinen-Code.

00:38:18.480 --> 00:38:22.480
CF: Und Apple hat da halt auch einiges an Security-Features.

00:38:22.480 --> 00:38:27.480
CF: Man muss dann quasi sicherstellen, dass man so einen Codeblock eben

00:38:27.480 --> 00:38:30.480
CF: so hin und her wechselt zwischen "Ich kann den Codeblock schreiben

00:38:30.480 --> 00:38:33.480
CF: und ich kann ihn ausführen." Also man kann ihn nie gleichzeitig

00:38:33.480 --> 00:38:37.480
CF: schreibbar und ausführbar haben, um eben so Security-Exploits

00:38:37.480 --> 00:38:42.480
CF: unwahrscheinlicher zu machen. Und bis man das ganz genau richtig hingekriegt hat,

00:38:38.260 --> 00:38:46.260
Jochen: [kein Ton]

00:38:42.480 --> 00:38:45.480
CF: das ist tricky. Wobei Perf ist eigentlich nur ein Ledungsprojekt.

00:38:45.480 --> 00:38:48.480
CF: Insofern habe ich, glaube ich, gerade Quatsch gesagt.

00:38:46.260 --> 00:38:56.260
Jochen: [kein Ton]

00:38:48.480 --> 00:38:57.480
CF: Ah ja.

00:38:57.480 --> 00:39:11.480
CF: Unbedankt haben. Von einer Mac-Version zur nächsten.

00:39:11.480 --> 00:39:18.480
CF: Ja, ich finde es cool, dass es Leute gibt, die sich dann wirklich mit den Linkern

00:39:18.480 --> 00:39:21.480
CF: auf allen Plattformen herumschlagen, um dieses Problem zu lösen.

00:39:21.480 --> 00:39:43.480
CF: Ja.

00:39:29.360 --> 00:39:41.360
Dominik: Ja, das ist interessant.

00:39:41.360 --> 00:40:09.360
Dominik: Ja, das ist interessant.

00:39:43.480 --> 00:40:11.480
CF: Ja.

00:40:09.360 --> 00:40:11.360
Dominik: Was macht das denn überhaupt, der G...

00:40:11.360 --> 00:40:13.360
Dominik: Ja.

00:40:11.480 --> 00:40:26.480
CF: Ja.

00:40:15.360 --> 00:40:25.360
Dominik: Ja.

00:40:26.480 --> 00:40:46.480
CF: Ja.

00:40:27.640 --> 00:40:47.640
Johannes: Ich hoffe, dass ihr mich nicht vergessen habt.

00:40:46.480 --> 00:41:01.480
CF: Ja.

00:40:47.640 --> 00:40:57.640
Johannes: Ich hoffe, dass ihr mich nicht vergessen habt.

00:41:01.480 --> 00:41:04.480
CF: Also ganz allgemein, die ganzen Darmstrukturen sind halt erstmal nicht

00:41:04.480 --> 00:41:28.480
CF: Threat-safe. Also wird alles kaputt gehen.

00:41:15.360 --> 00:41:35.360
Dominik: Ja.

00:41:28.480 --> 00:41:32.480
CF: Es gab noch ein älteres, aber ja. Also alle paar Jahre kommt mal jemand

00:41:32.480 --> 00:41:37.480
CF: und baut den Deal aus. Ja.

00:41:35.360 --> 00:41:45.360
Dominik: Ja.

00:41:37.480 --> 00:41:40.480
CF: Ja, genau. Also es war wirklich so 1.6. oder irgendwie so was ganz frühes,

00:41:40.480 --> 00:42:04.480
CF: wo das dann die ersten ... Also die Single-Core-Performance, genau.

00:42:04.480 --> 00:42:33.480
CF: Genau.

00:42:05.360 --> 00:42:17.360
Dominik: Ja.

00:42:17.360 --> 00:42:37.360
Dominik: Ja.

00:42:33.480 --> 00:42:36.480
CF: Also an dem GARBIS-Projekt hatten die quasi bei diesen Gilectomy-Versuchen

00:42:36.480 --> 00:42:40.480
CF: auch nichts geändert. Was sie gemacht haben, ist jedem Objekt einen Lock zu geben.

00:42:37.360 --> 00:42:47.360
Dominik: Ja.

00:42:40.480 --> 00:42:43.480
CF: Und immer, wenn ein Threat mit dem Objekt eben interagieren wollte,

00:42:43.480 --> 00:42:46.480
CF: insbesondere wenn eben der Reference-Count verändert wird,

00:42:46.480 --> 00:42:50.480
CF: musst du halt dir erstmal das Lock holen für das Objekt.

00:42:50.480 --> 00:42:54.480
CF: Und weil halt ständig, um irgendeine Operation mit dem Objekt machen zu können,

00:42:54.480 --> 00:42:57.480
CF: du halt ständig an dem Reference-Count herumoperierst,

00:42:57.360 --> 00:43:19.360
Dominik: Ja.

00:42:57.480 --> 00:43:00.480
CF: musst du halt ständig auf das Lock warten.

00:43:00.480 --> 00:43:04.480
CF: Und das hat halt die bisherigen Versuche, den GIL zu entfernen,

00:43:04.480 --> 00:43:06.480
CF: einfach sehr, sehr teuer gemacht.

00:43:06.480 --> 00:43:16.480
CF: Also die Single-Threat-Performance eben komplett ruiniert.

00:43:16.480 --> 00:43:19.480
CF: Ja, jetzt wird es super kompliziert.

00:43:19.360 --> 00:43:29.360
Dominik: Ja.

00:43:19.480 --> 00:43:22.480
CF: Also wir haben jetzt ... Genau. Es gibt den GIL.

00:43:22.480 --> 00:43:25.480
CF: Der GIL verhindert, dass mehr als ein Threat-Python-Call ausführen kann.

00:43:25.480 --> 00:43:30.480
CF: Also gleichzeitig auf einem Core.

00:43:30.480 --> 00:43:33.480
CF: Jetzt kommt eben der nächste Versuch.

00:43:33.480 --> 00:43:40.480
CF: Und das ist von Sam Gross bei MITHA über viele Jahre lang eben probiert worden.

00:43:40.480 --> 00:43:46.480
CF: Und der hat einige sehr clevere neue Ideen da reingebracht,

00:43:46.480 --> 00:43:52.480
CF: um zu versuchen, eben die Verlangsamung für Single-Threat-Performance,

00:43:52.480 --> 00:43:54.480
CF: so weit es geht, zu minimieren.

00:43:54.480 --> 00:43:58.480
CF: Und da gibt es eben so eine ganze Bandbreite an Optimierungen,

00:43:58.480 --> 00:44:01.480
CF: womit er dann eben versucht, genau die Probleme in den Griff zu kriegen.

00:44:01.480 --> 00:44:07.480
CF: Und eine davon ist eben die Beobachtung,

00:44:07.480 --> 00:44:11.480
CF: dass die allermeisten Objekte, die werden halt trotzdem nur von einem Threat benutzt.

00:44:11.480 --> 00:44:14.480
CF: Also wenn ich halt eine Funktion habe, die irgendwie eine Liste erstellt

00:44:14.480 --> 00:44:16.480
CF: und da was reinappendet und so weiter,

00:44:16.480 --> 00:44:19.480
CF: selbst wenn auf ganz vielen anderen Threats halt noch Sachen laufen,

00:44:19.480 --> 00:44:23.480
CF: kommt halt kein anderer Threat erstmal standardmäßig an diese Liste ran.

00:44:23.480 --> 00:44:26.480
CF: Das heißt, die erste Optimierung ist zu sagen,

00:44:26.480 --> 00:44:32.480
CF: für die ganzen lokalen Objekte, die ich also nur von einem Threat überhaupt jemals anfasse,

00:44:32.480 --> 00:44:35.480
CF: muss ich für das Updaten der Reference Counts eben nicht locken.

00:44:35.480 --> 00:44:40.480
CF: Also das ist quasi die wichtigste Optimierung.

00:44:40.480 --> 00:44:42.480
CF: Genau, das heißt Biased Reference Counting,

00:44:42.480 --> 00:44:48.480
CF: weil quasi dafür gesorgt wird, dass man eben nicht geshared Objekte,

00:44:48.480 --> 00:44:51.480
CF: die nur von einem Threat eben erreichbar sind,

00:44:51.480 --> 00:44:56.480
CF: dass man da eben das Locking quasi sein lassen kann.

00:44:56.480 --> 00:44:59.480
CF: Jetzt gibt es aber natürlich eine ganze andere Klasse an Objekten,

00:44:59.480 --> 00:45:03.480
CF: die werden halt von ganz vielen verschiedenen Threats angefasst.

00:45:03.480 --> 00:45:08.480
CF: Also halt alles, was die ganzen Buildings, also NUN, die ganzen Typen.

00:45:08.480 --> 00:45:10.480
CF: Und dafür gibt es dann also wieder einen ganz anderen Ansatz.

00:45:10.480 --> 00:45:13.480
CF: Und da ist nämlich die Idee, dass man da halt sagt,

00:45:13.480 --> 00:45:15.480
CF: diese Objekte, die können eh nicht sterben.

00:45:15.480 --> 00:45:20.480
CF: Also so was wie NUN, NUN gibt es halt einfach immer.

00:45:20.480 --> 00:45:23.480
CF: Und das gilt halt für ganz, ganz viele andere Arten von Objekten auch.

00:45:23.480 --> 00:45:25.480
CF: Die meisten Typen gibt es halt immer.

00:45:25.480 --> 00:45:32.480
CF: Und die werden dann so unsterblich gemacht.

00:45:29.360 --> 00:45:31.360
Dominik: Ist das dann ein Singleton?

00:45:31.360 --> 00:46:00.360
Dominik: [Aufnahmellärm]

00:45:32.480 --> 00:45:35.480
CF: Also NUN ist auch ein Singleton, ja, aber das ist nicht das einzige Kriterium.

00:45:35.480 --> 00:45:37.480
CF: Man kann sich schon vorstellen, dass es Singletons gibt,

00:45:37.480 --> 00:45:39.480
CF: die halt vielleicht auch sterben könnten,

00:45:39.480 --> 00:45:41.480
CF: also die man vielleicht wegräumen will.

00:45:41.480 --> 00:45:44.480
CF: Aber es gibt also die ganzen eingebauten Sachen,

00:45:44.480 --> 00:45:48.480
CF: die werden einfach nie garbage collected.

00:45:48.480 --> 00:45:50.480
CF: Und deswegen kann man da eben auch sagen,

00:45:50.480 --> 00:45:52.480
CF: da kriegt jetzt der Reference Count irgendwie so einen speziellen Flag.

00:45:52.480 --> 00:45:56.480
CF: Und dann erhöht und senkt man den Reference Count eben auch nicht.

00:45:56.480 --> 00:45:59.480
CF: Und dann muss man die auch wieder nicht locken.

00:45:59.480 --> 00:46:02.480
CF: Und dann gibt es noch den dritten Ansatz.

00:46:00.360 --> 00:46:23.360
Dominik: [Aufnahmellärm]

00:46:02.480 --> 00:46:04.480
CF: Und das ist das sogenannte Deferred Reference Counting.

00:46:04.480 --> 00:46:06.480
CF: Und da verstehe ich die ganzen Details auch nicht komplett.

00:46:06.480 --> 00:46:12.480
CF: Aber da ist eben die Idee, dass man eben das Erhöhen und Senken

00:46:12.480 --> 00:46:15.480
CF: des Reference Count nicht mehr die ganze Zeit up-to-date macht,

00:46:15.480 --> 00:46:20.480
CF: um eben zu ver- also da geht es um Objekte, die so dazwischen sind,

00:46:20.480 --> 00:46:23.480
CF: also die von einem, mehr als einem Thread erreicht werden können.

00:46:23.360 --> 00:46:27.360
Dominik: Also man erhöht, aber man reduziert das nicht oder beides nicht?

00:46:23.480 --> 00:46:30.480
CF: Ich glaube beides nicht.

00:46:27.360 --> 00:46:56.360
Dominik: [Aufnahmellärm]

00:46:30.480 --> 00:46:33.480
CF: Also, und dann, das sorgt aber dafür, dass wenn der Reference Count null wird,

00:46:33.480 --> 00:46:35.480
CF: dann kann man die auch nicht sofort einsammeln,

00:46:35.480 --> 00:46:37.480
CF: sondern da muss man eben warten.

00:46:37.480 --> 00:46:40.480
CF: Und dann warten, bis alle Threads zu irgendeinem wohl definierten Punkt kommen.

00:46:40.480 --> 00:46:42.480
CF: Und dann kann man schauen,

00:46:42.480 --> 00:46:45.480
CF: ob es nicht noch irgendwelche References in den Stack Frames gibt oder so,

00:46:45.480 --> 00:46:47.480
CF: die dann noch dazu gezählt werden müssen.

00:46:47.480 --> 00:46:49.480
CF: Deswegen eben deferred.

00:46:49.480 --> 00:46:51.480
CF: Und nur wenn man da dann eben überall nachgeschaut hat und feststellt,

00:46:51.480 --> 00:46:55.480
CF: oh, okay, das Objekt, das ist jetzt wirklich auch von keinem Frame-Objekt mehr erreichbar,

00:46:55.480 --> 00:46:57.480
CF: dann kann ich das wirklich wegräumen.

00:46:56.360 --> 00:46:58.360
Dominik: [Aufnahmellärm]

00:46:57.480 --> 00:47:04.480
CF: Und das hat auch komplizierte Interaktionen mit dem Memory Allocator.

00:47:00.360 --> 00:47:28.360
Dominik: [Aufnahmellärm]

00:47:04.480 --> 00:47:09.480
CF: Da wechselt nämlich die freethreading-Version auch zu Mimalock.

00:47:09.480 --> 00:47:13.480
CF: Das ist so ein von Microsoft geschriebener C-Memory Allocator,

00:47:13.480 --> 00:47:17.480
CF: der eben auch besonders gut mit Multithreading interagiert.

00:47:17.480 --> 00:47:21.480
CF: Und da wird auf eine für mich noch nicht ganz verständliche Art und Weise

00:47:21.480 --> 00:47:25.480
CF: eben mit besonderen Mimalock-Features dann erreicht,

00:47:25.480 --> 00:47:27.480
CF: dass genau das Richtige passiert.

00:47:26.260 --> 00:47:34.260
Jochen: [kein Ton]

00:47:27.480 --> 00:47:31.480
CF: Aber also da bin ich noch nicht, ja.

00:47:28.360 --> 00:47:31.360
Dominik: Das ist immer genau das richtige, was hier, das ist immer toll.

00:47:31.360 --> 00:47:59.360
Dominik: [Aufnahmellärm]

00:47:31.480 --> 00:47:41.480
CF: Ja, ich glaube, das ist genau.

00:47:34.260 --> 00:47:44.260
Jochen: [kein Ton]

00:47:41.480 --> 00:47:53.480
CF: Also Vorbemerkung ist, das gilt alles nur für Objekte,

00:47:53.480 --> 00:47:55.480
CF: die eben von mehr als einem Thread erreicht werden können.

00:47:55.480 --> 00:47:58.480
CF: Also genau, aber für die hast du absolut recht.

00:47:58.480 --> 00:48:03.480
CF: Da ist eben eine Zahl drin, die nicht unbedingt wirklich alle References

00:47:59.360 --> 00:48:09.360
Dominik: [Aufnahmellärm]

00:48:03.480 --> 00:48:07.480
CF: von allen Threads dann widerspiegelt.

00:48:07.480 --> 00:48:10.480
CF: Und um das Objekt dann wirklich wegräumen zu können,

00:48:09.360 --> 00:48:33.360
Dominik: [Aufnahmellärm]

00:48:10.480 --> 00:48:14.480
CF: muss man halt nochmal nachschauen, ob das wirklich alles so gestimmt hat.

00:48:14.480 --> 00:48:37.480
CF: Ja, absolut.

00:48:33.360 --> 00:48:37.360
Dominik: Also so ein bisschen so, als wenn du die Box aufmachst und guckst, ob die Katze noch lebt.

00:48:37.360 --> 00:48:39.360
Dominik: [Aufnahmellärm]

00:48:37.480 --> 00:49:05.480
CF: Ja.

00:48:43.360 --> 00:49:12.360
Dominik: [Aufnahmellärm]

00:49:05.480 --> 00:49:09.480
CF: Ich glaube, Eventual Consistency ist auf jeden Fall ein super Gedankenmodell,

00:49:07.640 --> 00:49:27.640
Johannes: Ich hoffe, dass ihr mich nicht vergessen habt.

00:49:09.480 --> 00:49:15.480
CF: weil, also Eventual Consistency wird ja auch quasi aus den gleichen Gründen eingeführt.

00:49:12.360 --> 00:49:22.360
Dominik: [Aufnahmellärm]

00:49:15.480 --> 00:49:18.480
CF: Also natürlich kann ich, will ich, eigentlich ist es besser,

00:49:18.480 --> 00:49:20.480
CF: wenn meine Information halt die ganze Zeit consistent ist.

00:49:20.480 --> 00:49:24.480
CF: Aber das hat halt im Datenbankbereich dann auch entsprechende Nachteile,

00:49:22.360 --> 00:49:44.360
Dominik: [Aufnahmellärm]

00:49:24.480 --> 00:49:27.480
CF: Performance-Nachteile.

00:49:27.480 --> 00:49:28.480
CF: Genau.

00:49:27.640 --> 00:49:37.640
Johannes: Ich hoffe, dass ihr mich nicht vergessen habt.

00:49:28.480 --> 00:49:33.480
CF: Und quasi aus den gleichen Gründen führe ich halt quasi im Field,

00:49:33.480 --> 00:49:35.480
CF: also auf einem ganz anderen Maßstab natürlich,

00:49:35.480 --> 00:49:41.480
CF: aber werden die Deferred Reference Counts verwendet.

00:49:37.640 --> 00:49:41.640
Johannes: Ja, cool. Super coole Sache.

00:49:41.480 --> 00:49:42.480
CF: Ja, genau.

00:49:41.640 --> 00:50:05.640
Johannes: Ja, cool. Super cool.

00:49:42.480 --> 00:49:47.480
CF: Aber es ist halt wie gesagt auch bisher noch experimentell und standardmäßig nicht eingebaut.

00:49:44.360 --> 00:50:09.360
Dominik: [Aufnahmellärm]

00:49:47.480 --> 00:49:49.480
CF: Da gibt es auch noch so ein paar Nachteile.

00:49:49.480 --> 00:49:54.480
CF: Die Single Thread Performance ist auch quasi in der Free Threading Version schlechter im Moment.

00:49:54.480 --> 00:49:58.480
CF: Ich glaube vor allem, weil sie im Moment eben noch dieses Bytecode-Rewriting,

00:49:58.480 --> 00:50:00.480
CF: wo wir vorhin in der JIT-Sektion drüber gesprochen haben,

00:50:00.480 --> 00:50:06.480
CF: noch abschalten müssen, eben aus dem Grund, dass wenn ich quasi mehr als einen Thread habe,

00:50:05.640 --> 00:50:15.640
Johannes: Ja, cool. Super cool.

00:50:06.480 --> 00:50:10.480
CF: der die gleiche Python-Version ausführt und alle wollen jetzt den Bytecode umschreiben,

00:50:09.360 --> 00:50:37.360
Dominik: [Aufnahmellärm]

00:50:10.480 --> 00:50:17.480
CF: dann habe ich da eben auch wieder quasi Mutationen derselben Datenstruktur von einem Thread.

00:50:17.480 --> 00:50:18.480
CF: Und da will ich das nicht immer locken.

00:50:18.480 --> 00:50:22.480
CF: Und deswegen haben sie das bisher einfach abgeschaltet in der Free Threading Version.

00:50:22.480 --> 00:50:27.480
CF: Und das sorgt dann eben für, weiß ich nicht, 10 Prozent, 20 Prozent Verschlechterung

00:50:27.480 --> 00:50:30.480
CF: der Single Threading Performance.

00:50:30.480 --> 00:50:35.480
CF: Oder es gibt eben, ein anderes Problem ist, es gibt eben einfach ganz, ganz viel Python-Code,

00:50:35.480 --> 00:50:39.480
CF: der so in der Welt ist, in irgendwelchen Bibliotheken, der einfach nicht Thread-safe ist.

00:50:37.360 --> 00:50:39.360
Dominik: [Aufnahmellärm]

00:50:39.480 --> 00:50:44.480
CF: Weil bisher konnte man sich halt so ein bisschen immer so durchmogeln mit der Tatsache,

00:50:44.480 --> 00:50:47.480
CF: dass meistens ist man halt vom Gil geschützt.

00:50:45.640 --> 00:51:03.640
Johannes: Ja, cool. Super cool.

00:50:47.480 --> 00:50:51.480
CF: Und so viel Multi-Threaded Python-Code gibt es halt auch oft nicht.

00:50:51.480 --> 00:50:59.480
CF: Und deswegen finden wir jetzt wahrscheinlich die nächsten 10 Jahre Locking-Bugs in allen PyPI-Bibliotheken.

00:50:59.480 --> 00:51:03.480
CF: Und für die C-Extensions gilt das natürlich erst recht.

00:51:03.480 --> 00:51:17.480
CF: Ja, sobald ich quasi was mache, was dann wirklich weit weg von jedem Python-Objekt, ja.

00:51:03.640 --> 00:51:15.640
Johannes: Ja, aber die C-Extensions hatten ja vorher schon die Möglichkeit, den GIL freizugeben. Also NumPy zum Beispiel.

00:51:15.640 --> 00:51:23.640
Johannes: Genau, was aus dem Python Memory Management rausgeht, dann kann ich sagen, ah, das brauche ich gerade gar nicht.

00:51:17.480 --> 00:51:30.480
CF: Also die große Matrix-Multiplikation, die NumPy macht, die hat halt mit Python dann nichts mehr zu tun.

00:51:23.640 --> 00:51:31.640
Johannes: Ja, gut, okay, FootGuns, ich meine ...

00:51:30.480 --> 00:51:39.480
CF: Und die konnte halt dann auch schon auf dem extra Core dann den Lüfter heißlaufen lassen.

00:51:31.640 --> 00:51:39.640
Johannes: Genau.

00:51:39.480 --> 00:51:42.480
CF: Aber genau.

00:51:39.640 --> 00:51:45.640
Johannes: Ja, das sind die wenigsten Operationen, das ist mir schon klar.

00:51:42.480 --> 00:52:04.480
CF: [kein Ton]

00:51:45.640 --> 00:51:51.640
Johannes: Die prinzipielle Möglichkeit gab es vorher schon. Wenn ich mein eigenes Memory Management mache, brauche ich auch, bin ich nicht auf den GIL angewiesen.

00:51:51.640 --> 00:52:05.640
Johannes: Okay, cool.

00:52:04.480 --> 00:52:08.480
CF: Ja, also das ist auch in der Standard-Bibliothek, gibt es einfach ganz viele solche Stellen.

00:52:05.640 --> 00:52:33.640
Johannes: Ja.

00:52:08.480 --> 00:52:12.480
CF: Wir hatten heute so einen Bug-Report.

00:52:12.480 --> 00:52:16.480
CF: Es gibt das Line-Cache-Modul, das kennt keiner, weil man das quasi selber nie benutzt.

00:52:16.480 --> 00:52:24.480
CF: Das ist quasi dafür da, dass wenn ich Tracebacks kriege, dass die Source-Code-Zeilen halt quasi aus den Python-Dateien geladen werden zum Anzeigen.

00:52:24.480 --> 00:52:27.480
CF: Und das wird gecached, damit ich nicht jedes Mal die Dateien eröffnen muss.

00:52:27.480 --> 00:52:31.480
CF: Und wenn ich jetzt aber quasi Python-Code zu Laufzeiten erzeugt mit exec oder so,

00:52:31.480 --> 00:52:35.480
CF: dann kann ich quasi auch da dann in den Line-Cache so Sachen reinschreiben.

00:52:33.640 --> 00:52:43.640
Johannes: Ja.

00:52:35.480 --> 00:52:41.480
CF: Und die will ich aber vielleicht auch wieder löschen, damit eben der Cache nicht mehr und mehr Speicher verwendet.

00:52:41.480 --> 00:52:46.480
CF: Und dann hatten wir einen Bug von Sympy oder so, die schreiben da eben so Sachen in den Line-Cache rein und löschen die dann auch wieder.

00:52:46.480 --> 00:52:49.480
CF: Und dann stellt sich halt raus, dass der Line-Cache nicht thread-safe ist.

00:52:49.480 --> 00:52:58.480
CF: Also wenn ich das quasi von mehreren Threads mache, dann kriege ich halt irgendwelche komischen Exceptions von irgendwelchen internen Line-Cache-Funktionen, von denen ich noch nie gehört habe.

00:52:53.640 --> 00:53:17.640
Johannes: Ja.

00:52:58.480 --> 00:53:09.480
CF: Und ja, also wenn, klar, das ist jetzt alles schon extra ultra speziell, aber so Stellen wird es halt in der Standardbibliothek auch noch an anderen Plätzen geben,

00:53:09.480 --> 00:53:12.480
CF: dass man halt dann feststellt, oh, okay, es gibt hier Python-Code.

00:53:12.480 --> 00:53:17.480
CF: Da hat halt noch nie jemand drüber nachgedacht, was passiert eigentlich, wenn ich das auf vier Threads gleichzeitig ausführe.

00:53:17.640 --> 00:53:23.640
Johannes: Ja, und eigentlich sollte man sich ja da auch keine Gedanken, beziehungsweise das ist ja der Ansatz, dass man sich keine Gedanken darüber machen soll.

00:53:18.480 --> 00:53:24.480
CF: Also man wird da in Python schon drüber nachdenken müssen.

00:53:23.640 --> 00:53:29.640
Johannes: Viele andere Sprachen lösen das Problem halt auf eine andere Art und Weise, indem sie sagen, da musst du jetzt halt selber explizit darüber nachdenken.

00:53:24.480 --> 00:53:31.480
CF: Also wenn du halt so was hast, wie du hast irgendein globales Dictionary und das wird jetzt von zwei Threads mutiert und ich habe aber in beiden eine Iteration darüber,

00:53:29.640 --> 00:53:37.640
Johannes: Ist ja der Ansatz, dass man es in Python nicht machen muss.

00:53:31.480 --> 00:53:35.480
CF: dann sind halt wahrscheinlich die Varianten der Schleife kaputt, die ich dann auch noch mal nachdenken muss.

00:53:35.480 --> 00:53:45.480
CF: Egal, ob die Datenstruktur jetzt, also klar, die Datenstruktur soll nicht kaputt gehen, aber ich kann ja trotzdem dann plötzlich den Key verlieren, den ich erwarte, dass er noch in dem Dictionary drin ist.

00:53:37.640 --> 00:53:47.640
Johannes: Ja.

00:53:45.480 --> 00:53:50.480
CF: Das ist, das ist ja auch so ein bisschen ein Problem, dass man da so ein bisschen auf den Weg geht.

00:53:47.640 --> 00:53:57.640
Johannes: Ja, oder auch ...

00:53:50.480 --> 00:53:55.480
CF: Also ich habe da jetzt einen anderen Punkt, der ist ja auch ein bisschen anders, aber ich glaube, das ist auch so ein bisschen ein Problem, dass man da so ein bisschen auf den Weg geht.

00:53:55.480 --> 00:54:00.480
CF: Also ich habe da jetzt einen anderen Punkt, der ist ja auch ein bisschen anders, aber ich glaube, das ist ja auch so ein bisschen ein Problem, dass man da so ein bisschen auf den Weg geht.

00:53:57.640 --> 00:54:17.640
Johannes: Ja, auch diese ganzen Probleme, die bei Multithreaded Programming auftreten, also allein, wenn ich irgendeine Variable habe, die ich inkrementieren möchte, dann da muss ich ja schon irgendwie einen Mechanismus haben, der Multithreading ermöglicht, aber das ist ja nochmal eine ganz andere Ebene.

00:54:00.480 --> 00:54:15.480
CF: [Stille]

00:54:15.480 --> 00:54:19.480
CF: Ja, klar, solche Bugs haben wir definitiv auch schon gesehen.

00:54:17.640 --> 00:54:37.640
Johannes: Ja, die sind ja auch leicht. Also ich meine, die hat man ja sofort.

00:54:19.480 --> 00:54:31.480
CF: Also sowas wie self.counter=1, das ist halt nicht atomic in der Freethreading-Version.

00:54:31.480 --> 00:54:37.480
CF: Also wenn ich da mehrere Files habe, die das machen, dann könnten halt komische Sachen passieren.

00:54:37.480 --> 00:54:45.480
CF: [Stille]

00:54:37.640 --> 00:54:51.640
Johannes: Aber da gab es auch früher schon so Stolperfallen, wo manche Sachen in Python Atomic aussahen und es dann aber irgendwie doch nicht waren.

00:54:44.260 --> 00:54:44.260
Jochen: [kein Ton]

00:54:44.260 --> 00:55:04.260
Jochen: [kein Ton]

00:54:45.480 --> 00:54:54.480
CF: Genau, also viele von diesen Bugs, die sind quasi bisher auch schon, das sind jetzt quasi keine Bugs, die nur in Freethreading wirklich vorhanden sind.

00:54:51.640 --> 00:55:19.640
Johannes: Ja.

00:54:54.480 --> 00:55:04.480
CF: Das sind quasi latente Bugs, die es schon immer gibt, die auch quasi in der ganz normalen GIL-Version von Python Bugs sind und Crashes verursachen können.

00:55:04.260 --> 00:55:14.260
Jochen: [kein Ton]

00:55:04.480 --> 00:55:11.480
CF: Nur bisher waren die quasi einfach viel unwahrscheinlicher, dass man die wirklich dann auch trifft, diese Bugs.

00:55:11.480 --> 00:55:21.480
CF: Aber dadurch, dass jetzt eben mehr Leute versuchen werden, mit Multithreading in der Freethreading-Version Programme dann schneller laufen zu lassen,

00:55:19.640 --> 00:55:31.640
Johannes: Ja.

00:55:21.480 --> 00:55:26.480
CF: wird die Wahrscheinlichkeit, dass man diese Bugs halt dann auch quasi in echt sieht, die geht halt hoch.

00:55:26.480 --> 00:55:34.480
CF: Das heißt, also ja, ich meine das ernst. Wir werden jetzt wahrscheinlich zehn Jahre lang Bugs in allen Bibliotheken finden, die irgendwas mit Threading zu tun haben.

00:55:31.640 --> 00:55:45.640
Johannes: Ja.

00:55:34.480 --> 00:55:40.480
CF: [Stille]

00:55:40.480 --> 00:55:51.480
CF: Ja, genau, also das ist ja auch eine der großen Schwierigkeiten des Freethreading-Projekts.

00:55:45.640 --> 00:56:05.640
Johannes: Und woran erkennt man das?

00:55:51.480 --> 00:55:56.480
CF: Das ist sich quasi bei allen eingebauten Containern, also wie Listen und Dictionaries und so weiter, jetzt überlegen müssen,

00:55:56.480 --> 00:56:03.480
CF: welche der Methoden wollen wir eigentlich als atomar verstanden haben und welche halt dann auch nicht.

00:56:03.480 --> 00:56:10.480
CF: Also sowas wie, das erkennt man nicht. Ich glaube, das wird dann dokumentiert.

00:56:05.640 --> 00:56:33.640
Johannes: Ja, genau, erkennt man das. Ja, gut, klar, also das muss man nachlesen, aber ja.

00:56:10.480 --> 00:56:19.480
CF: Aber die Entwickler, die quasi Freethreading implementieren, die müssen sich eben bei jeder Methode Gedanken darüber machen.

00:56:19.480 --> 00:56:24.480
CF: Also List.append ist halt atomic, aber List.extend bin ich mir schon mal nicht mehr so sicher.

00:56:24.480 --> 00:56:32.480
CF: Wenn das, was ich dann als Argument von Extend reinreiche, wenn das selber ein Iterator ist und da halt dann mit einem Generator irgendwie Python-Code ausgeführt wird,

00:56:32.480 --> 00:56:35.480
CF: dann kann das halt auch eine Weile dauern, bis ich da durch bin.

00:56:33.640 --> 00:56:57.640
Johannes: Ja, und jetzt machen wir uns auf einmal Gedanken über Transaktionen und über Transaktionsmanagement und das ist dann schon auf Sprachebene was sehr Spezifisches.

00:56:35.480 --> 00:56:40.480
CF: Und in der Zwischenzeit können natürlich andere Threads da laufen und irgendwelchen Quatsch produzieren.

00:56:40.480 --> 00:56:44.480
CF: [Stille]

00:56:44.480 --> 00:56:51.480
CF: Ja, genau. Übrigens, um die Frage zu beantworten, was für einen atomaren Counter ich benutzen kann,

00:56:51.480 --> 00:56:56.480
CF: da gibt es irgendwie itertools.counter oder so heißt es, glaube ich.

00:56:56.480 --> 00:57:04.480
CF: Und das gilt wirklich als, also das ist die Thread-Safe-Variante, um einen atomaren Counter in Python zu haben.

00:56:57.640 --> 00:57:05.640
Johannes: Okay.

00:57:04.480 --> 00:57:07.480
CF: [Stille]

00:57:05.640 --> 00:57:25.640
Johannes: Also hätte ich jetzt nicht gewusst. Und ja. Ja, okay, klar. Ja, genau, ich erinnere mich noch, das habe ich vor Jahren mal diese Meinung vertreten, dass der Slobal Interpreter Log mich davor schützt, dass ich x plus gleich eins machen kann, so viel ich will.

00:57:07.480 --> 00:57:12.480
CF: Ich auch nicht, aber wir hatten halt Bug-Reports, die gesagt haben, self.x+=1 geht halt nicht.

00:57:12.480 --> 00:57:35.480
CF: [Stille]

00:57:25.640 --> 00:57:37.640
Johannes: Und dann haben wir im Chaoslauf an einem Abend das einfach mal ausprobiert und es stellte sich als falsch raus, die Annahme, weil man eben sehr schnell falsche Zahlen rauskriegen kann.

00:57:35.480 --> 00:57:38.480
CF: Darf ich kurz ranten?

00:57:37.640 --> 00:57:41.640
Johannes: Ja, selbstverständlich. Da sind wir ja.

00:57:38.480 --> 00:57:48.480
CF: Okay, also das komplette, wie heißt das, Insider-Baseball, also das hat sich geändert in den letzten Python-Versionen, also in den letzten C-Python-Versionen.

00:57:41.640 --> 00:57:51.640
Johannes: Ja.

00:57:48.480 --> 00:57:56.480
CF: Du hast absolut recht, dass quasi, also ursprünglich war die Regel, ein Bytecode ist atomar,

00:57:56.480 --> 00:58:01.480
CF: aber so theoretisch kann ich nach jedem Bytecode eben einen Thread-Switch haben.

00:58:01.480 --> 00:58:12.480
CF: Und sowas wie das erwähnte Beispiel self.x+=1, das sind eben mehrere Bytecodes, das heißt da kann ich dazwischen einen Thread-Switch haben und entsprechend ist das nicht atomar.

00:58:12.480 --> 00:58:24.480
CF: In einer der letzten Versionen, ich weiß nicht, 3.12 vielleicht oder so, haben sie quasi in C-Python die Bytecodes, wo man Thread-Switches machen kann,

00:58:21.640 --> 00:58:45.640
Johannes: Ja.

00:58:24.480 --> 00:58:28.480
CF: also in der regulären GIL-Version, stark reduziert.

00:58:28.480 --> 00:58:34.480
CF: Und es gibt jetzt eben nur noch ganz, ganz wenige Bytecodes, wo wirklich dann Switches stattfinden können.

00:58:34.480 --> 00:58:40.480
CF: Das sorgt dafür, dass die quasi beobachtbare Atomarität zunimmt.

00:58:40.480 --> 00:58:44.480
CF: Das heißt plötzlich in 3.12 war dieses Counter-Beispiel atomar.

00:58:44.480 --> 00:58:51.480
CF: Und das ist natürlich total schlecht, weil wenn man die Community darauf vorbereiten will, dass jetzt irgendwann mal der GIL entfernt wird

00:58:45.640 --> 00:59:13.640
Johannes: Okay. Ja.

00:58:51.480 --> 00:59:01.480
CF: und man quasi mit Thread-Switches an viel mehr Stellen rechnen muss, ist es halt schlecht, wenn man in der Version davor dafür sorgt,

00:59:01.480 --> 00:59:08.480
CF: dass viel weniger Thread-Switches an viel vorhersagbaren Stellen, nämlich nur am Ende von der Schleife oder sowas stattfinden kann.

00:59:08.480 --> 00:59:16.480
CF: Also das finde ich, also ich meine klar, dieses Reduzieren der Thread-Switches, das erhöht halt wieder die Single-Threading-Performance,

00:59:13.640 --> 00:59:27.640
Johannes: Ja, klar.

00:59:16.480 --> 00:59:20.480
CF: das war der Grund, warum sie das gemacht haben, aber ich finde es halt unstrategisch.

00:59:20.480 --> 00:59:24.480
CF: Also ich glaube, wenn du in 3.12 das mit dem Counter nochmal ausprobieren würdest,

00:59:24.480 --> 00:59:28.480
CF: dann wäre es quasi nicht mehr beobachtbar, dass man dazwischen...

00:59:27.640 --> 00:59:34.640
Johannes: Dann mache ich das jetzt mal nicht, zur Sicherheit.

00:59:28.480 --> 00:59:34.480
CF: Nee, mach es lieber gleich in der No-GIL-Version.

00:59:34.480 --> 00:59:41.480
CF: Damit würdest du es kaputt kriegen können, würde ich hoffen.

00:59:34.640 --> 00:59:40.640
Johannes: Ja gut, aber damit muss es ja gehen.

00:59:40.640 --> 00:59:46.640
Johannes: Ja gut, ja, kaputt kriegen.

00:59:42.480 --> 00:59:44.480
CF: Ja, also...

00:59:44.480 --> 00:59:53.480
CF: Aber ich glaube, da gibt es auch zum Beispiel so... also es gibt Packages davon.

00:59:46.640 --> 01:00:00.640
Johannes: Ich habe jetzt leider keine Nokia Version hier kompiliert, deshalb muss ich leider dieses Experiment.

00:59:58.480 --> 01:00:08.480
CF: Genau. Und in... in... in... bei Env weiß ich nicht, aber in Ubuntu, in dem DeadSnake PPA gibt es das auch.

01:00:00.640 --> 01:00:29.640
Johannes: Ja, bei Pans.

01:00:25.480 --> 01:00:31.480
CF: Ich glaube, es liegt aber halt vor allem auch daran, dass wir daran gewöhnt sind, es nicht zu brauchen, weil wir es halt nie hatten.

01:00:29.640 --> 01:00:34.640
Johannes: Ja.

01:00:31.480 --> 01:00:37.480
CF: Also ich glaube schon, dass es dann einiges gibt, wo das halt schon irgendwie auch...

01:00:37.480 --> 01:00:41.480
CF: Klar, man muss dann sich irgendwie umgewöhnen und vielleicht gibt es auch ein paar schöne Bibliotheken,

01:00:41.480 --> 01:00:47.480
CF: die das halt alles ein bisschen weniger gefährlich machen, dass man so ein paar schöne Abstraktionen auf jeden Fall hat.

01:00:47.480 --> 01:00:52.480
CF: Aber ich denke schon, dass wir an einen Punkt kommen können, wo man dann eben sagen kann...

01:00:52.480 --> 01:00:58.480
CF: Ja, also früher hätten wir vielleicht Multiprocessing genommen und es wäre nervig und...

01:00:54.640 --> 01:01:11.640
Johannes: Ja, das ist halt auch mit Threads programmieren, ist halt auch was gefährliches.

01:00:58.480 --> 01:01:03.480
CF: also frickelig gewesen, das dann gut hinzukriegen und jetzt nehmen wir es halt plötzlich und es funktioniert gut.

01:01:11.640 --> 01:01:24.640
Johannes: Da gibt es ja, also ich meine, selbst wenn diese Operationen alle atomar sind und selbst wenn das so ist, dann gibt es ja immer noch diese ganzen Probleme und Deadlocks und Race Conditions und all das Zeugs und das ist einfach eine schwierige Sache.

01:01:20.480 --> 01:01:22.480
CF: Ja, ja, absolut.

01:01:22.480 --> 01:01:33.480
CF: Ja, das ist die Freethreading.

01:01:24.260 --> 01:01:32.260
Jochen: [kein Ton]

01:01:24.640 --> 01:01:36.640
Johannes: Ich habe kurz, ich habe eben nachgeguckt, es gibt in PyEnv, gibt es eine 3.13.0 Version und es gibt eine 3.13.0t Version und das werden die beiden unterschiedlichen sein.

01:01:32.260 --> 01:01:42.260
Jochen: [kein Ton]

01:01:33.480 --> 01:01:42.480
CF: Genau, und dann muss man ein altes Skript vom Chaosdorf finden und dann...

01:01:36.640 --> 01:01:43.640
Johannes: Gut, dann muss ich jetzt Boomer installieren.

01:01:42.260 --> 01:02:02.260
Jochen: [kein Ton]

01:01:43.640 --> 01:01:50.640
Johannes: Es war nicht so ein beeindruckendes Testharness, es war einfach nur zwei Threads, die eine Variable gleichzeitig erhöht haben.

01:01:48.480 --> 01:01:50.480
CF: Ja, klar.

01:01:50.480 --> 01:01:56.480
CF: Ja, ich sehe das auch so. Also jetzt...

01:01:50.640 --> 01:02:07.640
Johannes: Also das kann man relativ leicht wieder rekonstruieren.

01:01:56.480 --> 01:02:01.480
CF: Ich habe so sehr gemischte Gefühle, was das Freethreading angeht.

01:02:01.480 --> 01:02:05.480
CF: Einerseits ist es halt cool, weil endlich diese endlose Diskussion aufhört auf der einen Seite

01:02:02.260 --> 01:02:12.260
Jochen: [kein Ton]

01:02:05.480 --> 01:02:09.480
CF: und weil halt auch wirklich jemand mal Geld in die Hand genommen hat und das richtig gut macht.

01:02:07.640 --> 01:02:09.640
Johannes: Ja, das ist ja auch ein bisschen schwierig.

01:02:09.480 --> 01:02:13.480
CF: Also richtig gut, klar, da kann man dann auch Details kritisieren, aber die Tatsache,

01:02:13.480 --> 01:02:19.480
CF: dass jetzt eben irgendwie einige Leute von Meta dafür bezahlt werden, das halt wirklich zu machen

01:02:19.480 --> 01:02:26.480
CF: und auch quasi den Aufwand betreiben, das in C-Python reinzukriegen, was ja auch wirklich immer viele Diskussionen

01:02:26.480 --> 01:02:33.480
CF: und viel Überzeugungsarbeit und viel Debugging und sehr, sehr viel Aufwand sind dafür nötig.

01:02:33.480 --> 01:02:39.480
CF: Und ich finde es erst mal gut, dass das halt jetzt passiert und dass quasi auch die Community mitgenommen wird

01:02:39.480 --> 01:02:44.480
CF: und irgendwie verschiedene... Also es gibt ja jetzt wirklich auch schon einige an Bibliotheken,

01:02:44.480 --> 01:02:51.480
CF: die jetzt mitziehen und gucken, dass sie halt auch Freethreading-Versionen dann binaries auf PyPI releasen usw.

01:02:51.480 --> 01:02:54.480
CF: Und das ist schon wirklich gut.

01:02:54.480 --> 01:03:01.480
CF: Klar, auf der anderen Seite sehe ich das... Ich denke wirklich, das wird eine Riesenumstellung

01:03:01.480 --> 01:03:05.480
CF: und das wird schon auch, was die Bugs angeht und was die Eingewöhnungszeit angeht

01:03:05.480 --> 01:03:09.480
CF: sowohl in den Bibliotheken als auch in der Sprache selbst.

01:03:09.480 --> 01:03:18.480
CF: Ich habe mal so einen... Das ist schon ewig her, aber ich habe mal einen Vortrag gehört von einem der SunJVM-JIT-Entwickler,

01:03:18.480 --> 01:03:25.480
CF: der auch an dem ganzen Laufzeitsystem und dem Multithreaded-Garbage-Collector und so gearbeitet hat.

01:03:25.480 --> 01:03:30.480
CF: Und der meinte so, im Garbage-Collector findet man halt zehn Jahre lang Multithreading-Bugs.

01:03:30.480 --> 01:03:33.480
CF: Und die werden halt immer schwieriger, die zu finden.

01:03:33.480 --> 01:03:38.480
CF: Und ich weiß halt nicht so genau, ob wir darauf so richtig gefasst sind.

01:03:38.480 --> 01:03:41.480
CF: Also das... Ja.

01:03:41.480 --> 01:03:44.480
CF: [kein Ton]

01:03:55.480 --> 01:04:00.640
CF: *Wir werden alt. Das ist ein amischer Geheimnis. *

01:04:00.640 --> 01:04:03.840
CF: *Aber economistisch genutzt worden ist das. *

01:04:03.840 --> 01:04:14.080
CF: *Also, Andere machen immer alles nahe.*

01:04:07.360 --> 01:04:09.360
Dominik: Spiele wollte ich bauen.

01:04:09.360 --> 01:04:11.360
Dominik: [Aufnahmellärm]

01:04:14.080 --> 01:04:16.520
CF: *Aber ich mag keine Frage. *

01:04:16.520 --> 01:04:20.520
CF: Mmh.

01:04:23.400 --> 01:04:25.880
CF: *Wir sind alle einig. *

01:04:25.880 --> 01:04:27.960
CF: *Wir sind alle einig. *

01:04:53.000 --> 01:04:55.000
CF: *Wir sind alle einig. *

01:05:01.000 --> 01:05:03.080
CF: *Wir sind alle einig. *

01:05:28.120 --> 01:05:30.120
CF: *Wir sind alle einig. *

01:05:38.120 --> 01:05:40.200
CF: *Wir sind alle einig. *

01:06:05.240 --> 01:06:07.240
CF: *Wir sind alle einig. *

01:06:43.240 --> 01:06:54.200
CF: Die Zustande kann man als Apron sozusagen annehmen und dann zu seinem eigenen bestimmten

01:06:51.640 --> 01:06:56.640
Johannes: Ja, genau, aber das ist eben diese Klasse von Problemen, die ich meinte vorhin.

01:06:54.200 --> 01:07:15.080
CF: Grund zu kommen. Aber das ist nicht so einfach. Und das ist auch nicht so einfach, dass man,

01:06:56.640 --> 01:07:05.640
Johannes: Und früher waren es halt Telefonverteiler oder Netzwerkinterfaces oder, keine Ahnung, Paketquellen oder ...

01:07:05.640 --> 01:07:07.640
Johannes: Ja, genau, aber das ist eben diese Klasse von Problemen, die ich meinte vorhin.

01:07:07.640 --> 01:07:09.640
Johannes: Und früher waren es halt Telefonverteiler oder Netzwerkinterfaces oder, keine Ahnung, Paketquellen oder ...

01:07:09.640 --> 01:07:11.640
Johannes: Ja, genau, aber das ist eben diese Klasse von Problemen, die ich meinte vorhin.

01:07:15.080 --> 01:07:25.080
CF: wie man es so nennt, eine Art "Die Zukunft" zu finden. Und das ist ein ganz wichtiger Punkt.

01:07:25.080 --> 01:07:27.080
CF: [Musik]

01:07:39.080 --> 01:07:40.680
CF: das ist ultraliebend.

01:07:40.680 --> 01:07:41.960
CF: Ja unglaublich.

01:07:41.960 --> 01:07:44.960
CF: Dann kommen wir zu dem Sicherlibar.

01:07:44.960 --> 01:07:47.960
CF: Wir haben hier eine Schweizer Versorgebehörde.

01:07:47.960 --> 01:07:50.600
CF: Und dabei sind wir an einem Regelet подум geht.

01:07:50.600 --> 01:07:53.440
CF: Und dann, in dieser английschlössigen Gregory

01:07:51.640 --> 01:08:05.640
Johannes: Ja, genau, aber das ist eben diese Klasse von Problemen, die ich meinte vorhin.

01:07:53.440 --> 01:08:07.200
CF: Erhed

01:08:05.640 --> 01:08:07.640
Johannes: Schreib' mal.

01:08:07.200 --> 01:08:08.760
CF: Es ist ja jetzt auch so,

01:08:08.840 --> 01:08:13.160
CF: dass wir eigentlich letztlich in einer sehr pragmatischen Situation sind.

01:08:13.160 --> 01:08:15.440
CF: Also es ist standardmäßig nicht an.

01:08:15.440 --> 01:08:18.920
CF: Und wir gucken, wir haben jetzt Zeit, als Community rauszufinden,

01:08:15.640 --> 01:08:18.640
Johannes: Untertitel der Amara.org-Community

01:08:18.640 --> 01:08:21.640
Johannes: Diese Sendung wurde vom NDR live untertitelt (02.02.2020)

01:08:18.920 --> 01:08:21.840
CF: gibt es Anwendungsfälle dafür, finden wir Anwendungsfälle dafür,

01:08:21.640 --> 01:08:24.640
Johannes: Die Sendung wurde vom NDR live untertitelt (02.02.2020)

01:08:21.840 --> 01:08:23.080
CF: wird es stabil genug,

01:08:23.080 --> 01:08:26.760
CF: ist die Single-Threading-Performance akzeptabel, schlechter

01:08:26.760 --> 01:08:30.120
CF: und ziehen die ganzen Bibliotheken mit.

01:08:30.120 --> 01:08:33.560
CF: Und im Moment ist das Risiko halt nicht so hoch.

01:08:33.560 --> 01:08:36.480
CF: Also quasi der absolute Worst-Case, der passieren könnte,

01:08:36.560 --> 01:08:39.040
CF: ist halt, wir finden in zwei Jahren raus, niemand benutzt es,

01:08:39.040 --> 01:08:42.840
CF: es stürzt die ganze Zeit ab und Sam Gross hat keine Lust mehr.

01:08:42.840 --> 01:08:47.520
CF: Und dann kann man es halt auch einfach wieder weglassen.

01:08:47.520 --> 01:08:49.360
CF: Also was ich, würde ich nicht von ausgehen,

01:08:49.360 --> 01:08:52.240
CF: aber also die Möglichkeit besteht halt sozusagen.

01:08:52.240 --> 01:08:54.240
CF: *Pause*

01:09:32.240 --> 01:09:35.240
CF: Klar, auf jeden Fall ist es auf jeden Fall ein langfristiges Projekt.

01:09:35.240 --> 01:09:39.240
CF: Das ist jetzt nichts, was wir jetzt in einer Version mal irgendwie so ein bisschen reinbasteln,

01:09:39.240 --> 01:09:41.240
CF: dann ist das Problem gelöst.

01:09:41.240 --> 01:09:43.240
CF: *Pause*

01:10:01.240 --> 01:10:03.240
CF: Klar, und also ob es dann wirklich klappt,

01:10:03.240 --> 01:10:05.240
CF: klappt.

01:10:05.240 --> 01:10:07.240
CF: >> Schnelles Telefonieren.

01:10:05.360 --> 01:10:07.360
Dominik: Ich erwarte nur darauf, dass du es sehr klar hast, Jonas.

01:10:07.240 --> 01:10:09.240
CF: >>

01:10:07.360 --> 01:10:09.360
Dominik: [Aufnahmellärm]

01:10:19.360 --> 01:10:21.360
Dominik: Spaghetti ist Dining.

01:10:21.360 --> 01:10:23.360
Dominik: Feindeining. Ja, okay.

01:10:23.360 --> 01:10:25.360
Dominik: Ja, Zeigabeln. Ja.

01:10:25.360 --> 01:10:27.360
Dominik: Mit Zeigabeln. Ja.

01:10:27.360 --> 01:10:29.360
Dominik: [Aufnahmellärm]

01:11:43.360 --> 01:11:47.360
Dominik: Also sitzen da irgendwelche Leute, die haben alle eine Gabel in der Hand und warten darauf, dass sie eine zweite bekommen.

01:11:47.360 --> 01:11:49.360
Dominik: [Aufnahmellärm]

01:12:01.360 --> 01:12:03.360
Dominik: Deadlock quasi.

01:12:03.360 --> 01:12:05.360
Dominik: [Aufnahmellärm]

01:12:07.360 --> 01:12:11.360
Dominik: Du meinst, die müssen miteinander reden und sagen "Gib mir mal eine Gabel, bitte".

01:12:11.360 --> 01:12:13.360
Dominik: [Aufnahmellärm]

01:12:23.360 --> 01:12:25.360
Dominik: Hmm, das ist im Blut. Hat der Mund schon voll.

01:12:25.360 --> 01:12:27.360
Dominik: [Aufnahmellärm]

01:12:33.360 --> 01:12:35.360
Dominik: Mehr Gaben in Parteien?

01:12:35.360 --> 01:12:37.360
Dominik: [Aufnahmellärm]

01:12:43.240 --> 01:13:09.860
CF: {unverständlich}

01:12:49.360 --> 01:12:51.360
Dominik: Goldene Gaben, ja, ich wollte gerade sagen.

01:12:51.360 --> 01:12:53.360
Dominik: [Aufnahmellärm]

01:13:09.860 --> 01:13:11.820
CF: ... ja, es ist ja auch ...

01:13:12.560 --> 01:13:14.840
CF: Also schon allein die Tatsache, dass quasi

01:13:14.840 --> 01:13:18.560
CF: einer der schwierigsten Probleme bei verteilten Systemen ein Counter ist,

01:13:18.560 --> 01:13:22.240
CF: das ist ja eigentlich auch schon relativ lustig.

01:13:22.240 --> 01:13:28.680
CF: Genau, eine Zahl aufzählen, aber so global konsistent und so, das ist wirklich ...

01:13:28.680 --> 01:13:30.880
CF: Auch schon das ist nicht so einfach.

01:13:30.880 --> 01:13:43.880
CF: {unverständlich}

01:13:42.260 --> 01:13:50.260
Jochen: [kein Ton]

01:13:43.880 --> 01:13:48.280
CF: Und wenn das dann 18 Eingänge sind, dann finden die dann raus,

01:13:48.280 --> 01:13:50.880
CF: jetzt sind gerade minus 10 Leute bei uns auf dem Festival.

01:13:50.260 --> 01:14:00.260
Jochen: [kein Ton]

01:13:50.880 --> 01:13:55.080
CF: Genau.

01:13:55.080 --> 01:14:06.080
CF: {unverständlich}

01:14:06.080 --> 01:14:08.480
CF: Man kann es ja mal positiv ausdrücken.

01:14:08.480 --> 01:14:11.880
CF: Die Hoffnung ist, dass es jetzt eben ganz, ganz tolle Abstraktionen geben wird,

01:14:11.880 --> 01:14:18.080
CF: die dann auf der quasi Low-Level-Basis von Threats und Logs und was weiß ich,

01:14:18.080 --> 01:14:21.080
CF: was es dann eben an Infrastruktur gibt oder geben wird,

01:14:21.080 --> 01:14:24.480
CF: die das unwahrscheinlicher machen, dass wir Deadlocks produzieren.

01:14:24.880 --> 01:14:26.080
CF: Das ist die positive Sicht.

01:14:26.080 --> 01:14:29.280
CF: Also macht mal.

01:14:29.280 --> 01:14:37.080
CF: War das jetzt sarkastisch oder nicht?

01:14:37.280 --> 01:14:38.280
CF: Das war's.

01:14:38.480 --> 01:14:41.480
CF: {unverständlich}

01:14:41.680 --> 01:14:42.680
CF: {unverständlich}

01:15:02.280 --> 01:15:04.280
CF: {unverständlich}

01:15:29.280 --> 01:15:30.280
CF: {unverständlich}

01:15:29.360 --> 01:15:31.360
Dominik: Du wolltest gerade picken, hast du damit gesagt schon.

01:15:30.280 --> 01:15:33.280
CF: {unverständlich}

01:15:31.360 --> 01:15:33.360
Dominik: [Aufnahmellärm]

01:15:37.360 --> 01:15:39.360
Dominik: Oh, kein Pfeifen.

01:15:39.360 --> 01:15:41.360
Dominik: [Aufnahmellärm]

01:15:45.280 --> 01:15:47.280
CF: {unverständlich}

01:15:58.280 --> 01:16:13.000
CF: Das ist übrigens auch da wieder so ein bisschen Geschichte. Das ist ein gefühlt jahrzehntelanges

01:16:13.000 --> 01:16:20.980
CF: Projekt, so ein paar von diesen Sachen. Das wurde mal auf einem CPython Core-Developer-Treffen in

01:16:20.980 --> 01:16:28.840
CF: einem Vortrag empfohlen, der damals mit sehr gemischten Reaktionen aufgenommen wurde. Und es

01:16:28.840 --> 01:16:33.280
CF: hat ewig gedauert, bis das jetzt wirklich passiert ist, dass die Bibliotheken jetzt entfernt wurden.

01:16:33.280 --> 01:16:39.040
CF: Die Motivation ist, dass es halt quasi so ein bisschen Code in der Standardbibliothek gab,

01:16:39.040 --> 01:16:46.520
CF: der einfach sehr veraltet ist und nicht mehr so richtig für aktuelle Probleme zu benutzen ist.

01:16:46.520 --> 01:16:51.640
CF: Und die wurden dann eben zuerst deprecated und jetzt, seit ein paar Versionen,

01:16:50.260 --> 01:16:54.260
Jochen: [kein Ton]

01:16:51.640 --> 01:16:53.240
CF: jetzt eben wirklich wurden ein paar entfernt.

01:16:53.240 --> 01:16:58.240
CF: [Abspann]

01:16:54.260 --> 01:17:02.260
Jochen: [kein Ton]

01:16:58.240 --> 01:17:01.240
CF: [Abspann]

01:17:02.260 --> 01:17:12.260
Jochen: [kein Ton]

01:17:11.240 --> 01:17:15.240
CF: [Abspann]

01:17:31.360 --> 01:17:33.360
Dominik: Falls ihr jetzt kurz auf den Tisch gefallen seid, weil euer Paket auf einmal weg ist, dann

01:17:33.360 --> 01:17:35.360
Dominik: solltet ihr auffassen mit dem Update.

01:17:35.360 --> 01:17:37.360
Dominik: [Aufnahmellärm]

01:17:36.240 --> 01:17:39.240
CF: [Abspann]

01:17:39.240 --> 01:17:43.240
CF: [Abspann]

01:18:04.240 --> 01:18:07.240
CF: [Abspann]

01:18:07.240 --> 01:18:13.240
CF: [Abspann]

01:18:13.240 --> 01:18:21.240
CF: [Abspann]

01:18:21.240 --> 01:18:27.240
CF: [Abspann]

01:18:27.240 --> 01:18:31.240
CF: [Abspann]

01:18:32.240 --> 01:18:35.240
CF: [Abspann]

01:18:35.240 --> 01:18:39.240
CF: [Abspann]

01:19:00.240 --> 01:19:03.240
CF: [Abspann]

01:19:03.240 --> 01:19:07.240
CF: [Aspann]

01:19:28.240 --> 01:19:31.240
CF: [Aspann]

01:19:31.240 --> 01:19:35.240
CF: [Aspann]

01:19:56.240 --> 01:19:59.240
CF: [Aspann]

01:19:59.240 --> 01:20:03.240
CF: [Aspann]

01:20:24.240 --> 01:20:27.240
CF: [Aspann]

01:20:27.240 --> 01:20:31.240
CF: [Aspann]

01:20:52.240 --> 01:20:55.240
CF: [Aspann]

01:20:55.240 --> 01:20:59.240
CF: [Aspann]

01:21:20.240 --> 01:21:23.240
CF: [Aspann]

01:21:23.240 --> 01:21:27.240
CF: [Aspann]

01:21:48.240 --> 01:21:51.240
CF: [Aspann]

01:21:51.240 --> 01:21:55.240
CF: [Aspann]

01:22:16.240 --> 01:22:19.240
CF: [Aspann]

01:22:19.240 --> 01:22:23.240
CF: [Aspann]

01:22:44.240 --> 01:22:47.240
CF: [Aspann]

01:22:47.240 --> 01:22:51.240
CF: [Aspann]

01:23:12.240 --> 01:23:15.240
CF: [Aspann]

01:23:15.240 --> 01:23:19.240
CF: [Aspann]

01:23:40.240 --> 01:23:43.240
CF: [Aspann]

01:23:43.240 --> 01:23:47.240
CF: [Aspann]

01:24:08.240 --> 01:24:11.240
CF: [Aspann]

01:24:11.240 --> 01:24:15.240
CF: [Aspann]

01:24:22.260 --> 01:24:30.260
Jochen: [kein Ton]

01:24:30.260 --> 01:24:40.260
Jochen: [kein Ton]

01:24:36.240 --> 01:24:39.240
CF: [Aspann]

01:24:39.240 --> 01:24:43.240
CF: [Aspann]

01:24:51.640 --> 01:24:53.640
Johannes: Die Sendung wurde vom NDR live untertitelt (02.02.2020)

01:24:53.640 --> 01:24:56.640
Johannes: Die Sendung wurde vom NDR live untertitelt (02.02.2020)

01:25:04.240 --> 01:25:07.240
CF: [Aspann]

01:25:07.240 --> 01:25:11.240
CF: [Aspann]

01:25:32.240 --> 01:25:35.240
CF: [Aspann]

01:25:35.240 --> 01:25:39.240
CF: [Aspann]

01:26:00.240 --> 01:26:03.240
CF: [Aspann]

01:26:03.240 --> 01:26:07.240
CF: [Aspann]

01:26:28.240 --> 01:26:31.240
CF: [Aspann]

01:26:31.240 --> 01:26:35.240
CF: [Aspann]

01:26:56.240 --> 01:26:59.240
CF: [Aspann]

01:26:59.240 --> 01:27:03.240
CF: [Aspann]

01:27:24.240 --> 01:27:27.240
CF: [Aspann]

01:27:27.240 --> 01:27:31.240
CF: [Aspann]

01:27:52.240 --> 01:27:55.240
CF: [Aspann]

01:27:55.240 --> 01:27:59.240
CF: [Aspann]

01:28:20.240 --> 01:28:23.240
CF: [Aspann]

01:28:23.240 --> 01:28:27.240
CF: [Aspann]

01:28:48.240 --> 01:28:51.240
CF: [Aspann]

01:28:51.240 --> 01:28:55.240
CF: [Aspann]

01:29:16.240 --> 01:29:19.240
CF: [Aspann]

01:29:19.240 --> 01:29:23.240
CF: [Aspann]

01:29:44.240 --> 01:29:51.240
CF: die es noch gibt. Aber ja, also ich kenne auf jeden Fall auch in Python Leute, die sich das

01:29:50.260 --> 01:29:56.260
Jochen: [kein Ton]

01:29:51.240 --> 01:29:56.040
CF: so angewöhnt haben, dass sie halt im Test schreiben, die Bagger anmachen und dann kann

01:29:56.040 --> 01:30:00.040
CF: man erst mal so gucken, was hat man denn eigentlich für Objekte, was haben die für Methoden und was

01:29:56.260 --> 01:30:06.260
Jochen: [kein Ton]

01:30:00.040 --> 01:30:00.800
CF: macht man denn da eigentlich so.

01:30:00.800 --> 01:30:18.800
CF: Na.

01:30:18.800 --> 01:30:35.120
CF: Verändern könnte, ja genau. Das wäre schön. Aber ich glaube, PDB ist eine der Sachen, wo ich das

01:30:35.120 --> 01:30:40.480
CF: Gefühl habe, dass das auch so ein bisschen revitalisiert ist. Also dass es da jetzt Core-Devs

01:30:40.480 --> 01:30:45.800
CF: gibt, die sich dafür interessieren und eben hoffen, da in den nächsten Versionen auch ein paar neue

01:30:45.800 --> 01:30:50.440
CF: Features reinzukriegen. Ich glaube auch in 3.13 ist schon die erste Version. Zum Beispiel, dass

01:30:50.440 --> 01:30:57.640
CF: wenn man so einen Breakpoint macht, dass man dann nicht erst in der nächsten Zeile dann wirklich

01:30:57.640 --> 01:31:10.600
CF: anhält im Debugger, sondern schon in der Zeile selber, wo der Breakpoint ist. Im Coder erst den

01:31:10.600 --> 01:31:36.040
CF: Breakpoint gekriegt hat. Ja genau.

01:31:15.640 --> 01:31:18.640
Johannes: Um jetzt meinen Einwurf noch kurz zu retten.

01:31:21.640 --> 01:31:24.640
Johannes: Das war eine Präsentation von einem Spieleentwickler,

01:31:24.640 --> 01:31:27.640
Johannes: die sich selber so ein System gebaut hat.

01:31:27.640 --> 01:31:30.640
Johannes: Die Tomorrow Corporation.

01:31:30.640 --> 01:31:33.640
Johannes: Die haben sich genau so einen Debugger gebaut,

01:31:33.640 --> 01:31:36.640
Johannes: der vorwärts und rückwärts steppen kann

01:31:36.040 --> 01:32:00.040
CF: Ja echt, also.

01:31:36.640 --> 01:31:39.640
Johannes: und wo ich zwischendurch Code verändern kann

01:31:39.640 --> 01:31:42.640
Johannes: und dann trotzdem die Auswirkungen alle sehe.

01:31:42.640 --> 01:31:45.640
Johannes: Und dann am offenen Herzen ohne Angst haben zu müssen,

01:31:45.640 --> 01:31:48.640
Johannes: dass der Patient jetzt abstürzt.

01:31:48.640 --> 01:31:51.640
Johannes: Das ist schon sehr beeindruckend.

01:31:51.640 --> 01:31:54.640
Johannes: Grafisch.

01:31:54.640 --> 01:32:09.640
Johannes: Dann schreibe ich hier mal die Funktionen um

01:32:00.040 --> 01:32:24.040
CF: Findet mal bitte diesen Vortrag. Aber ich glaube, die Free-Threading-Leute, die müssen solche Tools

01:32:09.640 --> 01:32:12.640
Johannes: und lasse das mal wieder laufen von hier aus.

01:32:12.640 --> 01:32:15.640
Johannes: Und jetzt ist auch der Sebranche da drin.

01:32:15.640 --> 01:32:18.640
Johannes: Ja, dem tut ihr auch in die Shownotes rein.

01:32:18.640 --> 01:32:21.640
Johannes: Kein Problem.

01:32:21.640 --> 01:32:24.640
Johannes: Danke.

01:32:24.040 --> 01:32:28.040
CF: auch benutzen, weil es ansonsten einfach echt zu schwierig ist. Und da gibt es halt auch für C so

01:32:24.640 --> 01:32:27.640
Johannes: [Musik]

01:32:28.040 --> 01:32:34.040
CF: einen Back-in-Time-Debugger, der, wie heißt der nochmal? Anfang des Jahres war ich zum ersten Mal

01:32:34.040 --> 01:32:38.040
CF: in der Situation, dass ich mich genötigt gesehen habe, auch so einen zu benutzen, weil wir so einen

01:32:38.040 --> 01:32:44.040
CF: nur sehr selten stattfindenden Garbage-Collector-Bug hatten. Und mit so einem Back-in-Time-Debugger

01:32:44.040 --> 01:32:52.040
CF: kann man halt dann solche Probleme auch richtig gut lösen. Also das ist quasi so ein Tracing-Debugger,

01:32:52.040 --> 01:32:56.040
CF: der macht so eine Aufzeichnung der gesamten Prozessausführung. Das kann man einfach 100 Mal

01:32:56.040 --> 01:33:00.040
CF: machen, bis der Crash stattfindet. Und dann kann man sich die Ausführungen beliebig oft wieder

01:32:57.640 --> 01:33:04.640
Johannes: [Musik]

01:33:00.040 --> 01:33:06.040
CF: anschauen. Und das Interface ist quasi so wie so ein normaler Debugger. Ich kann halt Next machen und

01:33:06.040 --> 01:33:10.040
CF: Sachen printen. Aber der Prozess wird nicht wirklich neu ausgeführt, sondern das ist quasi

01:33:10.040 --> 01:33:16.040
CF: "nur" ein Replay von dem, was eben bei der crashenden Ausführung wirklich passiert ist.

01:33:11.640 --> 01:33:19.640
Johannes: [Musik]

01:33:16.040 --> 01:33:22.040
CF: Und da kann ich dann wirklich auch ein Backward Next machen und dann bin ich wieder eine Zeit

01:33:22.040 --> 01:33:29.040
CF: davor. Oder ein Backward Finish und dann bin ich eben am Anfang der Funktion nicht gerade ausführend.

01:33:23.640 --> 01:33:26.640
Johannes: Ja, das ist schon ziemlich cool, so was.

01:33:26.640 --> 01:33:29.640
Johannes: [Musik]

01:33:29.040 --> 01:33:35.040
CF: Oder halt auch so Sachen wie ich mache ein Hardware Watchpoint. Also das war wirklich

01:33:29.640 --> 01:33:35.640
Johannes: [Musik]

01:33:35.040 --> 01:33:40.040
CF: Memory Corruption, die ich da debuggt habe. Und wenn du halt einen kaputten Speicher hast,

01:33:35.640 --> 01:33:43.640
Johannes: [Musik]

01:33:40.040 --> 01:33:45.040
CF: dann kannst du dir so ein Watchpoint setzen, wo du sagst, wer hat diesen... Also wenn dieser

01:33:45.040 --> 01:33:53.040
CF: Speicher verändert wird, dann halt an. Und dann kann man quasi vom Crash sagen, man macht

01:33:51.640 --> 01:33:54.640
Johannes: [Musik]

01:33:53.040 --> 01:33:57.040
CF: so ein Watchpoint für den kaputten Speicher und dann lässt man rückwärts laufen. Weil dann

01:33:54.640 --> 01:34:09.640
Johannes: Das ist schon ziemlich magisch, Cam.

01:33:57.040 --> 01:34:01.040
CF: findet man quasi, wenn man rückwärts läuft, findet man den Code, der den Speicher wirklich

01:34:01.040 --> 01:34:08.040
CF: kaputt geschrieben hat. Und das war wirklich richtig gut. Aber das war wirklich auch...

01:34:08.040 --> 01:34:11.040
CF: Es ist sehr magisch. Es funktioniert übrigens auch nicht... Also technisch ist das nicht so

01:34:09.640 --> 01:34:17.640
Johannes: Ja, klar. Das läuft nochmal von vorne nach hinten durch.

01:34:11.040 --> 01:34:14.040
CF: implementiert, dass es wirklich rückwärts läuft. Weil es ist ja Maschinencode. Es geht

01:34:14.040 --> 01:34:20.040
CF: von beliebigen Code. Stattdessen macht er so Snapshots. Der geht dann zum letzten Snapshot

01:34:17.640 --> 01:34:20.640
Johannes: Ja, gut genug.

01:34:20.040 --> 01:34:28.040
CF: und läuft von da vorwärts. Aber es fühlt sich halt trotzdem so an. Gut genug.

01:34:20.640 --> 01:34:26.640
Johannes: Okay, ich habe hier noch den wichtigsten,

01:34:26.640 --> 01:34:29.640
Johannes: die wichtigste Änderung

01:34:28.040 --> 01:34:51.040
CF: Warum? Wo wirst du da?

01:34:29.640 --> 01:34:32.640
Johannes: in Python 3.13.

01:34:32.640 --> 01:34:35.640
Johannes: Bei Docstrings werden jetzt die

01:34:35.640 --> 01:34:38.640
Johannes: führenden Leerzeichen entfernt.

01:34:38.640 --> 01:34:41.640
Johannes: [Musik]

01:34:47.640 --> 01:34:55.640
Johannes: Weil

01:34:51.040 --> 01:35:14.040
CF: Da müsste man jetzt mal... Na ja, 5% finde ich ganz schön krass. Also 5% sind Leerzeichen

01:34:55.640 --> 01:34:58.640
Johannes: 5 Prozent weniger.

01:34:58.640 --> 01:35:01.640
Johannes: Aber also,

01:35:01.640 --> 01:35:04.640
Johannes: einfach, weil es korrekt ist, oder?

01:35:04.640 --> 01:35:07.640
Johannes: Du brauchst niemals den Docstring mit der Einrückung.

01:35:07.640 --> 01:35:10.640
Johannes: [Musik]

01:35:13.640 --> 01:35:16.640
Johannes: Ja, spannend.

01:35:14.040 --> 01:35:20.040
CF: von eingerückten Logstrings in unseren PYC-Dateien. Das würde man jetzt erstmal so nicht erwarten.

01:35:16.640 --> 01:35:24.640
Johannes: Ne.

01:35:20.040 --> 01:35:42.040
CF: Na ja gut, wenn ich halt Klasten habe und Methoden-Logstrings, dann sind die ja schon

01:35:21.360 --> 01:35:23.360
Dominik: Ich sehe "Green Development" danach.

01:35:23.360 --> 01:35:25.360
Dominik: [Aufnahmellärm]

01:35:24.640 --> 01:35:27.640
Johannes: Das liegt halt daran, dass wir alle so viele

01:35:27.640 --> 01:35:30.640
Johannes: gute und ausführliche Docstrings schreiben und

01:35:30.640 --> 01:35:33.640
Johannes: ganz viel Text da reinschreiben.

01:35:33.640 --> 01:35:41.640
Johannes: Bei mir ist 0 Prozent.

01:35:35.360 --> 01:35:37.360
Dominik: Jochen schreibt keine Drucker, deswegen passiert sowas nicht.

01:35:37.360 --> 01:35:39.360
Dominik: [Aufnahmellärm]

01:35:41.640 --> 01:35:44.640
Johannes: [Musik]

01:35:42.040 --> 01:36:11.040
CF: immer 8 Bytes eingerückt pro Zeile Logstring.

01:35:44.640 --> 01:35:51.640
Johannes: Und es müsste dann eigentlich 10 Prozent sein, weil wir

01:35:51.640 --> 01:35:54.640
Johannes: gehen ja nur bis 80 Zeichen pro Zeile.

01:35:54.640 --> 01:36:04.640
Johannes: 72.

01:35:59.360 --> 01:36:01.360
Dominik: Ist das nicht 79?

01:36:01.360 --> 01:36:03.360
Dominik: [Aufnahmellärm]

01:36:05.360 --> 01:36:07.360
Dominik: 79, 79.

01:36:07.360 --> 01:36:09.360
Dominik: [Aufnahmellärm]

01:36:08.640 --> 01:36:11.640
Johannes: Was habt ihr denn für moderne Displays?

01:36:11.040 --> 01:36:21.040
CF: Wenn du Python-Code auf deinem C64 schreibst.

01:36:11.640 --> 01:36:14.640
Johannes: 80 mal 25, so.

01:36:14.640 --> 01:36:17.640
Johannes: Modus 4, oder wie war es?

01:36:17.360 --> 01:36:19.360
Dominik: Es gibt Leute, die müssen auf ihrem Handy entwickeln.

01:36:17.640 --> 01:36:23.640
Johannes: C64 ist keine supported Plattform mehr.

01:36:19.360 --> 01:36:21.360
Dominik: [Aufnahmellärm]

01:36:21.040 --> 01:36:28.040
CF: Ich habe PyPy auf meinem Handy. Da bin ich sehr stolz drauf. PyPy ist tatsächlich ein

01:36:23.640 --> 01:36:26.640
Johannes: [Musik]

01:36:28.040 --> 01:36:36.040
CF: Paket auf Thermux. PyPy hat eine ARM-Version und dann kann man das einfach laufen lassen.

01:36:29.640 --> 01:36:36.640
Johannes: [Musik]

01:36:36.040 --> 01:36:40.040
CF: Manchmal ist es auch nett, dann kann ich in der Bahn irgendwie... Es ist halt so ein bisschen

01:36:36.640 --> 01:36:44.640
Johannes: [Musik]

01:36:40.040 --> 01:36:43.040
CF: nervig zu tippen. Aber man kann auch den JIT laufen lassen. Man kann sich dann auch auf

01:36:43.040 --> 01:36:50.040
CF: dem Handy anzeigen lassen, welchen Maschinen-Code der PyPy-JIT jetzt gerade für den Python-Code,

01:36:50.040 --> 01:37:09.040
CF: den man auf dem Handy laufen ließ, erzeugt wurde. Wenn man die richtigen Umgebungsvariablen

01:36:52.640 --> 01:36:55.640
Johannes: [Musik]

01:36:55.640 --> 01:37:01.640
Johannes: [Musik]

01:37:01.640 --> 01:37:13.640
Johannes: [Musik]

01:37:09.040 --> 01:37:10.040
CF: weiß.

01:37:10.040 --> 01:37:19.040
CF: In der Konsole, nee, glaube ich nicht. Jedenfalls zu dem Thermux, weiß ich nicht, wie lustig

01:37:13.640 --> 01:37:16.640
Johannes: [Musik]

01:37:19.040 --> 01:37:22.040
CF: die für andere ist. Ich fand die lustig. Ist mir was auf einer Konferenz im Sommer

01:37:19.640 --> 01:37:26.640
Johannes: [Musik]

01:37:22.040 --> 01:37:28.040
CF: passiert. Ich war auf so einer akademischen Programmiersprachen-Konferenz mit Forschern

01:37:26.640 --> 01:37:34.640
Johannes: [Musik]

01:37:28.040 --> 01:37:33.040
CF: und Forscherinnen, die sich mit Compilern und Optimierung und Programmiersprachen auseinandersetzen.

01:37:33.040 --> 01:37:41.040
CF: Da war ich dann mit einem relativ bekannten C-Compiler-Prof, John Regge, auf so einem

01:37:41.040 --> 01:37:47.040
CF: Boot in Kopenhagen Bier trinken. Das Boot lag am Hafen, man konnte auf Deck Bier trinken.

01:37:43.640 --> 01:37:46.640
Johannes: [Musik]

01:37:46.640 --> 01:37:55.640
Johannes: [Musik]

01:37:47.040 --> 01:37:52.040
CF: Ich habe ihm dann auf dem Handy so eine Optimierung gezeigt, die wir in PyPy machen. Er hat mit

01:37:52.040 --> 01:37:56.040
CF: PyPy noch nie irgendwas zu tun gehabt und schaut sich das an, so in ganz, ganz kleinem

01:37:55.640 --> 01:38:03.640
Johannes: [Musik]

01:37:56.040 --> 01:38:00.040
CF: Font und meinte so, warum ist denn da diese extra Operation? Die braucht er doch gar nicht.

01:38:00.040 --> 01:38:07.040
CF: Und das war absolut richtig. Und der Grund war, dass die Divisionen in C und in Python

01:38:03.640 --> 01:38:06.640
Johannes: [Musik]

01:38:06.640 --> 01:38:32.640
Johannes: Tja, so Leute, gibt's

01:38:07.040 --> 01:38:13.040
CF: halt sich unterschiedlich verhalten, wenn die Zahlen negativ sind. Und dafür braucht

01:38:13.040 --> 01:38:19.040
CF: man halt in Python so ein extra XOR. Aber die Tatsache, dass er das quasi so mit dem

01:38:19.040 --> 01:38:26.040
CF: Achtpunkt-Font über einem Bier, so auf dem Handy mal eben so gesehen hat, quasi in einem

01:38:26.040 --> 01:38:30.040
CF: ASCII-Format, was er noch nie gesehen hatte, das fand ich dann doch relativ krass.

01:38:30.040 --> 01:38:30.540
CF: Das war's.

01:38:30.540 --> 01:38:32.540
CF: [Musik]

01:38:31.360 --> 01:38:33.360
Dominik: Ich würde sogar fast sagen, das ist fast der Schluss von

01:38:32.640 --> 01:38:35.640
Johannes: noch ein paar Ideen, die ich euch noch mal

01:38:33.360 --> 01:38:35.360
Dominik: dem Thema 2013.

01:38:35.360 --> 01:38:37.360
Dominik: [Aufnahmellärm]

01:38:35.640 --> 01:38:38.640
Johannes: vorstellen kann.

01:38:38.640 --> 01:38:41.640
Johannes: Ich würde sagen, wir machen das jetzt mal

01:38:41.640 --> 01:38:44.640
Johannes: mit dem, was ich euch vorgestellt habe,

01:38:59.640 --> 01:39:02.640
Johannes: mit dem, was ich euch vorgestellt habe.

01:39:02.640 --> 01:39:05.640
Johannes: Mit dem, was ich euch vorgestellt habe,

01:39:05.640 --> 01:39:08.640
Johannes: mit dem, was ich euch vorgestellt habe.

01:39:08.640 --> 01:39:11.640
Johannes: Mit dem, was ich euch vorgestellt habe.

01:39:19.360 --> 01:39:21.360
Dominik: Kriegen wir auch an.

01:39:21.360 --> 01:39:23.360
Dominik: [Aufnahmellärm]

01:39:29.360 --> 01:39:31.360
Dominik: Ja, genau.

01:39:31.360 --> 01:39:33.360
Dominik: [Aufnahmellärm]

01:39:39.360 --> 01:39:41.360
Dominik: Genau.

01:39:41.360 --> 01:39:43.360
Dominik: [Aufnahmellärm]

01:39:43.540 --> 01:39:47.920
CF: Wer den Spiel noch nicht gesehen hat, der wird es dann auch nicht mehr sehen.

01:39:44.640 --> 01:39:47.640
Johannes: Aber ich würde das gerne noch erweitern,

01:39:47.640 --> 01:39:50.640
Johannes: also falls da fünf Mails kommen, die sich im

01:39:47.920 --> 01:39:49.360
CF: Ich habe das Video noch nicht gesehen.

01:39:49.360 --> 01:39:50.440
CF: Ja, wir haben es noch nicht gesehen.

01:39:50.440 --> 01:39:52.960
CF: Ja, wir haben es noch nicht gesehen.

01:39:50.640 --> 01:39:53.640
Johannes: Stuttgarter Raum treffen wollen.

01:39:52.960 --> 01:39:54.400
CF: Ja, wir haben es noch nicht gesehen.

01:39:53.360 --> 01:39:55.360
Dominik: Was ein Ableger.

01:39:53.640 --> 01:39:56.640
Johannes: Ah, in Frankfurt?

01:39:54.400 --> 01:39:55.400
CF: Wir haben es noch nicht gesehen.

01:39:55.360 --> 01:39:57.360
Dominik: [Aufnahmellärm]

01:39:55.400 --> 01:39:56.600
CF: Wir haben es noch nicht gesehen.

01:39:56.600 --> 01:39:57.600
CF: Ja, wir haben es noch nicht gesehen.

01:39:56.640 --> 01:39:59.640
Johannes: Das ist bimodal, oder?

01:39:57.360 --> 01:39:59.360
Dominik: Ja, ja, der Duck hat auch Anfang.

01:39:57.600 --> 01:39:58.600
CF: Wir haben es noch nicht gesehen.

01:39:59.360 --> 01:40:01.360
Dominik: [Aufnahmellärm]

01:39:59.640 --> 01:40:02.640
Johannes: Das ist Düsseldorf oder Stuttgart und dann kriegt man das hin.

01:40:02.640 --> 01:40:05.640
Johannes: Die Frankfurter müssen halt dann sich einen raussuchen.

01:40:05.360 --> 01:40:07.360
Dominik: Marburg, Marburg.

01:40:07.360 --> 01:40:09.360
Dominik: [Aufnahmellärm]

01:40:08.640 --> 01:40:11.640
Johannes: Da ist zuerst.

01:40:10.600 --> 01:40:13.600
CF: Wir haben es noch nicht gesehen.

01:40:11.360 --> 01:40:13.360
Dominik: Aha.

01:40:11.640 --> 01:40:14.640
Johannes: Das war's.

01:40:13.360 --> 01:40:15.360
Dominik: [Aufnahmellärm]

01:40:13.600 --> 01:40:14.600
CF: Wir haben es noch nicht gesehen.

01:40:14.640 --> 01:40:17.640
Johannes: [Abspann]

01:40:21.360 --> 01:40:23.360
Dominik: Soll noch ein T-Shirt machen, Jürgen?

01:40:23.360 --> 01:40:25.360
Dominik: [Aufnahmellärm]

01:40:35.360 --> 01:40:37.360
Dominik: Das kriegen wir hin.

01:40:37.360 --> 01:40:39.360
Dominik: [Aufnahmellärm]

01:40:37.600 --> 01:40:41.580
CF: (Siehe Untertitelung aufgrund der Audioqualität nicht möglich)

01:40:53.360 --> 01:40:55.360
Dominik: Ja, haben wir.

01:40:55.360 --> 01:40:57.360
Dominik: [Aufnahmellärm]

01:41:11.640 --> 01:41:15.640
Johannes: [Abspann]

01:41:13.360 --> 01:41:15.360
Dominik: Ja, kann ja gerne zu Besuch kommen.

01:41:15.360 --> 01:41:17.360
Dominik: [Aufnahmellärm]

01:41:17.360 --> 01:41:19.360
Dominik: Wie ist es eigentlich mit den

01:41:19.360 --> 01:41:21.360
Dominik: tollen Transkripten

01:41:21.360 --> 01:41:23.360
Dominik: von unserem Podcast, lieber Jochen?

01:41:23.360 --> 01:41:25.360
Dominik: [Aufnahmellärm]

01:41:36.640 --> 01:41:39.640
Johannes: [Abspann]

01:41:39.640 --> 01:41:43.640
Johannes: [Abspann]

01:41:47.360 --> 01:41:49.360
Dominik: Also, falls ihr taub seid und es

01:41:49.360 --> 01:41:51.360
Dominik: trotzdem hören wollt, könnt ihr uns jetzt auch alles lesen.

01:41:51.360 --> 01:41:53.360
Dominik: [Aufnahmellärm]

01:42:04.640 --> 01:42:07.640
Johannes: [Abspann]

01:42:07.640 --> 01:42:11.640
Johannes: [Abspann]

01:42:32.640 --> 01:42:35.640
Johannes: [Abspann]

01:42:35.640 --> 01:42:39.640
Johannes: [Abspann]

01:43:00.640 --> 01:43:03.640
Johannes: [Abspann]

01:43:03.640 --> 01:43:07.640
Johannes: [Abspann]

01:43:28.640 --> 01:43:31.640
Johannes: [Abspann]

01:43:31.640 --> 01:43:35.640
Johannes: [Abspann]

01:43:56.640 --> 01:43:59.640
Johannes: [Abspann]

01:43:59.640 --> 01:44:03.640
Johannes: [Abspann]

01:44:24.640 --> 01:44:27.640
Johannes: [Aspann]

01:44:27.640 --> 01:44:31.640
Johannes: [Aspann]

01:44:52.640 --> 01:44:55.640
Johannes: [Aspann]

01:44:55.640 --> 01:44:59.640
Johannes: [Aspann]

01:45:20.640 --> 01:45:23.640
Johannes: [Aspann]

01:45:23.640 --> 01:45:27.640
Johannes: [Aspann]

01:45:39.100 --> 01:45:43.100
CF: (Siehe Untertitelung aufgrund der Audioqualität nicht möglich)

01:45:43.100 --> 01:45:49.100
CF: (Siehe Untertitelung aufgrund der Audioqualität nicht möglich)

01:45:48.640 --> 01:45:51.640
Johannes: [Aspann]

01:45:51.640 --> 01:45:55.640
Johannes: [Aspann]

01:45:55.360 --> 01:45:57.360
Dominik: Wahrscheinlich kann man es nicht einfach mit selber multiplizieren

01:45:57.360 --> 01:45:59.360
Dominik: und dann nochmal wieder eins abziehen und dann hat man das schon.

01:45:59.360 --> 01:46:01.360
Dominik: [Aufnahmellärm]

01:46:01.360 --> 01:46:03.360
Dominik: Fast.

01:46:03.360 --> 01:46:05.360
Dominik: [Aufnahmellärm]

01:46:07.100 --> 01:46:11.100
CF: (Siehe Untertitelung aufgrund der Audioqualität nicht möglich)

01:46:11.100 --> 01:46:17.100
CF: (Siehe Untertitelung aufgrund der Audioqualität nicht möglich)

01:46:13.360 --> 01:46:15.360
Dominik: Wie lange braucht man eine Zahl zu sagen?

01:46:15.360 --> 01:46:17.360
Dominik: 41 Millionen?

01:46:16.640 --> 01:46:19.640
Johannes: [Aspann]

01:46:17.360 --> 01:46:19.360
Dominik: [Aufnahmellärm]

01:46:19.640 --> 01:46:23.640
Johannes: [Aspann]

01:46:23.360 --> 01:46:25.360
Dominik: Oh, da muss ich nicht runter regeln.

01:46:25.360 --> 01:46:27.360
Dominik: [Aufnahmellärm]

01:46:35.100 --> 01:46:39.100
CF: (Siehe Untertitelung aufgrund der Audioqualität nicht möglich)

01:46:39.100 --> 01:46:45.100
CF: (Siehe Untertitelung aufgrund der Audioqualität nicht möglich)

01:46:44.640 --> 01:46:47.640
Johannes: [Aspann]

01:46:47.640 --> 01:46:51.640
Johannes: [Aspann]

01:47:03.100 --> 01:47:07.100
CF: (Siehe Untertitelung aufgrund der Audioqualität nicht möglich)

01:47:03.360 --> 01:47:05.360
Dominik: Wir können jedes Mal jetzt in einer Episode

01:47:05.360 --> 01:47:07.360
Dominik: so eine kleine Episode von dieser Primzah mit sehen.

01:47:07.100 --> 01:47:13.100
CF: (Siehe Untertitelung aufgrund der Audioqualität nicht möglich)

01:47:07.360 --> 01:47:09.360
Dominik: [Aufnahmellärm]

01:47:12.640 --> 01:47:15.640
Johannes: [Aspann]

01:47:15.640 --> 01:47:19.640
Johannes: [Aspann]

01:47:31.100 --> 01:47:35.100
CF: (Siehe Untertitelung aufgrund der Audioqualität nicht möglich)

01:47:35.100 --> 01:47:41.100
CF: (Siehe Untertitelung aufgrund der Audioqualität nicht möglich)

01:47:40.640 --> 01:47:43.640
Johannes: [Aspann]

01:47:43.640 --> 01:47:47.640
Johannes: [Aspann]

01:47:59.100 --> 01:48:03.100
CF: (Siehe Untertitelung aufgrund der Audioqualität nicht möglich)

01:48:03.100 --> 01:48:09.100
CF: (Siehe Untertitelung aufgrund der Audioqualität nicht möglich)

01:48:08.640 --> 01:48:11.640
Johannes: [Aspann]

01:48:17.640 --> 01:48:21.640
Johannes: [Aspann]

01:48:27.100 --> 01:48:31.100
CF: (Siehe Untertitelung aufgrund der Audioqualität nicht möglich)

01:48:31.100 --> 01:48:37.100
CF: (Siehe Untertitelung aufgrund der Audioqualität nicht möglich)

01:48:36.260 --> 01:48:44.260
Jochen: [kein Ton]

01:48:42.640 --> 01:48:45.640
Johannes: [Aspann]

01:48:44.260 --> 01:48:54.260
Jochen: [kein Ton]

01:48:45.640 --> 01:48:49.640
Johannes: [Aspann]

01:48:55.100 --> 01:48:59.100
CF: (Siehe Untertitelung aufgrund der Audioqualität nicht möglich)

01:48:59.100 --> 01:49:05.100
CF: (Siehe Untertitelung aufgrund der Audioqualität nicht möglich)

01:49:10.640 --> 01:49:13.640
Johannes: [Aspann]

01:49:13.640 --> 01:49:17.640
Johannes: [Aspann]

01:49:17.640 --> 01:49:20.640
Johannes: [Aspann]

01:49:23.100 --> 01:49:27.100
CF: (Siehe Untertitelung aufgrund der Audioqualität nicht möglich)

01:49:23.640 --> 01:49:27.640
Johannes: [Aspann]

01:49:48.640 --> 01:49:51.640
Johannes: [Aspann]

01:49:51.640 --> 01:49:55.640
Johannes: [Aspann]

01:50:16.640 --> 01:50:19.640
Johannes: [Aspann]

01:50:19.640 --> 01:50:23.640
Johannes: [Aspann]

01:50:44.640 --> 01:50:47.640
Johannes: [Aspann]

01:50:47.640 --> 01:50:51.640
Johannes: [Aspann]

01:51:09.360 --> 01:51:11.360
Dominik: Du meinst in den nächsten fünf Jahren?

01:51:11.360 --> 01:51:13.360
Dominik: [Aufnahmellärm]

01:51:12.640 --> 01:51:15.640
Johannes: [Aspann]

01:51:15.640 --> 01:51:19.640
Johannes: [Aspann]

01:51:40.640 --> 01:51:43.640
Johannes: [Aspann]

01:51:43.640 --> 01:51:47.640
Johannes: [Aspann]

01:52:08.640 --> 01:52:11.640
Johannes: [Aspann]

01:52:11.640 --> 01:52:15.640
Johannes: [Aspann]

01:52:31.100 --> 01:52:35.100
CF: Ich finde es ja total lustig. Also man gewöhnt sich ja wirklich total dran.

01:52:35.100 --> 01:52:39.100
CF: Ich bin nicht so extrem, ich höre vielleicht 1,2 oder 1,5 oder so.

01:52:36.640 --> 01:52:39.640
Johannes: [Aspann]

01:52:39.100 --> 01:52:43.100
CF: Und an das Sprechen gewöhnt man sich total. Aber wenn man so eine Zeit lang

01:52:39.640 --> 01:52:43.640
Johannes: [Aspann]

01:52:43.100 --> 01:52:47.100
CF: irgendwas mit normaler Geschwindigkeit und dann erhöht gehört hat,

01:52:47.100 --> 01:52:51.100
CF: die Jingle klingt immer falsch. Also selbst Jahre, ich höre jetzt,

01:52:51.100 --> 01:52:55.100
CF: was weiß ich, wie heißt der Microsoft C#-Tipp?

01:52:55.100 --> 01:52:59.100
CF: Ähm, Äh, Hansel Minutes.

01:52:59.100 --> 01:53:03.100
CF: Höre ich seit Jahren 20% schneller, die Jingle klingt immer noch falsch.

01:53:03.100 --> 01:53:07.100
CF: Also das...

01:53:04.640 --> 01:53:07.640
Johannes: [Aspann]

01:53:07.100 --> 01:53:11.100
CF: (Siehe Untertitelung aufgrund der Audioqualität nicht möglich)

01:53:07.640 --> 01:53:11.640
Johannes: [Aspann]

01:53:09.360 --> 01:53:13.360
Dominik: Es gibt gute Jingles, die hören sich auf unterschiedlichen Geschwindigkeiten ähnlich interessant an.

01:53:11.100 --> 01:53:15.100
CF: Ich habe einen Python-Pick.

01:53:13.360 --> 01:53:15.360
Dominik: Und ha!

01:53:15.100 --> 01:53:19.100
CF: Es gibt eine super kleine Studie von Erid Katriel,

01:53:15.360 --> 01:53:17.360
Dominik: [Aufnahmellärm]

01:53:19.100 --> 01:53:23.100
CF: das ist eine CPython-Core-Entwicklerin, die eine Studie darüber gemacht hat,

01:53:23.100 --> 01:53:27.100
CF: wie viel PyPI-Pakete Return, Break oder Continue-Anweisungen

01:53:27.100 --> 01:53:31.100
CF: in Finally-Blöcken machen. Weil es gab nämlich so eine kleine Diskussion darüber,

01:53:31.100 --> 01:53:35.100
CF: dass man, ob man vielleicht, also Except-Doppelpunkt,

01:53:32.640 --> 01:53:35.640
Johannes: [Aspann]

01:53:35.100 --> 01:53:39.100
CF: also ohne Angabe einer Exception-Typ abschaffen sollte,

01:53:35.640 --> 01:53:39.640
Johannes: [Aspann]

01:53:39.100 --> 01:53:43.100
CF: irgendwann in einer der nächsten Versionen.

01:53:43.100 --> 01:53:47.100
CF: Da gab es total viel Gegenmeinung und dann haben sie das Vorhaben

01:53:47.100 --> 01:53:51.100
CF: auch wieder aufgegeben. Aber eine der Ergebnisse von der Diskussion war eben,

01:53:51.100 --> 01:53:55.100
CF: einfach mal zu gucken, wie sieht das denn mit Finally aus? Und Return, Break und Continue

01:53:55.100 --> 01:53:59.100
CF: in Finally haben ja so ein bisschen so komische Effekte. Wenn man Return macht,

01:53:59.100 --> 01:54:03.100
CF: dann ist das ein bisschen wie ein Code. Also wenn ich quasi

01:54:00.640 --> 01:54:03.640
Johannes: [Aspann]

01:54:03.100 --> 01:54:07.100
CF: Try-Finally habe und der Code wirft eine Exception und in dem

01:54:03.640 --> 01:54:07.640
Johannes: [Aspann]

01:54:07.100 --> 01:54:11.100
CF: Finally-Block mache ich dann Return, dann returne ich halt einfach von der Funktion

01:54:11.100 --> 01:54:15.100
CF: und die Exception verschwindet. Und deswegen hat Erid eben gesagt,

01:54:15.100 --> 01:54:19.100
CF: sie schaut mal, wie das in, hier steht irgendwo, wie viele Pakete

01:54:19.100 --> 01:54:23.100
CF: sie angeschaut hat, die 8000 beliebtesten PyPI-Pakete

01:54:23.100 --> 01:54:27.100
CF: analysiert, eben ein Skript geschrieben, was

01:54:27.100 --> 01:54:31.100
CF: sollte, ob eben das Finally-Block mit Break, Continue und Return

01:54:28.640 --> 01:54:31.640
Johannes: [Aspann]

01:54:31.100 --> 01:54:35.100
CF: drin vorkommen und dann von Hand analysiert, wie viele

01:54:31.640 --> 01:54:35.640
Johannes: [Aspann]

01:54:35.100 --> 01:54:39.100
CF: von denen quasi wirklich so sein sollen und

01:54:39.100 --> 01:54:43.100
CF: wie viele von denen Bugs sind. Also es waren 120 Millionen Zeilen Python

01:54:43.100 --> 01:54:47.100
CF: und darin waren 200 Fälle von

01:54:47.100 --> 01:54:51.100
CF: Kontrollflussinstruktionen in Finally-Blocken.

01:54:51.100 --> 01:54:55.100
CF: Davon waren 46 korrekt, aber diese 46

01:54:55.100 --> 01:54:59.100
CF: waren lauter Tests in irgendwelchen Lintern, die eben

01:54:56.640 --> 01:54:59.640
Johannes: [Aspann]

01:54:59.100 --> 01:55:03.100
CF: sicherstellen wollten, dass der Linter sagt, bitte verwende kein Return in Finally.

01:54:59.640 --> 01:55:03.640
Johannes: [Aspann]

01:55:03.100 --> 01:55:07.100
CF: Acht Fälle waren wirklich korrekt, also wirklich, wo das

01:55:07.100 --> 01:55:11.100
CF: quasi gewollt ist, dass die Exception dann gestuckt wird. Und 149

01:55:11.100 --> 01:55:15.100
CF: waren dann eben Bugs, die Erid Katrin dann auch immer

01:55:15.100 --> 01:55:19.100
CF: bei den entsprechenden GitHub-Repositories gemeldet hat und die meisten dieser Bugs

01:55:19.100 --> 01:55:23.100
CF: werden jetzt gefixt. Also sieht schon so ein bisschen aus, als wäre das jetzt nicht

01:55:23.100 --> 01:55:27.100
CF: so das wichtige Feature und auch ein Feature, was vielleicht eher zu

01:55:24.640 --> 01:55:27.640
Johannes: [Aspann]

01:55:27.100 --> 01:55:31.100
CF: Missanwendungen

01:55:27.640 --> 01:55:31.640
Johannes: [Aspann]

01:55:31.100 --> 01:55:35.100
CF: als zu korrekten Anwendungen führt.

01:55:35.100 --> 01:55:39.100
CF: Und wenn ihr wollt, habe ich noch einen mega nerdy Pick.

01:55:39.100 --> 01:55:43.100
CF: Es gibt ein Paper, was einen C-Compiler für eine sehr

01:55:43.100 --> 01:55:47.100
CF: kleine Timing von C nach Shell übersetzt.

01:55:47.100 --> 01:55:51.100
CF: Und das ist vollständig genug,

01:55:51.100 --> 01:55:55.100
CF: dass der C-Compiler sich dann, wenn er sich selbst nach Shell übersetzen kann

01:55:52.640 --> 01:55:55.640
Johannes: [Aspann]

01:55:55.100 --> 01:55:59.100
CF: und dann kann ich quasi, wenn ich nur irgendeine beliebige Unix-Scherle

01:55:55.640 --> 01:55:59.640
Johannes: [Aspann]

01:55:59.100 --> 01:56:03.100
CF: habe, kann ich einen sehr kleinen C-Compiler bootstraten.

01:56:03.100 --> 01:56:07.100
CF: Und also die haben auch Gründe,

01:56:07.100 --> 01:56:11.100
CF: das sind irgendwelche Forscher, die gute Gründe dafür haben, warum sie das machen.

01:56:11.100 --> 01:56:15.100
CF: Also die haben so Trusting-Trust-Gründe.

01:56:15.100 --> 01:56:19.100
CF: Also damit kann man halt sicherstellen, dass man keine langlebigen Backdoors

01:56:19.100 --> 01:56:23.100
CF: in Compilern hat. Aber die Gründe sind mir egal, warum ich das toll finde,

01:56:20.640 --> 01:56:23.640
Johannes: [Aspann]

01:56:23.100 --> 01:56:27.100
CF: es gibt ja immer diese Argumente, C ist eine schnelle Sprache, weil die ist

01:56:23.640 --> 01:56:27.640
Johannes: [Aspann]

01:56:27.100 --> 01:56:31.100
CF: compiled und Python ist eine langsame Sprache, die ist interpretiert.

01:56:31.100 --> 01:56:35.100
CF: Und von solchen Argumenten halte ich gar nichts, weil das ist halt eine Eigenschaft der Implementierung,

01:56:35.100 --> 01:56:39.100
CF: ob was compiled oder interpretiert ist. Ich kann halt kompilierte Python-Implementierung

01:56:39.100 --> 01:56:43.100
CF: haben und interpretierte. Das ist keine inhärente Eigenschaft der Sprache.

01:56:43.100 --> 01:56:47.100
CF: Und das ist einfach so ein schönes Gegenbeispiel, dass ich

01:56:47.100 --> 01:56:51.100
CF: eine kompilierte Version von C habe, die halt trotzdem ultra langsam ist.

01:56:48.640 --> 01:56:51.640
Johannes: [Aspann]

01:56:51.100 --> 01:56:55.100
CF: Das war's.

01:56:51.640 --> 01:56:55.640
Johannes: [Aspann]

01:56:53.360 --> 01:56:55.360
Dominik: Okay, sehr schön.

01:56:55.100 --> 01:57:17.100
CF: Tschüss!

01:56:55.360 --> 01:56:57.360
Dominik: Ja, ich würde sagen,

01:56:57.360 --> 01:56:59.360
Dominik: das war ein passender Schlusswort für das.

01:56:59.360 --> 01:57:01.360
Dominik: Jetzt könnt ihr auch wieder runterdrehen,

01:57:01.360 --> 01:57:03.360
Dominik: eure Geschwindigkeit beim Hören.

01:57:03.360 --> 01:57:05.360
Dominik: Und wünschen euch

01:57:05.360 --> 01:57:07.360
Dominik: einen wunderschönen Tag,

01:57:07.360 --> 01:57:09.360
Dominik: wunderschöne Nacht, wunderschönen Morgen,

01:57:09.360 --> 01:57:11.360
Dominik: wunderschönen Aufstehen. Bleibt uns gewogen,

01:57:11.360 --> 01:57:13.360
Dominik: hallo@pythonpodcast.de für alles Feedback und so weiter.

01:57:13.360 --> 01:57:15.360
Dominik: Bis bald. Tschüss.

01:57:14.260 --> 01:57:16.260
Jochen: [kein Ton]

01:57:15.360 --> 01:57:17.360
Dominik: [Aufnahmellärm]

01:57:16.260 --> 01:57:16.260
Jochen: [kein Ton]

01:57:16.260 --> 01:57:18.260
Jochen: [ENDE]

01:57:16.640 --> 01:57:18.640
Johannes: Tschau.

