[RANT] Der Interpreter

Es gibt 52 Antworten in diesem Thema, welches 9.473 mal aufgerufen wurde. Der letzte Beitrag (17. August 2010 um 23:05) ist von Herbarius.

  • Ich will hier nicht über den Befehlsumfang lästern, mehr passte scheinbar nicht in ~9 kbyte (8 kbyte BASIC-ROM und noch ca 1 kbyte im Kernal-ROM).
    Einfach nur mal ein paar Dinge die mir aufgefallen sind wo ich nur den Kopf schüttle.

    - Eine einsame Variable kostet 7 byte, selbst wenn sie nur 1 byte halten soll. (2 byte Verwaltung, 5 byte Float-Daten)
    - Singles (16 bit Integer) sind langsamer wie Floats weil der Interpreter intern nur mit Floats rechnen kann und verbrauchen trotzdem 4 byte. (2 byte Verwaltung, 2 byte Single-Daten)
    - Die Garbage-Collection ist langsam und muss, um langen Wartezeiten vorzubeugen, manuell angetreten werden.
    - Die Stringverwaltung ist äußerst ineffizient. Egal was ich treibe, der Interpreter legt erst mal einen komplett neuen String im Speicher an.
    - Die Stringmanipulatoren sind extrem pedantisch. A=0:MID$(T$,1,A) produziert einen Fehler statt mir einfach einen leeren String zu geben.
    - Soweit ich das sehe wird ein IF bis zum Ende durchgezogen, selbst wenn schon der erste Vergleich fehlschlägt. Das nötigt einem zu so etwas: IF F=O THEN IF B=A THEN ...

    Blog: Bitte melde dich an, um diesen Link zu sehen. - The Seventies Board: Bitte melde dich an, um diesen Link zu sehen. Bitte melde dich an, um diesen Link zu sehen.

    Ein Terminal und ein Z80 :D

  • War ja klar, ist von Microsoft. Das Markenzeichen für Ineffizienz ...

    Bitte melde dich an, um diesen Link zu sehen. --- Bitte melde dich an, um diesen Link zu sehen. --- Bitte melde dich an, um diesen Link zu sehen.

  • Gut Diddl, bitte einmal einen Basic-Interpreter in den 9K. Kannst du ja bestimmt effizienter und besser.

    Ehrlich, das ewige Gemecker geht mir auf den Sack.


    Das mit den IF kann ich mir vorstellen, weil man ja so hässliche klammernlose Konstrukte mit AND und OR machen kann. Da muss der Interpreter doch mal voll drüber:

    IF A=0ANDB=1ORC=2 THEN ...

    C64Studio: Bitte melde dich an, um diesen Link zu sehen. - Bitte melde dich an, um diesen Link zu sehen. --- C64Studio WIP: Bitte melde dich an, um diesen Link zu sehen. - Bitte melde dich an, um diesen Link zu sehen. --- Bitte melde dich an, um diesen Link zu sehen.

  • Wegen (genau diesem (mehr oder weniger)) BASIC haben sich die Geraete so gut verkauft und MS wurde zu dem was es ist.
    Der BASIC code ist zwar denkbar haesslich wenn man sich den mal genauer ansieht aber ganz sicher nicht so uebel wie der ein oder andere denken koennte.
    Und vollkommen ausreichend noch dazu - damals waren diejenigen die MEHR wollten wohl auch nicht so Assemblerresistent wie heute :wink:

    Bitte melde dich an, um diesen Link zu sehen.
    Bitte melde dich an, um diesen Link zu sehen.
    Bitte melde dich an, um diesen Link zu sehen.

  • IF A=0ANDB=1ORC=2 THEN ...


    Ein richtig guter Interpreter würde schon merken das A eben nicht gleich Null ist...
    Vorallem, wo ist bei deinem Beispiel eigentlich die Priorität?
    a=0 and (b=1 or c=2) oder (a=0 and b=1) or c=2
    Hat das mal einer dokumentiert? :)

    Wegen (genau diesem (mehr oder weniger)) BASIC haben sich die Geraete so gut verkauft und MS wurde zu dem was es ist.


    Hmm... MS ist groß geworden weil es Raubkopien von MSDOS und WIN3.x "geduldet" und seine Software als OEM-Versionen verschleudert hat.

    Naja, vielleicht bin ich auch einfach nur verwöhnt. :)

    Blog: Bitte melde dich an, um diesen Link zu sehen. - The Seventies Board: Bitte melde dich an, um diesen Link zu sehen. Bitte melde dich an, um diesen Link zu sehen.

    Ein Terminal und ein Z80 :D

  • Bastet, das meine ich. Ich würde da immer Klammern rum setzen, aber je nachdem, wie der Interpreter da vorgeht, muss er eben da alles durchwühlen.

    C64Studio: Bitte melde dich an, um diesen Link zu sehen. - Bitte melde dich an, um diesen Link zu sehen. --- C64Studio WIP: Bitte melde dich an, um diesen Link zu sehen. - Bitte melde dich an, um diesen Link zu sehen. --- Bitte melde dich an, um diesen Link zu sehen.

  • Vorallem, wo ist bei deinem Beispiel eigentlich die Priorität?
    a=0 and (b=1 or c=2) oder (a=0 and b=1) or c=2
    Hat das mal einer dokumentiert? :)


    Die Operationen haben numerische Prioritäten. Die komplette Liste habe ich gerade nicht da, aber in einer zum C64-BASIC kompatiblen Grammatik hatte ich mal 70 für OR, 80 für AND, 90 für NOT, 100 für Vergleichsoperatoren (</>/=/... - egal ob numerisch oder Strings), 121 für Addition/Subtraktion, 123 für Multiplikation/Division, 125 für unäres Plus/Minus (d.h. Vorzeichen vor Zahlen) und 127 für den Potenzoperator (der mathematisch betrachtet falsch bindet) in den Kommentaren notiert.

    10 x=rnd(-1963):fori=1to81:y=rnd(1):next
    20 forj=1to5:printchr$(rnd(1)*16+70);:next
    30 printint(rnd(1)*328)-217

    Bitte melde dich an, um diesen Link zu sehen. - Bitte melde dich an, um diesen Link zu sehen. - Bitte melde dich an, um diesen Link zu sehen.

  • D.h. der Interpreter muss voll drüber, um zu prüfen, ob da nicht noch irgendein höherwertiger Operator drin ist. Aua.

    C64Studio: Bitte melde dich an, um diesen Link zu sehen. - Bitte melde dich an, um diesen Link zu sehen. --- C64Studio WIP: Bitte melde dich an, um diesen Link zu sehen. - Bitte melde dich an, um diesen Link zu sehen. --- Bitte melde dich an, um diesen Link zu sehen.

  • Ach...man kann sich jetzt darüber aufregen, dass das Basic so "schlecht" sei. Aber genau das finde ich ist es nicht! (siehe Basic Game Compo, da muss man auch damit zurecht kommen)
    Dann hat der C64 doch schon einige Jahre auf dem Buckel. Ist schon klar, dass das alles lächerlich erscheint, wenn man das mit heutigen Sprachen vergleicht
    Hat das alles früher normale User gestört? Ich denke nicht. Die waren sicherlich froh, wenn sie überhaupt etwas machen konnten.

    Mein Tipp um dieses rießige Problem zu lösen: Sucht einen der Entwickler und fragt den doch, wieso man das so gemacht hat und nicht gleich nen i7 eingebaut hat.... :platsch:

    Daniel

  • Zitat

    Ist schon klar, dass das alles lächerlich erscheint, wenn man das mit heutigen Sprachen vergleicht. Hat das alles früher normale User gestört?


    a) das basic ist auch für 1983 schlecht (einfach mal mit der konkurrenz vergleichen)
    b) genau das war auch schon 1983 in der kritik

    was die user damals eher nicht so gestört hat wie heute war: assembler :o)

  • Wirklich ärgerlich find/fand ich die doch arg rudimentäre bzw. überhaupt nicht vorhandene Unterstützung von VIC und SID. Poke und Peek zählt imho nicht, das sind ja mehr so Allzweckwaffen gegen die Systemstabilität :)

    Ansonsten kann man mit Basic V2 aber schon ganz gut leben. N etwas komfortablerer Editor mit Raufscrollen und ohne diesen dämlichen Quotemode, der immer genau das Gegenteil von dem macht was man gerade will, wär vielleicht auch noch ganz schön gewesen, aber was solls.

  • was die user damals eher nicht so gestört hat wie heute war: assembler :o)


    In reinem Assembler Spiele programmieren hat aber einen Nachteil, man wird nie fertig. ;)

    Blog: Bitte melde dich an, um diesen Link zu sehen. - The Seventies Board: Bitte melde dich an, um diesen Link zu sehen. Bitte melde dich an, um diesen Link zu sehen.

    Ein Terminal und ein Z80 :D

  • D.h. der Interpreter muss voll drüber, um zu prüfen, ob da nicht noch irgendein höherwertiger Operator drin ist. Aua.


    Deshalb heißt der ja auch Interpreter :)

    Außerdem war damals sicher halbwegs mathematische Korrektheit (z.B. Operatorprioritäten) wichtiger als Performance, weil man BASIC noch nicht sooo als Spielerei empfunden und auch für Bildungszwecke eingesetzt hat.

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    Bitte melde dich an, um diesen Link zu sehen. | Bitte melde dich an, um diesen Link zu sehen.

    Bitte melde dich an, um diesen Link zu sehen.

  • Außerdem war damals sicher halbwegs mathematische Korrektheit (z.B. Operatorprioritäten) wichtiger


    Wenn die denn mal richtig wären... ?2^3^4 gibt auf dem C64 die Zahl 4096 aus, eigentlich müsste ca. 2,4*10^24 rauskommen.

    10 x=rnd(-1963):fori=1to81:y=rnd(1):next
    20 forj=1to5:printchr$(rnd(1)*16+70);:next
    30 printint(rnd(1)*328)-217

    Bitte melde dich an, um diesen Link zu sehen. - Bitte melde dich an, um diesen Link zu sehen. - Bitte melde dich an, um diesen Link zu sehen.

  • Wenn die denn mal richtig wären... ?2^3^4 gibt auf dem C64 die Zahl 4096 aus, eigentlich müsste ca. 2,4*10^24 rauskommen.

    Zitat von skoe

    halbwegs mathematische Korrektheit


    halbwegs => bei den meisten Operatoren...

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    Bitte melde dich an, um diesen Link zu sehen. | Bitte melde dich an, um diesen Link zu sehen.

    Bitte melde dich an, um diesen Link zu sehen.

  • Basic gibt's doch auch auf diversen Microcontrollern, also PIC, AVR und wie sie nicht alle heissen. Einen mini-Interpreter hat Adam Dunkels (Contiki) mal veröffentlicht: Bitte melde dich an, um diesen Link zu sehen.

    Viele der alten Computer haben ihren Basic-Interpreter in 4k, teilweise sogar in 2K gehabt. Der C64 war also schon gar nicht so schlecht ausgestattet. Dass jedoch aus der Speichermenge so wenig (effizientes) herausgeholt wurde ist tatsächlich enttäuschend.

    Jens

    Bitte melde dich an, um diesen Link zu sehen. - Das offizielle iComp Supportforum ist online.

  • Ich muss an dieser Stelle 'gestehen', dass der Tape-load ENORM viel Platz einnimmt.
    Waere man da einfach mal pragmatischer gewesen und haette sich auf einen langsamen TurboTape bzw.
    einfach den KCS (den es schon lange vor 82 gab) eingelassen, waere das einmal VIEL schneller gewesen und zum anderen ungleich kuerzer.

    Bitte melde dich an, um diesen Link zu sehen.
    Bitte melde dich an, um diesen Link zu sehen.
    Bitte melde dich an, um diesen Link zu sehen.

  • Zitat

    Wenn die denn mal richtig wären... ?2^3^4 gibt auf dem C64 die Zahl 4096 aus, eigentlich müsste ca. 2,4*10^24 rauskommen.


    Das ist ja man sowas von falsch... Da wir nur einen Operator haben, hat der identische Priorität, d.h. es wird von links nach rechts ausgewertet.
    2^3=8
    8^4=4096

    Ich möchte hier mal eine Lanze für den Interpreter brechen, der ist für die Größe des belegten Speichers und den puscheligen 6502-Prozessor schon recht genial, außerdem gab es den schon seit mindestens Ende der 70er für alle möglichen Systeme. Der macht seine Sache schon fein. Hat sich schonmal jemand das Integer-Basic vom Apple-II angeschaut? Oder die Krücke vom ZX-80/81? So schlimm ist das Microsoft/Commodore-Basic nun wirklich nicht!

    Basic V2 Programme unter Windows editieren: Bitte melde dich an, um diesen Link zu sehen.

  • ?2^3^4 gibt auf dem C64 die Zahl 4096 aus, eigentlich müsste ca. 2,4*10^24 rauskommen.


    Warum das? Gleiche Operatoren bzw Operatoren mit gleicher Priorität werden halt von vorne nach hinten ausgeführt.