Milyen programnyelvek vannak?

Ó, 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.

A Pascal és amit elindított

Miért is fontos a Pascal?

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 Pascal megalkotója, Nicklaus Wirth bácsi képét guglizd ki, valójában kicsit másként hordja a szakállát mint a rajzon :) Szegényt nagyon sokat kritizálták kezdetben - de nem a szakálla miatt, hanem azok miatt az elvek miatt, amivel újraírta a sötét középkorból származó programozási szokásokat.

Hogyan lehet 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.

Mik azok a programozási paradigmák?

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ó!)

Strukturált programozás

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); 
    }
}
Ne is szokj meg semmi mást, mint a strukturált programozást! Nem is mutatom meg, mi volt a Pascal előtt, annyira veszélyesen ronda megoldásokat használtak a régi, fehér-köpenyes számítógép-guruk.

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 strukturált programozást az utasítás-blokkról lehet felismerni. Ez lehet kapcsos-zárójel (C, C++, Java) vagy begin és end szavak (Pascal).

Moduláris programozás

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.

A moduláris programozást a több file-ból álló programok, vagy a lib-eket használó programok jelentik.

Objektum-orientált programozás

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(); 
}
Az objektum-orientált programozást a . műveleti jelről (szép szóval member operátor) lehet felismerni, amivel egy objektum példány egy függvényéhez lehet hozzáférni. A . műveletet úgy kell értelmezni, hogy "valakinek a valamije", pld. a pixels objektumnak a show metódusa. (A függvények szép neve a metódus az objektum-orientált világban.)

Valamint sokan mások

Lesz még ezekből, hiszen a fejlődés nem áll meg!

Modern programnyelvek

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: