knuspermagier.de

Der privateste Blog von Philipp.

I wanted to find if a particular http response was successful, so “anything in the 200s”. How did I write?

Notes from my journey from Rust to … TypeScript? auf blog.chiselstrike.com

In diesem längeren Artikel schreibt Glauber Costa von seiner magischen Reise von Rust zu TypeScript. Diese ganze Sache ist mir relativ egal, aber ein Detail fand ich ganz spannend. Costa ist jahrelanger C++-Entwickler und unter dem obigen Zitat befindet sich folgendes Code-Beispiel:

const success = req.ret / 100 == 2

Wir erinnern uns, er will herausfinden, ob der HTTP-Statuscode irgendwo zwischen 200 und 299 liegt und benutzt dafür diese Division. In C++ und (wahrscheinlich) allen anderen Sprachen, die ein vernünftiges Typ-System haben macht das eine Integer-Division und das Ergebnis ist halt immer 2, egal ob der Statuscode nun 200, 201 oder 299 ist. Der Rest wird abgeschnitten. In JavaScript kommt halt 2.01 oder 2.99 raus und damit funktioniert dieser clevere Code nicht.

Ich selber wäre niemals im Leben auf diese Code-Zeile gekommen und bei einem Code Review hätte ich sie wahrscheinlich auch als zu clever! gekennzeichnet und die Verfasser:in darauf hingewiesen, das bitte mal leserlicher zu schreiben. Aber mit dem Hintergrund, den Costa hat, ergibt es total Sinn, wie er auch selber schreibt:

I swear to you that this makes total sense in the minds of anyone coming from Rust and C++ […]: When you are used to dealing with low-level code, you learn to fear the processor ‘s branch predictor a bit and it is common to avoid branches when possible (although in this case it would likely predict well). Although division is usually not the fastest processor operation either, at least it is consistent, and in many cases you can rewrite them with shifts and bitwise operations (not in this case), so it is a natural way for us to do it.

Immer ganz spannend, solche Einblicke in das Denken anderer Personen zu bekommen.

Kommentare, Feedback und andere Anmerkungen? Schreib mir eine E-Mail 🤓