Shotnest

Shotnest · Bibliothek

Codetext ohne Annahme gleicher Ausführung vergleichen

Vergleichen Sie zwei Code-Snippets im Textwerkzeug von Shotnest und sehen Sie, warum if (count > 0) und if (count >= 0) dennoch 0,778 ihrer Tokens teilen.

Was der Vergleich mit Code macht

Das Vergleichswerkzeug schreibt beide Eingaben klein, wendet dieselbe Zeichenvereinheitlichung an, die Shotnest für die Suche nutzt (Akzente entfernt, Buchstaben in voller Breite auf halbe Breite gebracht), fasst jede Folge von Leerraum zu einem Leerzeichen zusammen und teilt dann an den Leerzeichen. Gemeldet wird der Anteil der verschiedenen Tokens, die beide Texte gemeinsam haben, dazu die Tokens, die nur auf einer Seite vorkommen. Einrückung, Zeilenumbrüche und Groß- und Kleinschreibung verschwinden vor diesem Schritt – praktisch für Prosa, riskant für Code.

Nichts wird ausgeführt. Die Seite behandelt ein eingefügtes Snippet als reinen Text und gibt das Ergebnis aus, ohne es in Markup zu verwandeln; die Zahlen beschreiben also Zeichen, nicht Verhalten.

Die beiden Snippets vorbereiten

  1. Fügen Sie jedes Snippet genau so ein, wie es erfasst wurde, mit seinen geschweiften Klammern und Operatoren.
  2. Lesen Sie zuerst die Zeile „Exakt gleich“; sie ist die einzige Prüfung, die Schreibung und Abstände berücksichtigt.
  3. Lesen Sie danach „Nach Normalisierung gleich“ und den Überschneidungswert als getrennte Tatsachen.
  4. Öffnen Sie die Token-Listen Nur im ersten Text und Nur im zweiten Text; Operatoren und angehängte Satzzeichen tauchen meist dort auf.
  5. Gehen Sie für alles, was die Token-Listen nicht zeigen können, zum Screenshot zurück, etwa für Einrückung in einer Sprache, in der sie zählt.

Zwei Snippets, ein geänderter Operator

Erster Text: „if (count > 0) { return count; }“, über drei Zeilen geschrieben. Zweiter Text: dieselbe Anweisung in einer Zeile mit >= statt >. Nach der Normalisierung sind die Zeilenumbrüche weg, daher sind > und >= die einzigen abweichenden Tokens. Sieben der neun verschiedenen Tokens sind gemeinsam, das ergibt 7 ÷ 9.

Exakt gleich
Nein
Nach Normalisierung gleich
Nein
Wortüberschneidung
0,7777777777777778
Nur im ersten Text
>
Nur im zweiten Text
>=

Ein zweites Paar zeigt das umgekehrte Risiko: „const Total = 1;“ und „const total = 1;“ gelten nach der Normalisierung als gleich, mit Überschneidung 1, obwohl viele Sprachen Total und total als verschiedene Namen behandeln.

Fehler bei Codetext

Wo der Vergleich aufhört

Die Wortüberschneidung ist ein Textmaß. Sie übergeht Reihenfolge, wiederholte Tokens und Leerraum und kann daher nicht sagen, ob der Code kompiliert oder denselben Wert zurückgibt. In der App Shotnest kommt ein Code-Screenshot in das Regal Code, wenn drei oder mehr Zeilen wie Code beginnen (import, def, return und Ähnliches); dieses Regal dient dem Wiederfinden, das Ausführen ist Sache Ihrer eigenen Umgebung.