Wer Programme schreiben will, benötigt dazu einen Entwicklungsrechner und ein Zielsystem (Target). Wer Programme für den PC entwickelt, schreibt den Code am PC und das ausführbare Binär-Programm (.exe, .com) läuft ebenfalls am PC.

Ist das Zielsystem aber nicht der PC, sondern ein Raspberry, muss der Code am Zielsystem ausführbar sein, dann nützt der Binärcode für den PC gar nichts. Soll daher ein Programm sowohl am PC als auch am Raspberry laufen, benötigt man zwei unterschiedliche Binärdateien und zwei unterschiedliche Compiler. Man braucht so viele Compiler als es Zielsysteme gibt. So etwa war die Situation vor der Erfindung von node.js.

Was nun, wenn wenn wir interpretierte Programme schreiben? Dann genügt es, auf allen Zielsystemen ein kompatibles Runtime-System mit einem Interpreter zu haben und wir können die Software auf praktisch jedem System ohne irgendeine Veränderung laufen lassen und ohne uns um den Binärcode kümmern zu müssen, denn der entsteht durch den Interpreter.

JavaScript, Lingua franca des Internet

HTML, die Webseitenbeschreibungssprache, erlaubt syntaktisch die Einbettung beliebiger Sprachen und es gab seitens Microsoft Versuche, alternativ zu JavaScript auch VBScript im Browser laufen zu lassen, doch da ein solcher VB-Interpreter nur im Internet Explorer verfügbar war, blieb es bei einem eher theoretischen Versuch. Der Normungsdruck auf Webseiten ist extrem und daher läuft im Biotop einer Internet-Seite ausschließlich JavaScript. Die große Verbreitung von JavaScript wurde ein starkes Motiv, JavaScript auch außerhalb von Webseiten einzusetzen und Anwendungen für alle möglichen Zielsysteme in JavaScript auszuführen.

JavaScript allein genügt nicht

JavaScript kann die Objekte einer Webseite ansprechen aber JavaScript kann keine Objekte des Zielsystems, also etwa des PC ansprechen.  Soll Hardware in einem Zielsystem angesprochen werden, muss man dafür einen Treiber haben oder dieser Treiber selbst schreiben. Dieses Rad muss man aber nicht neu erfinden. Diese Elementarprogramme zur Ansteuerung der Hardware schreibt man nicht selbst, sondern kommuniziert über so etwas wie ein BIOS, also eine hardwarenahe Programmsammlung. Das Programm heißt node.js.

Warum Pi Programmierung in node.js?

  • node.js ermöglicht “natives” JavaScript (.js) außerhalb des Web-Browsers auf (nahezu allen) Computern
  • Anderseits Raspbian inkludiert Python, mit vielen verfügbaren Applikationen, weil es sehr einfach zu lernen ist
  • Python vs. JavaScript = Einfacheit vs. Überall (Browser, Smartphone, PC, Pi, …)
  • Ich hab mich für’s “1x Lernen” entschieden – deshalb JavaScript, und eben unter node.js (am Mac und Pi)

Editor

Die Programme kann man grundsätzlich mit jedem Test-Editor schreiben, doch hat sich Visual Studio Code auf allen Plattformen (Windows, Linux, Mac) etabliert und sollte auf keinem Desktop fehlen. Auch als eine Art Nachfolger von Notepad++ und anderer Texteditoren kann man es verwenden. Man installiert also Visual Studio Code, sofern das nicht schon geschehen ist, über die Downloadseite.

node.js

Nicht nur, dass wir Programme für einen MikroController  schreiben wollen, sollen diese Programme mit JavaScript geschrieben werden. Doch wie wir wissen, ist JavaScript eigentlich eine Sprache für die eingeschränkten Bedingungen eines Browsers ohne Zugriffsmöglichkeit zu Hardware. Dazu benötigt man node.js. node.js ist ein RunTime-System, das für die gängigen Systeme PC, Linus, Mac sowie als SourceCode verfügbar ist.

Installation von node.js am PC

Gleich auf der Startseite der Homepage nodejs.org gibt es einen Button, mit dem man die msi-Version des Installationsprogramms (ca. 16 MB) downloaden kann). Die Installation erfolgt problemlos im Programmverzeichnis. Ebenso gibt es Versionen für Linus, Mac oder auch eine Sourcecode-Version.

Nun geht es darum, diese Installation zu testen. Man braucht dazu ein „Terminal“. Entweder eine klassische Eingabeaufforderung oder die PowerShell ISE oder ein Terminalfenster in Visual Studio Code. Man gibt ein

node --help

und bekommt Hinweise über die Optionen des node-Befehls.

Die Syntax, um die JavaScript mit node.js erweitert wird, gibt es einleitend in Deutsch oder Englisch, die APIs nur in Emglisch.

Die Interaktion mit node.js erfolgt über eine Konsole. Die Konsolenein- und -ausgabe erfolgt über das Objekt console.

„Hello World“ über die Konsole

Das einfachste Beispiel für die Ausgabe eines Textes an die Konsole ist:

var msg = 'Hello World';
console.log(msg);
Jedes Programmierprojekt braucht einen aufnehmenden Ordner. Legen wir daher einen Ordner am Desktop an. Mein Desktop befindet sich im Pfad S:\desktop. Hier die Befehle in klassischer DOS-Manier:
C:\>S:
S:\>cd desktop
S:\>md hello
S:\>cd hello
Dieselben Befehle können auch in einer PowerShell-Konsole verwendet werden, weil sie in PowerShell als Aliase definiert sind. Genaugenommen lauten sie aber in PowerShell so:
PS C:\>Set-Location S:\desktop
PS S:\>New-Item -Name hello -ItemType directory
PS S:\>Set-Location hello
Solange der Ordnername hello kein Leerzeichen enthält muss man ihn nicht durch Anführungszeichen begrenzen.
Jetzt startet man mit code Visual Studio Code
S:desktop\hello\>code
Man öffnet in Visual Studio Code mit File -> New (oder Strg-N)  eine neue Datei, schreibt diese beiden Zeilen hinein und speichert die Datei als app.js. So präsentiert sich der Code in Visual Studio Code (VS Code):
Um dieses Programm auszuführen, kann man irgendeine Konsole verwenden. VS Code hat aber eine Konsole bereits eingebaut, die man mit Strg-ö ein- oder ausschalten kann. Die Konsole blendet sich am unteren Rand ein. Man ruft node.js mit node auf und übergibt als Parameter ein Skript, hier app.js.
Der Text „Hello World“ wir an der Konsole ausgegeben.
Nun ist aber eine Ausgabe an der Konsole nur etwas für eine Testumgebung und daher wollen wir in einem nächsten Schritt den Text durch einen Webserver ausgeben lassen, der für diesen Zweck aus dem Zauberhut von node.jserzeugt wird.

„Hello World“ am Webserver

Dieses Beispiel kommt in praktisch allen Einführungen in node.js vor und darf daher hier auch nicht fehlen:

const http = require('http');

const hostname = '127.0.0.1';
const port = 3000;

const server = http.createServer((req, res) => {
res.statusCode = 200;
res.setHeader('Content-Type', 'text/plain');
res.end('Hello, World!\n');
});

server.listen(port, hostname, () => {
console.log(`Server running at http://${hostname}:${port}/`);
});

Mit

node webserver.js

startet man den Webserver über die Konsole, und durch Eingabe von http://127.0.0.1:3000 in einem Browserfenster kontrolliert man die Ausgabe „Hello World“.

PowerShell-Skripts nutzen

In der Nachlese zum PowerShell-Vortrag von Roman Korecky wurde gezeigt, wie man sich Informationen über die aktuelle CPU besorgen kann, nämlich mit dem Befehl

PS s:\desktop>Get-WMIObject -Class Win32_ComputerSystem

Der Befehl liefert den Text:

Domain : WORKGROUP
Manufacturer : System manufacturer
Model : System Product Name
Name : FRANZ-DIMOTION
PrimaryOwnerName : Windows User
TotalPhysicalMemory : 17115840512

Aus einer Konsole kann man den Befehl so ausführen:

S:\>powershell -command Get-WMIObject -Class Win32_ComputerSystem

Ein derartiges Objekt. findet man in node.js nicht, doch soll das folgende Beispiel zeigen, wie man sich aus node.js der Dienste von PowerShell bedienen kann, Ein Programmvorschlag aus stackoverflow.com schaut so aus:

var spawn = require("child_process").spawn,child;
child = spawn(„powershell.exe“,[„Get-WMIObject -Class Win32_ComputerSystem“]);
child.stdout.on("data",function(data){
console.log("Powershell Data: "+ data);
});

child.stderr.on("data",function(data){
console.log("Powershell Errors: "+ data);
});

child.on("exit",function(){
console.log("Powershell Script finished");
});

child.stdin.end(); //end input
Hier sieht man die Ausführung dieses Skripts in VS Code:

Man bekommt nur einen Text und kein Objekt zurück, dessen Eigenschaften „Manufacturer“, Model“… man abfragen könnte, aber die gewünschte Information kann durch Textbearbeitung leicht extrahiert werden. Genau so könnte man andere Programme aufrufen, die im Hostsystem verfügbar sind.

Zur Werkzeugleiste springen