Projekt előrehaladási jelentés
Deklaratív programozási nyelvek segítségével számtalan problémát lehet tömören és magas absztrakciós szinten megfogalmazni. Ennek köszönhetően a programozó arra öszpontosíthat, hogy mit szeretne megoldani és kevésbé kell aggódnia azon, hogy ezt hogyan oldja meg. A Prolog egy logikai programozási nyelv, mely a deklratív nyelvek családjába tartozik. A Prolog rendelkezik egy beépített következtető mechanizmussal, aminek segítségével komplex következtetési feladatokat lehet megoldani. Számos egyéb alkalmazási terület mellett, ez a nyelv különösen alkalmas nyelvtani elemzésre. Jelen projekt keretében azt vizsgáljuk, hogy hogyan lehet logikai programozás segítségével programozási nyelvek típuselemzését elvégezni. A típusellenőrzés segít különféle programozási hibák korai felderítésében, ezáltal jelentősen megkönnyítve a programfejlesztés folyamatát.
Elkészítettünk egy típusellenőrző rendszert a Q funkcionális nyelvhez. A program bemenetként kap egy Q programot és eldönti, hogy a program típushelyes-e. Nemleges válasz esetén a rendszer rámutat a hibás kódrészletre és egy hibaüzenet formájában megmagyarázza, hogy miért tartja az adott részt típushibásnak.
A típusellenőrző rendszer Prolog programozási nyelven készült. A bemenetként kapott programot először egy lexikai elemző tokenek sorozatára bontja, majd a szintaktikai elemző felépít egy absztrakt szintaxis fa adatstruktúrát, melyben minden csomópont a program egy részkifejezését reprezentálja. A szintakikai elemzéshez Definit Klóz Nyelvtanokat használtunk (Definite Clause Grammars – DCG), mely roppant kényelmes megoldásnak bizonyult.
Az absztrakt szintaxis fán dolgozik maga a típusellenőrző. A típuskövetkeztetést egy korlát kielégítési feladatként értelmeztük, melynek megoldására a Prolog Constraint Handling Rules (CHR) könyvtárát használtuk fel.
Elkészült a következtető rendszer. A felhasználónak lehetősége van típusdeklarációkat ágyazni bele a forráskódba. Evvel egyrészt expliciten rá lehet kérdezni, hogy egy adott kifejezés típusa ténylegesen megfelel-e a programozó által elvárt típusnak. Másrészről a típusdeklarációk segítségével a programozó plussz információt adhat a típusellenőrző számára, melyet önmagától nem lenne esélye kitalálni (mert például egy adott változó értékét futás közben olvassuk be állományból és így előre nem állapítható meg a típusa).
A rendszer alapos tesztelése elkezdődött. Sok saját kézzel gyártott bemenetre jó eredményeket kaptunk. Evvel párhuzamosan a projektparnerünk, a Morgan Stanley Business and Technology Centre, Budapest átvette a programot és elkezdte tesztelni a saját programjaikon. Az ő tesztjeik eredményeire még várunk. Teszteket futtattunk továbbá nagyobb méretű internetről letölthető Q nyelvű programokon. Ezek a programok mind típushelyesek, így a tesztekből nem egyértelmű, hogy mennyire hatékonyan tudunk típushibákat megtalálni nagyobb programokban. Ami viszont jellemző, hogy az elkészített program nem támogatja a teljes Q nyelvet annak minden kivételével együtt, hanem tartalmaz bizonyos megszorításokat. Ezen megszorításokat a Morgan Stanley kérésére építettük bele a programba, hogy ezáltal kényszeríthesse a cég a programozóit bizonyos programozási konvenciók tiszteletben tartására, az átláthatóság biztosítására. Másrészről vannak olyan nyelvi elemek, melyeket a Morgan Stanley egyáltalán nem használ a programjaiban és nem kérte a támogatásukat. Ennek megfelelően az interneten található programok között vannak olyanok, melyekben a rendszerünk típushibát jelez, pedig a program maga helyesen fut a Q interpreterben.