Nano
the
nanny of
pico
tussentijdse
evaluatie
Naam : Van Belle
Werner
e-mail : we47091@is2.vub.ac.be
programmeerproject
1e licentie Computerwetenschappen
Projectbegeleider: Wolfgang
Demeuter
Pico |
Java |
Prof.
Theo D'Hondt Educational
Language Variant
van Scheme |
Sun
Microsystems Architecture
Neutral afgekalfde/opgelapte
C++ |
begin(
eenfunctie(arg1,arg2):arg1+arg2,
lazy_and(pred1,pred2()):if(pred1,pred2(),false),
lazy_and(
begin(
display('Side effect pred 1'),
false)
begin
display('Side effect pred 2'),
true)
)
)
Runtime Specification
package
PicoRuntime;
import java.*;
import
PicoRuntime.DoorVerwijzing;
public abstract
class
FunctionObject extends BasicFunction {
protected Object Contents[];
protected FunctionObject DefinedIn;
static final protected DoorVerwijzing NotDefined=
new DoorVerwijzing(1024,0);
static final private Class
DoorVerwijzingClass=NotDefined.getClass();
public FunctionObject(int size, FunctionObject parentenvironment)
{Contents=new Object[size];
DefinedIn=parentenvironment;}
public FunctionObject() {};
public abstract Object ActionCall(Object parameters[]);
public abstract Object NormalCall(Object parameters[]);
protected abstract Object Action();
abstract protected void SetupFormals();
protected final Object LookUp(int back, int framenr)
{if (back==0)
{Object answer=Contents[framenr];
if (answer.getClass()==DoorVerwijzingClass)
return
DefinedIn.LookUp(
((DoorVerwijzing)answer).back,
((DoorVerwijzing)answer).framenr);
return
answer;}
return DefinedIn.LookUp(back-1,framenr);}
public final void Set(int back, int framenr, Object value)
{if (back==0)
{Object answer=Contents[framenr];
if (answer==null)
System.out.print("uninitialized environment
entry.\n");
if (answer.getClass()==DoorVerwijzingClass)
DefinedIn.Set(
((DoorVerwijzing)answer).back,
((DoorVerwijzing)answer).framenr,value);
else
Contents[framenr]=value;}
else
{DefinedIn.Set(back-1,framenr,value);}}
static final public Object[] newtable(int size, Object exp)
{Object [] result;
result=new Object[size];
int i;
for(i=0;i<size;i++) result[i]=exp;
return result;}};
package
PicoRuntime;
import
PicoRuntime.FunctionObject;
public
abstract class FunctionVarParam extends FunctionObject {
public FunctionVarParam(int size,
FunctionObject parentenvironment)
{super(size,parentenvironment);}
public Object ActionCall(Object
parameters[])
{
//1. een nieuwe instance van de klasse
genereren
FunctionObject
funcinst=(FunctionObject)this.clone();
funcinst.Contents=(Object[])Contents.clone();
//2. de parameters in de nieuwe
environment stouwen
funcinst.Contents[0]=parameters;
//3. al de lokale variabelen laten
doorverwijzen (in 1 gebeurt)
//4. de formele functieparameters
alloceren.
funcinst.SetupFormals();
//5. het nieuwe object zijn Action()
aanroepen.
return funcinst.Action();}
public Object NormalCall(Object
parameters[])
{
//1. een nieuwe instance van
de klasse genereren
FunctionObject
funcinst=(FunctionObject)this.clone();
funcinst.Contents=(Object[])Contents.clone();
//2. de parameters juist in deze klasse
kopieren
for(int i=0;i<parameters.length;i++)
parameters[i]=((FunctionObject)(parameters[i])).Action();
funcinst.Contents[0]=parameters;
//3. al de lokale variabelen laten
doorvberwijzen
//4. al de formele parameters alloceren
funcinst.SetupFormals();
//5. het nieuwe object zijn Action()
aanroepen.
return funcinst.Action();}
};
package
PicoRuntime;
import
java.*;
public
abstract class FunctionVastParam extends FunctionObject {
static boolean NoParameters[]=new
boolean[0];
protected boolean
ParameterTemplate[]=NoParameters;
//indien true moet de functie
gedenormalizeerd worden
public FunctionVastParam() {}
public FunctionVastParam(int size,
FunctionObject parentenvironment)
{super(size,parentenvironment);}
public Object ActionCall(Object
parameters[])
{//1. een nieuwe instance van de klasse
genereren
FunctionObject
funcinst=(FunctionObject)this.clone();
funcinst.Contents=(Object[])Contents.clone();
//2. de parameters in de nieuwe
environment stouwen
for(int
i=0;i<ParameterTemplate.length;i++)
funcinst.Contents[i]=parameters[i];
//3. al de lokale variabelen laten
doorverwijzen (in 1 gebeurt)
//4. de formele functieparameters
alloceren.
funcinst.SetupFormals();
//5. het nieuwe object zijn Action()
aanroepen.
return funcinst.Action();};
public Object NormalCall(Object
parameters[])
{//1. een nieuwe instance van de klasse
genereren
FunctionObject
funcinst=(FunctionObject)this.clone();
funcinst.Contents=(Object[])Contents.clone();
//2. de parameters juist in deze klasse
kopieren
for(int
i=0;i<ParameterTemplate.length;i++)
if (ParameterTemplate[i])
funcinst.Contents[i]=((FunctionObject)(parameters[i])).Action();
else funcinst.Contents[i]=parameters[i];
//3. al de lokale variabelen laten
doorvberwijzen
//4. al de formele parameters alloceren
funcinst.SetupFormals();
//5. het nieuwe object zijn Action()
aanroepen.
return funcinst.Action();};};
Intermediate code
Enkel
NormalCall
22
classen
begin( begin
eenfunctie(arg1,arg2): formal1 eenfunctie
arg1 formal3
+ _add
arg2,
formal4
lazy_and(pred1,pred2()): formal2 lazy_uand
if(
if
pred1, formal5
pred2(), formal6
false), formal8
lazy_and( formal3
begin( formal9
display('Side effect pred 1'), formal11 display
formal15
false)
formal12
begin formal10
display('Side effect pred 2'), formal13 formal16
true))) formal14
Optimiseren
NormalCall
+ ActionCall
9
classen
begin( begin
eenfunctie(arg1,arg2): formal1 eenfunctie
arg1 formal3
+ _add
arg2,
formal4
lazy_and(pred1,pred2()): formal2 lazy_uand
if(
if
pred1, formal5
pred2(), formal6
false), formal8
lazy_and( formal3
begin( formal9
display('Side effect pred 1'), formal11 display
formal15
false)
formal12
begin formal10
display('Side effect pred 2'), formal13 formal16
true))) formal14
Een functiereference is gekend
als de
variabelenaam in de huidige environment nergens een
assignment/herdefinitie
ondergaat...
...Aldus boer Werner op zijn
veld..
/***************************************************************************/
/**
**/
/**
F.R.A.M.E.S
**/
/**
**/
/***************************************************************************/
/*
een frame is een voorstelling van de levensloop van een variabelenaam in
*
ene bepaalde envioronment */
struct
_frm_
{String name;
/* de naam van een
frame. strcmp(namefrm1, namefrm2)==0
* a.s.a namefrm1==namefrm2 */
int framenr;
/* FrameNr beschrijft waar de
frame voor zal komen in de
* environment */
_ENV_ env;
/* is een pointer naar de
environment waarin deze frame
* voorkomt */
struct flags
{int read : 1;
/* gezet, indien de variabele
uitgelezen wordt. Dit wil niet
* noodzakelijk zeggen dat de
variabele ook hier gedefinieerd
* is */
int native : 2;
/* zegt of de variabele
gedefinieerd is
* als een native function is */
int called : 3;
/* zegt of de bewuste naam
gecalled wordt. Hier zou ik
* onderscheid kunnen maken
tussen wat voor soort call
* (bv normalcall, applycall, en
enventuele anderen) maar dit
* doe ik niet. */
int parameter : 4;
/* Zegt of deze frame een
parameter is.*/
int parameterlst : 5;
/* Zegt of deze frame een
volledige parameterlijst voorstelt.
* Indien dat het geval is MOET
framenr nadien op 0 staan. */
int written : 6;
/* Zegt of de variabele ooit
beschreven is, los van het feit
* dat de variabele hier al dan
niet gedefinieerd is.
* table assignment wordt ook
bij written gevoegd */
int defined : 7;
/* de variabele wordt in deze
environmpent gedefinieerd, al
* de definities aan de
variabele staan opgegeven in de
* DefineList*/
} flags;
Plist DefineList;
/* een lijst van eventueel
nuttige expressies die ooit in de
* definitie van de variabele
voorkomen */
Plist CallList;
/* een lijst van al de
RFF-expressies die deze variabele
* callen */
};
typedef
struct _frm_ *_FRM_;
_FRM_
_frm_create_(String name, _ENV_ env);
/* creert een frame met
variabelenaam 'name', in de
* gegeven environment */
#define
_frm_valid_(frm) (frm && frm->name && frm->env)
/* check om te zien of het wel
een geldige frame is */
#define
_frm_env_(frm) (frm->env)
/* opvragen van de environment.
Deze is altijd gedefinieerd */
#define
_frm_name_(frm) (frm->name)
/* popvragen van de framename.
Deze is
* altijd gedefinieerd */
#define
_frm_set_framenr_(frm,nr) (frm->framenr=nr)
#define
_frm_framenr_(frm) (frm->framenr)
/* zetten en lezen van het
framenummer op */
#define
_frm_mark_read_(frm) (frm->flags.read=1)
#define
_frm_read_(frm) (frm->flags.read)
/* zetten en lezen van de
read-flag */
#define
_frm_mark_written_(frm) (frm->flags.written=1)
#define
_frm_written_(frm) (frm->flags.written)
/* zetten en lezen van de
'write' flag */
#define
_frm_mark_called_(frm) (frm->flags.called=1)
#define
_frm_called_(frm) (frm->flags.called)
#define
_frm_foreach_call_(frm,func,common)
l_foreach((frm)->CallList,(func),(common))
#define
_frm_add_called_(frm, rffexp) l_add((frm)->CallList,(rffexp));
/* zetten en lezen van de
'called' flag */
#define
_frm_mark_parameter_(frm) (frm->flags.parameter=1)
#define
_frm_parameter_(frm) (frm->flags.parameter)
/* zetten en lezen van de
'parameter' flag */
#define
_frm_mark_parameterlst_(frm) (frm->flags.parameterlst=1)
#define
_frm_parameterlst_(frm) (frm->flags.parameterlst)
/*
zetten en lezen van de 'parameterlst' flag */
#define
_frm_mark_native_(frm) (frm->flags.native=1)
#define
_frm_native_(frm) (frm->flags.native)
_DFF_
_frm_get_native_definition_(_FRM_ frm);
/* zetten en lezen van de
'native' flag */
#define
_frm_mark_defined_(frm) (frm->flags.defined=1)
#define
_frm_defined_(frm) (frm->flags.defined)
#define
_frm_add_definition_(frm, exp) l_add((frm)->DefineList,(exp))
#define
_frm_add_native_definition_(frm, exp) l_add((frm)->DefineList,(exp))
#define
_frm_foreach_definition_(frm,func,common)
l_foreach((frm)->DefineList,(func),(common))
/* zetten en lezen van de
'defined' flag en toebehoren */
/***************************************************************************/
/**
**/
/**
E.N.V.I.R.O.N.M.E.N.T.S
**/
/**
**/
/***************************************************************************/
/*
een environment is 1-1 gerelateerd ten opzichte van een function
*
definition dus ik vraag mij af of het niet
betere is environments en
*
functiedefinities te laten samenvallen */
struct
_env_
{struct _env_* DefinedIn;
/* DefinedIn beschrijft in
welke environment deze steeds
* gedefinieerd zal worden, bij
de root_env staat DefinedIn
* op NULL */
int size;
/* De grootte van de
environment-array @ runtime, deze is
* pas geldig na een env_close
van de root */
Plist FORlist;
/* een lijst van formele
parameters die eventueel
* gebruikt zullen worden in de
functie. Na een env_close
* is dit een lijst van
gebruikte parameters */
Plist frames;
/* hierin worden frames
opgeslagen. Zolang de environments
* niet gesloten zijn bevatten
deze halfbakken informatie.*/
};
_ENV_
_env_create_(_ENV_ DefinedIn);
#define
_env_definedin_(env) (env->DefinedIn)
/* definieert een nieuwe
environment, die gedefinieerd is in
* DefinedIn. Zet deze op 0 als
dit de root_env moet zijn */
#define
_env_size_(env) (env->size)
#define
_env_set_size_(env,siz) (env->size=siz)
/* opvragen en zetten van de
environment grootte */
#define
_env_foreach_formal_(env,func,common)
l_foreach((env)->FORlist,func,common)
#define
_env_add_formal_(env, formal) l_add(env->FORlist,formal)
/* een formele functieparameter
toevoegen */
#define
_env_add_frame_(env,frm) l_add(env->frames,frm)
#define
_env_firstthat_frm_(env,func,common)
l_firstthat(env->frames,func,common)
#define
_env_foreach_frm_(env,func,common) l_foreach(env->frames,func,common)
/* frame bewerkingen */
/**********************************************************************/
/**
**/
/**
globale
bewerkingen
**/
/**
**/
/**********************************************************************/
extern
Plist function_list;
/* een lijst van alle functies
die gedefinieerd worden */
extern
_ENV_ root_env;
/* de rootenvironment */
void
foreach_env(void (*f)(_ENV_));
struct
LookupResult {
_FRM_ frm; /* de frame die gevonden werd */
int back; /* hoeveel er teruggelopen moet
worden */
};
_FRM_
lookup_frm_in_env(_ENV_ env,String name);
/* zoekt de frame op met naam
'name' in de 'env'
* Hier wordt niet verder
gezocht in DefinedIn en hoger.
* Geeft NULL weer indien er
geen dergelijke frame
* voorkomt */
_FRM_
find_frm_in_env(_ENV_ env,String name);
/* zoekt de frame op met naam
'name' in de 'env'
* Hier wordt niet verder
gezocht in DefinedIn en hoger.
* Als name niet voorkomt wordt
ter stond een frame gecreeert*/
struct
LookupResult next_frm(_FRM_ frm);
/* deze zoekt de volgende frame
op */
struct
LookupResult lookup_frm(_ENV_ env, String name);
/* zoekt de frame op met naam
'name' in de 'env'
* Hier wordt verder gezocht in
DefinedIn en hoger.
* Geeft NULL weer in frm
indien er geen dergelijke frame
* voorkomt */
_FRM_
introduce_name(_ENV_ env, String name);
/* creeert altijd een nieuwe
frame met name 'name'
* en environment 'env'.
* voegt de define-expressie
toe aan de lijst
* Stopt deze in env en geeft
het resultaat weer */
_FRM_
define_name(_ENV_ env, String name);
/* creeert een frame met name
'name' (indien nodig)
* en environment 'env'.
* voegt de define-expressie
toe aan de lijst
* Stopt deze in env en geeft
het resultaat weer */
void
write_name(_ENV_ env, String name);
/* markeert de frame met naam
'name' as beeing written.
* Indien er zo geen frame is
zal er prompto 1 worden
* aangemaakt en natuurlijk ook
gemarkeerd als written.*/
void
read_name(_ENV_ env, String name);
/* markeert de frame met naam
'name' as beeing read.
* Indien er zo geen frame is
zal er prompto 1 worden
* aangemaakt en natuurlijk ook
gemarkeerd als read. */
_FRM_
call_name(_ENV_ env, String name);
/* markeert de frame met naam
'name' as beeing called.
* Indien er zo geen frame is
zal er prompto 1 worden
* aangemaakt en natuurlijk ook
gemarkeerd als called. */
void
ShowFrame(_FRM_ frm);
/* toont de gegeven frame */
void
ShowEnvironment(_ENV_ env);
/* toont de gegeven
environment, met bijhorende frames */
void
ShowEnvironments(_ENV_ env);
/* toont de
gegeven environment en al de hoger liggende*/
void
ShowAllEnvironments(void);
/* toont al de gekende
environments */