Sangat menyenangkan membuat model pendidikan. Sangat menyenangkan melihat bahwa seseorang telah memahami beberapa prinsip kompleks dalam ilmu alam atau algoritma dengan berinteraksi dengan program Anda. Saya berprofesi sebagai ahli biofisika, jadi saya biasanya tidak memiliki masalah dengan persamaan dan matematika, tetapi saya telah menempuh perjalanan jauh dengan alat untuk membuat model interaktif visual. Saya mulai membuat model di Matlab, ada perpustakaan yang sangat baik untuk menyelesaikan persamaan, Anda dapat dengan mudah membuat grafik. Kerugiannya adalah hasilnya sulit untuk dibagikan, dan cukup sulit untuk melakukan sesuatu di luar lingkup pengembang. Dibutuhkan lebih banyak kebebasan. Saya juga mencoba menggunakan teknologi Flash, pada tahun-tahun itu teknologinya masih relevan untuk web, dan bahasa ActionScript memungkinkan untuk membuat model interaktif yang cukup sibuk.Namun, bahasa pemrograman ActionScript itu sendiri tidak sesuai dengan ide saya yang ketat tentang harmoni dan ketertiban, dan kemudian teknologi Flash benar-benar dikeluarkan dari browser oleh standar HTML5 yang baru ... Pada saat itu saya sudah aktif memprogram model di lingkungan.Pembuat Komponen BlackBox . Ini adalah pengembangan sumber terbuka Swiss, cukup terisolasi dari sistem operasi IDE, yang mereka kembangkan berdasarkan sistem operasi ETHOS... Perpustakaan grafis baik-baik saja dengan saya, kinerja kompiler, kecepatan eksekusi kode komputasi - juga. Dan yang paling penting, bahasa Oberon idealnya terletak pada ide saya tentang seberapa banyak bahasa pemrograman harus digunakan oleh seorang spesialis domain. Saya tidak memerlukan kebiasaan linguistik apa pun, senang berada di zona nyaman dan memikirkan tugas itu. Namun, di abad ke-21, sangat sulit untuk mendistribusikan aplikasi yang dikompilasi untuk menunjukkan sesuatu kepada siswa, atau untuk sekadar menerbitkan model di Internet. Bagaimanapun, orang-orang hanya takut menjalankan aplikasi pihak ketiga, dan antivirus sering kali memberikan kesalahan positif. Aplikasi desktop untuk sains dan industri sangat baik, model interaktif untuk mendidik orang tidak.
Pada tahun 2014, bersama dengan proyek Informatics-21 , kami mengadakan konferensi IT di Moskow. Spesialis sistem Oberon dari seluruh Rusia dan bahkan dari Belarusia datang ke sana. Kemudian saya tidak terlalu malas untuk mengambil kamera lama saya, dan merekam sebagian besar laporan . Dari ceramah Alexei Veselovsky , saya mengetahui tentang penerjemah OberonJS . Tesis laporan ini sederhana: JavaScript adalah substansi yang sangat amorf, jadi mengembangkan sesuatu yang besar di atasnya memang memusingkan, tetapi jika JavaScript dirancang dengan Oberon, akan ada penghematan yang signifikan dalam proses debug. Oberonsemacam tautan tengah antara blockbuster LEGO MINDSTORMS dan kebebasan tak terbatas C. Secara umum, Anda dapat melakukan apa saja di atasnya, dan pada saat yang sama kemungkinan "menembak diri sendiri" adalah minimal. Orang-orang itu kemudian membuat demo untuk menunjukkan cara kerjanya. Kode dari jendela CodeMirror diterjemahkan dari Oberon ke JavaScript langsung di browser klien dan dijalankan. Ini tidak akan menarik perhatian saya jika Aleksey tidak membuat demo tentang bagaimana hal ini dapat dikombinasikan dengan kerangka ProcessingJS!
Bahasa yang kuat dan sederhana + grafik tingkat lanjut dalam HTML5 = formula pendidikan yang sempurna sehingga pengguna tidak hanya melihat model grafik interaktif, tetapi dapat dengan mudah memahami algoritma di baliknya. Saya suka mengutip Sergey Zalmanovich Sverdlov:
ยซ โ . , , . , - - . , ยป.
ยซ !ยป :
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);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.
Namun, terlepas dari kesulitan teknis, secara konseptual OberonJS membantu memecahkan masalah pembuatan antarmuka perancang perangkat lunak yang ramah untuk membuat model interaktif. Selain itu, nilai tambah yang penting adalah bahwa penerjemah OberonJS tidak menghubungi server saat membuat program, dan program juga dijalankan di sisi klien, yang berarti bahwa dalam kasus penskalaan, beban di server harus sedikit meningkat.
Di masa depan, akan menarik untuk menggabungkan OberonJS dengan kerangka Electron.