Hallo Besucher, der Thread wurde 21k mal aufgerufen und enthält 128 Antworten

letzter Beitrag von Bodhi1969 am

F64Summer -- neuer Checksummer zum Abtippen von BASIC Zeilen

  • Wie aufwändig wäre es denn, falls der Checksummer auf einen Doppelpunkt in einer Zeile trifft, auf anschließendes REM zu testen und dann ggf. die Checksumme nur für den Teil vor dem Doppelpunkt zu berechnen?

    Siehe oben:

    Dann genügt es aber nicht mehr, linear zu parsen und sich nur Status zu merken (wie "bin ich gerade in einem String?"), man muss auch nach vorne schauen -- oder anders gesagt, es gibt Kontext nicht mehr nur in eine Richtung sondern in beide. Das bedeutet leider, dass der Checksummer signifikant größer wird.

    Machbar ist das, und das wäre der IMHO korrekte Weg, dieses Feature umzusetzen. Konkret: Leerzeichen werden sowieso übersprungen, aber man müsste bei jedem Doppelpunkt "vorauslesen" ob noch etwas anderes kommt außer Doppelpunkt, Leerzeichen und dem Token für "REM".


    Ohne es auszuprobieren behaupte ich das kostet mindestens 20 Bytes. Da man den Checksummer ja erstmal abtippen muss halte ich das nicht für sinnvoll.

  • Wer Bedenken hat, daß man Listings beim Abtippen verändert, kann sie ja mit selbstmodifizierenden Code schützen. Sobald ein REM nicht die richtige Länge hat, oder auch nur ein Doppelpunkt oder Leerzeichen fehlt, würde es dann abschmieren. Ein Checksummer, der diese Fälle ausklammert wäre dann allerdings nicht mehr für's Abtippen eines derartig geschützten Programms geeignet.

  • Wer Bedenken hat, daß man Listings beim Abtippen verändert, kann sie ja mit selbstmodifizierenden Code schützen

    Bei einem BASIC-Programm? Wer macht sowas? :gruebel

    Mir ist vor Urzeiten mal ein BASIC-Programm am C64 untergekommen, das hatte sich Daten aus den Kommentaren hinter dem REM-Befehl geholt (also eine Art "DATA-Ersatz"). Keine Ahnung, warum das der Autor damals so gemacht hat, aber auch hier wäre das Weglassen des REM-Kommentars ziemlich folgenreich gewesen. :)

  • aber auch hier wäre das Weglassen des REM-Kommentars ziemlich folgenreich gewesen

    Ja klar. Es gibt auch solche, die mit Hilfe des {Delete}-Charakters BASIC-Code verstecken, was sich auf die Checksumme auswirkt, aber man im Listing dann nicht mehr sieht.


    Grundsätzlich geht es aber hier doch um klassische Abtipplistings für eine Zielgruppe, die ein BASIC-Programm erfolgreich abtippen können möchte. Da macht man solche verqueren Sachen nicht.

  • Na, das ignorieren von Leerzeichen finde ich schon sinnvoll und richtig, da die oft beim abtippen weggelassen werden (aber für die Lesbarkeit trotzdem oft abgedruckt sind).


    REM ignorieren würde der gleichen Logik folgen, aber während Leerzeichen ignorieren nur ein paar wenige Bytes Code braucht wird es bei REM deutlich mehr (oder eben, wie weiter oben diskutiert, unvollständig und verwirrend).

  • Snoopy Auch ohne Fettdruck und Unterstreichen, weiss ich, auf was ihr besteht: Ein Programm soll das machen, was von ihm erwartet wird. Punkt. Das hat zrs1 bereits erläutert mit dem Hinweis auf das "Principle of least surprise". Ich denke bei solchen Diskussionen immer ein wenig an Apple, die es schafft, die Endanwender-Sicht einzunehmen und nicht darauf beharrt, technisch logisch zu denken. Es geht ja darum, dass ein Mensch ein Listing Abtippen und am Schluss ein Hochgefühl seiner Abtipparbeit erleben möchte. Wie kann man es also schaffen, dass ein erwünschenswerter "Flow" also ein Glücksgefühl auch schon beim Abtippen eintritt? Entsteht der Flow dadurch, dass ich, wenn ich in einer Zeile ein Zeichen ändere und Return drücke, sich die Checksumme ändert? Oder eben die Checksumme möglichst schnell übereinstimmt und ich zur nächsten Zeile übergehen kann?


    Prinzipien sind keine Gesetze und können je nach Anwendungsfall relativiert werden. Man könnte denn F64Summer mit diesem Zusatzfeature (REM-Kommentare haben keinen Einfluss auf Checksumme) auch genausogut gegenüber anderen Checksummern als "bessere Lösung" verkaufen, das auf die Bedürfnisse der 80%-Anwendungsfälle möglichst gut eingeht und nicht einfach versucht, logisch korrekt zu sein.

  • Also, ich denke so würde es gehen (C64-Version):

    Das wären 23 Bytes mehr. Also über 90 Zeichen mehr abzutippen für den Checksummer.

  • Ich denke bei solchen Diskussionen immer ein wenig an Apple, die es schafft, die Endanwender-Sicht einzunehmen und nicht darauf beharrt, technisch logisch zu denken.

    Bei Apple ist es meistens so, dass der Endanwender sich daran anpassen muss, wie Apple denkt, dass es Endanwender haben wollen. :)

  • Hä? Apple? Ich als Benutzer eines Checksummers wäre massiv verwirrt, wenn Änderungen in einem Kommentar sich nicht auf die Prüfsumme auswirken, das Weglassen aber schon -- daher ist das für mich keine Lösung.


    Was gehen würde ist der Patch oben (der dabei gleichzeitig auch "überflüssige" Doppelpunkte ignoriert, allerdings nicht einen einzelnen Doppelpunkt ganz am Anfang der Zeile, daher IMHO immer noch etwas suboptimal). Schon dieser Patch erhöht den Abtippaufwand für den Checksummer selbst aber so stark, dass ich ihn nicht einbauen möchte.

  • Ich als Benutzer eines Checksummers wäre massiv verwirrt, wenn Änderungen in einem Kommentar sich nicht auf die Prüfsumme auswirken, das Weglassen aber schon -- daher ist das für mich keine Lösung.

    Ich bin ja schon längst bei dir mit deinem Approach jetzt. Ich fände das auch total suboptimal, wenn man den Doppelpunkt oder das REM-Statement drin lassen müsste. Das war nur als - zugegebenermassen schlechten - Kompromiss gedacht, weil du das Programm ja möglichst kurz halten willst - was ich auch erstrebenswert finde.

  • Ok. Ich fasse abschliessend nochmals kurz Pro und Kontra für den Vorschlag zusammen, REM-Kommentare aus der Checksummenberechnung auszuschliessen:


    PRO:

    • Schreibfehler in REM-Kommentaren könnten von der Redaktion im letzten Moment noch korrigiert werden, ohne dass die Checksumme neu berechnet werden müsste. Andernfalls ist der Aufwand zu gross, etwas zu ändern. Schreibfehler machen aber keinen so guten Eindruck.
    • REM-Kommentare könnten komplett ausgetauscht werden ohne Impact auf die Checksumme, z.B. Lokalisierung für ein anderes Sprachgebiet (das gilt dann aber nicht für Text in Strings)
    • REM-Kommentare könnten vom Abtipper optional nur teilweise oder ganz weggelassen werden, ohne dass die Checksumme davon betroffen wäre. Durch das Weglassen wird Zeit beim Abtippen gespart und das Programm läuft dann auch etwas schneller
    • Ein Hinweistext "REM-Statement hat keinen Einfluss auf die Checksumme und kann zugunsten der Performance weggelassen werden." könnte helfen, das unterschiedliche Verhalten des Checksummers zu erklären.
    • Technisch vermutlich realisierbar.
    • Das Checksummer-Tool würde mit diesem Feature um lediglich 23 Bytes bzw. Data-Werte länger (c64)

    KONTRA:

    • Nicht intuitives Verhalten. Es könnte den Eindruck erwecken, dass der Checksummer nicht richtig funktioniert
    • Eine Funktion sollte sich erwartungsgemäß immer gleich Verhalten (Principle of least surprise)
    • Unnötige Anforderung, weil REM-Statements in der selben Zeile wie Code nichts zu suchen haben. Sinnvoller ist es REM-Statements sparsam und in einer eigenen Zeile unterzubringen.
    • Es scheint bisher niemand ein Problem damit zu haben, REM Statement eintippen zu müssen, um an die Checksumme zu gelangen. Auch waren in den bisherigen BASIC Weihnachten Listings eh nur ganz wenige REM-Statements vorhanden.
    • Erforderliche Änderung nicht getestet, somit nicht bestätigt, dass es problemlos funktioniert und sich in allen Situationen richtig verhält. Nebeneffekte ungewiss.
    • Selbstmodifizierender Code oder REM-Statements als DATA-Ersatz setzt eine exakte Abbildung des kompletten Listings voraus. Ohne korrekt erfassten REM-Statements würde das Programm nicht korrekt laufen.
    • Das Checksummer-Tool würde mit diesem Feature um ganze 23 Bytes bzw. Data-Werte länger (c64)

    Ich hoffe, ich habe da die wichtigsten Punkte berücksichtigt. Wie auch immer die Entscheidung schlussendlich ausfällt, danke ich für die faire Diskussion und Argumentationen. Und Danke an zrs1, dass du dir sogar die Mühe gemacht hast, die Logik probehalber einzubauen.

  • Also diese Argumentsammlung ist größtenteils ok, ich sehe aber ein paar Punkte ein bisschen anders:


    Der Patch oben würde nicht zu verwirrendem Verhalten führen, wenn man davon absieht, dass ein Doppelpunkt am Anfang der Zeile immer noch relevant ist. Getestet habe ich das mittlerweile auch und bin auf keinen Fall gestoßen, in dem es NICHT funktioniert. Was mich daran persönlich stört sind wirklich "nur" die 23 zusätzlichen Bytes, denn das sind 2,5 Bildschirmzeilen mehr abzutippen für den Checksummer selbst :)


    Mit ganz wenigen zusätzlichen Bytes (vermutlich 5) könnte man einfach bei REM abbrechen, wie auch vorgeschlagen wurde. DAS fände ich aber dann unintuitiv und verwirrend.


    Ich werde vermutlich dem User (in der "Publisher" Rolle) die Entscheidung überlassen und eine Build-Option einbauen, so dass die Checksummer mit oder ohne dieses Feature gebaut werden können. mksums bekommt dann ein entsprechendes Flag um REM und überschüssige Doppelpunkte zu ignorieren.

  • Ist es denn nicht so, das REM- Kommentare eher die Ausnahme sind und nicht in jeder Zeile vorkommen? Ist doch dann kein Problem, die befraglichen Zeilen mit fehlerhafter Summe (beim weglassen der Kommentare) noch mal zu überfliegen, FALLS das Programm dann nicht läuft? Wobei das ganze REM- Zeug wirklich in eigene Zeilen gehört, die man dann einfach weglassen kann.


    Weil es hier immer um die Länge des Checksummers geht, warum eigentlich abtippen und nicht downloaden? Dann ist es egal wie gross er ist.

  • Weil es hier immer um die Länge des Checksummers geht, warum eigentlich abtippen und nicht downloaden? Dann ist es egal wie gross er ist.

    Warum braucht man überhaupt einen Checksummer? Zum Abtippen, oder? Sonst könnte man ja auch gleich die fertigen Programme downloaden :) Zum "Retro-Feeling" gehört es IMHO auch, zuerst mal den Checksummer abzutippen.

  • Zum "Retro-Feeling" gehört es IMHO auch, zuerst mal den Checksummer abzutippen.

    Stimmt. Aber wolltest du beim F64Summer BASIC-Programm nicht noch zumindest ein Total über alle DATA-Werte (z.B. c=c+a+b) machen, damit man auch dort sicher sein kann, dass alle DATA-Zeilen korrekt eingegeben wurden?

    Ich habe das hier (siehe folgendes F64Summer-Listing) mal so ergänzt, wobei die Rahmenfarbe noch auf rot gesetzt wird, wenn die Checksumme falsch ist bzw. grün, wenn die DATA-Zeilen korrekt eingegeben wurden. Damit erhält der User auch gleich ein visuelles Feedback, dass der Checksummer nun aktiv ist. Die Variable "a" habe ich bei der Berechnung der Checksumme noch dazu genommen, damit auch das versehentliche Weglassen von DATA-Einträgen mit Wert 0 in der Checksumme berücksichtigt werden.

    Code
    1. 0 fora=820to984:readb:pokea,b:c=c+a+b:next:ifc<>167229thenpoke53280,2:end
    2. 1 data169,73,141,2,3,169,3,141,3,3,169,80,141,4,3,169,3,141,5,3,96,169,255,133
    3. 2 data21,76,131,164,32,124,165,173,0,2,240,6,165,21,73,255,208,1,96,133,252,138
    4. 3 data72,152,72,165,20,73,255,133,251,162,0,134,2,189,0,2,133,253,240,44,36,2
    5. 4 data48,4,201,32,240,33,201,34,208,6,169,255,69,2,133,2,160,8,6,253,42,69,251
    6. 5 data74,144,6,169,104,69,252,133,252,102,252,102,251,136,208,235,232,208,205
    7. 6 data160,3,170,181,251,41,15,32,207,3,153,36,4,136,181,251,74,74,74,74,32,207
    8. 7 data3,153,36,4,232,136,16,229,169,1,160,3,153,36,216,136,16,250,104,168,104
    9. 8 data170,96,201,10,144,3,233,9,96,105,48,96
    10. 9 poke53280,5:sys820

    Dies aber das nur als Idee/Vorschlag.

    Was mich daran persönlich stört sind wirklich "nur" die 23 zusätzlichen Bytes

    Ich verstehe das. Aber zusätzliche 23 DATA-Werte entsprechen nur etwa einer DATA-Zeile bei der C64-Version. Finde ich also schon zumutbar. Vor allem: Entweder ist jemand eh zu bequem die schon vorhandenen DATA-Zeilen abzutippen und lädt sich das Binary einfach runter oder er/sie sieht die zusätzliche Tipp-Vorarbeit als indirekte Wertschätzung und Teil des Abtipp-Flairs ein kleines Software-Tool einsetzbar zu machen - als Basis für das Haupt-Listing.


    Ich werde vermutlich dem User (in der "Publisher" Rolle) die Entscheidung überlassen und eine Build-Option einbauen, so dass die Checksummer mit oder ohne dieses Feature gebaut werden können.

    Würde das aber dann nicht darauf hinauslaufen, dass der Abtipper dann darauf achten müsste, ob er nun bei einem Listing mit 4-stelligen Checksummen den F64SummerWithREM oder F64SummerWithoutREM Checksummer verwenden soll? Am Einfachsten wäre es für mich als Publisher, wenn ich in meinem Listing lediglich ein kleiner Hinweis auf den F64Summer mit Versionsnummer und URL-Link auf den C64-Wiki-F64Summer-Eintrag angeben könnte.


    Dazu noch eine Frage zur Version "Checksumme ohne REM": Gibt der Checksummer dann überhaupt noch eine Checksumme aus (somit nur für die Zeilennummer), wenn z.B. folgende Zeile eingeben und Return gedrückt wird?


    10 rem **** alles klar, herr kommissar ****


    Wenn eine Checksumme angezeigt wird, dann wäre das m.E. klar besser als gar keine Ausgabe, weil ansonsten die Checksumme von der Zeile davor noch auf dem Bildschirm steht, und DAS dann wirklich für Verwirrung sorgen würde.

  • Stimmt. Aber wolltest du beim F64Summer BASIC-Programm nicht noch zumindest ein Total über alle DATA-Werte (z.B. c=c+a+b) machen, damit man auch dort sicher sein kann, dass alle DATA-Zeilen korrekt eingegeben wurden?

    Ich habe das hier (siehe folgendes F64Summer-Listing) mal so ergänzt, [...]

    Ja, zu dem Thema wollte ich mir tatsächlich was überlegen ... schon wieder vergessen :whistling: -- ich bastle wohl mal wieder an zu vielen Baustellen gleichzeitig ;)


    Ob es eine simple Summe wird (ja, wahrscheinlich schon), mal sehen. Jedenfalls hätte DAS ja einen echten Mehrwert, denn ein falsch eingegebener Checksummer ist schon sehr ärgerlich. Natürlich muss auch das so gelöst werden, dass das Listing so klein wie möglich bleibt.


    Danke für deinen Vorschlag, schaue ich mir auf jeden Fall mal an. Allerdings würde ich es so einbauen, dass das BASIC Listing direkt beim Build "herausfällt".

    Dazu noch eine Frage zur Version "Checksumme ohne REM": Gibt der Checksummer dann überhaupt noch eine Checksumme aus (somit nur für die Zeilennummer), wenn z.B. folgende Zeile eingeben und Return gedrückt wird?

    Natürlich. Alles andere würde auch hier wieder eine Sonderbehandlung erfordern, und jede Sonderbehandlung "kostet" wertvolle Bytes :)

  • Ob es eine simple Summe wird (ja, wahrscheinlich schon), mal sehen.

    Ich empfehle faktor=faktor+1:summe=summe+faktor*DATAWERT, durch den hochzählenden Faktor fallen dann auch Zahlendreher auf.