Program (informatika)

A számítógépes program azon utasításoknak a sorozata, amelyeket a számítógépnek egymás után végre kell hajtania valamely feladat elvégzése céljából, jellemző módon azt, hogy az adatokkal milyen műveleteket végezzen. A számítástechnikai és számítógéptudományi zsargonban a „programokat” és az „adatokat” általában különböző fogalomként kezeljük, habár az informatikai alapismeretek szerint mindkétféle bithalmaz, tágabb értelemben, adatnak számít.
A legjellemzőbb programozáselméleti alapparadigma szerint a számítógépes program egy programnyelven írt algoritmus, azaz bizonyos egzakt feltételeket, követelményeket (előre definiáltság, egyértelmű végrehajthatóság stb.) kielégítő utasítássorozat.

Program futtatása 
Ahhoz, hogy egy számítógép egy programot végrehajtson, a számítógépet olyan alapállapotba kell hozni a program és gyakran az adatok számítógépbe juttatásával, hogy azok végrehajthatóak legyenek, majd egy indító eljárást kell a számítógépen aktivizálni. A legalacsonyabb szinten ez a hidegindítás (boot eljárás) folyamatával kezdődik, amikor a számítógép első indításakor az indítóprogramját futtatja le, ami a későbbi működésre készíti elő.

Napjainkban a legtöbb számítógép működési alapállapotának eléréséhez szükséges az operációs rendszer nevű "program" (programok rendszere) elindítása. Ez a program végzi el a későbbi futtatandó programok betöltését és futtatását. Ebben a működési környezetben a számítógépes program csak az épp vizsgált egyéni futtatható programot jelenti, és nem az összes programot (beleértve az operációs rendszert), amik a számítógépen az adott pillanatban futnak.

A Neumann-architektúra 
Az architektúrák a számítógép működésének, felépítésének fajtáit jelentik.

A processzorokat működésük szempontjából két külön kategóriába sorolhatjuk. Az egyik a Neumann-architektúra a másik Harvard-architektúra szerint működik. A két architektúra abban különbözik, hogy a Neumann-elvű esetében megegyezik az adat- és a programmemória, míg a Harvard-architektúrájú számítógép esetén a program- és adatmemória különbözik. A gép a programot és annak adatait egy külső adattároló eszközről tölti be, leggyakrabban merevlemezről. Ezután a program és az adatok a központi memóriába kerülnek, majd a program végrehajtása megindul, és a gép egyenként sorban végrehajtja a gépi kódú utasításokat, adatokat változtat, az ugró utasítások (illetve néhány belső folyamat, mint amilyenek a megszakítások) hatására a végrehajtást a memória más pontján folytatja. Az éppen végrehajtandó programutasítás helyét a memóriában a programszámláló (program counter) mutatja, mely az utasítások végrehajtása után növekszik, és amit az ugrások megváltoztathatnak.

A gépi kód olyan program, ami a gép által megértett utasításokból áll. A Neumann-architektúrán alapuló gépek program nélkül egyáltalán semmit sem tudnak csinálni.

A gépi kódú programokat – az egyedülieket, melyeket egy ilyen számítógép megért – általában magasabb szintű programozási nyelveken készítik, és azt fordítóprogramokkal (compiler) alakítják át gépi kódra.

Szoftver 
A program szót gyakran a „számítógépes szoftver” kifejezés szinonimájaként használják. Bár a szoftverek fő részét programok képezik, maga a szoftver gyakran tartalmaz erőforrás-állományokat, melyek mindenféle adatot hordoznak, és amik valójában nem a programhoz, hanem az annak működéséhez szükséges környezet részei.

Neurális hálózatok 
A neurális hálózatokon alapuló számítógépek esetében számos végrehajtó egység van, melyek egymással bizonyos fajta kapcsolatban vannak, és a feladatokat egyszerre, egymással közreműködve hajtják végre. Ezt az elvet számos architektúra követi, és ezen számítógépek programozása valójában az egységek közötti kapcsolatok szabályozásából áll (például a kapcsolatok súlyozásával illetve az egységeken belüli küszöbértékek meghatározásával). Ahogy a számítógép "tanul", a kapcsolatok módjai (a súlyozások és küszöb-értékek) változnak. A legtöbb neurális hálózat esetén ez a megtanult állapot elmenthető és később visszatölthető, programszerűen.

Néhány neurális hálózat minden egyes indításkor újrakezdi a tanulást, és ebben az esetben azok egyáltalán nem rendelkeznek programmal.

Virtuális számítógép 
Napjainkban számos program virtuális számítógépen fut. A programot futtató számítógépen belül egy idealizált utasításkészlettel rendelkező környezetet hozunk létre, melyben a programot futtatjuk. Ennek az idealizált utasításkészletnek általában valamilyen előnye van a gép által közvetlenül megértett gépi kóddal szemben, mely előny változatos lehet: lehetséges, hogy ez az utasításkészlet könnyebben programozható assembly nyelvet vagy egy másik gépi kóddal rendelkező, elterjedtebb végrehajtó egységet szimulál.

Napjainkban nagyon sok Neumann-architektúrán alapuló számítógépi környezet valójában csak egy virtuális gépen létező szimuláció eredménye, és az azon futó "gépi kód" nem azonos a központi egység által legalacsonyabb szinten végrehajtható lépésekkel.

Analóg számítógépek 
Az analóg számítógépek – szemben a digitális számítógépekkel – az állapotaikat nem diszkrét értékekkel ábrázolják, mint az elterjedt számítógépeink, hanem végtelen sok analóg értékkel. Ilyen például a Water integrator (vízegyesítő[?]), aminek az alapállapotát a csapok áramlásának nagyságával és a gép tartályaiban szereplő vízmennyiségekkel adjuk meg.

Számos rovarszerű autonóm robot mutat példát a program nélküli analóg számítógépekre. Ezek a neutrális hálózatokhoz hasonlóan környezetük hatásaiból tanulnak.

Adat 
A számítógépes programok általános felfogás szerint a számítógép állapotának azon részei, melyek nem adatok. Míg ez a megkülönböztetés általában egyértelmű a digitális Neumann-architektúrájú gépek esetében a probléma nehezedik más architektúrákat szemlélve. A neurális hálózatok súlyozása adat vagy program? A hálózat működésekor nyilvánvalóan adatként kezeljük, de ezek valójában közvetlenül meghatározzák a hálózat működését. Még bonyolultabb a helyzetünk az analóg számítógépek esetében: a Water integratornál a víz program vagy adat?

Algoritmusok 

Az absztrakt programokat gyakran algoritmusoknak nevezzük. Ezek valamilyen módon általánosan leírják, hogy egy adott problémát hogyan lehet megoldani. Az algoritmusok absztrakt programjai alapján lehetséges egy konkrét programozási nyelven egy konkrét, az adott problémát megoldó programot írni.

A matematika előkészíti a programozást 

A számítógépes programok elméleti lehetőségével és hátterével foglalkozott a matematika már mintegy két évtizeddel azt megelőzően, hogy 1948. június 21-én megszületett az első, működés közben átprogramozható számítógép, az úgynevezett Manchester Small-Scale Experimental Machine.

Akkor pontosan húszéves volt az óvatosságra intő Ackermann-függvény 1928-ból. Klasszikus intelem mai mesterséges intelligencia programozóknak 1930-ból a Gödel első nemteljességi tétele és a Gödel második nemteljességi tétele. Az igen szerteágazó matematikai kutatást emblematikusan jellemzi a Church–Turing-tézis a korai 30-as évekből, és a Turing-gép 1936-ból.

Magyar vonatkozás a korai 30-as évekből többek között, a parciálisan rekurzív függvény fogalma, valamint Péter Rózsa és Kalmár László kutatásai. Későbbi magyar vonatkozás Neumann János diplomás vegyészmérnök és matematikus, aki két leendő Nobel-díjas társával együtt a legendás Rátz László matematika tanítványa volt a fasori Ágostai Hitvallású Evangélikus Főgimnáziumban, és 1930-tól haláláig az Egyesült Államokban számos tudománytörténetileg jelentős kutatásban vett részt, számítógépes programok vonatkozásában fontosak a Neumann-elvek, és az általa 1944-ben úttörőként megtervezett és 1946. február 14-én üzembehelyezett ENIAC, amely egy program vezérlésű, de működés közben nem átprogramozható számítógép volt.

A különféle programozási paradigmák rendre fellelhetők az azt megelőző matematikai gondolkodásban. A funkcionális programozás paradigmája, hogy egy függvény értékének kiszámolása nem rontja el a többi, már meglévő számolási részeredményeket, ez a csillagászok, fizikusok és matematikusok több évszázada meglévő természetes paradigmája. Objektumorientált programozás paradigmája, hogy a számolás objektumától függ az, hogy a megnevezett művelet gyanánt ténylegesen mi is a számolási teendő, ez pedig a 19. század óta dinamikusan fejlődő absztrakt algebra természetes sajátja, amely szemlélet a matematika alapjainak tisztázását követően, a 20. század elején átterjedt az egész absztrakt matematikára. Logikai programozás paradigmája esetén pedig maga az elnevezés mutatja a matematikai logika történelmi elsőségét.

A mai matematika számtalan témakörön keresztül támogatja a számítógépes programok írását, ilyenek például a kiterjedt programhelyesség bizonyítási kutatások, az egyre fontosabb logikai programozás háttereként a matematikai logika és az algoritmuselmélet vonatkozó fejezeteinek intenzív kutatása. A valószínűségszámítás is kiveszi részét: az algoritmikus információelmélet idealizált számítógépek viselkedését vizsgálja véletlenszerűen előállított programok esetén.

Kapcsolódó szócikkek 
szoftver
firmware
operációs rendszer
polyglot program
programozási nyelv
programozási paradigma
programozó
script programozási nyelv
Turing-gép

Jegyzetek

További információk 
programleírás.lap.hu - linkgyűjtemény

Programozási alapfogalmak