Ó, ezt talán elkezdeni is lehetetlen, olyan sokan vannak, ráadásul gyakran találnak ki újabb nyelveket is, amivel bizonyos dolgokat még könnyebben lehet megcsinálni.
Egy rövid listát találsz a wikipedia oldalán - szerintem érdemes végignézni, hiszel el-ké-pesz-tő hogy mennyi féle "egyre kényelmesebb" nyelvet találtak ki az emberek.
Természetesen felesleges azt fejtegetni, hogy vajon az 50-es években milyen nyelven programoztak. A mi időszámításunk kezdődjék a Pascal programnyelvvel - amiről lehet, hogy már hallottál. Jót, vagy rosszat.
Azért, mert ez hozta az első olyan elvet, hogy a nyelvnek nem csupán egyre okosabb utasításokat kell tartalmaznia, hanem a nyelvnek magának olyannak kell lennie, hogy minél kevesebbet lehessen benne hibázni.
A szintaktikai hibák (azaz ha valami olyat programozunk, amit a compiler nem ért meg) könnyen kiderülnek, hisze a fordítás során hibát kapunk.
A szemantikai hibák (azaz ha valami ugyan helyesen néz ki, de értelmileg helytelen) azok a compiler számára nem tűnnek fel. Például, véletlenül rossz adattípusokat használunk. Például C-ben simán helyes az alábbi:
byte b=2;
byte c='3';
Azonban c értéke nem 3, hanem a 3-as betű ASCII kódja, azaz 51 lesz. Aztán majd csodálkozunk, hogy miért nem háromszor, hanem 51-szer villan fel a led :)
Szintén könnyű hiba a nem létező tömb elemre hivatkozás:
byte b[]={1,2,3};
byte c=b[3];
Vajon c értéke mennyi lesz? Igaziból a b tömbnek három eleme van, a 0-ás, 1-es, és a 2-es elem, de 3-as eleme nincs, így az, hogy mi lesz c értéke, nem tudható, de tutira nem az amit várunk.
A modern programnyelvek fordítóprogramjai meglepően sok szemantikai hibát is észrevesznek. Sőt, vannak olyan programok, amik "átolvassák" a kódot amit írtunk, és egy csomó szempont szerint (hatékonyság, olvashatóság) értékelik. Ezek segítenek abban, hogy ne csak működő, hanem kifejezetten jó minőségű programokat csináljunk.
Sajnos azonban egyik automatikus megoldás sem helyettesíti az emberi gondolkodást: ezért tehát fontos, hogy tisztában legyünk pár vezérelvvel.
Azok a módszerek, amivel egy nyelv hozzájárul, hogy minél kevesebb gépeléssel, minél kevesebb lehetséges hibalehetőséggel tudjunk programot írni, a programozási paradigmák. (Paradigma = eszmerendszer, de szép szó!)
A legelső lépcsőfok a strukturált programozás. De ezt már ismered: arról szól a dolog, hogy az egymás után végrehajtandó utasításokat utasítás-blokkba rakjuk. Az utasítás-blokk miatt egyértelmű, hogy hol van egy ciklus vagy egy feltétel belseje, és hol van a külseje.
void loop() {
if (digitalRead(2)==0) {
// gomb megnyomva, villantsunk egyet a leden
digitalWrite(1, HIGH);
delay(100);
digitalWrite(1, LOW);
}
}
A strukturált programozás része a kód újrafelhasználása azzal, hogy függvényeket csinálunk. Emlékszel a DM-en a csipogásra? Randa!
void beep(byte port,int freq,long duration) {
int x;
long delayAmount=(long)(1000000/freq);
long time=(long)((duration*1000)/(delayAmount*2));
for (x=0;x<=time;x++) {
digitalWrite(port, HIGH);
delayMicroseconds(delayAmount);
digitalWrite(port, LOW);
delayMicroseconds(delayAmount);
}
}
Ezt becsomagoltuk egy függvénybe, így utána csak a függvényt kell használni, és a ronda kódot nem kell újra és újra bepötyögni a boci-boci tarka összes hangjához egyesével.
A következő ötlet, hogy az általunk alkotott gyakran használt függvényekből egy-egy különálló modult (lib-et) készítünk. Ha legközelebb kell használni, akkor egyszerűen elővesszük a lib-et, és nem kell újra és újra begépelni mindent.
#include "Adafruit_NeoPixel.h"
Ráadásul ez olyan jó, hogy a lib-ben lévő függvények nem is látszódnak, és nem szennyezik a mi kis programunkat!
Természetesen ha a saját programunkból szeretnénk csak eltakarítani azokat a függvényeket, amik csúnyák, azokat is kitehetjük egy másik file-ba, és a compiler összerakja az egészet nekünk.
Ez egy nagyon régi, de nagyon hatékony módszer. Ahelyett, hogy mindenféle függvényünk és mindenféle változónk lenne, ezeket összefogjuk egy "szatyorba". Ebben vannak adatok, és az adatokon értelmezett műveletek - hiszen ezek összetartoznak.
Ilyet is láttál már:
#include "Adafruit_NeoPixel.h"
#define NEOPIXEL_PORT 0
#define NEOPIXEL_CNT 1
// pixels az egy Adafruit_NeoPixel típusú objektum
Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NEOPIXEL_CNT,NEOPIXEL_PORT, NEO_GRB + NEO_KHZ800);
void setup() {
pixels.begin();
}
void loop() {
// ennek a NeoPixel sornak a 0. ledje legyen piros
pixels.setPixelColor(0, pixels.Color(255,0,0));
// ennek a NeoPixel soron jelenjenek meg a beállított színek
pixels.show();
}
Lesz még ezekből, hiszen a fejlődés nem áll meg!
A modern programnyelvek (Java, C++, C#, Delphi, Object Pascal) korát úgy az 1980-as évek közepétől számítjuk. Ezek mind multi-paradigmás nyelvek, azaz egyszerre: