www.linux-swt.de

Edwards JavaScript aus dem Wohnheim seit 2012 Homepage

Module

Gibt noch keine Runtime Semantics. Aber Static Semantics. Nach ein paar Bugfixes neuer Funktionen, die ich ueber das Wochenende und davor geschrieben habe, der Interpreter unten ist da kurz vor seinem Untergang, aeh Arbeitsgang, geht es weiter.

module a {
    export function c (a, b) {
	return d(a,b);
    }
    export function d(a=2,b=3) {
	return a+b;
    }
}
/*
module "b" {
    export var x = 10;
    let y = 12;    
    export y;
}

/*
import c from "a";
import {x as i, y as j} from "b";
c(i,j);
*/

ES.next

Heute las ich, [a,b] += [c,d] ist kein valides Konstrukt. Die Implementierung ist eigentlich trivial.

Gestern abend habe ich https://github.com/domenic/promises-unwrapping schon einmal vorsorglich abgearbeitet bevor ich eingeschlafen und rüber bin.

Heute gibt es ein neues ES6 Draft (Rev 19).

Die beste Erfindung am Sonntag war function EarlyErrors(node). Ich werde sie nach jeder Parsenode rufen. Den AST dekorieren.

Die Ergebnisse dieser Tests stehen zur Zeit noch nicht für eine korrekte Implementation.

Funktionieren werden die nicht alle.

September

Auch diesen Monat geht es weiter mit ES6.

	class C {
	    method(a,b,c=3) {
		return a+b+c;
	    }
	    noDefaults(a,b) {
		return a+b;
	    }
	}
	let c = new C();
	c.method(1,2);
    
let x,y,z;
function f(a,b,c=3) {
    return [a,b,c];
}
[x,y,z] = f(1,2);

ConciseBody

Arrow Funktionen haben den ThisMode "lexical", der neu ist, und praktisch bedeutet, dass sie mit dem this der sie einschliessenden Funktion arbeiten. Ach, und es wird nur eine deklarative statt eine Funktionsumgebung verwendet. Der ConciseBody ist eine AssignmentExpression ohne { } rum. Was bleibt ist ein implizites Return, sprich das was rauskommt geht zurück. Man kann sie aber auch mit { FunctionBody } schreiben, wobei man return wieder explizit setzen muss. Ich glaube, ich muß mal sehen, warum der Concise Body eigentlich nicht ausgewertet wird.

	let f = (a,b) => a+b; 
	f(1,2);
    

start: 229ms
js> let x;
eval(Program)
eval(LexicalDeclaration)
undefined
js> let x;
eval(Program)
eval(LexicalDeclaration)
!
HandleAbruptCompletion();
Eine Exception wurde geworfen!

type: ReferenceError
message: x is bereits deklariert
stackTraceLimit: 10
stack: [ReferenceError]: x is bereits deklariert
(Program): at line undefined, col undefined; in [[globalState.scriptLocation]]

!

undefined
js> 

In CreateMutableBinding(N,D). Assert: envRec does not already have a binding for N.

Nachdem ich status = InstantiateGlobalDeclaration und ReturnIfAbrupt(status) statt void benutzt habe, funktionierten auch HasVarDeclaration und HasLexicalDeclaration. In dem oberen Fall führt HasLexicalDeclaration zu einem entsprechendenen Fehler.

August

Im august-2013.html sind dann die Fortschritte seit Juli festgehalten. Einige Tage habe ich nur dreissig Minuten mit dem Rechner verbracht, einige aber auch ein paar Stunden. Mitte August hatte ich dann endlich das ES-262 Draft vom 15. Juli gedruckt bekommen. Seitdem lese ich es. Bis zum Ende des Monats war das Projekt "ES6-virtuelle-Maschine-mit-ES5" auf ueber 10,000 Zeilen oder 300,000 Bytes angewachsen. Hat zur Folge, dass ich einige Stellen bereits verstaendlich erklaeren kann.

Der typeof Operator. Function Type(O) returnt Object, wenn es eine Funktion ist. Man muss pruefen, ob sie callable ist. Type(null) ergibt Null und man gibt "object" zurueck. Uebrigens. Das ist der dynamische Runtime-Typecheck, auf amerikanisch gesagt, meien ich. Ach und noch was. Meine Funktion Type() ist besonders schlecht, da sie fuer Completions, Objekte, Funktion instanceof ruft, was jeweils 1x [@@hasInstance] oder OrdinaryHasInstance macht. Auf Anfaengerdeutsch. Ich ueberlege, das hatte ich zu Beginn bereits, vielleicht eine .type Property an den Objekten zu nutzen. Damit ist der Test konstant und ich kann direkt den .type der Primitiven und Objekte zurueckgeben.<

Juli

Habe ich als juli-2013.html archiviert. Den Rest des Monats habe ich mit Lesen im ECMA Draft verbracht, was ganz schön anstrengend ist, wenn man dafür vor dem Bildschirm sitzen muss und keinen Desktop mehr frei hat und der Computer selbst total ungeeignet zum Arbeiten ist. Alles in allem habe ich das Programm aber aufgeräumt und gut auf die neuen Aufgaben vorbereitet.

Juni

Habe ich als juni-2013.html archiviert. Die Seite ist den Binary Search Trees, dem Splay Tree, AVL Tree gewidmet. Zeigt aber auch eine wichtige Benchmark, die zeigt, wie günstig Objektliterale, und wie gefäährlich Arrays, aber auch Regular Expressions, für die Performance von zum Beispiel Parsern sind. Ausserdem gibt es einen gerichteten Graphen mit konstantem Zugriff auf die Edges, Fibonacci und Recursion Trees, die für die Rekursionsanalyse unverzichtbar sind.

Jobcenter

Hatte ich schon gesagt, dass das Jobcenter mir trotz ueberdurchschnittlicher Leistung beim berufspsychologischen Dienst (weit ueberhoehte Punktzahl bei *allen* Fragen, oberer Bereich im oberen Block, bis auf eine einzige (!) Aufgabe: Wo war das Hotel, wo die Bank auf der Karte? Die ersten drei habe ich weit daneben getippt, danach habe ich die Punkte gerettet. Aber die Aufgabe war dann weniger, sonst alle oberhalb von oberhalb.) dann mit anderen Gruenden kam, dass ich keine Fortbildung zum LPI-geprueften Linux-Admin machen kann? Der Arbeitsvermittler war voll der Idiot, er wuesste ja nicht, ob ich denn belastbar waere. Bis die mir auch nur eine Weiterbildung goennen, habe ich das Rentenalter erreicht. Und ausserdem muss man als Obdach- und Arbeitsloser etwas mehr aushalten koennen.

Grammatik

Habe mir gestern (Dienstag) http://teramako.github.io/ECMAScript/ecma6th_syntax.html gedruckt. Jetzt kann ich mit der Expression aufraeumen(*). Ich grinse uebrigens, schwer ist die nicht, ich bin nur durcheinander gekommen, weil ich vor ein paar Tagen mal so drin rumeditiert habe, dass die Expression ausfuehrlich unterrichtet wird. Hinter dem ExpressionStatement steht ein ;, wie hinter var, let, const, break, throw, continue, return, sowie erlaubt als ClassElement und als EmptyStatement. break, return, throw und cont haben wie PostFixExpression eine Regel, dass kein LineTerminator zwischen ihnen und dem naechsten Token stehen darf, sonst wird ein Semikolon eingefuegt. Ich habe nur vor ein paar Tagen ExpressionStatement (EXPR ;) mit ( EXPR ) (ParenthesizedExpr) mit EXPR (AssignmentExpr, AssignmentExpr, ..) verwechselt. Die Grammatik im Draft ist nur in den Kapiteln up to date. Und ich hatte schon lange nicht mehr auf die Zusammenfassung geguckt und sowieso ein paar Sachen schon wieder vergessen.

(*) noch nicht geschehen

Die "CallExpression TemplateLiteral" sowas wie raw`Template` hatte ich ganz ueberlesen.

Update: Die Grammatik spiegelt bereits Rev19 Draft vom 27. September. Thank you.

Computer Science 164 - Computer Languages and Compilers

Einen Kurs an der Uni von Berkeley, Kalifornien (wo auch die BSD herkommt und wo ich das erste Datenstrukturen und Algorithmen-Videosemester meines Lebens nahm (CS61B)), habe ich dafuer auch gefunden. Es gibt einen 2011er und 2012er Kurs, die beide unterschiedlich sind. Wer LR(1) lernen will, muss den aelteren Kurs nehmen, so ab Lektion 10 (12), wer mehr wissen will, soll beide gucken.

Bottom-Up Parsing: Ich parse die kleinstmoeglichen Symbole zusammen. Dann fasse ich sie uebergeordnet zusammen. Diese kann ich moeglicherweise wieder uebergeordnet zusammenfassen. Das unterscheidet sich eindeutig vom Top-Down Parsing, wo ich die Funktion einer groesseren Produktion rufe, die sich dann moegliche Unterproduktionen holt, bis zu einzelnen Token. Wenn man jetzt nicht shift und reduce nimmt und schwere Tabellen mit NFA, dann kann man da bestimmt auch einen Algorithmus zum Pruefen einer Grammatik Bottom-Up mit ausdenken.

Bytecode

(Design Error Array Buffer first)

Wenn ich einen DataDescriptor als 1 bezeichne, einen Accessor als 2 und enumerable 32 und configurable 64 gebe, dann kann ich die addieren (1+32+64) sowie (2+32+64) oder 32 oder 64 weglassen und mit & testen, ob die Zahl gesetzt ist. Damit habe ich gerade den PropertyDescriptor beschrieben. Demnaechst zeige ich die Tabellen. Die darf ich mir fuer den Bytecode erstmal formulieren. Auf ein paar Zahlen zum Verknuepfen muss ich mich einigen. Ebenso wie darauf, dass ich String.fromCharCode und ("*").charCodeAt(0) nutzen muss, um Strings zu speichern. Der Algorithmenkurs war ganz gut letztens, so dass ich Objekte und Arrays leicht als Hashmaps unterbringe mit lose im Speicher verteilten Values. Hauptsache die Pointer zeigen auf den richtigen Speicherbereich. Ich denke, beim String erst die laenge zu speichern, dann die Daten und bis zum Ende des Alignments mit Nullen zu fuellen oder nicht. Eine Weile lang die Strukturen in Tabellen umwandeln werde ich. Aber erstmal auf Blatt Papier. Letzten Monat habe ich bereits Bitmasken mit 1+2+4+8 und n & 1 und n & 2 und n & 4 und n & 8 ausprobiert, als ich den Garbage Collector auf einer flachen Root ausprobierte. Das Schreiben und Zeichnen macht auch Spass. Und neben dem Druck ist auf der Rueckseite der Seiten Platz um die Notizen zusammenzuhalten. Also writable und value sind noch ein flag und ein offset und get und set sind zwei offsets. Je nachdem ob buf[0] & 1 == 1 oder buf[0] & 2 == 2 (oder alternativ aber nicht gut buf[0] % 2 == 1 oder 0) sind. Also 32 & 32 sind 32, genauso wie 96 & 32 == 32, wenn das Bit dazugehoert, kommt es bei & auch raus.