Erfahrung in der Verwendung des OberonJS-Übersetzers zum Erstellen eines interaktiven Modelleditors

Es macht Spaß, Bildungsmodelle zu erstellen. Es ist schön zu sehen, dass eine Person durch die Interaktion mit Ihrem Programm ein komplexes Prinzip in den Naturwissenschaften oder Algorithmen verstanden hat. Ich bin von Beruf Biophysiker, daher habe ich normalerweise keine Probleme mit Gleichungen und Mathematik, aber ich habe mit den Werkzeugen zur Erstellung visueller interaktiver Modelle einen langen Weg zurückgelegt. Ich habe angefangen, Modelle in Matlab zu erstellen. Es gibt ausgezeichnete Bibliotheken zum Lösen von Gleichungen. Es ist möglich, einfach Diagramme zu erstellen. Der Nachteil ist, dass das Ergebnis schwer zu teilen ist und es ziemlich schwierig ist, etwas außerhalb des Bereichs der Entwickler zu tun. Mehr Freiheit ist nötig. Ich habe auch versucht, die Flash-Technologie zu verwenden. In jenen Jahren war die Technologie noch für das Web relevant, und die ActionScript-Sprache ermöglichte es, ziemlich beschäftigte interaktive Modelle zu erstellen.Die ActionScript-Programmiersprache selbst entsprach jedoch nicht meinen strengen Vorstellungen von Harmonie und Ordnung, und dann wurde die Flash-Technologie durch den neuen HTML5-Standard vollständig aus den Browsern verdrängt ... Zu diesem Zeitpunkt programmierte ich bereits aktiv Modelle in der UmgebungBlackBox Component Builder . Dies ist eine Schweizer Open-Source-Entwicklung, die hermetisch vom IDE-Betriebssystem isoliert ist, das sie auf Basis des ETHOS-Betriebssystems entwickelt haben... Grafikbibliotheken waren für mich in Ordnung, die Leistung des Compilers, die Geschwindigkeit der Ausführung des Rechencodes - auch. Und am wichtigsten ist, dass die Oberon-Sprache idealerweise auf meiner Vorstellung beruhte, wie viel eine Programmiersprache im Kopf eines Domain-Spezialisten aufnehmen sollte. Es waren keine sprachlichen Macken nötig, es war schön, in der Komfortzone zu sein und über die Aufgabe nachzudenken. Im 21. Jahrhundert ist es jedoch sehr schwierig, kompilierte Anwendungen zu verteilen, um den Schülern etwas zu zeigen, oder einfach Modelle im Internet zu veröffentlichen. Schließlich haben die Leute einfach Angst, Anwendungen von Drittanbietern auszuführen, und Antivirenprogramme geben häufig falsch positive Ergebnisse ab. Desktop-Anwendungen für Wissenschaft und Industrie sind hervorragende, interaktive Modelle für die Aufklärung von Menschen nicht.

2014 -21 IT- . - . , . OberonJS. : JavaScript — , - — , JavaScript , . LEGO MINDSTORMS . , , « » . , , . CodeMirror JavaScript . , , ProcessingJS!

+ HTML5 = , , . :

« — . , , . , - - . , ».

« !» :

MODULE HelloWorld;
IMPORT Log;
BEGIN
 Log.String(" !"); Log.Ln
END HelloWorld.	

, .

OberonJS, , , . , , CodeMirror , . , , . . MVP, .

: Log , Math , Strings , Draw , Forms Plot . , .

ProcessingJS, , p5.js. JavaScript JS.do, — . , REAL INTEGER FLOOR FLT. , : , . , , :

MODULE Draw;
IMPORT JS;
...
PROCEDURE Line*(x0, y0, x1, y1: REAL);
BEGIN JS.do("Instance.line(x0,y0,x1,y1)")
END Line;

PROCEDURE LineInt*(x0, y0, x1, y1: INTEGER);
BEGIN JS.do("Instance.line(x0+0.5,y0+0.5,x1+0.5,y1+0.5);")
END LineInt;
...
END Draw.

* . Instance Draw.Start, , p5.js, InnerDraw .

MODULE Draw;

TYPE
 ProcessingType* = POINTER TO RECORD END;

VAR
 Instance: ProcessingType; focus, started: BOOLEAN;

...

PROCEDURE InnerDraw;
BEGIN
 IF DrawProc # NIL THEN
  TrackMouse;
  DrawProc;
  IF FormDraw # NIL THEN FormDraw END
 END
END InnerDraw;

PROCEDURE Start*;
BEGIN
 ASSERT(~started);
 JS.do("let sketchProc = function(p){
 p.preload=Preload;
 p.draw=InnerDraw; p.setup=InnerSetup;
 p.keyPressed=InnerKeyPressed; p.keyTyped=InnerKeyTyped;
 p.mousePressed=InnerPressed; p.mouseReleased=InnerReleased;
 p.mouseOver=InnerOver; p.mouseOut=InnerOut;
 Instance=p;
 }");
 JS.do("var processingInstance = new p5(sketchProc);");
 JS.do("Instance.colorMode(Instance.RGB, 255, 255, 255, 1);");
 JS.do("removeSketch = function() { Remove(); }");
 focus := FALSE;
 started := TRUE
END Start;

END Draw.

JavaScript , , . , . , :

...
var Init = function (Log){

function Do(){
	Log.String(" !");
	Log.Ln();
}
Do();
}(Log);

, JavaScript. :

MODULE Strings;

IMPORT JS;

PROCEDURE Length* (s: ARRAY OF CHAR): INTEGER;
VAR i: INTEGER;
BEGIN i := 0;
 WHILE (i < LEN(s)) & (s[i] > 0X) DO INC(i) END
 RETURN i
END Length;

...

:

var Strings = function (JS){

function Length(s/*ARRAY OF CHAR*/){
	var i = 0;
	i = 0;
	while (true){
		if (i < s.length && RTL$.charAt(s, i) > 0){
			++i;
		} else break;
	}
	return i;
}

charAt :

var RTL$ = {
    charAt: function(s, index){
        if (index >= 0 && index < s.length)
            return s.charCodeAt(index);
        throw new Error("index out of bounds: " + index);
    },
...
}

, , . . — . , , JavaScript. - , .

— . - , , HTML5.

Trotz der technischen Schwierigkeiten half OberonJS konzeptionell, das Problem der Erstellung einer benutzerfreundlichen Software-Designer-Oberfläche für die Erstellung interaktiver Modelle zu lösen. Ein wichtiges Plus ist auch, dass der OberonJS-Übersetzer beim Erstellen eines Programms keinen Kontakt mit dem Server aufnimmt und das Programm auch auf der Clientseite ausgeführt wird. Dies bedeutet, dass bei einer Skalierung die Belastung des Servers leicht zunehmen sollte.

In Zukunft wäre es interessant, OberonJS mit dem Electron-Framework zu kombinieren.




All Articles