No

d'ordre

TH?ESE

pr?esent?ee

devant

l'Universit

e

de

Rennes

I

Institut

de

Formation

Sup?erieure

en

Informatique

et

Communication

pour

obtenir

le

titre

de

Docteur

de

l'Universit

e

de

Rennes

I

Mention

Informatique

Doctor

Communitatis

Europeae

Elagage

de

contexte

retour

arri?ere

superficiel

modifications

r?eversibles

et

autres

une

etude

approfondie

de

la

WAM

par

Jacques

Noy?e

soutenue

le

Novembre

devant

la

Commission

d'Examen

M.

Jean-Pierre

Ban

atre

Pr?esident

MM

Patrice

Boizumault

Rapporteurs

Bart

Demoen

Tony

Dodd

MM

Yves

Bekkers

Examinateurs

Jean-Claude

Syre

Remerciements

Je

voudrais

d'abord

remercier

les

personnes

sans

qui

cette

th?ese

n'aurait

tout

simplement

pas

vu

le

jour

ou

ne

serait

rest?ee

qu'un

projet

avort?e

Jean-Claude

Syre

en

me

proposant

de

venir

travailler

dans

son

groupe

a

l'ECRC

m

a

permis

de

participer

a

une

aventure

formidable

le

d?eveloppement

d'une

machine

et

de

son

logiciel

des

premiers

coups

de

feutre

sur

un

tableau

vierge

a

la

maintenance

chez

l'utilisateur

final

Son

enthousiasme

et

sa

t?enacit?e

m

ont

marqu?e

de

mani?ere

durable

Qu'il

soit

aussi

remerci?e

d'avoir

accept?e

de

participer

au

jury

malgr?e

un

emploi

du

temps

tr?es

charg?e

Yves

Bekkers

a

bien

voulu

diriger

cette

th?ese

alors

que

le

sujet

n

etait

pas

sien

Il

m

a

conduit

a

m

int?eresser

de

mani?ere

plus

approfondie

a

la

gestion

m?emoire

et

j'

ai

beaucoup

appris

Il

a

aussi

tr?es

bien

su

barrer

le

bateau

par

gros

temps

Sans

lui

j'

aurais

bu

la

tasse

Enfin

qu'aurais

je

fait

sans

les

sourires

de

Mireille

et

Sarah

Merci

a

vous

de

bien

avoir

voulu

d'

un

petit

gris

sous

votre

toit

pendant

de

si

longs

mois

De

nombreuses

autres

personnes

ont

aussi

jou?e

un

r

ole

important

dans

l'

elaboration

et

le

jugement

de

cette

th?ese

Jean-Pierre

Ban

atre

m

a

accueilli

a

l'IRISA

et

m

a

fait

l'honneur

de

pr?esider

la

commission

d'examen

Bart

Demoen

Tony

Dodd

et

Patrice

Boizumault

m

ont

fait

le

grand

plaisir

d'accepter

de

juger

mon

travail

Leur

confiance

m

a

beaucoup

aid?e

dans

la

phase

finale

de

r?edaction

Leurs

remarques

pertinentes

m

ont

permis

de

clarifier

certains

passages

du

manuscrit

Olivier

Ridoux

et

Pascal

Brisset

m

ont

ouvert

les

portes

de

MALI

et

Prolog

m

offrant

de

nouvelles

perspectives

sur

des

points

que

je

croyais

pourtant

bien

balis?es

Les

nombreuses

conversations

que

j'

ai

pu

avoir

avec

eux

ont

toujours

et?e

tr?es

enrichissantes

La

partie

sur

les

modifications

r?eversibles

notamment

leur

doit

enorm?ement

De

mani?ere

g?en?erale

j'

ai

beaucoup

appr?eci?e

travailler

au

sein

de

l'

equipe

LANDE

tant

pour

la

comp?etence

que

pour

les

qualit?es

humaines

de

ses

membres

Je

remercie

Daniel

Le

M?etayer

de

m

en

avoir

offert

l'opportunit

e.

Je

voudrais

aussi

particuli?erement

remercier

R?emi

Douence

Barbara

Moura

et

Val?erie

Gouranton

dont

les

encouragements

n'ont

pas

et?e

vains

A

l'ECRC

le

projet

KCM

a

et?e

le

r?esultat

d'un

travail

d'

equipe

J'aimerais

citer

ii

Une

etude

approfondie

de

la

WAM

ici

Hans

Benker

G?unter

Watzlawik

et

Bruno

Poterie

membres

du

noyau

dur

du

projet

ainsi

que

Michel

Dorochevsky

qui

m

a

aid?e

a

ecrire

le

premier

compilateur

Prolog

pour

KCM

et

Alan

Sexton

qui

a

travaill?e

sur

le

syst?eme

d'exploitation

et

m

a

fait

appr?ecier

ce

sujet

J'ai

aussi

grandement

b?en?efici?e

de

l'expertise

des

membres

du

groupe

de

programmation

logique

notamment

Dominique

Henri

de

Villeneuve

Micha

Meier

et

Joachim

Schimpf

Finalement

certaines

parties

de

cette

th?ese

sont

issues

de

papiers

pr?ealablement

publi?es

Je

voudrais

remercier

les

personnes

qui

ont

relu

ces

papiers

pour

leurs

commentaires

qui

m

ont

et?e

d'une

aide

pr?ecieuse

Mireille

Ducass?e

Michel

Dorochevsky

Micha

Meier

Olivier

Ridoux

Mike

Reeve

Joachim

Schimpf

et

Evan

Tick

Table

des

Mati?ere

Introduction

Pr?eliminaires

Repr?esentation

des

termes

et

unification

Quelques

rappels

Repr?esentation

des

termes

Unification

et

partage

des

repr?esentations

Autres

choix

de

repr?esentation

La

repr?esentation

du

contr

ole

La

r?esolution

SLD

De

la

r?esolution

SLD

a

l'empilement

de

buts

R?ecup?eration

m?emoire

anticip?ee

par

empilement

d'environnements

Derniers

pas

vers

la

WAM

Gestion

m?emoire

dynamique

R?ecapitulatif

des

structures

de

contr

ole

de

la

WAM

et

conventions

La

gestion

des

environnements

L'

elagage

dans

la

WAM

L'impl

ementation

D?esavantages

de

l'impl

ementation

de

l'

elagage

dans

la

WAM

Variantes

de

base

Variantes

avanc?ees

Sp?ecialisation

Sommet

de

pile

explicite

La

cr?eation

retard?ee

des

environnements

La

r?eutilisation

des

environnements

Interd?ependances

avec

le

contr

ole

OU

L'influence

de

l'

elagage

sur

la

taille

des

environnements

Le

co

ut

des

variables

globalisables

Conclusion

iv

Une

etude

approfondie

de

la

WAM

La

gestion

des

points

de

choix

La

gestion

des

points

de

choix

dans

la

WAM

L'impl

ementation

Deux

impl?ementations

de

la

primitive

d'

echec

Le

retour

arri?ere

superficiel

Principes

L'impl

ementation

Etendre

la

port?ee

du

retour

arri?ere

superficiel

Gestion

du

mode

de

retour

arri?ere

a

la

compilation

Discussion

Lecture

retard?ee

des

points

de

choix

Principes

Les

registres

arguments

Les

autres

registres

Retour

arri?ere

superficiel

et

lecture

retard?ee

La

cr?eation

retard?ee

des

points

de

choix

Principes

Premi?ere

impl?ementation

Une

autre

impl?ementation

des

drapeaux

Gestion

du

retardement

a

la

compilation

Retour

arri?ere

dirig?e

par

une

table

d'adresses

Autres

am?eliorations

L'

elagage

des

points

de

choix

La

r?eutilisation

des

points

de

choix

Conclusion

La

coupure

L'impl

ementation

de

l'op

erateur

de

coupure

standard

Une

impl?ementation

ve

Inconv?enients

Le

calcul

du

point

de

coupure

pr?edicat

par

pr?edicat

Le

calcul

du

point

de

coupure

clause

par

clause

Elimination

des

drapeaux

Travaux

apparent?es

Coupure

et

gestion

m?emoire

La

tra

n?ee

Table

des

Mati?ere

v

La

pile

locale

La

pile

globale

Coupures

locales

Principes

L'impl

ementation

Coupures

s?electives

Conclusion

Modifications

R?eversibles

Une

sp?ecification

des

modifications

r?eversibles

a

partir

des

variables

a

attribut

Qu'est

ce

qu'une

variable

a

attribut

Le

m?eta

interpr?ete

Exemples

Impl?ementer

les

modifications

r?eversibles

par

substitution

La

repr?esentation

des

termes

L'unification

Gestion

m?emoire

Les

faiblesses

de

la

substitution

Premiers

rem?edes

Impl?ementer

les

mises

a

jour

r?eversibles

a

l'aide

de

l'affectation

destructive

La

mise

a

jour

de

l'attribut

La

modification

en

place

des

attributs

Abandonner

le

champ

substitution

Am?eliorer

le

tra

nage

de

valeur

f

Affectation

destructive

et

Conclusion

Conclusion

Annexes

A

An

Overview

of

the

Knowledge

Crunching

Machine

A.

Basic

Design

Decisions

A.

A

High-level

Architecture

A.

Modifications

to

the

WAM

A.

Implementing

Built-in

Predicates

A.

Word

Format

vi

Une

etude

approfondie

de

la

WAM

A.

Practical

Hardware

and

Software

Issues

A.

Hardware

Architecture

A.

Control

and

Pipelining

A.

The

Execution

Unit

A.

The

Prefetch

Unit

A.

The

Memory

System

A.

The

Interface

Board

A.

Software

Architecture

A.

Operating

System

Software

A.

The

Prolog

System

A.

System

Debugging

and

Development

Tools

A.

Implementation

Languages

A.

Evaluation

A.

Benefit

Analysis

of

Architectural

Features

A.

The

KCM

vs

ECLiPSe

on

a

SUN

SPARCStation

II

A.

The

KCM

vs

the

BAM

A.

Conclusion

and

Perspectives

R?ef?erences

bibliographiques

Index

Index

des

figures

Exemple

de

repr?esentation

d'un

terme

compos?e

Unification

avec

partage

des

repr?esentations

Unification

sans

partage

des

repr?esentations

Code

WAM

sans

auto-r

ef?erence

prisonni?ere

WAM

Agencement

de

l'environnement

WAM

Instructions

de

contr

ole

impliqu?ees

dans

l'

elagage

WAM

et

taille

d'environnement

explicite

Instructions

Elagage

anticip?e

Agencement

de

l'environnement

Elagage

anticip?e

Instructions

Elagage

retard?e

Agencement

de

l'environnement

Elagage

retard?e

Instructions

Elagage

a

prix

r?eduit

Instructions

WAM

avec

sommet

de

pile

explicite

Instructions

Elagage

retard?e

avec

sommet

de

pile

explicite

Instructions

Enregistrement

d'activation

standard

Agencement

de

l'environnement

Enregistrement

d'activation

standard

Instructions

WAM

et

cr?eation

retard?ee

des

environnements

Instructions

Elagage

retard?e

avec

cr?eation

retard?ee

des

environnements

Instructions

Code

WAM

de

Code

WAM

de

avec

r?eutilisation

de

l'environnement

Exemple

de

r?eutilisation

des

environnements

en

pr?esence

d'

echec

profond

R?eutilisation

dynamique

des

environnements

Instructions

Agencement

de

l'enregistrement

d'activation

de

la

NTOAM

WAM

Agencement

d'un

point

de

choix

WAM

Instructions

de

gestion

des

points

de

choix

S?equencement

des

clauses

Famille

try

viii

Une

etude

approfondie

de

la

WAM

S?equencement

des

clauses

Famille

try

me

else

Point

de

choix

avec

champ

arit?e

Agencement

Point

de

choix

avec

champ

arit?e

Instructions

WAM

Primitive

d'

echec

r?eduite

Instructions

WAM

Gestion

du

retour

arri?ere

superficiel

Instructions

Code

de

avec

retour

arri?ere

superficiel

Clause

d'arr

et

en

t

ete

Code

de

avec

retour

arri?ere

superficiel

Clause

r?ecur

sive

en

t

ete

Code

de

Sch?ema

a

deux

s?equences

d'instructions

Code

de

Utilisation

de

d?eclarations

de

modes

Code

de

Code

de

avec

retour

arri?ere

superficiel

Mode

de

retour

compil?e

fail

r?eduit

Instructions

Mode

de

retour

compil?e

fail

r?eduit

S?equencement

des

clauses

Mode

de

retour

compil?e

en

C

fail

r?eduit

Instructions

-LRB-

-RRB-

Mode

de

retour

compil?e

en

C

fail

r?eduit

S?equencement

des

clauses

-LRB-

-RRB-

Mode

de

retour

compil?e

en

C

fail

r?eduit

Instructions

-LRB-

-RRB-

Mode

de

retour

compil?e

en

C

fail

r?eduit

S?equencement

des

clauses

-LRB-

-RRB-

Mode

de

retour

compil?e

fail

standard

Instructions

Mode

de

retour

compil?e

fail

standard

S?equencement

des

clauses

Instructions

d'unification

avec

etiquette

d'

echec

Codage

en

C

de

la

clause

r?ecursive

de

Acc?es

retard?e

aux

arguments

fail

r?eduit

Instructions

Acc?es

retard?e

aux

arguments

fail

r?eduit

S?equencement

des

clauses

Cr?eation

retard?ee

des

point

choix

Instructions

Cr?eation

retard?ee

des

points

de

choix

sans

drapeau

Instructions

Cr?eation

retard?ee

des

points

de

choix

sans

drapeau

S?equencement

des

clauses

Retour

arri?ere

dirig?e

par

une

table

d'adresses

Instructions

Retour

arri?ere

dirig?e

par

une

table

d'adresses

S?equencement

des

Index

des

figures

ix

Exemple

de

r?eutilisation

d'un

point

de

choix

Calcul

du

point

de

coupure

pr?edicat

par

pr?edicat

Instructions

Code

d'un

pr?edicat

avec

coupure

Calcul

du

point

de

coupure

clause

par

clause

Instructions

Coupure

sans

drapeau

Instructions

Cr?eation

d'un

trou

sur

la

pile

a

la

suite

d'une

coupure

Esquisse

de

codage

du

m?eta

pr?edicat

Instruction

de

coupure

s?elective

Cr?eation

d'un

trou

sur

la

pile

a

la

suite

d'une

coupure

s?elective

Le

type

de

donn?ee

abstrait

variable

a

attribut

Le

m?eta

interpr?ete

Impl?ementer

a

l'aide

de

variables

a

attribut

Impl?ementer

a

l'aide

de

m?eta

structures

Impl?ementer

a

l'aide

des

variables

a

attribut

d?efinies

par

Mise

a

jour

par

substitution

Mise

a

jour

par

substitution

et

compression

de

chemin

Tra

nage

de

valeur

Estampillage

Estampillage

a

l'aide

de

la

tra

n?ee

Estampillage

a

l'aide

de

la

tra

n?ee

Variante

Estampillage

a

l'aide

d'adresses

globales

A.

The

KCM

System

A.

KCM

Word

Format

A.

Top

Level

Architecture

A.

KCM

Pipelining

A.

The

Execution

Unit

A.

The

Prefetch

Unit

A.

KCM

Software

Architecture

A.

Speed-up

wrt

weight

of

built-in

predicates

x

Une

etude

approfondie

de

la

WAM

Index

des

tables

Influence

de

l'

elagage

sur

la

taille

des

environnements

Surco

ut

des

instructions

put

unsafe

R?epartition

des

retours

arri?ere

superficiels

entre

t

ete

et

garde

Efficacit?e

de

la

cr?eation

retard?ee

des

points

de

choix

Comportements

compar?es

du

pr?edicat

pr?ed?efini

A.

Software

Size

A.

Hardware

Evaluation

of

the

KCM

A.

The

KCM

vs

A.

The

KCM

vs

the

BAM

xii

Une

etude

approfondie

de

la

WAM

Introduction

Depuis

sa

conception

il

y

a

un

peu

plus

de

dix

ans

la

WAM

-LRB-

Warren

Abstract

Machine

-RRB-

est

la

r?ef?erence

en

terme

de

mise

en

oeuvre

de

syst?emes

Prolog

s?equentiels

En

d?epit

de

sa

grande

diffusion

la

WAM

est

rest?ee

relativement

difficile

d'acc

es

Pendant

longtemps

la

note

technique

originelle

de

Warren

-LSB-

-RSB-

tr?es

condens?ee

mais

compl?ete

a

et?e

la

seule

v?eritable

source

de

r?ef?erence

sur

la

WAM

Cette

note

a

et?e

utilement

compl?et?ee

par

le

tutoriel

d'

A

t-Kaci

-LSB-

-RSB-

La

lecture

de

ces

deux

documents

peut

donner

a

penser

que

la

WAM

est

d'une

certaine

mani?ere

achev?ee

et

optimale

alors

qu'elle

n'est

en

fait

qu'un

point

dans

un

espace

de

conception

excessivement

complexe

Le

livre

de

Boizumault

sur

la

mise

en

oeuvre

de

Prolog

-LSB-

-RSB-

donne

une

id?ee

de

la

complexit?e

de

cet

espace

de

conception

en

couvrant

des

techniques

de

mise

en

oeuvre

autres

que

celles

utilis?ees

dans

la

WAM

Ces

techniques

ne

sont

toutefois

que

les

etapes

d'une

reconstruction

de

la

WAM

L'introduction

de

m?ecanismes

de

contr

ole

dirig?e

par

les

donn?ees

ne

bouleverse

pas

cet

etat

de

fait

La

WAM

peut

etre

etendue

afin

d'int

egrer

ces

m?ecanismes

En

fait

une

fois

les

rouages

de

la

WAM

assimil?es

il

est

si

tentant

de

se

d?eplacer

dans

cet

espace

de

conception

qu'il

est

difficile

sinon

impossible

de

trouver

un

syst?eme

Prolog

fid?ele

a

la

description

originelle

de

la

WAM

M

eme

le

tutoriel

d'

A

t-Kaci

s

ecarte

de

la

WAM

de

mani?ere

sans

doute

marginale

mais

pas

toujours

compr?ehensible

Par

exemple

pourquoi

ne

plus

d?efaire

les

liaisons

au

retour

arri?ere

dans

l'op

eration

backtrack

Bien

s

ur

des

modifications

plus

notables

ont

aussi

et?e

propos?ees

comme

une

architecture

a

pile

double

utilis?ee

dans

SICStus

Prolog

-LSB-

-RSB-

et

la

machine

KCM

-LSB-

-RSB-

Cependant

aucune

de

ces

modifications

ne

fait

l'unanimit

e.

Zhou

par

exemple

a

r?ecemment

sugg?er?e

de

refusionner

les

deux

blocs

de

contr

ole

de

la

WAM

en

un

bloc

unique

-LSB-

-RSB-

Il

n'est

alors

plus

question

d'architecture

a

pile

double

Cette

multiplication

des

variantes

ainsi

que

les

difficult?es

rencontr?ees

dans

la

justification

d'une

variante

donn?ee

sont

dues

pour

une

part

aux

probl?emes

classiques

d'

evaluation

de

la

mise

en

oeuvre

d'un

langage

absence

de

crit?ere

d'

evaluation

unique

probl?eme

de

quantification

de

certains

crit?eres

tels

que

la

complexit?e

d'une

mise

en

oeuvre

influence

du

mat?eriel

et

notamment

du

syst?eme

m?emoire

sur

la

complexit?e

des

algorithmes

notion

evolutive

d'ex

ecution

standard

au

travers

du

choix

de

programmes

de

tests

Mais

notre

exp?erience

pass?ee

sur

la

machine

KCM

-LSB-

-RSB-

nous

a

convaincu

que

Prolog

et

la

WAM

ont

aussi

leurs

parts

de

responsabilit?e

Au

niveau

le

plus

abstrait

les

interactions

entre

les

deux

types

de

contr

ole

avant

et

arri?ere

-LRB-

ET

et

OU

-RRB-

de

Prolog

et

l'unification

cr?eent

une

premi?ere

source

de

complexit?e

Ensuite

quelle

que

soit

la

machine

abstraite

s

ajoutent

les

contraintes

inh?erentes

a

l'utilisation

d'un

syst?eme

m?emoire

fini

et

hi?erarchis?e

d'

o?u

notamment

la

n?ecessit?e

d'une

gestion

dynamique

de

Introduction

la

m?emoire

Finalement

la

WAM

rajoute

un

dernier

niveau

de

complexit?e

par

certains

choix

de

mise

en

oeuvre

visant

a

une

consommation

m?emoire

parcimonieuse

Aussi

il

est

fondamental

lors

de

la

justification

de

toute

variante

de

la

WAM

de

prendre

en

compte

ces

diff?erents

el?ements

et

notamment

d'appr

ecier

le

comportement

relatif

de

la

variante

en

terme

de

consommation

m?emoire

Il

est

par

exemple

curieux

de

voir

certains

travaux

ax?es

sur

la

performance

ignorer

les

probl?emes

li?es

a

une

gestion

dynamique

efficace

de

la

m?emoire

alors

que

la

gestion

m?emoire

est

le

facteur

clef

de

la

performance

d?es

que

la

pagination

entre

en

jeu

Cette

th?ese

etudie

en

profondeur

quatre

aspects

importants

de

la

mise

en

oeuvre

de

Prolog

dans

le

contexte

de

la

WAM

a

la

lumi?ere

des

remarques

pr?ec?edentes

Les

trois

premiers

aspects

la

gestion

des

environnements

la

gestion

des

points

de

choix

et

la

coupure

couvrent

la

majeure

partie

du

contr

ole

standard

de

Prolog

Leur

etude

eclaircit

les

similarit?es

entre

contr

ole

avant

et

contr

ole

arri?ere

et

montre

les

limites

de

la

politique

de

gestion

m?emoire

adopt?ee

par

la

WAM

Le

dernier

aspect

traite

des

techniques

de

modification

r?eversible

et

touche

a

la

fois

au

contr

ole

et

a

l'unification

Les

techniques

de

modification

r?eversible

jouent

un

r

ole

majeur

dans

la

mise

en

oeuvre

de

nombreuses

extensions

telles

que

le

coroutinage

et

les

contraintes

et

fournit

un

bon

exemple

de

la

mani?ere

d'

etendre

les

possibilit?es

d'un

syst?eme

Prolog

a

partir

de

modifications

mineures

du

moteur

Prolog

de

base

Nous

esp?erons

que

ce

travail

aidera

les

personnes

int?eress?ees

par

la

mise

en

oeuvre

de

Prolog

a

mieux

comprendre

la

WAM

et

ses

variantes

et

leurs

evitera

de

tomber

dans

certains

travers

de

l'

optimisation

a

tout

crin

Plan

de

la

th?ese

Chapitre

Pr?eliminaires

Bien

qu'une

bonne

connaissance

de

la

WAM

soit

n?ecessaire

a

la

compr?ehension

de

certains

d?etails

de

ce

document

ce

chapitre

devrait

permettre

au

n?eophyte

d'appr

ecier

les

el?ements

majeurs

des

chapitres

suivants

Le

chapitre

est

int?eressant

en

lui-m

eme

car

diff?erent

en

cela

des

pr?esentations

classiques

de

la

WAM

il

ne

s

attache

pas

a

d?ecrire

la

WAM

par

le

menu

mais

se

focalise

sur

des

principes

g?en?eraux

qui

touchent

a

l'essence

de

la

WAM

Trois

sujets

principaux

sont

abord?es

la

repr?esentations

des

termes

la

repr?esentation

du

contr

ole

et

la

gestion

dynamique

de

la

m?emoire

Chapitre

La

gestion

des

environnements

La

WAM

g?ere

le

contr

ole

avant

par

empilement

d'environnements

Il

est

alors

possible

de

g?en?eraliser

l'optimisation

d'appel

terminal

en

elaguant

l'environnement

courant

a

chaque

appel

d?eterministe

La

mise

en

oeuvre

de

l'

elagage

n'est

toutefois

pas

totalement

satisfaisante

Aussi

un

certain

nombre

de

variantes

ont

et?e

propos?ees

Les

variantes

connues

de

l'auteur

sont

pass?ees

en

revue

Outre

la

strat?egie

utilis?ee

par

la

WAM

deux

strat?egies

de

base

sont

mises

en

lumi?ere

une

strat?egie

avide

qui

garde

explicitement

la

valeur

du

sommet

de

l'environnement

courant

et

une

strat?egie

paresseuse

qui

sous-traite

l'

elagage

au

r?ecup?erateur

de

m?emoire

L'influence

de

la

r?eutilisation

des

environnements

et

du

contr

ole

arri?ere

est

etudi?ee

Les

strat?egies

d'

elimination

des

variables

globalisables

elagage

retard?e

analyse

globale

et

globalisation

syst?ematique

des

variables

libres

sont

ensuite

abord?ees

Le

chapitre

inclut

des

donn?ees

exp?erimentales

sur

l'effet

de

l'

elagage

sur

la

taille

de

la

pile

et

sur

le

co

ut

relatif

a

l'accroissement

du

nombre

de

variables

globalisables

Chapitre

La

gestion

des

points

de

choix

Entrem

el?ee

aux

environnements

une

pile

de

points

de

choix

m?emorise

les

chemins

non

s?electionn?es

a

explorer

au

retour

arri?ere

Dans

un

premier

temps

la

mise

en

oeuvre

des

points

de

choix

dans

la

WAM

est

d?etaill?ee

En

particulier

le

besoin

d'inclure

un

champ

donnant

la

taille

du

point

de

choix

est

r?efut?e

Diff?erentes

techniques

visant

en

compl?ement

de

l'indexation

a

r?eduire

le

trafic

m?emoire

d

u

aux

points

de

choix

sont

ensuite

pass?ees

en

revue

Ces

techniques

s

appuient

principalement

sur

l'id

ee

simple

d'acc

eder

a

la

m?emoire

uniquement

en

cas

de

n?ecessit?e

Elles

am?eliorent

notablement

les

retours

arri?ere

superficiels

Une

mise

en

oeuvre

efficace

de

ces

techniques

adapt?ee

a

la

compilation

en

code

natif

est

d?eriv?ee

de

mani?ere

incr?ementale

Finalement

la

notion

d'

elagage

pr?ec?edemment

evoqu?ee

est

etendue

aux

points

de

choix

Chapitre

La

coupure

Le

m?ecanisme

de

coupure

permet

de

r?eduire

l'espace

de

recherche

en

supprimant

les

points

de

choix

jug?es

inutiles

Ce

chapitre

d?ecrit

la

mise

en

oeuvre

des

trois

types

principaux

de

coupure

coupure

standard

coupure

locale

et

coupure

s?elective

L'accent

est

mis

sur

la

m?ethode

de

compilation

utilis?ee

pour

KCM

Cette

m?ethode

est

bas?ee

sur

le

traitement

de

la

coupure

au

niveau

de

la

clause

par

transformation

de

programmes

Un

examen

de

l'influence

de

la

coupure

sur

la

gestion

m?emoire

montre

que

la

logique

de

r?ecup?eration

avide

de

m?emoire

mise

en

place

par

la

WAM

fonctionne

mal

en

pr?esence

de

certains

types

de

coupure

La

s?eparation

des

environnements

et

des

points

de

choix

sur

deux

piles

s?epar?ees

permet

la

r?ecup?eration

de

points

de

choix

superficiels

mais

ne

r?esout

pas

les

cas

de

coupure

s?elective

de

points

choix

profonds

Chapitre

Les

modifications

r?eversibles

La

mise

en

oeuvre

d'extensions

telles

que

le

coroutinage

les

contraintes

les

termes

rationnels

et

les

termes

requiert

d'

etendre

la

proc?edure

d'unification

de

Prolog

standard

Cette

unification

etendue

doit

etre

capable

de

modifier

de

mani?ere

r?eversible

certains

termes

modifications

qui

peuvent

etre

r?ealis?ees

soit

par

substitution

soit

par

affectation

destructive

et

tra

nage

de

valeur

Les

deux

techniques

ont

chacune

leurs

qualit?es

et

leurs

d?efauts

ce

qui

sugg?ere

de

les

combiner

Diff?erentes

techniques

de

tra

nage

sont

compar?ees

dont

de

nouvelles

techniques

proches

de

la

technique

classique

d'estampillage

Une

d?efinition

pr?ecise

du

pr?edicat

pr?ed?efini

est

aussi

pr?esent?ee

Introduction

Chapitre

Conclusion

La

conclusion

r?esume

les

contributions

de

la

th?ese

et

evoque

quelques

perspectives

sur

la

mise

en

oeuvre

des

langages

de

programmation

en

logique

Annexes

Un

survol

de

KCM

pr?esente

le

contexte

initial

de

ces

travaux

et

explique

certaines

de

nos

inqui?etudes

-LRB-

par

exemple

sur

l'utilisation

de

la

hi?erarchie

m?emoire

-RRB-

et

de

nos

biais

-LRB-

par

exemple

en

faveur

de

la

compilation

en

code

natif

-RRB-

Ce

que

la

th?ese

n'aborde

pas

Une

eni?eme

introduction

sur

le

langage

Prolog

et

son

histoire

a

et?e

epargn?ee

au

lecteur

Une

bonne

connaissance

de

Prolog

est

pr?esuppos?ee

Le

livre

de

Sterling

et

Shapiro

-LSB-

-RSB-

est

une

r?ef?erence

classique

mais

d'autres

ouvrages

ont

leur

int?er

et

Par

exemple

le

premier

livre

de

Hogger

echappe

aux

habituelles

idiosyncrasies

de

Prolog

en

terme

de

pr?edicats

pr?ed?efinis

et

d'environnement

de

programmation

-LSB-

-RSB-

Une

bibliographie

relativement

compl?ete

d'ouvrages

sur

Prolog

est

r?eguli?erement

post?ee

sur

USENET

dans

le

guide

des

ressources

Prolog

de

Kantrowitz

-LRB-

forum

comp.lang.prolog

-RRB-

En

ce

qui

concerne

l'

evolution

des

techniques

de

mise

en

oeuvre

et

en

compl?ement

du

livre

pr?ec?edemment

cit?e

de

Boizumault

-LSB-

-RSB-

l'article

de

Van

Roy

-LSB-

-RSB-

r?ef?erence

a

peu

pr?es

tous

les

d?eveloppements

marquants

des

dix

derni?eres

ann?ees

Citons

aussi

la

th?ese

de

Mari?en

-LSB-

-RSB-

tr?es

informative

en

ce

qui

concerne

la

production

de

code

et

dont

nous

partageons

la

conclusion

a

savoir

que

la

vitesse

d'ex

ecution

de

Prolog

peut

etre

encore

significativement

am?elior?ee

sans

recours

a

des

techniques

lourdes

d'analyse

globale

Ce

document

ne

se

veut

pas

un

tutoriel

sur

la

WAM

En

d?epit

du

chapitre

pr?eliminaire

certains

d?etails

ne

peuvent

etre

compris

sans

une

bonne

connaissance

pr?ealable

de

la

WAM

De

plus

ne

sont

couverts

que

quelques

aspects

de

la

WAM

Il

n'est

m

eme

pas

possible

de

pr?etendre

que

l'ensemble

des

probl?emes

relatifs

au

contr

ole

de

Prolog

ait

et?e

trait?e

Les

techniques

d'indexation

et

le

coroutinage

ne

sont

que

mentionn?es

et

rien

n'est

dit

du

traitement

des

et

traitement

des

exceptions

ne

sont

pas

abord?es

dans

la

WAM

Aujourd

hui

un

traitement

complet

du

contr

ole

de

Prolog

ne

saurait

les

ignorer

Pr?eliminaires

En

tant

que

machine

abstraite

Prolog

la

WAM

d?efinit

une

architecture

m?emoire

un

jeu

d'instructions

manipulant

cette

m?emoire

et

les

sch?emas

n?ecessaires

a

la

compilation

de

Prolog

vers

les

instructions

de

la

WAM

La

WAM

est

abstraite

en

ce

que

certains

d?etails

de

codage

et

de

mise

en

oeuvre

ne

sont

pas

sp?ecifi?es

de

sorte

que

sa

r?ealisation

puisse

prendre

des

formes

diff?erentes

-LSB-

traduction

personnelle

-RSB-

principalement

la

forme

d'un

code

dit

emul?e

interpr?et?e

par

un

emulateur

ou

d'un

code

dit

natif

directement

ex?ecut?e

par

le

mat?eriel

D'une

certaine

mani?ere

la

WAM

d'assez

bas

niveau

est

toutefois

plus

une

machine

interm?ediaire

qu'une

machine

abstraite

L'objectif

de

ce

chapitre

n'est

pas

de

d?ecrire

exhaustivement

la

WAM

mais

d'extraire

au

del?a

des

descriptions

d?etaill?ees

habituelles

les

principales

caract?eristiques

de

la

WAM

n?ecessaires

a

la

compr?ehension

des

chapitres

suivants

Ces

caract?eristiques

sont

regroup?ees

en

trois

sections

repr?esentation

des

termes

et

unification

repr?esentation

du

contr

ole

et

gestion

m?emoire

dynamique

Ce

dernier

point

est

fr?equemment

ignor?e

dans

les

descriptions

de

machines

abstraites

de

type

WAM

alors

que

les

choix

li?es

a

la

gestion

m?emoire

statique

-LRB-

compil?ee

-RRB-

et

a

la

gestion

m?emoire

dynamique

-LRB-

interpr?et?ee

-RRB-

ne

peuvent

que

difficilement

etre

trait?es

ind?ependamment

Une

derni?ere

section

r?ecapitule

les

structures

de

contr

ole

de

la

WAM

et

pr?ecise

un

certain

nombre

de

conventions

utilis?ees

dans

les

chapitres

suivants

Repr?esentation

des

termes

et

unification

Quelques

rappels

Syntaxiquement

les

termes

de

Prolog

sont

d?efinis

inductivement

a

partir

de

symboles

de

variables

ou

variables

et

de

symboles

fonctionnels

ou

foncteurs

A

chaque

foncteur

est

associ?e

un

nombre

positif

son

arit?e

Les

foncteurs

d'arit

e

sont

appel?es

constantes

Un

terme

peut

etre

une

variable

une

constante

ou

un

terme

compos?e

f

-LRB-

tn

-RRB-

o?u

f

est

un

foncteur

d'arit

e

n

et

les

ti

i

n

des

termes

L'unification

rend

deux

termes

egaux

par

substitution

Une

substitution

est

un

ensemble

vn

tng

o?u

les

vi

-LRB-

i

n

-RRB-

sont

n

variables

distinctes

et

chaque

ti

est

distinct

de

vi

La

variable

vi

initialement

libre

ou

non

li?ee

est

dite

li?ee

a

ti

On

dit

aussi

que

ti

est

la

valeur

de

liaison

de

vi

Si

ti

n'est

pas

une

variable

vi

est

dite

instanci?ee

Pr?eliminaires

oe

oe

oe

Y

X

Pile

Globale

FON

REF

REF

CMP

Figure

Exemple

de

repr?esentation

d'un

terme

compos?e

La

proc?edure

d'unification

prend

deux

termes

et

calcule

la

substitution

la

plus

g?en?erale

ou

unificateur

le

plus

g?en?eral

rendant

ces

deux

termes

egaux

Evidemment

ce

calcul

n'est

pas

toujours

possible

Si

les

termes

sont

unifiable

l'unification

r?eussit

sinon

elle

echoue

L'unificateur

le

plus

g?en?eral

est

unique

modulo

un

renommage

des

variables

Compar?ees

a

la

proc?edure

d'unification

initialement

propos?ee

par

Robinson

-LSB-

-RSB-

les

impl?ementations

de

Prolog

omettent

habituellement

pour

des

raisons

d'efficacit

e

le

test

d'occurrence

Ce

test

permet

de

retourner

un

echec

lors

d'une

tentative

d'unification

d'une

variable

v

et

d'un

terme

t

qui

d?epend

de

v

garantissant

ainsi

que

l'unification

ne

cr?ee

pas

de

terme

infini

en

dehors

du

champ

de

la

th?eorie

standard

de

la

programmation

en

logique

-LRB-

voir

le

livre

de

Lloyd

-LSB-

-RSB-

-RRB-

D'autres

options

existent

Il

est

possible

de

d?eterminer

par

analyse

les

endroits

du

programme

o?u

le

test

d'occurrence

est

vraiment

n?ecessaire

comme

l'

a

sugg?er?e

Plaisted

-LSB-

-RSB-

Il

est

aussi

possible

de

s

appuyer

sur

une

th?eorie

prenant

en

compte

les

termes

rationnels

a

la

suite

de

Colmerauer

-LSB-

-RSB-

Il

est

tout

a

fait

notable

que

a

partir

du

moment

o?u

le

tra

nage

de

valeur

a

et?e

introduit

-LRB-

voir

section

-RRB-

etendre

la

proc?edure

d'unification

pour

prendre

en

compte

les

termes

rationnels

est

tr?es

simple

-LRB-

voir

la

version

op?erationnelle

de

l'algorithme

d'unification

de

Huet

par

Le

Huitouze

-LSB-

-RSB-

-RRB-

Repr?esentation

des

termes

Dans

la

WAM

les

termes

sont

repr?esent?es

par

des

cellules

m?emoire

etiquet?ees

c'est

adire

des

paires

-LRB-

etiquette

valeur

-RRB-

Une

cellule

prend

habituellement

un

ou

deux

mots

machine

L'

etiquette

donne

le

type

de

la

repr?esentation

c'est

a-dire

indique

comment

interpr?eter

la

valeur

de

la

cellule

Il

y

a

trois

types

de

base

les

r?ef?erences

-LRB-

etiquette

REF

-RRB-

les

foncteurs

-LRB-

etiquette

FON

-RRB-

et

les

termes

compos?es

-LRB-

etiquette

CMP

-RRB-

En

pratique

d'autres

types

comme

le

type

entier

et

le

type

liste

sont

aussi

d?efinis

Le

comportement

de

chacun

de

ces

types

se

r?esume

au

comportement

d'un

des

types

de

bases

Nous

ne

rentrerons

donc

pas

dans

ces

d?etails

Chaque

terme

a

a

tout

instant

une

repr?esentation

d?er?ef?erenc?ee

unique

Repr?esentation

des

termes

et

unification

ffl

une

auto-r

ef?erence

REF

adresse

si

le

terme

est

une

variable

libre

La

valeur

d'une

auto-r

ef?erence

est

l'adresse

de

la

cellule

ffl

une

cellule

de

foncteur

FON

identificateur

unique

du

foncteur

si

le

terme

est

une

constante

ffl

une

cellule

de

terme

compos?e

CMP

adresse

si

le

terme

est

un

terme

compos?e

La

valeur

de

la

cellule

donne

l'adresse

sur

une

zone

m?emoire

appel?ee

pile

globale

d'une

structure

de

donn?ees

dans

laquelle

sont

rang?ees

dans

des

cellules

cons?ecutives

les

repr?esentations

du

foncteur

et

des

arguments

du

terme

compos?e

Toute

autre

repr?esentation

est

une

r?ef?erence

-LRB-

etiquette

REF

-RRB-

maillon

dans

une

cha

ne

de

liaisons

dont

la

cellule

terminale

est

la

repr?esentation

d?er?ef?erenc?ee

du

terme

Suivre

la

cha

ne

de

liaisons

pour

acc?eder

a

la

repr?esentation

d?er?ef?erenc?ee

du

terme

est

appel?e

d?er?ef?erenciation

En

guise

d'exemple

la

figure

montre

le

r?esultat

de

l'ex

ecution

de

l'unification

Y

f

-LRB-

X

X

-RRB-

Notons

que

la

variable

X

est

repr?esent?ee

a

la

fois

par

une

r?ef?erence

et

une

auto-r

ef?erence

Globalement

la

repr?esentation

des

termes

dans

la

WAM

est

dite

par

copie

de

structures

et

etiquetage

des

pointeurs

Les

autres

options

partage

de

structures

et

etiquetage

des

donn?ees

sont

rapidement

abord?ees

en

La

cr?eation

d'une

instance

de

structure

c'est

a-dire

d'un

terme

compos?e

apparaissant

-LRB-

statiquement

-RRB-

dans

le

programme

requiert

en

quelque

sorte

une

copie

de

cette

structure

d'

o?u

le

terme

copie

de

structures

Les

instructions

utilis?ees

dans

la

WAM

pour

compiler

les

structures

fonctionnent

selon

le

mode

d'unification

En

mode

lecture

la

structure

est

unifi?ee

avec

un

terme

pr?eexistant

En

mode

ecriture

un

nouveau

terme

compos?e

est

cr?e?e

Le

terme

etiquetage

des

pointeurs

emprunt?e

a

Tarau

et

Neumerkel

-LRB-

tag-on-pointer

-LSB-

-RSB-

-RRB-

indique

l'utilisation

d'une

etiquette

sp?ecifique

pour

faire

la

diff?erence

entre

une

cellule

pointant

sur

la

structure

de

donn?ees

d'un

terme

compos?e

et

une

simple

r?ef?erence

Dans

une

repr?esentation

par

etiquetage

des

donn?ees

cette

etiquette

sp?ecifique

n'existe

pas

-LRB-

voir

section

-RRB-

Unification

et

partage

des

repr?esentations

A

un

niveau

purement

descriptif

l'unification

lie

des

variables

libres

-LRB-

les

vi

-RRB-

a

des

termes

-LRB-

les

ti

-RRB-

En

pratique

ces

liaisons

sont

faites

en

place

Pour

chaque

i

la

repr?esentation

d?er?ef?erenc?ee

de

ti

est

substitu?ee

a

l'auto-r

ef?erence

repr?esentant

vi

cela

si

la

variable

pr?eexiste

a

l'unification

Si

ce

n'est

pas

le

cas

la

repr?esentation

disponible

du

terme

ti

est

directement

affect?ee

a

la

cellule

choisie

par

le

compilateur

pour

repr?esenter

vi

Il

la

terminologie

de

la

WAM

une

structure

est

aussi

un

terme

compos?e

qui

n

a

pas

le

type

liste

c'est

a-dire

dont

le

foncteur

n'est

pas

Pr?eliminaires

oe

oe

oe

oe

X

Y

X

Y

X

Y

REF

REF

REF

REF

Figure

Unification

avec

partage

des

repr?esentations

oe

V

W

V

W

V

W

FON

REF

FON

FON

Figure

Unification

sans

partage

des

repr?esentations

Repr?esentation

des

termes

et

unification

n

y

a

pas

passage

par

une

auto-r

ef?erence

et

la

valeur

de

liaison

peut

ne

pas

etre

une

repr?esentation

d?er?ef?erenc?ee

Ce

cas

correspond

au

traitement

de

la

premi?ere

occurrence

d'une

variable

dans

la

t

ete

d'une

clause

Le

r?esultat

est

qu'une

variable

peut

etre

indiff?eremment

li?ee

a

un

terme

repr?esent?e

par

une

r?ef?erence

ou

par

une

non-r

ef?erence

Dans

le

premier

cas

et

dans

le

premier

cas

seulement

la

variable

et

le

terme

vont

partager

une

m

eme

repr?esentation

d?er?ef?erenc?ee

Ce

point

est

illustr?e

figures

et

Figure

les

deux

variables

X

et

Y

sont

libres

Suite

a

leur

unification

les

deux

variables

partagent

la

m

eme

repr?esentation

d?er?ef?erenc?ee

Une

nouvelle

unification

impliquant

l'une

des

deux

variables

affectera

aussi

l'autre

variable

Notons

que

les

autor?ef?erences

ont

la

bonne

propri?et?e

de

pouvoir

etre

partag?ees

par

simple

copie

de

leur

contenu

Remplacer

l'auto-r

ef?erence

repr?esentant

la

variable

Y

par

l'auto-r

ef?erence

repr?esentant

la

variable

X

change

automatiquement

la

repr?esentation

de

la

variable

Y

en

une

r?ef?erence

a

la

repr?esentation

de

la

variable

X.

Au

contraire

figure

unifier

la

variable

V

qui

est

li?ee

et

la

variable

W

qui

est

libre

ne

fait

que

dupliquer

la

repr?esentation

de

V

sans

cr?eer

aucun

partage

Autres

choix

de

repr?esentation

Les

autos-r

ef?erences

prisonni?eres

Lors

de

la

construction

de

la

structure

de

donn?ees

associ?ee

a

un

terme

compos?e

toute

cellule

correspondant

a

la

premi?ere

occurrence

d'une

variable

prend

pour

valeur

une

auto-r

ef?erence

C'est

ce

qui

arrive

a

la

variable

Y

figure

Nous

dirons

que

de

telles

r?ef?erences

sont

prisonni?ere

Le

partage

d'une

auto-r

ef?erence

prisonni?ere

par

unification

conduit

a

la

cr?eation

d'une

r?ef?erence

vers

un

champ

argument

d'un

terme

compos?e

Il

n

y

a

pas

d'autre

mani?ere

de

cr?eer

de

telles

r?ef?erences

Or

ces

r?ef?erences

cr?eent

un

certain

nombre

de

difficult?es

lors

de

l'introduction

de

l'affectation

destructive

par

exemple

au

travers

du

pr?edicat

pr?ed?efini

-LRB-

voir

section

-RRB-

ou

d'une

r?ecup?eration

de

m?emoire

par

copie

En

fait

l'

eviction

des

auto-r

ef?erences

prisonni?eres

est

un

pr?erequis

a

une

r?ecup?eration

m?emoire

par

copie

compatible

avec

une

r?ecup?eration

m?emoire

instantan?ee

au

retour

arri?ere

-LRB-

voir

la

synth?ese

de

Bekkers

et

al.

sur

la

r?ecup?eration

m?emoire

-LSB-

-RSB-

-RRB-

Afin

de

conserver

les

auto-r

ef?erences

Bevemyr

et

Lindgren

ont

et?e

conduits

a

impl?ementer

une

r?ecup?eration

m?emoire

par

marquage

et

copie

plut

ot

que

par

simple

copie

le

marquage

evite

que

les

auto-r

ef?erences

ne

soient

dupliqu?ees

lors

de

la

r?ecup?eration

m?emoire

-LSB-

-RSB-

Notons

cependant

qu'il

est

facile

de

l?eg?erement

modifier

la

WAM

afin

d'

eliminer

toute

auto-r

ef?erence

prisonni?ere

Il

suffit

de

s

interdire

l'utilisation

des

instructions

Vn

et

qui

sont

les

instructions

responsables

de

la

cr?eation

des

auto-r

ef?erences

prisonni?eres

et

d'amender

les

sch?emas

de

compilation

afin

que

les

repr?esentations

de

toutes

les

variables

apparaissant

dans

un

terme

compos?e

soient

initialis?ees

avant

que

le

terme

ne

soit

cr?e?e

Consid?erons

l'exemple

simple

de

la

figure

L'instruction

Pr?eliminaires

p

-LRB-

f

-LRB-

X

X

-RRB-

code

WAM

p

-LRB-

f

-LRB-

X

X

proceed

-RRB-

code

sans

auto-r

ef?erence

prisonni?ere

p

-LRB-

f

-LRB-

X

X

proceed

-RRB-

Figure

Code

WAM

sans

auto-r

ef?erence

prisonni?ere

Repr?esentation

des

termes

et

unification

s

attend

a

trouver

dans

le

registre

argument

soit

une

variable

soit

un

terme

compos?e

de

foncteur

principal

Dans

le

premier

cas

une

cellule

de

terme

compos?e

pointant

vers

le

sommet

de

la

pile

globale

est

substitu?ee

a

la

repr?esentation

d?er?ef?erenc?ee

de

la

variable

Une

cellule

de

foncteur

est

alors

empil?ee

sur

la

pile

globale

et

l'ex

ecution

continue

en

mode

ecriture

les

deux

instructions

suivantes

empilent

une

repr?esentation

des

premier

et

second

arguments

du

terme

compos?e

Habituellement

l'instruction

cr?ee

une

instance

de

la

variable

X

en

empilant

une

auto-r

ef?erence

sur

la

pile

globale

d'

o?u

la

cr?eation

d'une

auto-r

ef?erence

prisonni?ere

Une

r?ef?erence

a

cette

cellule

est

aussi

rang?ee

dans

le

registre

L'empilement

de

cette

r?ef?erence

par

l'instruction

va

conduire

a

une

situation

similaire

a

celle

d?ecrite

figure

La

cr?eation

d'une

auto-r

ef?erence

prisonni?ere

est

evit?ee

gr

ace

a

l'instruction

pr?eliminaire

Cette

instruction

cr?ee

une

instance

de

la

variable

X

en

empilant

une

auto-r

ef?erence

non

prisonni?ere

sur

la

pile

globale

rangeant

aussi

une

r?ef?erence

a

cette

cellule

dans

le

registre

Si

l'argument

de

est

une

variable

les

trois

instructions

suivantes

lient

la

variable

a

une

instance

du

terme

compos?e

f

-LRB-

X

X

-RRB-

Dans

la

structure

de

donn?ees

correspondante

chacun

des

arguments

est

alors

repr?esent?e

par

une

r?ef?erence

cr?e?ee

par

une

instruction

En

mode

lecture

le

code

r?esultant

est

moins

efficace

que

le

code

WAM

La

cr?eation

pr?eliminaire

d'une

auto-r

ef?erence

pour

la

variable

X

est

inutile

et

conduit

a

un

appel

additionnel

a

la

proc?edure

g?en?erale

d'unification

-LRB-

lors

de

l'ex

ecution

de

l'instruction

-RRB-

En

pratique

les

mises

en

oeuvre

mettant

l'accent

sur

l'efficacit

e

g?en?erent

deux

s?equences

d'instructions

une

par

mode

d'unification

-LRB-

voir

l'article

de

synth?ese

de

Van

Roy

-LSB-

-RSB-

-RRB-

de

sorte

que

la

s?equence

du

mode

ecriture

peut

etre

modi?ee

ind?ependamment

de

la

s?equence

de

mode

lecture

A

l'oppos

e

il

est

aussi

tr?es

facile

de

multiplier

les

r?ef?erences

a

des

champs

arguments

Consid?erons

le

code

WAM

standard

Si

l'instruction

trouve

dans

le

registre

un

terme

compos?e

de

foncteur

elle

fait

pointer

le

pointeur

de

structure

S

sur

le

premier

champ

argument

du

terme

compos?e

et

l'ex

ecution

continue

en

mode

lecture

Ce

pointeur

de

structure

est

incr?ement?e

a

la

fin

de

chaque

instruction

unify

de

mani?ere

a

traiter

successivement

chacun

des

arguments

du

terme

compos?e

Regardons

ce

qui

se

passe

pour

le

premier

argument

L'instruction

range

dans

le

registre

le

contenu

du

premier

champ

argument

Le

registre

contient

alors

une

repr?esentation

du

premier

argument

du

terme

compos?e

repr?esentation

qui

va

etre

utilis?ee

en

vue

d'unifier

les

deux

arguments

par

l'instruction

qui

suit

Autre

option

qui

suppose

que

le

pointeur

de

structure

est

etiquet?e

comme

etant

une

r?ef?erence

l'instruction

se

borne

a

copier

le

contenu

du

registre

S

dans

le

registre

En

effet

une

r?ef?erence

pointant

sur

le

premier

champ

argument

est

une

repr?esentation

tout

a

fait

valide

du

premier

argument

du

terme

compos?e

Si

le

pointeur

de

structure

et

les

registres

arguments

sont

des

registres

instruction

set

variable

Ai

introduite

par

A

t-Kaci

-LSB-

-RSB-

n'existe

pas

dans

la

version

originale

de

la

WAM

C'est

une

sp?ecialisation

au

mode

ecriture

de

l'instruction

unify

variable

Ai

Pr?eliminaires

machine

l'instruction

Ai

n

a

plus

a

acc?eder

la

m?emoire

Malheureusement

cela

n'est

pas

tout

b?en?efice

l'instruction

cr?ee

une

indirection

qui

contribue

a

rallonger

les

cha

nes

de

liaisons

En

moyenne

une

factorisation

des

acc?es

m?emoire

obtenue

en

ma

trisant

la

longueur

des

cha

nes

de

liaison

s

av?ere

plus

avantageuse

qu'une

approche

paresseuse

des

acc?es

m?emoire

Partage

contre

copie

de

structures

Le

partage

de

structures

repr?esente

une

instance

de

structure

par

une

paire

-LRB-

structure

environnement

-RRB-

o?u

l'environnement

est

un

vecteur

de

termes

donnant

les

valeurs

de

liaison

des

variables

apparaissant

dans

la

structure

ainsi

que

dans

d'autres

structures

de

la

m

eme

clause

A

chaque

variable

est

associ?e

un

nombre

entier

donnant

la

position

de

sa

valeur

de

liaison

dans

l'environnement

Il

y

a

donc

deux

niveaux

de

partage

En

premier

lieu

les

structures

sont

partag?ees

par

toutes

leurs

instances

En

second

lieu

les

termes

compos?es

cr?e?es

au

sein

de

la

m

eme

instance

de

clause

partagent

les

valeurs

de

liaison

de

leurs

variables

communes

par

l'interm

ediaire

d'un

environnement

Le

livre

de

Boizumault

-LSB-

-RSB-

contient

une

comparaison

d?etaill?ee

de

la

copie

et

du

partage

de

structures

Chaque

technique

a

ses

propres

avantages

Cependant

un

d?esavantage

notable

du

partage

de

structures

d?ej?a

signal?e

par

Warren

dans

-LSB-

-RSB-

est

de

ne

pas

permettre

de

lib?erer

a

la

r?ecup?eration

m?emoire

toutes

les

cellules

inaccessibles

La

raison

en

est

que

le

partage

de

structures

oblige

a

conserver

pour

chaque

environnement

la

position

relative

des

cellules

encore

vivantes

Un

argument

classique

en

faveur

de

la

copie

est

aussi

qu'elle

conduit

a

une

meilleur

localit?e

que

le

partage

Une

forme

limit?ee

de

partage

a

et?e

r?eintroduite

dans

un

certain

nombre

de

syst?emes

employant

la

copie

par

exemple

Aquarius

-LSB-

-RSB-

qui

partagent

les

termes

compos?es

totalement

instanci?es

Cette

id?ee

n'est

pas

nouvelle

Mellish

la

mentionne

dans

-LSB-

-RSB-

Etiquetage

des

donn?ees

contre

etiquetage

des

pointeurs

Une

repr?esentation

par

etiquetage

des

donn?ees

a

et?e

adopt?ee

par

Tarau

dans

son

impl?ementation

de

BinProlog

-LSB-

-RSB-

La

particularit?e

de

cette

repr?esentation

par

rapport

a

la

repr?esentation

utilis?ee

dans

la

WAM

est

d'

eviter

l'utilisation

d'une

etiquette

CMP

Un

terme

compos?e

est

repr?esent?e

par

une

r?ef?erence

pointant

sur

la

premi?ere

cellule

de

la

structure

de

donn?ees

associ?ee

au

terme

donc

une

r?ef?erence

pointant

sur

une

cellule

de

foncteur

d'arit

e

non

nulle

La

donn?ee

de

l'arit

e

comme

sous-champ

du

champ

valeur

d'un

foncteur

permet

de

faire

la

diff?erence

entre

terme

compos?e

et

constante

Cette

repr?esentation

a

l'avantage

de

sauver

un

bit

d'

etiquette

Cela

peut

ne

pas

etre

indiff?erent

quand

il

s

agit

de

ranger

dans

un

seul

mot

machine

de

bits

une

etiquette

et

une

valeur

Supposons

que

les

types

de

base

soient

les

suivants

r?ef?erence

constante

symbolique

entier

et

variable

a

attribut

-LRB-

voir

chapitre

-RRB-

Quatre

etiquettes

seulement

sont

n?ecessaires

le

codage

des

etiquettes

ne

requiert

que

bits

Sur

une

machine

bits

une

r?ef?erence

peut

etre

simplement

cod?ee

comme

un

pointeur

C.

Cela

est

aussi

possible

avec

une

repr?esentation

par

etiquetage

des

pointeurs

mais

conduit

a

un

codage

plus

complexe

Par

exemple

le

syst?eme

Parma

-LSB-

-RSB-

utilise

une

etiquette

primaire

de

Repr?esentation

des

termes

et

unification

bits

pour

faire

la

diff?erence

entre

variables

termes

compos?es

et

constantes

et

un

bit

additionnel

l'

etiquette

secondaire

pour

faire

la

diff?erence

entre

diff?erents

types

de

constantes

Une

repr?esentation

par

etiquetage

des

donn?ees

simplifie

aussi

la

premi?ere

phase

de

l'unification

compil?ee

des

termes

compos?es

-LRB-

instruction

F

Ai

-RRB-

Si

l'argument

est

instanci?e

la

d?er?ef?erenciation

retourne

directement

un

foncteur

qu'il

s

agit

simplement

de

comparer

au

foncteur

attendu

Avec

un

etiquetage

des

pointeurs

deux

tests

sont

n?ecessaires

le

premier

sur

l'

etiquette

de

la

cellule

retourn?ee

par

la

d?er?ef?erenciation

pour

v?erifier

qu'il

s

agit

bien

d'un

terme

compos?e

et

un

second

sur

le

foncteur

point?e

par

la

cellule

de

terme

Cependant

notons

que

le

nombre

total

de

comparaisons

est

identique

dans

les

deux

cas

a

partir

du

moment

o?u

la

d?er?ef?erenciation

est

pris

en

compte

En

effet

l'

etiquetage

des

donn?ees

rallonge

d'un

pas

la

d?er?ef?erenciation

De

plus

quand

l'unification

g?en?erale

unifie

deux

termes

instanci?es

un

etiquetage

des

donn?ees

requiert

aussi

un

second

test

afin

de

d?eterminer

si

les

termes

a

unifier

sont

des

constantes

ou

des

termes

compos?es

Utilisant

un

etiquetage

des

pointeurs

ce

second

test

n'est

pas

n?ecessaire

lorsque

deux

constantes

sont

unifi?ees

Mais

comme

l'unification

g?en?erale

est

peu

fr?equente

le

poids

de

ce

dernier

inconv?enient

reste

limit?e

L'

etiquetage

des

donn?ees

a

pour

principal

inconv?enient

de

compliquer

l'op

eration

de

liaison

d'une

variable

Notons

tout

d'abord

que

la

d?er?ef?erenciation

ne

peut

pas

retourner

un

singleton

comme

avec

un

etiquetage

des

pointeurs

Dans

le

cas

d'un

terme

compos?e

une

cellule

de

foncteur

serait

retourn?ee

et

l'adresse

de

la

structure

de

donn?ees

associ?ee

au

terme

compos?e

serait

perdue

La

d?er?ef?erenciation

doit

retourner

les

deux

derni?eres

cellules

de

la

cha

ne

de

liaisons

-LRB-

la

m

eme

cellule

est

retourn?ee

deux

fois

si

la

cha

ne

est

de

longueur

nulle

-RRB-

Cela

veut

dire

que

dans

le

cas

d'un

terme

instanci?e

-LRB-

et

d'une

cha

ne

de

longueur

non

nulle

-RRB-

la

d?er?ef?erenciation

retourne

a

la

fois

une

r?ef?erence

et

un

foncteur

Aussi

afin

de

ne

pas

rallonger

les

cha

nes

de

liaisons

lier

une

variable

a

un

terme

instanci?e

requiert

de

faire

la

diff?erence

entre

terme

compos?e

et

constante

Dans

le

premier

cas

-LRB-

terme

compos?e

-RRB-

la

variable

est

li?ee

a

la

r?ef?erence

Dans

le

second

cas

-LRB-

constante

-RRB-

la

variable

est

li?ee

au

foncteur

Un

second

inconv?enient

mineur

est

que

dans

certains

cas

-LRB-

echec

lors

d'une

unification

entre

terme

compos?e

et

constante

v?erification

de

type

-RRB-

la

connaissance

du

foncteur

n'est

pas

n?ecessaire

il

suffit

de

savoir

si

le

terme

est

compos?e

ou

non

Un

etiquetage

des

pointeurs

economise

un

acc?es

m?emoire

Dans

l'hypoth

ese

d'un

mot

par

cellule

et

de

types

de

base

un

etiquetage

des

donn?ees

est

attractif

le

codage

des

etiquette

pr?ec?edemment

mentionn?e

simplifie

le

traitement

des

etiquettes

Dans

d'autres

configurations

par

exemple

des

cellules

de

mots

ou

plus

de

quatre

types

il

n

y

a

pas

d'argument

evident

en

faveur

d'un

pas

-LSB-

-RSB-

Tarau

mentionne

trois

tests

sur

l'

etiquette

sur

le

nom

du

foncteur

et

sur

l'arit

e

du

foncteur

Ce

n'est

pas

sp?ecifique

a

une

repr?esentation

par

etiquetage

des

pointeurs

mais

plut

ot

a

un

mauvais

codage

des

identificateurs

de

foncteur

peut

aussi

etre

n?ecessaire

dans

le

cadre

d'un

etiquetage

des

pointeurs

par

exemple

lors

de

l'introduction

des

variables

a

attribut

-LRB-

voir

chapitre

-RRB-

Pr?eliminaires

sage

a

un

etiquetage

des

donn?ees

Cependant

consid?erant

les

difficult?es

inh?erentes

a

la

conception

d'un

sch?ema

d'

etiquetage

performant

-LRB-

voir

le

rapport

de

Gudeman

-LSB-

-RSB-

-RRB-

cela

demande

une

analyse

plus

d?etaill?ee

prenant

en

compte

tous

les

d?etails

de

l'impl

ementation

consid?er?ee

notamment

le

besoin

trop

souvent

ignor?e

de

bits

par

exemple

de

marquage

pour

la

r?ecup?eration

m?emoire

Un

dernier

el?ement

a

prendre

a

compte

et

qui

pourrait

jouer

en

faveur

de

l'

etiquetage

des

donn?ees

est

la

possibilit?e

de

diminuer

la

consommation

m?emoire

gr

ace

au

recouvrement

du

dernier

argument

d'un

terme

compos?e

par

le

premier

el?ement

de

cet

argument

-LRB-

un

foncteur

-RRB-

lorsque

cet

el?ement

est

lui-m

eme

un

terme

compos?e

Dans

le

meilleur

des

cas

cette

technique

propos?ee

par

Tarau

et

Neumerkel

-LSB-

-RSB-

peut

par

rapport

a

un

syst?eme

d'

etiquetage

des

pointeurs

r?eduire

la

consommation

m?emoire

de

moiti?e

De

plus

elle

n

a

jamais

un

effet

n?egatif

elle

est

au

pire

sans

effet

Tout

va

donc

etre

une

question

de

balance

entre

les

pertes

en

temps

et

les

gains

en

espace

d

us

a

la

mise

en

place

de

cette

am?elioration

La

repr?esentation

du

contr

ole

La

r?esolution

SLD

La

s?emantique

op?erationnelle

de

Prolog

est

traditionnellement

d?ecrite

a

l'aide

de

la

r?esolution

SLD

-LRB-

voir

-LSB-

-RSB-

-RRB-

La

r?esolution

SLD

est

un

raffinement

de

la

r?esolution

une

proc?edure

syntaxique

qui

calcule

la

satisfaisabilit?e

d'une

formule

logique

du

premier

ordre

La

r?esolution

SLD

s

applique

a

des

programmes

d?efinis

c'est

a-dire

a

des

ensembles

de

clauses

d?efinies

Utilisant

la

syntaxe

concr?ete

de

Prolog

-LRB-

repr?esente

l'implication

-RRB-

une

clause

d?efinie

est

une

clause

de

la

forme

-LRB-

l

-RRB-

A

Bl

A

et

Bi

sont

des

formules

atomiques

ou

atomes

p

-LRB-

tn

-RRB-

-LRB-

n

-RRB-

o?u

p

n

est

un

symbole

de

pr?edicat

d'arit

e

n

et

ti

-LRB-

i

n

-RRB-

un

terme

Toutes

les

variables

sont

implicitement

universellement

quantifi?ees

A

est

la

t

ete

de

la

clause

et

Bl

son

corps

Si

l

la

clause

est

un

fait

si

l

la

clause

est

dite

binaire

si

l

la

clause

est

dite

r?eguli?ere

Dans

le

contexte

de

l'interpr

etation

proc?edurale

des

programmes

d?efinis

on

parle

pour

Bi

d'appel

du

pr?edicat

p

n.

Le

pr?edicat

p

n

correspond

a

l'ensemble

des

clauses

dont

les

t

etes

ont

pour

foncteur

p

n.

On

dit

aussi

utilisant

une

interpr?etation

de

type

r?esolution

de

probl?eme

que

Bi

est

un

but

Une

etape

de

r?esolution

combine

une

r?esolvante

Rn

initialement

la

formule

dont

on

veut

conna

tre

la

satisfaisabilit?e

ou

requ

ete

Am

Ak

et

une

clause

du

programme

la

clause

s?electionn?ee

A

Bl

en

une

nouvelle

r?esolvante

Rn

La

repr?esentation

du

contr

ole

-LRB-

Am

Bl

Am

Ak

-RRB-

o?u

est

l'unificateur

le

plus

g?en?eral

de

Am

et

A.

Cela

suppose

que

les

variables

de

la

clause

et

de

la

r?esolvante

soient

distinctes

Dans

le

cas

contraire

il

suffit

de

renommer

les

variables

de

la

clause

Am

est

le

but

courant

-LRB-

ou

s?electionn?e

-RRB-

Le

pr?edicat

dont

la

d?efinition

inclut

le

but

courant

est

le

pr?edicat

courant

Deux

r?egles

contr

olent

la

r?esolution

SLD

la

r?egle

de

calcul

et

la

r?egle

de

recherche

La

r?egle

de

calcul

sp?ecifie

le

but

s?electionn?e

et

d?efinit

ainsi

un

arbre

de

recherche

ou

arbre

SLD

Chaque

noeud

de

l'arbre

de

recherche

a

pour

etiquette

une

r?esolvante

La

racine

de

l'arbre

a

pour

etiquette

la

requ

ete

Les

enfants

d'un

noeud

etiquet?e

Rn

ont

pour

etiquette

les

diff?erentes

r?esolvantes

Rn

qui

peuvent

etre

d?eriv?ees

en

une

etape

a

partir

de

Rn

Un

chemin

de

l'arbre

partant

de

la

racine

et

aboutissant

a

une

feuille

d?efinit

une

d?erivation

SLD

finie

Si

la

feuille

a

pour

etiquette

la

r?esolvante

vide

la

d?erivation

a

r?eussit

sinon

la

d?erivation

a

echou?e

La

r?egle

de

recherche

sp?ecifie

comment

explorer

l'arbre

de

recherche

En

fait

cet

arbre

est

construit

incr?ementalement

La

r?egle

de

recherche

d?efinit

a

chaque

etape

quel

noeud

etendre

et

si

le

pr?edicat

s?electionn?e

est

constitu?e

de

plusieurs

clauses

quelle

clause

s?electionner

Prolog

utilise

deux

r?egles

simples

La

r?egle

de

calcul

s?electionne

syst?ematiquement

le

but

le

plus

a

droite

La

r?egle

de

recherche

commande

une

exploration

en

profondeur

d'abord

avec

retour

arri?ere

chronologique

en

cas

d'

echec

Lorsqu'un

pr?edicat

comporte

plusieurs

clauses

l'ordre

textuel

du

programme

d?etermine

l'ordre

de

s?election

des

clauses

Cette

strat?egie

de

recherche

n'est

pas

equitable

si

l'arbre

de

recherche

est

infini

le

calcul

peut

s

engager

sans

espoir

de

retour

dans

la

construction

d'une

d?erivation

infinie

Cependant

c'est

ce

choix

qui

transforme

la

r?esolution

SLD

en

un

mod?ele

d'ex

ecution

utilisable

En

effet

quelle

que

soit

la

taille

de

l'arbre

de

recherche

il

n'est

pas

n?ecessaire

de

garder

en

m?emoire

plus

d'une

d?erivation

a

la

fois

a

savoir

la

d?erivation

courante

sans

oublier

les

noeuds

laiss?es

ouverts

le

long

de

cette

d?erivation

Ces

noeuds

permettent

en

cas

de

retour

arri?ere

de

continuer

la

recherche

De

la

r?esolution

SLD

a

l'empilement

de

buts

En

fait

l'

etat

de

la

recherche

peut

etre

repr?esent?e

par

une

pile

de

paires

-LRB-

r?esolvante

num?ero

de

clause

-RRB-

la

pile

de

recherche

La

r?esolvante

courante

est

en

sommet

de

pile

Le

num?ero

de

clause

est

initialement

ce

qui

veut

dire

que

la

clause

courante

est

initialement

la

premi?ere

clause

du

pr?edicat

courant

Si

l'unification

r?eussit

la

nouvelle

r?esolvante

est

construite

une

paire

-LRB-

nouvelle

r?esolvante

-RRB-

est

empil?ee

et

l'ex

ecution

continue

avec

la

nouvelle

r?esolvante

Si

l'unification

echoue

un

retour

arri?ere

a

lieu

Si

la

derni?ere

clause

n

a

pas

encore

et?e

atteinte

ce

retour

est

superficiel

le

num?ero

de

clause

de

la

paire

en

sommet

de

pile

est

incr?ement?e

et

la

clause

suivante

est

s?electionn?ee

Dans

le

cas

contraire

le

retour

est

profond

La

paire

en

sommet

de

pile

est

d?epil?ee

La

paire

pr?ec?edente

devient

la

paire

courante

Le

num?ero

de

clause

est

incr?ement?e

et

l'ex

ecution

Pr?eliminaires

repart

en

avant

Le

reste

de

la

section

esquisse

le

passage

graduel

de

cette

description

conceptuelle

a

une

v?eritable

impl?ementation

eclairant

les

choix

qui

ont

conduit

a

la

WAM

Pour

simplifier

les

choses

nous

supposerons

que

tous

les

pr?edicats

apparaissant

dans

le

programme

sont

d?efinis

a

chaque

etape

de

r?esolution

il

est

toujours

possible

de

s?electionner

une

clause

du

programme

Nous

ignorerons

aussi

les

probl?emes

de

coupure

Le

partage

des

r?esolvantes

La

premi?ere

etape

fondamentale

est

de

partager

les

r?esolvantes

-LSB-

-RSB-

Une

nouvelle

r?esolvante

Rn

est

construite

en

concat?enant

le

corps

B

de

la

clause

s?electionn?ee

et

la

queue

Tn

de

la

r?esolvante

Rn

tout

en

appliquant

la

substitution

C'est

a-dire

que

Rn

-LRB-

B

Tn

-RRB-

L'id

ee

est

de

partager

Tn

entre

Rn

et

Rn

tirant

parti

du

fait

que

la

substitution

ne

concerne

en

g?en?eral

qu'une

petite

fraction

des

variables

apparaissant

dans

Tn

Faisant

l'hypoth

ese

que

les

r?esolvantes

sont

repr?esent?ees

comme

des

termes

Prolog

standard

d?efaire

les

effets

de

sur

Tn

peut

etre

r?ealis?e

en

enregistrant

la

liste

not?ee

-LRB-

abusivement

-RRB-

de

toutes

les

adresses

des

cellules

de

Tn

li?ees

par

Au

retour

arri?ere

il

s

agit

simplement

d'affecter

a

nouveau

par

l'interm

ediaire

de

des

autor?ef?erences

a

toutes

ces

cellules

Notons

que

si

le

corps

de

la

clause

courante

est

vide

Rn

Tn

Aussi

du

fait

du

partage

la

paire

en

sommet

de

pile

permet

toujours

d'acc

eder

a

la

r?esolvante

courante

mais

les

buts

eux-m

emes

seront

dispers?es

sur

la

pile

a

une

profondeur

d?ependant

de

leurs

positions

respectives

dans

la

r?esolvante

Plus

un

but

est

a

droite

plus

il

est

profond

dans

la

pile

Un

seul

registre

d'

etat

SP

donnant

le

sommet

de

la

pile

suffit

a

g?erer

le

contr

ole

Points

de

choix

et

incr?ements

de

r?esolvante

Une

seconde

etape

consiste

a

s?eparer

les

paires

en

points

de

choix

qui

enregistrent

de

r?eelles

alternatives

et

en

incr?ements

de

r?esolvante

-LRB-

B

Tn

-RRB-

Deux

registres

d'

etat

le

point

de

choix

courant

B

-LRB-

backtrack

point

-RRB-

et

la

r?esolvante

courante

R

pointent

l'un

sur

le

point

de

choix

courant

l'autre

sur

la

r?esolvante

courante

Si

au

d?epart

d'une

etape

de

r?esolution

il

y

a

plusieurs

clauses

candidates

un

point

de

choix

est

empil?e

Ce

point

de

choix

sauvegarde

l'

etat

a

l'entr

ee

de

l'

etape

de

r?esolution

point

de

choix

pr?ec?edent

r?esolvante

courante

num?ero

de

la

clause

s?electionn?ee

-LRB-

initialement

-RRB-

et

valeur

de

-LRB-

initialement

la

liste

vide

-RRB-

Le

but

courant

est

unifi?e

avec

la

t

ete

de

la

clause

courante

Si

l'unification

r?eussit

un

incr?ement

de

r?esolvante

le

corps

de

la

clause

courante

est

empil?e

sur

la

pile

et

le

registre

R

est

mis

a

jour

afin

de

pointer

sur

la

nouvelle

r?esolvante

Nous

supposons

que

les

buts

constituant

un

incr?ement

de

r?esolvante

sont

empil?es

de

droite

a

gauche

de

sorte

que

une

fois

un

incr?ement

de

r?esolvante

empil?e

le

registre

R

pointe

sur

le

sommet

de

la

pile

Notons

que

dans

le

cas

o?u

la

clause

courante

est

un

fait

c'est

a-dire

que

son

corps

est

vide

il

n

y

a

pas

d'incr

ement

de

r?esolvante

Le

registre

R

est

simplement

mis

La

repr?esentation

du

contr

ole

a

jour

et

pointe

sur

la

queue

de

la

r?esolvante

pr?ec?edente

au

sein

de

la

pile

L'ex

ecution

continue

alors

avec

la

nouvelle

r?esolvante

Si

l'unification

echoue

l'

etat

de

la

recherche

tel

qu'il

a

et?e

sauv?e

dans

le

point

de

choix

courant

donn?e

par

le

registre

B

est

restaur?e

La

liste

permet

de

retrouver

l'

etat

d'instanciation

de

l'ancienne

r?esolvante

et

est

r?einitialis?ee

a

vide

Le

registre

R

reprend

la

valeur

de

l'ancienne

r?esolvante

Le

registre

B

donne

le

sommet

de

la

pile

Le

num?ero

de

clause

est

incr?ement?e

S'il

s

agit

de

la

derni?ere

clause

le

point

de

choix

courant

n

a

plus

de

raison

d'

etre

et

peut

etre

d?epil?e

Le

registre

B

est

mis

a

jour

en

cons?equence

A

ce

niveau

le

principal

b?en?efice

de

l'introduction

de

la

notion

de

point

de

choix

est

de

rendre

possible

l'am

elioration

du

partage

des

r?esolvantes

L'id

ee

est

la

suivante

Tous

les

incr?ements

de

r?esolvante

empil?es

apr?es

le

point

de

choix

courant

font

partie

de

r?esolvantes

sur

lesquelles

il

n

y

aura

pas

de

retour

arri?ere

Le

partage

de

ces

incr?ements

peut

donc

se

r?eduire

a

de

la

r?eutilisation

lier

des

variables

libres

au

sein

de

ces

incr?ements

de

r?esolvante

ne

requiert

pas

d'enregistrer

d'adresse

de

liaison

dans

seules

les

adresses

des

liaisons

plus

anciennes

que

le

point

de

choix

courant

liaisons

dites

sont

enregistr?ees

dans

Si

l'on

fait

l'hypoth

ese

d'une

allocation

de

la

pile

de

recherche

d'un

seul

tenant

d?eterminer

si

une

liaison

est

conditionnelle

va

se

r?esumer

a

une

simple

comparaison

d'adresses

L'optimisation

de

r?ecursion

a

gauche

Pour

l'instant

il

n

y

a

pas

de

r?ecup?eration

m?emoire

en

dehors

du

retour

arri?ere

et

mais

ceci

reste

mineur

la

lib?eration

du

point

de

choix

lors

de

la

s?election

de

la

derni?ere

clause

d'un

pr?edicat

Pourtant

quand

l'

etat

du

calcul

est

d?eterministe

c'est

a-dire

que

la

r?esolvante

courante

est

plus

r?ecente

que

le

point

de

choix

courant

on

aurait

envie

de

d?epiler

le

but

courant

Cela

est

rendu

impossible

par

la

cr?eation

lors

d'unification

post?erieures

a

l'empilement

du

but

courant

de

diverses

donn?ees

-LRB-

instances

de

termes

compos?es

et

adresses

de

liaisons

el?ements

de

-RRB-

qui

ont

une

dur?ee

de

vie

sup?erieure

a

celle

du

but

courant

Une

forme

d'optimisation

de

r?ecursion

a

gauche

peut

toutefois

etre

mise

en

place

Il

s

agit

de

couper

les

incr?ements

de

r?esolvante

en

deux

parties

le

but

le

plus

a

gauche

prochain

but

courant

et

le

reste

de

l'incr

ement

En

l'absence

d'incr

ement

le

but

courant

d'arit

e

n

est

extrait

de

la

pile

et

charg?e

dans

les

n

premiers

registres

d'

etat

Ai

i

-LRB-

pour

le

foncteur

et

Ai

i

pour

le

i?eme

argument

-RRB-

En

pr?esence

d'un

incr?ement

seul

le

reste

de

l'incr

ement

est

empil?e

Le

but

courant

d'arit

e

n

est

construit

comme

pr?ec?edemment

dans

les

registres

arguments

Ai

Ces

registres

Ai

seront

aussi

utilis?es

lors

de

l'unification

-LRB-

avec

i

eventuellement

sup?erieur

a

n

-RRB-

En

supposant

que

le

reste

de

l'incr

ement

est

consomm?e

par

la

r?esolution

de

mani?ere

utilisation

de

cet

adjectif

issu

de

travaux

sur

les

syst?emes

OU-parall

ele

-LSB-

-RSB-

est

critiquable

Il

a

l'avantage

de

conduire

a

des

formulations

concises

Pr?eliminaires

d?eterministe

toute

lib?eration

de

m?emoire

au

sein

de

cet

incr?ement

hors

retour

arri?ere

ne

pourra

etre

l'oeuvre

que

d'un

processus

de

r?ecup?eration

m?emoire

dynamique

Des

syst?emes

a

base

d'empilement

de

buts

Le

gestionnaire

de

m?emoire

MALI

-LSB-

-RSB-

a

et?e

con?cu

avec

l'id

ee

de

favoriser

ce

type

de

repr?esentation

directe

de

l'

etat

d'un

syst?eme

de

programmation

logique

repr?esentation

dite

par

empilement

de

buts

Aussi

les

syst?emes

construits

a

partir

de

MALI

-LSB-

-RSB-

fonctionnent

a

peu

pr?es

suivant

les

lignes

que

nous

venons

de

d?ecrire

Une

diff?erence

est

que

de

mani?ere

a

garder

un

maximum

de

flexibilit?e

au

niveau

de

la

gestion

m?emoire

MALI

ne

fait

pas

l'hypoth

ese

d'une

allocation

monolithique

de

la

pile

Dans

ces

conditions

il

est

difficile

de

d?eterminer

si

une

liaison

est

conditionnelle

ou

non

toute

liaison

est

enregistr?ee

dans

Il

ne

s

agit

cependant

que

d'un

d?etail

de

l'impl

ementation

courante

de

MALI

Tout

ce

qui

concerne

l'impl

ementation

du

partage

est

la

responsabilit?e

de

MALI

D'autres

impl?ementations

sont

envisageables

sans

remise

en

cause

des

interfaces

existantes

Notons

qu'il

est

possible

d'impl

ementer

une

repr?esentation

des

r?esolvantes

par

empilement

de

buts

par

simple

transformation

de

programmes

Cette

transformation

la

binarisation

utilis?ee

dans

le

syst?eme

BinProlog

-LSB-

-RSB-

a

et?e

propos?ee

par

Tarau

-LSB-

-RSB-

Elle

transforme

chaque

clause

en

une

clause

binaire

La

t

ete

de

la

clause

re?coit

un

argument

suppl?ementaire

qui

correspond

a

la

r?esolvante

courante

Si

la

clause

initiale

n'est

pas

un

fait

le

corps

de

la

clause

binaire

correspond

au

premier

but

du

corps

de

la

clause

initiale

c'est

a-dire

au

prochain

but

courant

a

garder

dans

les

registres

L'argument

suppl?ementaire

du

but

correspond

a

la

queue

de

la

prochaine

r?esolvante

courante

Si

la

clause

initiale

est

un

fait

il

s

agit

par

l'interm

ediaire

d'un

appel

au

pr?edicat

pr?ed?efini

de

continuer

l'ex

ecution

avec

la

r?esolvante

courante

Ainsi

les

clauses

a

-LRB-

U

-RRB-

a

-LRB-

U

-RRB-

b

-LRB-

U

V

-RRB-

c

-LRB-

V

W

-RRB-

d

-LRB-

W

-RRB-

sont

transform?ees

en

a

-LRB-

Res

U

-RRB-

call

-LRB-

Res

-RRB-

a

-LRB-

Res

U

-RRB-

b

-LRB-

c

-LRB-

d

-LRB-

Res

W

-RRB-

V

W

-RRB-

U

V

-RRB-

Cette

transformation

est

directement

apparent?ee

a

la

notion

de

transformation

par

passage

de

continuation

bien

connue

en

programmation

fonctionnelle

-LRB-

voir

par

exemple

les

travaux

d'Appel

-LSB-

-RSB-

-RRB-

Notons

cependant

que

la

r?esolvante

ne

correspond

pas

directement

a

la

continuation

de

succ?es

a

moins

que

le

programme

ne

soit

totalement

d?eterministe

-LRB-

voir

-LSB-

-RSB-

-RRB-

effet

sournois

de

ce

choix

est

que

la

complexit?e

d'un

r?ecup?erateur

de

m?emoire

par

copie

n'est

plus

proportionnelle

aux

seules

donn?ees

utiles

La

repr?esentation

du

contr

ole

R?ecup?eration

m?emoire

anticip?ee

par

empilement

d'environnements

L'organisation

par

empilement

d'environnements

de

la

WAM

peut

etre

comprise

comme

une

evolution

du

mod?ele

pr?ec?edent

autorisant

lors

d'un

etat

d'ex

ecution

d?eterministe

le

d?epilement

du

but

s?electionn?e

D?epiler

le

but

courant

La

repr?esentation

de

la

r?esolvante

par

empilement

de

buts

rend

le

d?epilement

du

but

courant

probl?ematique

pour

deux

raisons

-LRB-

-RRB-

la

repr?esentation

des

substitutions

cr?ee

comme

il

a

d?ej?a

et?e

mentionn?e

des

donn?ees

qui

viennent

s

intercaler

entre

le

sommet

de

pile

et

le

but

courant

-LRB-

-RRB-

d?epiler

le

but

courant

requiert

ensuite

la

mise

en

place

d'une

gestion

des

liaisons

visant

a

eviter

une

lib?eration

de

m?emoire

trop

h

ative

conduisant

a

l'apparition

de

r?ef?erences

illicites

pointant

sur

des

cellules

ind

ument

modifi?ees

ou

n'appartenant

plus

a

une

zone

m?emoire

active

Un

traitement

efficace

de

ce

probl?eme

achoppe

sur

le

test

des

variables

globalisables

Le

premier

probl?eme

peut

etre

r?esolu

par

l'introduction

de

deux

nouvelles

piles

Le

tas

-LRB-

terminologie

WAM

-RRB-

que

nous

pr?ef?erons

appeler

pile

va

recevoir

les

instances

de

termes

compos?es

cr?e?ees

lors

de

l'unification

La

tra

n?ee

va

recevoir

les

adresses

des

liaisons

conditionnelles

Nous

appellerons

tra

nage

la

sauvegarde

de

ces

adresses

d?etra

nage

la

restauration

d'un

etat

ant?erieur

de

liaison

et

test

de

tra

nage

la

proc?edure

d?eterminant

si

une

liaison

est

conditionnelle

Les

termes

compos?es

correspondant

aux

incr?ements

de

r?esolvante

sont

toujours

stock?es

sur

la

pile

de

recherche

que

nous

appellerons

dor?enavant

pile

locale

selon

la

terminologie

utilis?ee

pour

la

WAM

Une

grande

partie

de

la

gestion

des

liaisons

se

r?esume

a

s

assurer

que

lors

de

l'unification

on

ne

construit

pas

de

r?ef?erence

d'une

premi?ere

cellule

vers

une

seconde

cellule

plus

r?ecente

dont

la

dur?ee

de

vie

va

etre

plus

courte

Il

est

alors

possible

de

d?epiler

toute

cellule

r?ecente

sans

risquer

de

cr?eer

des

r?ef?erences

illicites

Sur

chacune

des

piles

locale

et

globale

la

notion

d'anciennet

e

d'une

cellule

correspond

tout

simplement

a

la

localisation

de

la

cellule

sur

la

pile

Plus

la

cellule

est

profonde

plus

elle

est

ag?ee

La

dur?ee

de

vie

des

termes

compos?es

stock?es

sur

la

pile

globale

etant

potentiellement

sup?erieure

a

celle

de

tout

objet

sur

la

pile

locale

la

pile

globale

est

dans

son

ensemble

consid?er?ee

comme

plus

ag?ee

que

la

pile

globale

La

WAM

s

interdit

donc

de

cr?eer

des

pointeurs

de

la

pile

globale

vers

la

pile

locale

Aussi

lors

de

la

construction

d'un

terme

compos?e

sur

la

pile

globale

si

l'un

des

arguments

est

une

variable

repr?esent?ee

par

une

auto-r

ef?erence

sur

la

pile

locale

cette

auto-r

ef?erence

doit

etre

globalis?ee

c'est

adire

relog?ee

sur

la

pile

globale

Une

simple

copie

de

la

r?ef?erence

sur

la

pile

globale

terme

pile

refl?ete

bien

le

d?ecoupage

de

la

pile

de

recherche

qui

devient

une

pile

logique

en

plusieurs

piles

physiques

Le

terme

tas

peut

alors

etre

r?eserv?e

a

la

zone

m?emoire

o?u

sont

allou?ees

des

donn?ees

survivant

au

retour

arri?ere

base

de

termes

table

des

atomes

et

des

pr?edicats

Pr?eliminaires

cr?eerait

en

effet

une

r?ef?erence

de

la

pile

globale

vers

la

pile

locale

La

globalisation

consiste

a

empiler

une

nouvelle

auto-r

ef?erence

sur

la

pile

globale

et

a

remplacer

l'autor

ef?erence

locale

-LRB-

localis?ee

sur

la

pile

locale

-RRB-

par

une

r?ef?erence

a

cette

auto-r

ef?erence

globale

-LRB-

localis?ee

sur

la

pile

globale

-RRB-

Reste

le

probl?eme

des

variables

globalisables

Consid?erons

la

deuxi?eme

clause

de

notre

exemple

Les

variables

V

et

W

qui

n'apparaissent

que

dans

le

corps

de

clause

et

n'apparaissent

pas

dans

un

terme

compos?e

sont

des

variables

globalisables

Chaque

empilement

d'un

incr?ement

de

r?esolvante

c

-LRB-

V

W

-RRB-

d

-LRB-

W

-RRB-

va

cr?eer

une

instance

de

la

variable

V

et

une

instance

de

la

variable

W.

Chaque

instance

est

repr?esent?ee

par

une

auto-r

ef?erence

au

sein

du

premier

but

le

plus

a

droite

dans

lequel

appara

t

la

variable

ceci

du

fait

que

l'on

empile

les

buts

de

droite

a

gauche

Aussi

lorsqu'il

va

s

agir

une

fois

le

but

b

-LRB-

U

V

-RRB-

r?esolu

de

d?epiler

la

t

ete

de

la

r?esolvante

c'est

a-dire

une

instance

de

c

-LRB-

V

W

-RRB-

deux

cas

de

figure

peuvent

se

produire

Si

l'instance

de

V

a

et?e

li?ee

il

est

licite

de

d?epiler

sa

valeur

de

liaison

et

de

la

placer

dans

un

registre

Dans

le

cas

contraire

la

variable

est

toujours

repr?esent?ee

par

une

auto-r

ef?erence

On

peut

garantir

a

ce

stade

qu'il

n'existe

pas

d'autre

r?ef?erence

pointant

sur

cette

cellule

D?epiler

la

t

ete

de

r?esolvante

tout

en

gardant

une

repr?esentation

pour

l'instance

de

V

requiert

toutefois

de

reloger

cette

repr?esentation

sur

la

pile

globale

Cette

globalisation

potentielle

ne

concerne

pas

la

deuxi?eme

argument

de

la

t

ete

de

r?esolvante

qui

n'est

qu'une

simple

r?ef?erence

Pour

W

la

question

se

posera

lorsque

le

but

suivant

sera

d?epil?e

Malheureusement

la

repr?esentation

de

la

r?esolvante

par

empilement

de

buts

fait

que

lorsqu'on

d?epile

un

but

on

a

perdu

le

contexte

de

cr?eation

de

ce

but

On

ne

sait

donc

plus

quels

arguments

correspondent

a

des

variables

globalisables

tous

les

arguments

doivent

etre

consid?er?es

comme

globalisables

Principe

de

l'empilement

d'environnements

Une

repr?esentation

des

incr?ements

de

r?esolvante

par

des

environnements

en

fait

un

recours

au

partage

de

structures

plut

ot

qu

a

la

copie

permet

de

garder

ce

contexte

et

donc

de

compiler

les

tests

de

globalisation

d'

o?u

le

choix

par

Warren

-LSB-

-RSB-

d'une

repr?esentation

par

empilement

d'environnements

La

repr?esentation

de

la

r?esolvante

par

empilement

d'environnements

peut

etre

illustr?ee

au

niveau

source

par

une

variante

de

la

binarisation

introduite

par

Demoen

et

Mari?en

-LSB-

-RSB-

qui

traduit

notre

exemple

en

a

-LRB-

Res

U

-RRB-

call

-LRB-

Res

-RRB-

a

-LRB-

Res

U

-RRB-

b

-LRB-

-LRB-

Res

W

V

-RRB-

U

V

-RRB-

-LRB-

Res

W

V

-RRB-

c

-LRB-

-LRB-

Res

W

-RRB-

V

W

-RRB-

-LRB-

Res

W

-RRB-

d

-LRB-

Res

W

-RRB-

La

r?esolvante

ou

plus

pr?ecis?ement

la

queue

de

la

r?esolvante

est

repr?esent?ee

par

une

liste

d'environnements

chaque

environnement

correspondant

a

un

incr?ement

de

La

repr?esentation

du

contr

ole

r?esolvante

Ainsi

l'appel

du

pr?edicat

-LRB-

sous

sa

version

transform?ee

-RRB-

va

conduire

a

la

cr?eation

d'un

environnement

-LRB-

Res

W

V

-RRB-

correspondant

a

une

queue

de

r?esolvante

c

-LRB-

V

W

-RRB-

d

-LRB-

W

-RRB-

Res

-LRB-

ou

encore

c

-LRB-

d

-LRB-

Res

W

-RRB-

V

W

-RRB-

lorsqu'on

utilise

la

binarisation

-RRB-

Cet

environnement

devient

l'environnement

courant

Il

est

compos?e

d'un

foncteur

-LRB-

-RRB-

donnant

acc?es

au

code

a

ex?ecuter

une

fois

le

but

courant

-LRB-

b

-LRB-

U

V

-RRB-

-RRB-

r?esolu

d'un

pointeur

sur

le

reste

de

la

r?esolvante

-LRB-

Res

-RRB-

et

des

valeurs

de

liaison

des

variables

apparaissant

dans

le

corps

de

la

clause

a

la

fois

a

la

gauche

du

but

courant

but

courant

compris

et

a

sa

droite

strictement

Ces

variables

dites

permanentes

sont

les

variables

qui

doivent

survivre

a

l'ex

ecution

du

but

courant

Les

autres

variables

par

exemple

U

sont

dites

temporaires

La

transformation

associe

a

chaque

but

du

corps

de

la

clause

initiale

premier

but

exclus

une

clause

auxiliaire

Une

fois

le

but

courant

r?esolu

au

lieu

d'extraire

le

nouveau

but

courant

et

de

le

r?esoudre

c'est

l'environnement

courant

que

l'on

extrait

et

que

l'on

r?esout

par

l'interm

ediaire

de

la

clause

auxiliaire

correspondant

au

nouveau

but

courant

Ainsi

une

fois

le

but

b

-LRB-

U

V

-RRB-

r?esolu

on

ex?ecute

a

partir

de

l'environnement

courant

le

corps

de

la

premi?ere

clause

auxiliaire

Le

corps

de

chaque

clause

auxiliaire

a

pour

r

ole

de

r?e?ecrire

l'environnement

courant

et

de

lancer

la

r?esolution

du

nouveau

but

courant

Dans

le

cas

de

notre

exemple

-LRB-

Res

W

V

-RRB-

est

r?e?ecrit

en

-LRB-

Res

W

-RRB-

et

la

r?esolution

de

c

-LRB-

V

W

-RRB-

est

lanc?ee

La

derni?ere

clause

auxiliaire

est

particuli?ere

Une

fois

le

dernier

but

de

l'incr

ement

atteint

l'environnement

courant

n'est

plus

n?ecessaire

on

doit

retrouver

la

queue

de

la

r?esolvante

initiale

Ainsi

l'environnement

-LRB-

Res

W

-RRB-

se

r?e?ecrit

simplement

en

Res

Sauf

dans

le

cas

particulier

du

dernier

but

la

r?e?ecriture

de

l'environnement

pr?esente

deux

aspects

modification

du

foncteur

et

suppression

des

variables

attach?ees

au

but

courant

Cette

r?e?ecriture

est

effectu?ee

en

place

afin

de

r?ecup?erer

la

m?emoire

associ?ee

-LRB-

sur

la

pile

locale

-RRB-

au

but

courant

et

donc

de

d?epiler

le

but

courant

Dans

l'exemple

cidessus

la

premi?ere

r?e?ecriture

de

l'environnement

supprime

la

partie

de

l'environnement

correspondant

au

nouveau

but

courant

c

-LRB-

V

W

-RRB-

c'est

a-dire

la

variable

V

qui

n'est

plus

utilis?ee

par

la

suite

Lors

de

la

compilation

des

clauses

les

variables

qui

vont

dispara

tre

de

l'environnement

V

dans

le

cas

de

la

clause

ci-dessus

sont

connues

On

va

donc

pouvoir

limiter

la

g?en?eration

d'un

test

de

globalisation

a

ces

variables

Syst?emes

interm?ediaires

En

fait

il

est

possible

d'imaginer

des

syst?emes

interm?ediaires

entre

empilement

de

buts

et

empilement

d'environnements

avec

pile

globale

s?epar?ee

mais

o?u

les

incr?ements

de

r?esolvantes

seraient

repr?esent?es

par

empilement

de

buts

sur

la

pile

locale

On

a

vu

qu'il

etait

possible

de

d?eterminer

pour

chaque

but

sur

quelles

variables

devait

porter

le

test

de

globalisation

On

a

vu

aussi

que

le

probl?eme

d'un

empilement

par

buts

f

etait

que

le

contexte

etait

perdu

Supposons

que

l'on

garde

ce

contexte

par

exemple

en

cr?eant

des

foncteurs

de

pr?edicat

sp?ecifiques

r?ealit?e

les

compilateurs

Prolog

standard

g?en?erent

le

code

correspondant

sans

passer

par

la

forme

source

interm?ediaire

Pr?eliminaires

traduisant

par

exemple

a

-LRB-

U

-RRB-

c

-LRB-

U

U

-RRB-

a

-LRB-

U

-RRB-

b

-LRB-

U

V

-RRB-

c

-LRB-

V

W

-RRB-

d

-LRB-

W

-RRB-

en

a

-LRB-

U

-RRB-

-LRB-

U

U

-RRB-

a

-LRB-

U

-RRB-

-LRB-

U

V

-RRB-

-LRB-

V

W

-RRB-

-LRB-

W

-RRB-

On

sait

alors

que

en

ce

qui

concerne

le

pr?edicat

seul

le

premier

argument

de

n?ecessite

un

test

de

globalisation

On

peut

ainsi

cr?eer

pour

chaque

but

que

l'on

peut

etre

amener

a

d?epiler

un

prologue

testant

l'

etat

du

syst?eme

et

dans

le

cas

d'un

etat

d?eterministe

d?epilant

le

but

tout

en

ex?ecutant

les

tests

de

globalisation

n?ecessaires

et

suffisants

Notons

que

ce

type

de

syst?eme

bien

que

tr?es

proche

d'un

syst?eme

par

empilement

d'environnements

ne

pr?esentera

pas

la

m

eme

complexit?e

du

fait

de

la

construction

avide

des

incr?ements

de

r?esolvante

-LRB-

voir

l'analyse

de

Demoen

et

Mari?en

-LSB-

-RSB-

-RRB-

Derniers

pas

vers

la

WAM

L'objectif

des

paragraphes

suivants

est

de

pr?eciser

certains

d?etails

de

la

r?e?ecriture

des

environnements

sur

lesquels

nous

sommes

pass?es

rapidement

afin

de

ne

pas

alourdir

la

pr?esentation

Les

variables

permanentes

D'apr

es

la

d?efinition

pr?ec?edente

certaines

variables

permanentes

n'apparaissent

dans

l'environnement

qu'apr

es

la

cr?eation

de

celui-ci

Consid?erons

la

clause

suivante

a

-LRB-

U

-RRB-

b

-LRB-

U

V

-RRB-

c

-LRB-

V

W

Z

-RRB-

d

-LRB-

V

W

Z

-RRB-

traduite

en

a

-LRB-

Res

U

-RRB-

b

-LRB-

-LRB-

Res

W

V

-RRB-

U

V

-RRB-

-LRB-

Res

W

V

-RRB-

c

-LRB-

-LRB-

Res

W

V

Z

-RRB-

V

W

Z

-RRB-

-LRB-

Res

W

V

Z

-RRB-

d

-LRB-

Res

V

W

Z

-RRB-

La

variable

Z

n'appara

t

pas

dans

l'environnement

initial

Cela

n'est

pas

compatible

avec

une

simple

r?e?ecriture

en

place

de

l'environnement

il

peut

s

av?erer

n?ecessaire

d'agrandir

l'environnement

Cela

devrait

etre

possible

dans

le

cas

d'un

etat

d?eterministe

l'environnement

est

dans

ce

cas

en

sommet

de

pile

mais

que

faire

dans

le

cas

contraire

-LRB-

voir

section

-RRB-

Chaque

variante

d'un

environnement

doit

donc

inclure

en

plus

de

ses

variables

permanentes

les

variables

permanentes

de

ses

r?e?ecritures

D'

o?u

une

nouvelle

transformation

-LRB-

utilis?ee

par

Demoen

dans

-LSB-

-RSB-

-RRB-

qui

traduit

l'exemple

ci-dessus

en

La

repr?esentation

du

contr

ole

a

-LRB-

Res

U

-RRB-

b

-LRB-

-LRB-

Res

W

V

Z

-RRB-

U

V

-RRB-

-LRB-

Res

W

V

Z

-RRB-

c

-LRB-

-LRB-

Res

W

V

Z

-RRB-

V

W

Z

-RRB-

-LRB-

Res

W

V

Z

-RRB-

d

-LRB-

Res

V

W

Z

-RRB-

Notons

finalement

que

notre

classification

temporaire/permanente

reste

une

premi?ere

approximation

de

la

classification

utilis?ee

dans

la

WAM

-LRB-

et

KCM

-RRB-

certaines

des

variables

que

notre

d?efinition

classe

comme

etant

temporaires

sont

en

fait

consid?er?ees

permanentes

afin

de

raccourcir

leur

dur?ee

de

vie

-LRB-

voir

le

tutoriel

d'

A

t-Kaci

-LSB-

-RSB-

-RRB-

Les

points

de

continuation

Du

fait

du

partage

des

r?esolvantes

il

n'est

en

fait

pas

possible

de

modifier

le

foncteur

d'un

environnement

sans

pr?ecaution

Si

l'ex

ecution

est

dans

un

etat

non

d?eterministe

l'environnement

correspond

a

un

incr?ement

de

r?esolvante

partag?ee

l'ancien

foncteur

doit

etre

sauvegard?e

afin

de

retrouver

l'

etat

initial

de

la

r?esolvante

en

cas

de

retour

arri?ere

Il

serait

possible

d'utiliser

un

m?ecanisme

de

tra

nage

etendu

appel?e

tra

nage

de

valeur

-LRB-

voir

section

-RRB-

La

WAM

g?ere

ce

probl?eme

a

co

ut

moindre

gr

ace

a

l'introduction

d'un

nouveau

registre

d'

etat

le

point

de

continuation

CP

-LRB-

continuation

program

pointer

-RRB-

Conceptuellement

ce

registre

correspond

au

foncteur

courant

l'id

ee

etant

de

remplacer

dans

chaque

environnement

le

foncteur

de

l'environnement

consid?er?e

par

le

foncteur

de

l'environnement

pr?ec?edent

Les

modifications

du

foncteur

courant

se

font

ainsi

au

niveau

des

registres

d'

etat

sans

souci

de

partage

et

tr?es

efficacement

s

il

est

possible

d'allouer

un

registre

machine

au

registre

CP

Par

contre

le

point

de

choix

ne

peut

se

limiter

a

sauvegarder

le

registre

E

pointant

sur

l'environnement

courant

-LRB-

et

rempla?cant

le

registre

R

-RRB-

le

registre

CP

doit

aussi

etre

sauvegard?e

En

pratique

la

compilation

transforme

chaque

foncteur

en

une

adresse

de

code

l'adresse

du

code

g?en?er?e

pour

la

clause

auxiliaire

qui

lui

est

associ?ee

Le

registre

CP

se

trouve

donc

etre

l'adresse

du

code

a

ex?ecuter

en

cas

de

succ?es

et

correspond

en

terme

de

s?emantique

d?enotationnelle

a

la

continuation

de

succ?es

-LRB-

voir

-LSB-

-RSB-

-RRB-

Notons

que

le

registre

n'est

plus

utile

et

que

les

environnements

deviennent

des

structures

de

donn?ees

ad

hoc

De

mani?ere

duale

il

existe

aussi

un

pointeur

correspondant

a

la

continuation

d'

echec

c'est

a-dire

donnant

l'adresse

du

code

a

ex?ecuter

en

cas

d'

echec

En

effet

lorsque

l'on

passe

de

notre

mod?ele

conceptuel

a

l'ex

ecution

de

code

compil?e

-LRB-

nous

consid?erons

ici

la

WAM

standard

-RRB-

le

num?ero

de

la

clause

s?electionn?ee

sauvegard?e

dans

chaque

point

de

choix

se

transforme

en

un

point

de

retour

arri?ere

-LRB-

backtrack

program

pointer

-RRB-

Alors

qu'en

cas

de

succ?es

le

compteur

ordinal

P

-LRB-

program

pointer

-RRB-

prend

pour

valeur

CP

-LRB-

d'

o?u

r?e?ecriture

de

l'environnement

courant

r?esolution

du

but

suivant

-RRB-

en

cas

d'

echec

le

compteur

ordinal

prend

apr?es

restauration

de

l'

etat

sauvegard?e

dans

le

point

de

choix

courant

pour

valeur

bp

-LRB-

d'

o?u

r?e?ecriture

du

point

de

choix

courant

essai

de

la

clause

suivante

-RRB-

utilisation

de

minuscules

d?enote

qu'il

ne

s

agit

pas

d'un

registre

d'

etat

Pr?eliminaires

Alternativement

on

pourrait

aussi

d?ecrire

un

environnement

comme

contenant

plut

ot

qu'un

foncteur

le

num?ero

de

la

clause

-LRB-

clause

initiale

transform?ee

ou

clause

auxiliaire

-RRB-

correspondante

Gestion

m?emoire

dynamique

Un

r?ecup?erateur

de

m?emoire

pr?ecis

travaillant

a

la

fois

sur

la

pile

globale

et

la

tra

n?ee

est

essentiel

au

bon

fonctionnement

de

tout

syst?eme

Prolog

s?erieux

Le

probl?eme

essentiel

est

de

d?efinir

de

mani?ere

pr?ecise

la

logique

d'utilit

e

du

syst?eme

c'est

a-dire

l'ensemble

des

objets

utiles

a

la

suite

du

calcul

afin

de

pouvoir

lib?erer

la

m?emoire

occup?ee

par

les

objets

qui

ne

sont

plus

utiles

Citant

l'article

de

synth?ese

de

Bekkers

et

al.

-LSB-

-RSB-

les

objets

utiles

sont

les

objets

accessibles

a

partir

des

points

de

choix

chacun

des

points

de

choix

etant

interpr?et?e

en

fonction

de

son

etat

de

liaison

propre

c'est

a-dire

l'

etat

de

liaison

que

l'on

obtiendrait

a

la

suite

d'un

retour

arri?ere

vers

ce

point

de

choix

ce

qui

n?ecessiterait

en

particulier

une

remise

a

jour

de

toutes

les

liaisons

enregistr?ees

sur

la

tra

n?ee

entre

sommet

de

pile

et

point

de

retour

arri?ere

En

plus

du

crit?ere

habituel

d'accessibilit

e

la

logique

d'utilit

e

doit

donc

prendre

en

compte

les

liaisons

enregistr?ees

sur

la

tra

n?ee

Deux

cas

particuliers

sont

a

consid?erer

ffl

une

variable

a

et?e

conditionnellement

li?ee

mais

sa

valeur

de

liaison

n'est

plus

utile

La

liaison

peut

etre

d?efaite

et

l'enregistrement

correspondant

elimin?e

de

la

tra

n?ee

C'est

la

d?eliaison

anticip?ee

ffl

une

variable

a

et?e

conditionnellement

li?ee

mais

du

fait

d'une

coupure

le

-LRB-

s

-RRB-

point

-LRB-

s

-RRB-

de

choix

rendant

la

liaison

conditionnelle

ont

disparu

La

liaison

devient

inconditionnelle

L'enregistrement

correspondant

peut

etre

elimin?e

de

la

tra

n?ee

De

plus

toute

r?ef?erence

a

cette

variable

peut

etre

remplac?ee

par

la

valeur

de

liaison

de

cette

variable

On

parle

de

court-circuit

de

variable

Le

court-circuit

de

variable

rend

possible

la

r?ecup?eration

de

cellules

allou?ees

isol?ement

-LRB-

singletons

variables

globalisables

-RRB-

ainsi

que

de

cellules

de

termes

compos?es

devenus

inaccessibles

Il

raccourcit

aussi

les

cha

nes

de

liaisons

Un

segment

etant

d?efini

comme

une

portion

de

pile

d?elimit?ee

par

deux

points

de

choix

cons?ecutifs

notons

finalement

la

n?ecessit?e

de

pr?eserver

lors

de

la

r?ecup?eration

m?emoire

la

localisation

relative

des

segments

de

donn?ees

sur

l'ensemble

des

piles

du

syst?eme

C'est

la

condition

d'une

lib?eration

instantan?ee

de

la

m?emoire

au

retour

arri?ere

ainsi

que

de

la

pr?ecision

du

test

de

tra

nage

qui

d?etermine

habituellement

par

une

simple

comparaison

d'adresses

si

une

liaison

est

conditionnelle

ou

pas

Un

r?ecup?erateur

par

marquage

et

compactage

pr?eserve

de

mani?ere

evidente

l'ordre

des

segments

en

fait

il

pr?eserve

m

eme

l'ordre

des

objets

a

l'int

erieur

de

chaque

segment

Une

r?ecup?eration

par

copie

pure

est

aussi

possible

L'ordre

des

segments

peut

etre

pr?eserv?e

a

R?ecapitulatif

des

structures

de

contr

ole

de

la

WAM

et

conventions

condition

de

s

interdire

les

auto-r

ef?erences

prisonni?eres

ce

qui

permet

une

copie

des

segments

en

partant

du

plus

ancien

Pour

de

plus

amples

d?etails

voir

l'article

de

synth?ese

susmentionn?e

-LSB-

-RSB-

R?ecapitulatif

des

structures

de

contr

ole

de

la

WAM

et

conventions

R?ecapitulatif

des

structures

de

contr

ole

de

la

WAM

Pour

r?esumer

la

repr?esentation

du

contr

ole

dans

la

WAM

s

appuie

sur

les

registres

d'

etat

suivants

P

compteur

ordinal

E

point

de

continuation

CP

environnement

courant

B

point

de

choix

courant

T

sommet

de

la

tra

n?ee

G

sommet

de

la

pile

globale

Ai

registres

arguments

Au

d?epart

d'une

etape

de

r?esolution

fP

Aig

va

correspondre

au

but

courant

et

fCP

Eg

au

reste

de

la

r?esolvante

-LRB-

ou

plus

pr?ecis?ement

a

la

continuation

de

succ?es

-RRB-

Chaque

environnement

inclut

deux

champs

sauvegardant

les

valeurs

des

registres

E

et

CP

a

sa

cr?eation

-LRB-

le

reste

de

la

r?esolvante

ou

de

la

continuation

de

succ?es

-RRB-

ainsi

qu'une

zone

comportant

un

nombre

variable

de

champs

donnant

les

valeurs

de

liaison

des

variables

permanentes

actives

Nous

noterons

ces

champs

E

-LRB-

E

-RRB-

CP

-LRB-

E

-RRB-

et

Yj

respectivement

Chaque

point

de

choix

sauvegarde

l'

etat

courant

a

sa

cr?eation

dans

les

champs

E

-LRB-

B

-RRB-

CP

-LRB-

B

-RRB-

B

-LRB-

B

-RRB-

T

-LRB-

B

-RRB-

G

-LRB-

B

-RRB-

et

Ai

-LRB-

B

-RRB-

Afin

d'essayer

la

clause

suivante

au

retour

arri?ere

on

sauve

non

pas

le

compteur

ordinal

mais

le

point

de

retour

arri?ere

dans

le

champ

bp

-LRB-

B

-RRB-

La

WAM

standard

inclut

deux

registres

suppl?ementaires

un

pointeur

de

structure

S

et

un

point

de

retour

sur

la

pile

globale

GB

Nous

avons

pr?ec?edemment

mentionn?e

l'utilisation

du

premier

Le

second

qui

n'est

pas

strictement

n?ecessaire

n'est

rien

d'autre

qu'une

image

du

champ

G

-LRB-

B

-RRB-

du

point

de

choix

courant

-LRB-

voir

section

-RRB-

Conventions

Nous

supposerons

sauf

indication

contraire

qu'est

allou?ee

a

chaque

pile

une

zone

m?emoire

contigu?e

Nous

supposerons

aussi

que

les

piles

croissent

dans

le

sens

des

adresses

croissantes

-LRB-

elles

pourraient

aussi

cro

tre

dans

le

sens

inverse

Pr?eliminaires

la

contrainte

est

que

la

pile

locale

et

la

pile

globale

croissent

dans

le

m

eme

sens

afin

de

faciliter

le

calcul

de

l'anciennet

e

relative

de

deux

valeurs

de

liaison

-RRB-

Nos

sch?emas

supposeront

une

croissance

des

piles

vers

le

bas

c'est

a-dire

suivant

le

sens

de

la

lecture

Nous

d?ecrirons

les

instructions

de

la

WAM

et

de

ses

variantes

en

pseudo

C.

Les

noms

de

champs

pr?ec?edemment

d?efinis

seront

alors

utilis?es

pour

sp?ecifier

des

acc?es

en

lecture

ou

en

ecriture

au

champ

correspondant

du

point

de

choix

ou

de

l'environnement

courant

Dans

les

instructions

ne

rompant

pas

le

flot

de

contr

ole

nous

ignorerons

la

mise

a

jour

du

compteur

ordinal

dont

le

d?etail

d?epend

de

caract?eristiques

de

bas

niveau

de

la

mise

en

oeuvre

La

gestion

des

environnements

Dans

les

impl?ementations

de

Prolog

bas?ees

sur

la

WAM

l'

elagage

des

environnements

une

g?en?eralisation

de

l'optimisation

de

r?ecursion

terminale

ou

plus

pr?ecis?ement

de

l'optimisation

d'appel

terminal

permet

de

r?eutiliser

les

cellules

allou?ees

aux

variables

permanentes

au

sein

d'un

environnement

d?es

que

ces

variables

permanentes

ne

sont

plus

n?ecessaires

ainsi

que

de

d?etecter

les

donn?ees

inutiles

accessibles

a

partir

de

ces

variables

Le

gain

par

rapport

a

l'optimisation

d'appel

terminal

n'est

cependant

pas

imm?ediatement

clair

Premi?erement

la

gestion

des

environnements

est

plus

co

uteuse

Deuxi?emement

eviter

la

cr?eation

de

r?ef?erences

illicites

via

l'introduction

de

variables

globalisables

introduit

un

surco

ut

a

priori

significatif

A

la

suite

de

-LSB-

-RSB-

ce

chapitre

passe

en

revue

diff?erentes

m?ethodes

d'impl

ementation

de

l'optimisation

d'appel

terminal

et

de

l'

elagage

dans

les

machines

abstraites

bas?ees

sur

la

WAM

soulignant

les

m?ecanismes

de

base

et

les

compromis

Il

est

organis?e

comme

suit

La

premi?ere

section

reprend

la

mise

en

oeuvre

de

l'

elagage

dans

la

WAM

La

section

introduit

trois

variantes

de

base

la

gestion

explicite

de

la

taille

de

l'environnement

l'

elagage

anticip?e

et

l'

elagage

retard?e

En

partant

des

variantes

de

base

la

section

en

construit

de

plus

sophistiqu?ees

en

utilisant

la

sp?ecialisation

d'instructions

un

pointeur

explicite

de

sommet

de

pile

et

la

cr?eation

retard?ee

des

environnements

La

r?eutilisation

des

environnements

ainsi

que

les

interd?ependances

possibles

avec

la

gestion

des

points

de

choix

sont

aussi

abord?ees

La

section

consid?ere

a

partir

de

r?esultats

exp?erimentaux

l'influence

de

l'

elagage

sur

la

taille

de

la

pile

locale

Finalement

la

section

se

concentre

sur

le

co

ut

des

variables

globalisables

La

section

conclut

le

chapitre

L'

elagage

dans

la

WAM

L'impl

ementation

L'id

ee

de

base

de

l'optimisation

d'appel

terminal

qui

n'est

pas

sp?ecifique

a

Prolog

est

que

gr

ace

a

un

m?ecanisme

de

passage

de

continuation

et

de

passage

de

param?etres

par

registres

l'enregistrement

d'activation

d'un

appel

de

proc?edure

peut

etre

lib?er?e

et

eventuellement

r?eutilis?e

avant

le

retour

de

l'appel

pr?ecis?ement

d?es

qu'a

eu

lieu

le

passage

des

arguments

au

dernier

sous-appel

Le

b?en?efice

principal

de

l'optimisation

d'appel

terminal

est

une

economie

drastique

d'espace

sur

les

piles

locales

et

globales

En

s

agit

d'une

version

revue

et

etendue

de

-LSB-

-RSB-

La

gestion

des

environnements

oe

E

-LRB-

E

-RRB-

Pile

locale

CP

-LRB-

E

-RRB-

Yn

E

Figure

WAM

Agencement

de

l'environnement

particulier

la

taille

m?emoire

n?ecessaire

sur

la

pile

locale

a

l'ex

ecution

d'une

proc?edure

it?erative

d?eterministe

est

constante

L'

economie

d'espace

sur

la

pile

globale

est

due

au

fait

que

l'espace

occup?e

par

les

termes

compos?es

initialement

uniquement

accessibles

a

partir

des

enregistrements

lib?er?es

peut

etre

lib?er?e

a

son

tour

par

le

r?ecup?erateur

de

m?emoire

Le

rapport

originel

sur

la

WAM

-LSB-

-RSB-

ainsi

qu'une

conception

plus

ancienne

incluant

l'optimisation

d'appel

terminal

-LSB-

-RSB-

montrent

qu'une

r?ecup?eration

anticip?ee

de

la

m?emoire

sur

la

pile

locale

fut

une

pr?eoccupation

fondamentale

lors

de

la

conception

de

la

WAM

Aussi

la

WAM

fait

appel

a

une

proc?edure

d'

elagage

une

g?en?eralisation

de

l'optimisation

d'appel

terminal

qui

elague

chaque

environnement

-LRB-

nos

enregistrements

d'activation

pr?ec?edents

-RRB-

au

cours

de

l'ex

ecution

d'une

proc?edure

en

eliminant

les

variables

qui

ne

sont

plus

utiles

Nous

allons

maintenant

d?etailler

l'

elagage

en

supposant

que

le

lecteur

a

une

compr?ehension

minimale

des

principes

de

base

de

la

WAM

-LRB-

voir

chapitre

-RRB-

Rappelons

bri?evement

qu'une

r?ecup?eration

anticip?ee

des

variables

permanentes

-LRB-

les

variables

allou?ees

dans

l'environnement

-RRB-

n?ecessite

de

mettre

en

place

un

sch?ema

de

liaison

non

trivial

ainsi

que

quelques

v?erifications

a

l'ex

ecution

sur

le

passage

d'arguments

pour

eviter

des

r?ef?erences

illicites

En

particulier

il

peut

etre

n?ecessaire

de

globaliser

c'est

a-dire

copier

sur

la

pile

globale

les

variables

cr?e?ees

dans

l'environnement

et

qui

s

av?erent

ne

pas

avoir

et?e

li?ees

avant

l'ex

ecution

du

but

dans

lequel

elles

apparaissent

en

dernier

Ajoutons

que

l'invalidation

d'un

environnement

lorsqu'on

atteint

le

dernier

but

d'une

clause

n'implique

pas

que

la

m?emoire

puisse

etre

r?eutilis?ee

En

effet

si

l'ex

ecution

est

non

d?eterministe

c'est

a-dire

qu'il

y

a

encore

des

alternatives

possibles

dans

la

clause

le

contenu

de

l'environnement

-LRB-

informations

de

continuation

et

de

liaison

-RRB-

correspondant

a

un

bout

de

r?esolvante

partag?ee

va

etre

a

nouveau

n?ecessaire

lors

du

retour

arri?ere

Cela

se

traduit

par

le

fait

que

le

sommet

de

la

pile

locale

l

est

toujours

donn?e

par

l

max

-LRB-

e

b

-RRB-

o?u

e

et

b

sont

les

sommets

respectifs

de

l'environnement

courant

et

du

point

de

choix

courant

L'

elagage

dans

la

WAM

allocate

precE

E

E

max

-LRB-

B

precE

-LRB-

CP

-RRB-

-RRB-

CP

-LRB-

E

-RRB-

CP

E

-LRB-

E

-RRB-

precE

deallocate

CP

CP

-LRB-

E

-RRB-

E

E

-LRB-

E

-RRB-

call

adresse

proc

n

CP

CP

-LRB-

P

-RRB-

P

Figure

WAM

Instructions

de

contr

ole

impliqu?ees

dans

l'

elagage

Plus

pr?ecis?ement

un

environnement

est

structur?e

comme

indiqu?e

figure

La

pile

est

suppos?ee

cro

tre

dans

le

sens

des

adresses

croissantes

vers

le

bas

de

page

sur

les

figures

L'information

de

continuation

-LRB-

point

de

continuation

CP

et

environnement

courant

E

-RRB-

est

empil?ee

sur

la

pile

en

premier

et

les

variables

permanentes

sont

rang?ees

en

fonction

de

leur

derni?ere

occurrence

dans

la

clause

les

variables

a

la

dur?ee

de

vie

la

plus

courte

etant

allou?ees

au

sommet

de

l'environnement

Le

registre

E

pointe

sur

le

fond

de

Il

est

ainsi

inutile

de

mettre

a

jour

ce

pointeur

a

chaque

elagage

De

plus

les

variables

permanentes

sont

accessibles

par

simple

adressage

index?e

a

partir

de

E.

La

figure

donne

le

code

abstrait

des

instructions

concern?ees

par

l'

elagage

c'est

adire

les

instructions

d'allocation

et

de

lib?eration

d'environnement

ainsi

que

l'instruction

d'appel

non

terminal

A

chaque

but

non

terminal

correspond

une

instruction

d'appel

call

Cette

instruction

inclut

un

param?etre

donnant

le

nombre

de

variables

permanentes

apparaissant

dans

les

buts

suivants

En

effet

lors

de

l'ex

ecution

de

l'appel

correspondant

au

ime

but

call

adresse

proc

n

-LRB-

i

-RRB-

les

variables

permanentes

qui

ont

leur

derni?ere

occurrence

dans

le

but

i

ont

et?e

charg?ees

dans

les

registres

arguments

Les

cellules

correspondantes

en

sommet

d'environnement

entre

les

adresses

E

n

-LRB-

i

-RRB-

et

E

n

-LRB-

i

-RRB-

ne

fond

d'un

bloc

de

donn?ees

est

aussi

le

sommet

du

bloc

pr?ec?edent

On

peut

d?efinir

le

sommet

d'un

bloc

comme

pointant

sur

la

derni?ere

cellule

allou?ee

ou

sur

la

cellule

suivante

Warren

a

choisi

la

premi?ere

solution

-LSB-

-RSB-

nous

utiliserons

de

pr?ef?erence

la

seconde

Cela

n

a

pas

d'incidence

sur

la

discussion

La

gestion

des

environnements

sont

plus

utiles

Le

nouveau

sommet

de

l'environnement

a

pour

adresse

E

n

-LRB-

i

-RRB-

Le

registre

B

donnant

l'adresse

du

somment

du

point

de

choix

l'adresse

du

sommet

de

la

pile

est

max

-LRB-

E

taille

env

-LRB-

E

-RRB-

B

-RRB-

soit

max

-LRB-

E

n

B

-RRB-

o?u

n

est

le

nombre

courant

de

variables

permanentes

Ce

nombre

est

par

d?efinition

du

point

de

continuation

CP

disponible

en

tant

que

param?etre

de

l'instruction

call

pr?ec?edant

l'instruction

point?ee

par

CP

Notons

qu'en

pratique

les

instructions

call

devraient

plut

ot

passer

en

param?etre

la

taille

totale

de

l'environnement

n

afin

d'

eviter

tout

calcul

a

l'ex

ecution

De

plus

dans

l'instruction

d'allocation

allocate

la

nouvelle

valeur

de

E

devrait

etre

calcul?ee

a

l'aide

d'une

conditionnelle

if

-LRB-

E

B

-RRB-

E

B

else

E

precE

Nous

garderons

la

formulation

utilisant

l'op

erateur

max

par

souci

de

concision

D?esavantages

de

l'impl

ementation

de

l'

elagage

dans

la

WAM

Deux

raisons

fondamentales

conduisent

a

reconsid?erer

la

mani?ere

dont

la

WAM

impl?emente

l'

elagage

Tout

d'abord

le

calcul

du

sommet

de

pile

a

partir

du

point

de

continuation

casse

la

s?eparation

autrement

etanche

entre

code

et

donn?ees

Ce

n'est

pas

sans

effet

pratique

Supposons

par

exemple

l'ex

ecution

de

code

natif

sur

une

architecture

de

type

Harvard

pour

laquelle

cache

de

code

et

cache

de

donn?ees

sont

s?epar?es

Le

cache

de

donn?ees

va

clairement

etre

perturb?e

par

des

acc?es

a

la

m?emoire

code

pr?esentant

une

tr?es

faible

localit?e

de

r?ef?erence

Sur

des

machines

sp?ecialis?ees

comme

la

machine

PLM

-LSB-

-RSB-

l'impact

est

extr

eme

Par

souci

de

simplicit?e

la

machine

PLM

ne

comporte

aucun

m?ecanisme

g?en?eral

cachant

code

et

donn?ees

Le

code

ne

peut

etre

lu

qu'au

travers

de

l'unit

e

de

lecture

anticip?ee

d'instructions

et

par

quelques

instructions

d'indexation

sp?ecialis?ees

Manipuler

du

code

par

exemple

pour

ajouter

dynamiquement

des

clauses

au

programme

ne

peut

se

faire

qu'au

travers

de

la

machine

h

ote

-LRB-

la

machine

PLM

est

un

co-processeur

-RRB-

M

eme

lorsque

dans

le

cas

de

code

emul?e

code

et

donn?ees

sont

pr?esents

dans

le

m

eme

cache

on

peut

se

poser

des

questions

sur

la

localit?e

des

acc?es

au

code

de

la

continuation

De

plus

en

comparaison

avec

l'optimisation

d'appel

terminal

l'

elagage

augmente

le

nombre

des

variables

globalisables

d'

o?u

le

remplacement

d'instructions

simples

par

des

instructions

plus

complexes

et

donc

un

surco

ut

potentiellement

important

le

tutoriel

d'

A

t-Kaci

-LSB-

-RSB-

B

pointe

sur

le

fond

du

point

de

choix

pour

des

raisons

didactiques

-LRB-

similarit?e

entre

B

et

E

-RRB-

Cela

complique

cependant

le

calcul

du

sommet

de

la

pile

accro

t

la

taille

du

point

de

choix

et

requiert

l'introduction

en

fait

evitable

d'un

registre

suppl?ementaire

Variantes

de

base

allocate

precE

E

E

max

-LRB-

B

precE

N

-RRB-

CP

-LRB-

E

-RRB-

CP

E

-LRB-

E

-RRB-

precE

E

-LRB-

N

-RRB-

N

deallocate

CP

CP

-LRB-

E

-RRB-

E

E

-LRB-

E

-RRB-

N

N

-LRB-

E

-RRB-

call

adresse

proc

taille

env

CP

CP

-LRB-

P

-RRB-

N

P

Figure

WAM

et

taille

d'environnement

explicite

Instructions

Variantes

de

base

En

premier

ressort

il

y

a

trois

mani?eres

d'

eviter

d'acc

eder

au

code

sans

alt?erer

les

effets

positifs

de

l'

elagage

l'introduction

d'un

nouveau

registre

donnant

la

taille

de

l'environnement

courant

l'

elagage

anticip?e

et

l'

elagage

retard?e

Taille

d'environnement

explicite

La

taille

de

l'environnement

courant

peut

etre

sauvegard?ee

dans

un

nouveau

registre

d'

etat

N

lors

de

l'ex

ecution

d'un

appel

non

terminal

Ce

registre

doit

alors

etre

sauv?e

a

chaque

cr?eation

d'environnement

ou

de

point

de

choix

afin

de

pouvoir

etre

restaur?e

au

retour

arri?ere

ou

lors

de

la

lib?eration

de

l'environnement

courant

La

taille

de

l'environnement

devient

partie

int?egrante

de

l'information

de

continuation

au

c

ot?e

des

champs

E

-LRB-

E

-RRB-

et

E

-LRB-

CP

-RRB-

Cette

approche

a

et?e

utilis?ee

pour

la

machine

PLM

-LSB-

-RSB-

et

la

machine

d?eriv?ee

-LSB-

-RSB-

L'agencement

d'un

environnement

est

similaire

a

celui

de

la

WAM

Les

instructions

d'allocation

de

lib?eration

et

d'appel

sont

modifi?ees

comme

indiqu?e

figure

Elagage

anticip?e

Le

registre

E

peut

aussi

etre

d?efini

comme

donnant

l'adresse

du

sommet

de

l'environnement

courant

et

mis

a

jour

de

mani?ere

syst?ematique

d?es

que

La

gestion

des

environnements

oe

E

-LRB-

E

-RRB-

CP

-LRB-

E

-RRB-

Yn

E

Pile

locale

Figure

Elagage

anticip?e

Agencement

de

l'environnement

allocate

l

max

-LRB-

E

B

-RRB-

-LRB-

l

-RRB-

E

-LRB-

l

-RRB-

CP

E

l

deallocate

d?ecr?ement

taille

E

E

d?ecr?ement

taille

CP

CP

-LRB-

E

-RRB-

E

E

-LRB-

E

-RRB-

call

d?ecr?ement

taille

E

E

d?ecr?ement

taille

CP

P

-LRB-

P

-RRB-

P

Figure

Elagage

anticip?e

Instructions

Variantes

de

base

oe

E

Yn

CP

-LRB-

E

-RRB-

E

-LRB-

E

-RRB-

Pile

locale

Figure

Elagage

retard?e

Agencement

de

l'environnement

certaines

variables

permanentes

ne

sont

plus

n?ecessaires

Cette

mise

a

jour

est

effectu?ee

par

chaque

instruction

d'appel

non

terminal

a

l'exclusion

de

l'appel

du

premier

but

de

la

clause

-LRB-

la

valeur

du

registre

E

vient

juste

d'

etre

d?efinie

-RRB-

L'optimisation

d'appel

terminal

pure

c'est

a-dire

sans

elagage

est

effectu?e

comme

dans

la

WAM

Avec

E

donnant

l'adresse

du

sommet

de

l'environnement

le

calcul

du

sommet

de

la

pile

est

simplifi?e

l

max

-LRB-

E

B

-RRB-

En

contrepartie

les

variables

permanentes

ne

sont

plus

a

une

distance

fixe

de

E.

L'ex

ecution

n'en

est

pas

ralentie

pour

autant

Bien

que

ces

distances

changent

d'un

but

a

l'autre

ces

changements

sont

connus

a

la

compilation

Cette

solution

sera

dite

elagage

anticip?e

Les

figures

et

donnent

les

d?etails

des

instructions

et

de

l'agencement

de

l'environnement

Notons

que

le

param?etre

d?ecr?ement

taille

de

deallocate

est

simplement

utilis?e

pour

acc?eder

aux

sauvegardes

des

registres

E

et

CP

et

n

a

aucune

fonction

d'

elagage

De

plus

la

valeur

de

d?ecr?ement

taille

est

nulle

au

premier

appel

-LRB-

l'environnement

complet

est

utile

-RRB-

Elagage

retard?e

a

la

r?ecup?eration

m?emoire

Une

approche

plus

extr

eme

consiste

a

ne

pas

elaguer

pendant

l'ex

ecution

normale

mais

a

donner

au

r?ecup?erateur

de

m?emoire

les

moyens

de

distinguer

entre

variables

permanentes

utiles

et

inutiles

Les

donn?ees

inutiles

accessibles

a

partir

des

variables

inutiles

peuvent

alors

etre

r?ecup?er?ees

et

la

pile

eventuellement

compact?ee

Si

le

r?ecup?erateur

de

m?emoire

n'est

pas

activ?e

l'

elagage

retard?e

se

r?esume

a

la

mise

en

place

de

l'optimisation

d'appel

terminal

Cette

id?ee

est

initialement

due

a

Joachim

Schimpf

et

a

et?e

exp?eriment?ee

pour

la

premi?ere

fois

dans

SEPIA

-LRB-

voir

section

-RRB-

L'impl

ementation

de

l'

elagage

retard?e

est

tr?es

semblable

a

celle

de

l'

elagage

anticip?e

voir

l'agencement

de

l'environnement

et

les

instructions

figures

et

Le

registre

E

peut

comme

dans

le

cas

de

l'

elagage

anticip?e

donner

l'adresse

du

sommet

de

l'environnement

ce

qui

simplifie

le

calcul

du

sommet

de

la

pile

L'agencement

de

l'environnement

est

diff?erent

dans

la

mesure

o?u

l'information

de

continuation

peut

maintenant

etre

rang?ee

au

sommet

de

l'environnement

Cette

information

peut

facilement

etre

acc?ed?ee

lors

de

l'

invalidation

de

l'

environnement

De

plus

les

variables

permanentes

sont

rang?ees

dans

l'ordre

inverse

de

l'

elagage

anticip?e

et

de

la

WAM

de

La

gestion

des

environnements

allocate

l

max

-LRB-

E

B

-RRB-

-LRB-

l

-RRB-

E

-LRB-

l

-RRB-

CP

E

l

deallocate

CP

CP

-LRB-

E

-RRB-

E

E

-LRB-

E

-RRB-

call

CP

P

-LRB-

P

-RRB-

P

Figure

Elagage

retard?e

Instructions

sorte

que

l'adresse

du

fond

de

la

partie

utile

de

l'environnement

puisse

etre

calcul?ee

par

le

r?ecup?erateur

de

m?emoire

Cette

adresse

vaut

E

env

size

-LRB-

CP

-RRB-

Finalement

il

n'est

pas

n?ecessaire

de

mettre

a

jour

le

registre

E

a

chaque

appel

L'adressage

des

variables

permanentes

s

en

trouve

simplifi?e

Variantes

avanc?ees

Les

sections

pr?ec?edentes

ont

couvert

les

trois

mani?eres

de

de

g?erer

les

environnements

et

leur

elagage

dans

les

machines

abstraites

de

type

WAM

Nous

allons

maintenant

construire

des

variantes

plus

compliqu?ees

en

introduisant

des

instructions

sp?ecialis?ees

un

pointeur

de

sommet

de

pile

explicite

et

une

cr?eation

retard?ee

des

environnements

Puis

la

r?eutilisation

des

environnements

ainsi

que

les

interd?ependances

avec

la

gestion

des

points

de

choix

seront

abord?ees

Sp?ecialisation

La

sp?ecialisation

est

une

technique

bien

connue

de

conception

de

jeux

d'instructions

Dans

le

tutoriel

d'

A

t-Kaci

-LSB-

-RSB-

cette

technique

est

erig?ee

en

troisi?eme

principe

de

la

combinaison

manquante

consiste

a

agencer

l'environnement

de

telle

mani?ere

que

E

donne

l'adresse

du

fond

de

l'environnement

o?u

seraient

rang?ees

les

variables

permanentes

Cette

combinaison

ne

semble

pas

pr?esenter

d'avantage

particulier

Variantes

avanc?ees

WAM

et

d?efinie

de

la

mani?ere

suivante

-LRB-

traduction

personnelle

-RRB-

Les

situations

particuli?eres

qui

apparaissent

tr?es

souvent

bien

que

correctement

trait?ees

par

des

instructions

g?en?erales

m?eritent

la

cr?eation

d'instructions

sp?ecialis?ees

si

leur

sp?ecificit?e

rend

possible

des

gains

en

temps

et/ou

en

espace

Un

exemple

simple

est

donn?e

par

la

sp?ecialisation

dans

le

cadre

de

l'

elagage

anticip?e

de

l'instruction

d'appel

non

terminal

en

une

instruction

adapt?ee

a

l'appel

du

premier

but

d'une

clause

Une

telle

instruction

evite

le

calcul

inutile

E

E

Un

autre

exemple

applicable

a

toutes

les

variantes

pr?ec?edentes

consiste

a

fusionner

l'

instruction

deallocate

et

l'instruction

d'appel

terminal

execute

en

une

instruction

Dans

ce

cas

une

s?equence

fr?equente

d'instructions

est

sp?ecialis?ee

en

une

instruction

unique

Le

b?en?efice

est

double

le

code

est

plus

compact

et

surtout

permet

de

mieux

utiliser

les

potentiels

de

micro-parall

elisme

de

la

machine

sous-jacente

Par

exemple

les

instructions

deallocate

execute

et

co

utent

et

-LRB-

au

lieu

de

-RRB-

cycles

sur

la

machine

KCM

Ce

type

d'effet

peut

aussi

etre

obtenu

sur

des

machines

g?en?erales

au

travers

par

exemple

de

techniques

de

branchement

retard?e

et

est

applicable

tant

dans

le

cadre

du

code

natif

que

du

code

Sommet

de

pile

explicite

Plut

ot

que

de

calculer

le

sommet

de

pile

uniquement

lors

d'une

op?eration

d'empilement

il

est

possible

de

maintenir

de

mani?ere

anticip?ee

la

valeur

du

sommet

de

la

pile

locale

dans

un

registre

d'

etat

L.

Combin?ee

a

la

sp?ecialisation

cette

id?ee

appliqu?ee

a

l'

elagage

anticip?e

conduit

directement

a

l'

elagage

a

prix

r?eduit

propos?e

par

B.

Demoen

and

A.

Mari?en

-LSB-

-RSB-

Voir

figure

les

instructions

correspondantes

Toutefois

les

b?en?efices

de

l'

elagage

a

prix

r?eduit

par

rapport

a

l'

elagage

anticip?e

ne

sont

pas

clairs

Ces

b?en?efices

d?ependent

de

consid?erations

de

bas

niveau

comme

le

co

ut

de

l'op

eration

ou

la

possibilit?e

de

garder

L

dans

un

registre

machine

Ils

d?ependent

aussi

du

programme

D'une

part

le

calcul

relativement

co

uteux

du

sommet

de

pile

n'est

pas

n?ecessaire

dans

le

cas

d'une

op?eration

d'empilement

Il

est

repouss?e

vers

la

fin

de

la

clause

ce

qui

est

int?eressant

en

cas

d'

echec

pr?ematur?e

D'autre

part

ce

calcul

est

effectu?e

plus

souvent

lors

d'appels

interm?ediaires

Il

peut

aussi

etre

inutile

s

il

est

suivi

d'un

echec

avant

tout

empilement

Bien

entendu

les

m

emes

modifications

peuvent

etre

appliqu?ees

aux

autres

variantes

par

exemple

a

la

WAM

-LRB-

voir

figure

-RRB-

et

a

l'

elagage

retard?e

-LRB-

voir

figure

-RRB-

sp?ecialisation

syst?ematique

peut

toutefois

accro

tre

la

taille

d'un

emulateur

au

point

d'influencer

n?egativement

son

comportement

m?emoire

KCM

par

exemple

cette

op?eration

peut

etre

microcod?ee

et

effectu?ee

en

parall?ele

avec

un

branchement

Elle

est

donc

moins

co

uteuse

dans

une

instruction

call

last

que

dans

une

instruction

allocate

La

gestion

des

environnements

allocate

-LRB-

L

-RRB-

E

-LRB-

L

-RRB-

CP

E

L

call

first

L

E

CP

P

-LRB-

P

-RRB-

P

call

d?ecr?ement

taille

E

E

d?ecr?ement

taille

L

max

-LRB-

E

B

-RRB-

CP

P

-LRB-

P

-RRB-

P

call

last

d?ecr?ement

taille

E

E

d?ecr?ement

taille

CP

CP

-LRB-

E

-RRB-

E

E

-LRB-

E

-RRB-

L

max

-LRB-

E

B

-RRB-

P

Figure

Elagage

a

prix

r?eduit

Instructions

Variantes

avanc?ees

allocate

-LRB-

L

-RRB-

E

-LRB-

L

-RRB-

CP

E

L

call

L

max

-LRB-

B

E

-RRB-

CP

P

-LRB-

P

-RRB-

P

call

last

CP

CP

-LRB-

E

-RRB-

E

E

-LRB-

E

-RRB-

L

max

-LRB-

B

E

-LRB-

CP

-RRB-

-RRB-

P

Figure

WAM

avec

sommet

de

pile

explicite

Instructions

allocate

-LRB-

L

-RRB-

E

-LRB-

L

-RRB-

CP

E

L

L

call

CP

P

-LRB-

P

-RRB-

P

call

last

CP

CP

-LRB-

E

-RRB-

E

E

-LRB-

E

-RRB-

L

max

-LRB-

E

B

-RRB-

P

Figure

Elagage

retard?e

avec

sommet

de

pile

explicite

Instructions

La

gestion

des

environnements

oe

Yn

E

CP

-LRB-

E

-RRB-

E

-LRB-

E

-RRB-

Pile

locale

Figure

Enregistrement

d'activation

standard

Agencement

de

l'environnement

allocate

-LRB-

L

-RRB-

E

E

L

call

L

max

-LRB-

B

E

-RRB-

-LRB-

L

-RRB-

P

-LRB-

P

-RRB-

P

call

last

cp

CP

-LRB-

E

-RRB-

E

E

-LRB-

E

-RRB-

L

max

-LRB-

B

E

-LRB-

cp

-RRB-

-RRB-

-LRB-

L

-RRB-

cp

P

Figure

Enregistrement

d'activation

standard

Instructions

Variantes

avanc?ees

Mentionnons

par

souci

d'exhaustivit

e

qu'une

modification

l?eg?ere

des

instructions

et

de

l'agencement

de

l'environnement

dans

la

WAM

conduit

a

g?erer

des

environnements

comme

des

enregistrements

d'activation

classiques

-LRB-

voir

les

figures

et

a

comparer

aux

figures

et

-RRB-

L'id

ee

est

d'utiliser

la

pile

machine

comme

pile

locale

Prolog

Le

registre

L

correspond

alors

au

sommet

de

la

pile

machine

le

registre

CP

dispara

t

et

correspond

au

nombre

de

variables

permanentes

dans

l'environnement

Cette

variante

est

surtout

int?eressante

sur

des

machines

de

type

CISC

avec

peu

de

registres

machine

et

des

instructions

d?edi?ees

de

manipulation

des

adresses

de

retour

SEPIA

-LSB-

-RSB-

dont

le

processeur

cible

etait

initialement

le

Motorola

combine

l'utilisation

d'enregistrements

d'activation

classiques

avec

un

elagage

retard?e

La

cr?eation

retard?ee

des

environnements

La

cr?eation

retard?ee

des

environnements

est

inspir?ee

par

un

principe

g?en?eral

de

qui

conseille

de

se

focaliser

sur

les

op?erations

qui

peuvent

pr?ecipiter

un

echec

et

de

retarder

celles

qui

devront

etre

effectu?ees

dans

tous

les

cas

Nous

supposerons

que

l'environnement

peut

etre

partiellement

rempli

par

l'initialisation

des

variables

permanentes

lors

de

l'unification

de

la

t

ete

de

clause

Cette

supposition

r?esulte

de

l'impossibilit

e

en

g?en?eral

de

garder

lors

de

l'unification

toutes

les

variables

permanentes

dans

des

registres

machine

Le

probl?eme

est

donc

de

retarder

la

sauvegarde

et

la

mise

a

jour

des

registres

E

et

CP

jusqu

a

l'occurrence

de

la

premi?ere

variable

permanente

Mats

Carlsson

-LSB-

-RSB-

sugg?ere

la

modification

suivante

minime

de

la

WAM

L'agencement

de

l'environnement

-LRB-

figure

-RRB-

ne

change

pas

L'instruction

allocate

est

partag?ee

en

deux

instructions

preallocate

et

postallocate

-LRB-

voir

figure

-RRB-

L'instruction

preallocate

calcule

le

sommet

de

la

pile

qui

est

sauvegard?e

dans

un

registre

interm?ediaire

utilis?e

pour

acc?eder

aux

variables

permanentes

nouvellement

cr?e?ees

L'instruction

postallocate

plac?ee

juste

avant

la

premi?ere

instruction

call

-LRB-

d'

o?u

une

possibilit?e

de

sp?ecialisation

-RRB-

met

a

jour

l'information

de

continuation

de

l'environnement

ainsi

que

le

registre

E.

Notons

que

le

registre

prend

la

valeur

du

registre

E

au

retour

d'un

fait

-LRB-

instruction

proceed

-RRB-

Ceci

permet

d'utiliser

une

seule

adresse

de

base

pour

acc?eder

aux

variables

permanentes

Dans

le

syst?eme

OU-parall

ele

Aurora/Foxtrot

-LSB-

-RSB-

la

m

eme

technique

est

utilis?ee

mais

appliqu?ee

a

la

WAM

avec

un

sommet

de

pile

explicite

L'introduction

des

tableaux

de

liaisons

enregistrant

les

liaisons

a

des

variables

partag?ees

par

plusieurs

branches

ex?ecut?ees

en

parall?ele

complique

l'

elagage

Plus

pr?ecis?ement

l'

elagage

combin?e

a

l'existence

de

liaisons

sur

la

pile

locale

rend

n?ecessaire

un

nettoyage

de

la

tra

n?ee

pointe

alors

sur

le

dernier

mot

empil?e

sur

la

pile

Pour

faciliter

les

comparaisons

nous

avons

ignor?e

le

fait

que

la

pile

machine

cro

t

habituellement

dans

le

sens

des

adresses

d?ecroissantes

principe

est

toutefois

a

utiliser

avec

discernement

son

principe

dual

de

consid?eration

anticip?ee

-LSB-

-RSB-

peut

eviter

l'ex

ecution

r?ep?et?ee

de

certaines

op?erations

La

gestion

des

environnements

preallocate

max

-LRB-

B

E

-LRB-

CP

-RRB-

-RRB-

postallocate

CP

-LRB-

-RRB-

CP

E

-LRB-

-RRB-

E

E

proceed

E

P

CP

Figure

WAM

et

cr?eation

retard?ee

des

environnements

Instructions

lors

de

la

coupure

-LRB-

voir

section

-RRB-

une

op?eration

que

dans

un

contexte

s?equentiel

il

vaut

mieux

laisser

au

r?ecup?erateur

de

m?emoire

En

fait

un

acc?es

aux

variables

permanentes

a

partir

de

deux

registres

l'un

utilis?e

jusqu'au

premier

appel

inclus

et

l'autre

pour

le

reste

de

la

clause

ne

pose

pas

de

probl?eme

Les

d?eplacements

par

rapport

a

ces

registres

peuvent

etre

calcul?es

a

la

compilation

et

les

instructions

d'acc

es

aux

variables

permanentes

prendre

en

compte

l'existence

de

deux

registres

de

base

La

cr?eation

retard?ee

des

environnements

peut

aussi

etre

facilement

combin?ee

avec

l'

elagage

anticip?e

et

l'

elagage

retard?e

L'agencement

de

l'environnement

dans

le

cas

de

l'

elagage

retard?e

sugg?ere

toutefois

une

autre

approche

Il

s

agit

dans

un

premier

temps

de

n'empiler

que

les

variables

permanentes

accessibles

par

l'interm

ediaire

du

sommet

de

la

pile

Les

d?eplacements

peuvent

changer

d'un

acc?es

a

l'autre

mais

tous

ces

d?eplacements

peuvent

etre

calcul?es

a

la

compilation

L'information

de

continuation

n'est

alors

sauv?ee

que

juste

avant

l'appel

du

premier

but

de

la

clause

L'instruction

allocate

peut

alors

etre

compl?etement

fusionn?ee

avec

l'instruction

call

ce

qui

donne

le

code

figure

C'est

la

solution

adopt?ee

pour

KCM

-LSB-

-RSB-

La

r?eutilisation

des

environnements

R?eutilisation

intra-clause

Dans

sa

th?ese

-LSB-

-RSB-

Van

Roy

laisse

supposer

que

la

WAM

permet

a

des

variables

permanentes

dont

les

dur?ees

de

vie

ne

se

chevauchent

pas

de

partager

la

m

eme

cellule

de

l'environnement

Il

consid?ere

aussi

la

possibilit?e

lors

de

la

d?er?ef?erenciation

d'une

variable

permanente

de

mettre

a

jour

la

cellule

affect?ee

a

la

variable

permanente

avec

le

r?esultat

de

la

d?er?ef?erenciation

Les

deux

id?ees

sont

rejet?ees

Variantes

avanc?ees

call

first

-LRB-

L

-RRB-

E

-LRB-

L

-RRB-

CP

E

L

CP

P

-LRB-

P

-RRB-

P

call

CP

P

-LRB-

P

-RRB-

P

call

last

CP

CP

-LRB-

E

-RRB-

E

E

-LRB-

E

-RRB-

L

max

-LRB-

E

B

-RRB-

P

Figure

Elagage

retard?e

avec

cr?eation

retard?ee

des

environnements

Instructions

La

gestion

des

environnements

du

fait

du

surco

ut

potentiel

d

u

au

tra

nage

ce

qui

am?ene

Van

Roy

a

introduire

la

notion

de

variable

permanente

a

ecriture

unique

Des

cellules

diff?erentes

sont

allou?ees

a

chaque

variable

permanente

De

plus

chaque

fois

qu'une

variable

permanente

est

d?er?ef?erenc?ee

le

r?esultat

de

la

d?er?ef?erenciation

est

stock?e

dans

une

nouvelle

cellule

de

l'environnement

En

fait

le

partage

d'une

cellule

de

l'environnement

n'est

pas

en

g?en?eral

compatible

avec

la

WAM

Consid?erons

par

exemple

la

clause

suivante

p

-LRB-

A

B

-RRB-

q

r

-LRB-

A

-RRB-

s

-LRB-

B

C

-RRB-

t

-LRB-

C

-RRB-

Cette

clause

comporte

trois

variables

permanentes

avec

les

dur?ees

de

vie

suivantes

Variable

premi?ere

occurrence

derni?ere

occurrence

A

t

ete

eme

but

B

t

ete

eme

but

C

eme

but

eme

but

La

WAM

alloue

un

environnement

avec

trois

cellules

pour

les

variables

C

B

et

A.

La

variable

A

est

elagu?ee

en

premier

suivie

par

la

variable

B

et

finalement

la

variable

C.

Les

dur?ees

de

vie

des

variables

A

et

C

ne

se

chevauchent

pas

Cependant

r?eutiliser

la

cellule

allou?ee

a

la

variable

A

pour

la

variable

C

implique

que

la

variable

B

ne

peut

pas

etre

elagu?ee

La

condition

n?ecessaire

et

suffisante

pour

pouvoir

partager

une

cellule

entre

deux

variables

permanentes

est

que

les

dur?ees

de

vie

des

variables

ne

se

chevauchent

pas

mais

aussi

qu'il

soit

possible

dans

le

contexte

de

la

WAM

d'allouer

aux

deux

variables

des

cellules

cons?ecutives

En

ce

qui

concerne

le

tra

nage

une

technique

ve

consisterait

a

appliquer

le

test

de

tra

nage

avant

chaque

mise

a

jour

d'une

cellule

Si

le

test

est

positif

l'adresse

de

la

cellule

ainsi

que

son

ancien

contenu

sont

sauv?es

sur

la

tra

n?ee

ce

que

l'on

appelle

tra

nage

de

valeur

-LRB-

voir

section

-RRB-

En

plus

du

co

ut

en

temps

le

tra

nage

de

valeur

d?etruit

potentiellement

les

b?en?efices

du

partage

En

effet

en

l'absence

de

tra

nage

une

cellule

de

moins

est

utilis?ee

Par

contre

s

il

y

a

tra

nage

le

gain

d'une

cellule

au

sein

de

l'environnement

ne

peut

pas

compenser

la

perte

en

espace

sur

la

tra

n?ee

Un

autre

probl?eme

est

que

le

tra

nage

n'est

pas

pr?ecis

Consid?erons

le

squelette

de

clause

suivant

o?u

ne

sont

donn?ees

que

les

premi?eres

et

derni?eres

occurrences

des

variables

permanentes

A

et

B

p

-LRB-

-RRB-

q

-LRB-

A

-RRB-

r

-LRB-

A

-RRB-

s

-LRB-

-RRB-

t

-LRB-

B

-RRB-

u

-LRB-

B

-RRB-

Avant

d'appeler

la

cellule

partag?ee

entre

les

variables

A

et

B

doit

etre

mise

a

jour

avec

la

repr?esentation

initiale

de

B

-LRB-

une

auto-r

ef?erence

-RRB-

Supposons

qu'aucun

point

de

choix

n'ait

et?e

cr?e?e

au

cours

de

l'ex

ecution

du

corps

de

la

clause

a

l'exception

d'un

Variantes

avanc?ees

point

de

choix

pour

le

but

s

-LRB-

-RRB-

Le

test

de

tra

nage

va

dire

que

la

modification

de

la

cellule

partag?ee

doit

etre

enregistr?ee

sur

la

tra

n?ee

alors

que

ce

n'est

pas

n?ecessaire

Cependant

si

une

analyse

de

d?eterminisme

est

capable

de

garantir

a

la

compilation

qu'aucun

point

de

choix

ne

sera

cr?e?e

entre

la

premi?ere

et

la

derni?ere

occurrence

de

A

alors

partager

une

cellule

entre

les

variables

A

et

B

vaut

la

peine

Voyons

maintenant

comment

le

concept

de

variable

a

ecriture

unique

permet

de

r?eduire

le

co

ut

de

la

d?er?ef?erenciation

Consid?erons

l'exemple

suivant

p

-LRB-

X

Y

-RRB-

q

-LRB-

X

-RRB-

Y

X

r

-LRB-

X

-RRB-

s

-LRB-

X

-RRB-

Lors

de

l'unification

Y

X

la

variable

X

est

d?er?ef?erenc?ee

Il

est

souhaitable

de

r?eutiliser

le

r?esultat

de

la

d?er?ef?erenciation

lors

de

la

r?esolution

des

buts

suivants

Supposons

que

la

d?er?ef?erenciation

puisse

etre

exprim?ee

au

niveau

source

par

l'interm

ediaire

d'un

pr?edicat

pr?ed?efini

Une

r?eutilisation

du

r?esultat

de

la

d?er?ef?erenciation

correspond

a

une

r?e?ecriture

de

la

clause

ci-dessus

en

p

-LRB-

X

Y

-RRB-

q

-LRB-

X

-RRB-

deref

-LRB-

Y

-RRB-

deref

-LRB-

X

-RRB-

r

-LRB-

-RRB-

s

-LRB-

-RRB-

Une

nouvelle

variable

permanente

a

et?e

introduite

L'opportunit

e

d'une

r?eutilisation

par

la

variable

de

la

cellule

occup?ee

par

la

variable

X

a

et?e

pr?ec?edemment

discut?ee

Il

y

a

peu

a

attendre

de

ce

type

de

transformation

en

terme

de

raccourcissement

des

cha

nes

de

liaisons

En

effet

d'apr

es

les

r?esultats

empiriques

de

Touati

et

Despain

-LSB-

-RSB-

la

grande

majorit?e

des

cha

nes

de

liaisons

-LRB-

plus

de

-RRB-

ne

peuvent

etre

raccourcies

soit

leur

longueur

est

nulle

soit

une

r?ef?erence

pointe

sur

une

auto-r

ef?erence

La

transformation

est

toutefois

int?eressante

si

elle

permet

de

supprimer

des

op?erations

de

d?er?ef?erenciation

Ceci

est

possible

si

l'

etat

instanci?e

de

la

variable

est

connu

par

exemple

du

fait

d'une

d?eclaration

de

mode

ou

de

la

pr?esence

de

la

variable

dans

une

expression

arithm?etique

Une

fois

sauvegard?ee

dans

l'environnement

sa

valeur

d?er?ef?erenc?ee

peut

etre

lue

par

l'interm

ediaire

d'une

simple

indirection

Dans

la

mesure

o?u

d?er?ef?erencer

une

variable

dans

la

m

eme

clause

est

peu

courant

la

transformation

n

a

de

sens

que

dans

le

contexte

d'une

compilation

globale

ou

si

des

clauses

complexes

sont

construites

automatiquement

par

exemple

par

evaluation

partielle

La

notion

de

variable

a

ecriture

unique

combine

en

fait

deux

id?ees

a

bien

s?eparer

la

r?eutilisation

de

cellules

de

l'environnement

dans

le

but

d'

economiser

de

la

m?emoire

et

la

r?eutilisation

des

r?esultats

de

la

d?er?ef?erenciation

dans

le

but

de

r?eduire

le

co

ut

de

la

d?er?ef?erenciation

Malheureusement

le

compilateur

de

Van

Roy

fusionne

ces

deux

id?ees

dans

le

concept

de

variable

a

ecriture

unique

L'option

de

compilation

ne

fournit

pas

la

possibilit?e

de

mesurer

leurs

m?erites

respectifs

fait

l'

evaluation

partielle

peut

etre

consid?er?ee

comme

une

forme

de

compilation

globale

La

gestion

des

environnements

qsort

-LRB-

-LSB-

-RSB-

R

R

-RRB-

qsort

-LRB-

-LSB-

X

L

-RSB-

R

-RRB-

partition

-LRB-

L

X

-RRB-

qsort

-LRB-

-LSB-

X

-RSB-

-RRB-

qsort

-LRB-

R

-RRB-

fail

instructions

proceed

fail

allocate

instructions

instructions

deallocate

execute

Figure

Code

WAM

de

Variantes

avanc?ees

R?eutilisation

inter-clauses

La

proc?edure

appel?ee

peut

sous

certaines

conditions

r?eutiliser

l'environnement

de

la

proc?edure

appelante

Cette

id?ee

a

et?e

initialement

sugg?er?ee

par

Touati

et

Despain

-LSB-

-RSB-

et

etudi?ee

plus

avant

par

Meier

-LSB-

-RSB-

Cette

r?eutilisation

est

typiquement

applicable

aux

pr?edicats

d?eterministes

r?ecursifs

a

droite

Elle

permet

de

transformer

une

r?ecursion

en

it?eration

Consid?erons

par

exemple

le

tri

d'une

liste

par

dichotomie

tel

qu'impl

ement?e

par

le

pr?edicat

Le

code

Prolog

et

le

code

WAM

de

qsort

extraits

de

la

d?efinition

de

la

WAM

-LSB-

-RSB-

sont

reproduits

figure

Toutes

les

instructions

WAM

n'intervenant

pas

dans

la

discussion

ont

et?e

pli?ees

dans

les

s?equences

d'instructions

d?enot?ees

<instructions N>

A

chaque

etape

non

terminale

de

la

r?ecursion

avant

chaque

appel

terminal

l'instruction

deallocate

d?epile

-LRB-

virtuellement

-RRB-

l'environnement

courant

apr?es

avoir

restaur?e

les

registres

E

et

CP

Puis

dans

la

mesure

o?u

la

fin

de

la

r?ecursion

n'est

pas

atteinte

deux

instructions

execute

et

sont

ex?ecut?ees

L'instruction

allocate

cr?ee

ensuite

un

nouvel

environnement

sauvant

le

contenu

des

registres

E

et

CP

sur

la

pile

locale

Entre

le

nouvel

environnement

et

l'environnement

initial

l'information

de

continuation

n

a

donc

pas

et?e

modifi?ee

De

plus

la

variable

permanente

qui

correspond

au

r?esultat

du

tri

R

un

invariant

de

la

r?ecursion

est

syst?ematiquement

charg?ee

dans

un

registre

a

partir

de

l'environnement

initial

-LRB-

instruction

-RRB-

pour

etre

sauvegard?ee

quelques

instructions

plus

tard

dans

le

nouvel

environnement

-LRB-

instruction

-RRB-

Or

le

nouvel

environnement

occupe

tr?es

exactement

la

place

de

l'environnement

initial

Cela

est

d

u

aux

raisons

suivantes

-LRB-

-RRB-

L'appel

r?ecursif

a

lieu

dans

un

etat

d?eterministe

Les

appels

interm?ediaires

a

et

n'ont

pas

cr?e?e

de

point

de

choix

-LRB-

-RRB-

La

s?election

de

la

deuxi?eme

clause

de

qsort

n

a

pas

demand?e

la

cr?eation

d'un

point

de

choix

qui

aurait

ecras?e

l'environnement

pr?ec?edent

L'id

ee

est

donc

de

ne

pas

lib?erer

l'environnement

initial

mais

de

le

r?eutiliser

Touati

et

Despain

ont

mesur?e

sur

une

petit

nombre

de

programmes

de

test

le

pourcentage

d'environnements

r?eutilisables

Ce

pourcentage

s

est

av?er?e

bas

a

moins

d'autoriser

la

cr?eation

de

points

de

choix

pour

la

s?election

des

clauses

-LSB-

-RSB-

Afin

d'

eviter

a

l'environnement

d'

etre

ecras?e

ils

ont

sugg?er?e

d'utiliser

deux

piles

s?epar?ees

pour

les

points

de

choix

et

les

environnements

c'est

a-dire

une

architecture

a

pile

double

-LRB-

voir

section

-RRB-

De

plus

Meier

a

not?e

sans

vraiment

s

etendre

que

la

s?election

de

la

bonne

clause

pouvait

impliquer

des

echecs

profonds

sans

compromettre

la

r?eutilisation

des

environnements

-LSB-

-RSB-

Voyons

sur

l'exemple

de

comment

du

code

prenant

en

compte

la

r?eutilisation

des

environnements

pourrait

etre

g?en?er?e

de

mani?ere

syst?ematique

Nous

supposons

savoir

par

exemple

au

moyen

d'une

analyse

globale

que

l'appel

r?ecursif

terminal

La

gestion

des

environnements

fail

instructions

proceed

fail

allocate

instructions

loop

instructions

loop

fail

instructions

deallocate

proceed

fail

instructions

instructions

jump

loop

Figure

Code

WAM

de

avec

r?eutilisation

de

l'environnement

Variantes

avanc?ees

a

est

d?eterministe

Une

analyse

globale

d?eterminerait

probablement

que

le

premier

argument

de

est

instanci?e

Cette

information

n'est

pas

n?ecessaire

a

la

r?eutilisation

et

n'est

donc

pas

prise

en

compte

afin

de

faciliter

les

comparaisons

avec

le

code

initial

Le

code

de

la

figure

peut

etre

obtenu

a

partir

du

code

de

la

figure

comme

suit

L'appel

r?ecursif

terminal

est

d?epli?e

et

les

instructions

et

deallocate

d?eplac?ees

en

avant

jusqu

a

ce

que

soit

leurs

r?esultats

soient

n?ecessaires

soit

des

instructions

duales

soient

rencontr?ees

auquel

cas

la

paire

-LRB-

instruction

instruction

duale

-RRB-

est

elimin?ee

Il

y

a

deux

exemples

du

premier

cas

dans

la

version

d?epli?ee

de

la

premi?ere

clause

L'instruction

ne

peut

pas

etre

repouss?ee

au

del?a

de

l'instruction

qui

requiert

que

le

registre

ait

et?e

charg?e

De

m

eme

l'instruction

deallocate

ne

peut

etre

repouss?ee

au

del?a

de

l'instruction

proceed

Il

y

a

deux

exemples

du

deuxi?eme

cas

dans

la

clause

r?ecursive

L'instruction

allocate

ne

peut

etre

d?eplac?ee

au

del?a

de

l'instruction

deallocate

et

les

deux

instructions

s

annihilent

de

m

eme

avec

la

paire

d'instructions

et

Un

traitement

rigoureux

de

la

transformation

passe

par

l'utilisation

de

graphes

de

flot

de

contr

ole

etendus

afin

de

prendre

en

compte

les

possibilit?es

de

sortie

d'un

bloc

d'instructions

par

echec

-LRB-

voir

par

exemple

les

travaux

de

Debray

-LSB-

-RSB-

-RRB-

En

g?en?eral

il

est

possible

de

partager

du

code

entre

clauses

d?epli?ees

et

clauses

initiales

Dans

notre

exemple

la

s?equence

d'instructions

instructions

est

partag?ee

Notons

que

dans

l'hypoth

ese

d'un

syst?eme

incr?emental

l'instruction

execute

doit

passer

par

l'interm

ediaire

d'une

table

des

pr?edicats

pour

conna

tre

l'adresse

du

code

cible

d'

o?u

l'introduction

d'une

instruction

de

branchement

imm?ediat

jump

La

figure

reprend

l'exemple

de

r?eutilisation

avec

echec

profond

possible

exhib?e

par

Meier

que

nous

avons

compl?et?e

par

une

proposition

de

code

WAM

De

m

eme

que

pr?ec?edemment

ce

code

peut

etre

d?eriv?e

du

code

standard

par

application

de

techniques

d'optimisation

sur

les

graphes

de

flot

de

contr

ole

Dans

un

premier

temps

un

d?eplacement

en

avant

permet

de

factoriser

allocate

Il

est

alors

possible

d'utiliser

une

technique

simple

de

duplication

de

cible

de

branchement

-LRB-

voir

-LSB-

-RSB-

-RRB-

pour

cr?eer

l'

etiquette

interm?ediaire

loop

et

dupliquer

l'instruction

allocate

avant

le

branchement

a

cette

etiquette

Finalement

une

phase

d'

elimination

de

code

supprime

les

instructions

deallocate

et

allocate

Notons

que

bien

que

l'environnement

soit

cr?e?e

avant

le

point

de

choix

une

pile

double

-LRB-

voir

section

-RRB-

n'est

pas

n?ecessaire

La

r?eutilisation

d'environnement

est

donc

compatible

avec

une

architecture

standard

m

eme

en

pr?esence

de

points

de

choix

Il

suffit

de

cr?eer

l'environnement

de

mani?ere

anticip?ee

et

de

le

lib?erer

dans

chaque

clause

non

r?eguli?ere

Le

seul

cas

probl?ematique

appara

t

quand

une

des

clauses

r?ecursives

est

binaire

Le

sch?ema

g?en?eral

conduit

a

allouer

et

lib?erer

inutilement

un

environnement

a

chaque

etape

de

r?ecursion

Sinon

les

allocations

et

lib?erations

inutiles

qui

peuvent

appara

tre

lors

de

r?ecursions

de

longueur

nulle

sont

facilement

evit?ees

par

la

g?en?eration

de

code

sp?ecialis?e

pour

le

premier

appel

-LRB-

comme

dans

l'exemple

de

-RRB-

La

gestion

des

environnements

loop

-LRB-

X

-RRB-

end

-LRB-

X

-RRB-

loop

-LRB-

X

-RRB-

process

-LRB-

X

-RRB-

loop

-LRB-

-RRB-

allocate

d?eplacement

de

code

loop

duplication

de

cible

de

branchement

allocate

codage

f

instructions

deallocate

proceed

fail

allocate

codage

f

instructions

deallocate

codage

f

proceed

codage

f

allocate

duplication

de

cible

de

branchement

jump

loop

duplication

de

cible

de

branchement

Figure

Exemple

de

r?eutilisation

des

environnements

en

pr?esence

d'

echec

profond

Variantes

avanc?ees

call

last

with

reuse

eut

if

-LRB-

L

E

-RRB-

P

eut

else

Figure

R?eutilisation

dynamique

des

environnements

Instructions

D'apr

es

Meier

r?eutiliser

un

environnement

en

pr?esence

de

plusieurs

clauses

r?ecursives

non

binaires

est

probl?ematique

Il

sugg?ere

faisant

l'hypoth

ese

d'une

compilation

des

disjonctions

en

ligne

de

fusionner

toutes

ces

clauses

en

une

clause

unique

utilisant

des

disjonctions

En

fait

l'unique

probl?eme

a

r?esoudre

concerne

la

possibilit?e

d'une

taille

d'environnement

variant

d'une

clause

a

l'autre

Cela

peut

etre

r?esolu

de

deux

mani?eres

soit

par

l'allocation

d'un

environnement

de

taille

maximale

soit

par

un

ajustement

si

n?ecessaire

de

la

taille

de

l'environnement

a

chaque

entr?ee

de

clause

La

premi?ere

solution

ne

peut

etre

evit?ee

dans

le

cadre

d'une

architecture

a

pile

unique

ou

si

l'information

de

continuation

est

plac?ee

en

sommet

d'environnement

Aussi

la

combinaison

d'une

architecture

a

pile

double

et

d'un

agencement

de

l'environnement

de

type

WAM

est

sp?ecialement

attrayante

Par

environnement

de

type

WAM

nous

entendons

un

agencement

pour

lequel

le

registre

E

pointe

sur

le

fond

de

l'environnement

o?u

est

plac?ee

l'information

de

continuation

Dans

ce

cas

l'environnement

est

en

sommet

de

pile

pendant

la

s?election

de

la

clause

et

peut

etre

librement

etendu

Une

telle

configuration

permet

aussi

dans

le

contexte

d'une

compilation

globale

d'

etendre

la

r?eutilisation

des

environnements

a

des

pr?edicats

non

r?ecursifs

Autre

point

il

n'est

pas

n?ecessaire

de

d?eterminer

a

la

compilation

si

l'appel

terminal

aura

lieu

dans

un

etat

d?eterministe

Ce

test

peut

etre

effectu?e

a

l'ex

ecution

Le

choix

d'un

sch?ema

avec

pointeur

de

pile

explicite

o?u

le

registre

E

pointe

sur

le

sommet

de

l'environnement

facilite

les

choses

Dans

ce

cas

l'

etat

est

d?eterministe

si

et

seulement

si

E

L.

Dans

le

cas

d'un

agencement

de

type

WAM

le

sommet

de

l'environnement

est

donn?e

par

E

o?u

est

la

taille

de

l'environnement

lors

de

l'avant-dernier

appel

du

corps

de

clause

taille

connue

a

la

compilation

La

figure

donne

le

sch?ema

d'une

version

sp?ecialis?ee

de

l'instruction

qui

pourrait

etre

utilis?ee

dans

le

cadre

d'une

organisation

de

type

WAM

avec

pointeur

de

pile

explicite

Si

l'

etat

est

d?eterministe

l'instruction

se

comporte

comme

un

simple

branchement

vers

du

code

r?eutilisant

l'environnement

courant

Sinon

l'instruction

est

equivalente

a

l'instruction

standard

Finalement

en

ce

qui

concerne

la

r?ecup?eration

m?emoire

l'hypoth

ese

habituelle

est

que

celle-ci

peut

etre

d?eclench?ee

en

des

points

pr?ecis

du

programme

au

sein

ou

juste

La

gestion

des

environnements

apr?es

les

instructions

d'appel

de

proc?edure

afin

que

l'

etat

des

registres

arguments

soit

pr?ecis?ement

d?efini

-LRB-

voir

-LSB-

-RSB-

-RRB-

Dans

le

cas

de

la

transformation

d'un

appel

r?ecursif

en

une

boucle

il

va

donc

etre

n?ecessaire

de

r?eintroduire

ce

test

de

d?eclenchement

de

la

r?ecup?eration

m?emoire

par

l'interm

ediaire

d'une

instruction

explicite

au

point

correspondant

a

l'appel

o?u

l'

etat

des

registres

est

bien

d?efini

-LRB-

apr?es

la

s?equence

d'instructions

instructions

dans

notre

exemple

-RRB-

Nous

ne

connaissons

pas

de

syst?eme

classique

r?eutilisant

les

environnements

Cependant

Zhou

a

appliqu?e

le

m

eme

genre

d'id

ee

aux

enregistrements

d'activation

de

sa

machine

abstraite

la

NTOAM

-LSB-

-RSB-

-LRB-

voir

ci-apr

es

-RRB-

Interd?ependances

avec

le

contr

ole

OU

L'architecture

a

pile

double

Les

machines

abstraites

de

KCM

et

de

SICStus/Aurora

utilisent

une

architecture

a

pile

double

c'est

a-dire

une

pile

pour

les

environnements

et

une

pile

pour

les

points

de

choix

-LRB-

voir

section

-RRB-

Le

choix

entre

pile

unique

et

pile

double

et

les

choix

concernant

l'

elagage

et

l'agencement

de

l'environnement

sont

largement

ind?ependants

Certains

d?etails

de

l'impl

ementation

d'une

architecture

a

pile

double

peuvent

cependant

influencer

l'efficacit

e

relative

des

diff?erentes

techniques

de

gestion

des

environnements

Par

exemple

lors

de

la

cr?eation

d'un

point

de

choix

le

sommet

de

la

pile

d'environnements

doit

etre

sauvegard?e

dans

le

point

de

choix

-LRB-

cette

sauvegarde

remplace

le

calcul

du

sommet

de

la

pile

locale

-RRB-

Cette

valeur

peut

etre

cach?ee

dans

un

registre

de

la

m

eme

mani?ere

que

le

point

de

retour

de

la

pile

globale

Si

elle

ne

l'est

pas

les

calculs

du

sommet

de

la

pile

locale

et

du

test

de

tra

nage

requi?erent

un

acc?es

m?emoire

suppl?ementaire

La

juxtaposition

des

points

de

choix

et

des

environnements

Une

premi?ere

id?ee

est

de

partager

l'information

de

continuation

et

de

coupure

entre

point

de

choix

et

environnement

correspondant

a

un

m

eme

appel

Ce

partage

requiert

de

mani?ere

evidente

une

architecture

a

pile

unique

et

un

agencement

par

lequel

l'information

de

continuation

est

plac?ee

au

fond

de

l'environnement

Cette

organisation

a

et?e

etudi?ee

par

Demoen

et

Mari?en

-LSB-

-RSB-

La

fusion

des

points

de

choix

et

des

environnements

Zhou

a

pouss?e

l'id

ee

de

partage

d'information

entre

point

de

choix

et

environnement

a

l'extr

eme

et

propos?e

une

machine

abstraite

la

NTOAM

construite

autour

d'une

structure

de

contr

ole

unique

fusionnant

point

de

choix

et

environnement

dans

l'esprit

d'un

enregistrement

d'activation

standard

-LSB-

-RSB-

L'agencement

de

cet

enregistrement

d'activation

est

repr?esent?e

figure

Afin

de

faciliter

les

comparaisons

nous

avons

utilis?e

la

terminologie

de

la

WAM

Variantes

avanc?ees

oe

Yn

Am

T

E

B

L

E

CP

B

G

BP

L

point

de

choix

environnement

et

point

de

choix

environnement

et

point

de

choix

environnement

Pile

locale

Figure

Agencement

de

l'enregistrement

d'activation

de

la

NTOAM

En

fait

la

motivation

premi?ere

de

Zhou

est

de

passer

arguments

et

information

de

continuation

sur

la

pile

dans

le

but

de

r?eduire

le

trafic

m?emoire

Dans

le

pire

cas

la

WAM

peut

requ?erir

jusqu

a

trois

copies

m?emoire

pour

passer

un

terme

en

argument

Consid?erons

l'appel

p

-LRB-

X

-RRB-

dans

le

programme

suivant

m

-LRB-

X

-RRB-

p

-LRB-

X

-RRB-

p

-LRB-

X

-RRB-

q

-LRB-

X

-RRB-

r

-LRB-

X

-RRB-

p

-LRB-

X

-RRB-

s

-LRB-

X

-RRB-

La

variable

X

est

initialement

une

variable

permanente

Elle

est

d'abord

copi?ee

de

l'environnement

dans

le

registre

argument

Un

point

de

choix

et

un

environnement

sont

successivement

cr?e?es

pour

l'appel

au

pr?edicat

A

chaque

fois

les

registres

E

et

CP

sont

copi?es

en

m?emoire

Par

contre

la

NTOAM

ne

va

copier

la

variable

X

qu'une

seule

fois

de

l'enregistrement

d'activation

de

l'appelant

a

celui

de

l'appel

e.

De

m

eme

en

cas

de

retour

arri?ere

la

WAM

doit

restaurer

les

registres

E

et

CP

ce

qui

n

a

pas

d'

equivalent

dans

la

NTOAM

Toutefois

en

supposant

que

les

premiers

registres

arguments

ainsi

que

CP

puissent

etre

des

registres

machine

il

est

facile

d'exhiber

des

programmes

qui

sont

d?efavoris?es

par

un

passage

d'arguments

sur

la

pile

Par

exemple

un

appel

au

pr?edicat

memberchk

-LRB-

X

-LSB-

Y

L

-RSB-

-RRB-

-LRB-

X

Y

true

memberchk

-LRB-

X

L

-RRB-

-RRB-

La

gestion

des

environnements

ne

requiert

aucun

acc?es

a

la

pile

locale

Bien

que

la

NTOAM

puisse

r?eutiliser

l'enregistrement

d'activation

de

l'appel

initial

le

traitement

du

deuxi?eme

argument

de

requiert

une

lecture

et

une

ecriture

m?emoire

a

chaque

etape

de

la

r?ecursion

Il

n'est

pas

non

plus

possible

de

donner

de

conclusion

g?en?erale

sur

la

consommation

m?emoire

D'une

part

du

fait

d'une

taille

fixe

allou?ee

a

l'information

de

contr

ole

la

NTOAM

consomme

plus

de

m?emoire

de

pile

que

la

WAM

sur

des

ex?ecutions

d?eterministes

D'autre

part

la

NTOAM

ne

duplique

pas

d'information

lors

d'ex

ecutions

non

d?eterministes

et

donc

consomme

alors

moins

de

m?emoire

Il

est

toutefois

a

noter

que

comme

la

WAM

la

NTOAM

ne

peut

r?ecup?erer

de

m?emoire

lors

de

la

coupure

de

points

de

choix

profonds

Une

architecture

a

pile

double

r?esout

ce

probl?eme

et

peut

donc

s

av?erer

consommer

moins

de

m?emoire

quand

la

coupure

est

utilis?ee

de

mani?ere

intensive

Dans

-LSB-

-RSB-

Zhou

compare

une

impl?ementation

de

la

NTOAM

avec

un

certain

nombre

de

syst?emes

de

type

WAM

Les

r?esultats

obtenus

sont

favorables

a

la

NTOAM

tant

en

temps

qu'en

espace

Cependant

la

comparaison

est

biais?ee

du

fait

de

l'introduction

dans

la

NTOAM

de

deux

am?eliorations

absentes

des

autres

syst?emes

une

analyse

globale

notamment

de

d?eterminisme

et

la

r?eutilisation

des

enregistrements

d'activation

L'analyse

globale

permet

de

consid?erer

des

gardes

incluant

des

pr?edicats

qui

ne

sont

pas

compilables

en

ligne

mais

qui

sont

d?eterministes

ne

cr?eent

pas

de

termes

compos?es

et

ne

lient

pas

de

variables

dans

la

t

ete

de

clause

En

pr?esence

de

telles

gardes

le

retour

arri?ere

n

a

besoin

de

prendre

en

compte

ni

l'

etat

de

la

pile

globale

ni

l'

etat

de

la

tra

n?ee

Une

partie

des

champs

de

l'enregistrement

d'activation

n'est

pas

initialis?ee

et

le

retour

arri?ere

est

simplifi?e

Ce

genre

d'optimisation

pourrait

etre

impl?ement?e

dans

le

contexte

de

la

WAM

-LRB-

voir

chapitre

-RRB-

En

ce

qui

concerne

le

deuxi?eme

point

l'enregistrement

d'activation

n

etant

rien

d'autre

qu'une

fusion

d'un

point

de

choix

et

d'un

environnement

la

possibilit?e

de

r?eutiliser

cet

enregistrement

implique

la

possibilit?e

dans

le

cadre

de

la

WAM

de

r?eutiliser

l'environnement

et

le

point

de

choix

correpondant

-LRB-

voir

sections

et

-RRB-

ce

qui

peut

etre

combin?e

avec

le

passage

de

certains

arguments

en

m?emoire

Clairement

il

serait

int?eressant

de

comprendre

le

poids

relatif

des

trois

techniques

passage

des

arguments

en

m?emoire

avec

enregistrement

d'activation

unique

analyse

globale

et

r?eutilisation

des

enregistrements

d'activation

dans

la

performance

de

la

NTOAM

L'influence

de

l'

elagage

sur

la

taille

des

environne

ments

L'influence

de

l'

elagage

sur

la

taille

des

environnements

Programme

taille

max

gain

en

taille

-LRB-

-RRB-

-LRB-

cellules

-RRB-

sur

taille

max

moyenne

deviation

std

boyer

browse

chat

parser

crypt

deriv

fast

mu

flatten

meta

qsort

mu

nand

nreverse

poly

prover

qsort

queens

query

reducer

sdda

sendmore

serialise

simple

analyser

tak

unify

zebra

Table

Influence

de

l'

elagage

sur

la

taille

des

environnements

La

gestion

des

environnements

SEPIA

et

KCM

les

deux

impl?ementations

de

l'

elagage

retard?e

connues

de

l'auteur

ne

compactent

pas

la

pile

locale

Intuitivement

le

gain

en

taille

n'en

vaut

pas

la

peine

Ceci

est

confirm?e

par

la

table

Chaque

programme

de

test

d'Aquarius

-LSB-

-RSB-

a

et?e

ex?ecut?e

sur

KCM

dans

une

boucle

sans

fin

et

echantillonn?e

une

fois

par

seconde

a

partir

de

la

machine

h

ote

de

KCM

C'est

a-dire

que

pour

chaque

echantillon

l'

h

ote

a

arr

et?e

KCM

examin?e

la

pile

calcul?e

la

taille

de

la

pile

d'environnements

et

au

sein

de

ces

environnements

la

m?emoire

occup?ee

par

les

variables

permanentes

inutiles

avant

de

relancer

l'ex

ecution

Chaque

programme

a

et?e

echantillonn?e

fois

a

l'exception

de

tak

qui

n

a

et?e

echantillonn?e

que

fois

Il

s

av?ere

que

la

version

Prolog

initiale

de

tak

-LSB-

-RSB-

a

et?e

l?eg?erement

modifi?ee

afin

de

tester

les

capacit?es

d'extraction

de

d?eterminisme

d'Aquarius

Les

compilateurs

classiques

consid?erent

le

programme

comme

etant

non

d?eterministe

ce

qui

emp

eche

la

lib?eration

par

optimisation

d'appel

terminal

d'un

grand

nombre

d'environnements

Pour

chaque

programme

la

table

donne

la

taille

de

la

pile

d'environnements

maximum

le

gain

en

taille

sur

l'

echantillon

correspondant

le

gain

moyen

sur

tous

les

echantillons

et

la

d?eviation

standard

Les

programmes

ont

et?e

compil?es

avec

l'option

d'arithm

etique

g?en?erique

en

ligne

Ces

gains

sont

bien

moins

importants

qu'il

n'avait

et?e

avanc?e

par

Demoen

et

Mari?en

-LSB-

-RSB-

Le

co

ut

des

variables

globalisables

Dans

la

WAM

du

fait

de

l'

elagage

est

globalisable

toute

variable

permanente

qui

n'appara

t

ni

dans

la

t

ete

de

clause

ni

dans

un

terme

compos?e

Sur

KCM

l'utilisation

d'un

environnement

de

taille

fixe

restreint

les

variables

globalisables

aux

variables

ob?eissant

au

crit?ere

pr?ec?edent

dont

la

derni?ere

occurrence

est

dans

le

dernier

but

de

la

clause

Afin

d'obtenir

une

id?ee

du

surco

ut

d

u

a

un

nombre

accru

de

variables

globalisables

dans

la

WAM

le

compilateur

de

KCM

a

et?e

modifi?e

afin

de

g?en?erer

les

m

emes

instructions

que

dans

la

WAM

La

table

donne

le

surco

ut

en

pourcentage

du

code

obtenu

sur

chaque

programme

de

test

d'Aquarius

Les

temps

d'ex

ecution

sont

en

secondes

Ils

ont

et?e

obtenus

en

compilant

incr?ementalement

et

ex?ecutant

chaque

programme

l'un

apr?es

l'autre

dans

une

boucle

command?ee

par

le

retour

arri?ere

telle

que

chaque

programme

tourne

a

peu

pr?es

secondes

Diff?erents

modes

de

compilation

de

l'arithm

etique

ont

et?e

test?es

Les

r?esultats

obtenus

montrent

que

globalement

le

surco

ut

n'est

pas

significatif

Ponctuellement

on

observe

toutefois

certaines

disparit?es

-LRB-

c'est

par

exemple

le

cas

du

programme

zebra

-RRB-

Ces

disparit?es

sont

vraisemblablement

a

mettre

au

compte

d'une

grande

sensibilit?e

de

certains

programmes

au

placement

des

instructions

et

des

donn?ees

dans

les

caches

-LRB-

ainsi

les

temps

d'ex

ecution

de

zebra

programme

sans

arithm?etique

devraient

etre

identiques

dans

les

trois

colonnes

du

tableau

-RRB-

Nous

supposons

que

les

globalisations

r?eelles

sont

rares

et

donc

que

l'accroissement

Le

co

ut

des

variables

globalisables

Programme

arith

expans?ee

arith

en

ligne

arith

enti?ere

KCM

standard

KCM

standard

KCM

standard

boyer

browse

chat

parser

crypt

deriv

fast

mu

flatten

meta

qsort

mu

nand

nreverse

poly

prover

qsort

queens

query

reducer

sdda

sendmore

serialise

simple

analyser

tak

unify

zebra

moyenne

deviation

std

Table

Surco

ut

des

instructions

put

unsafe

La

gestion

des

environnements

du

nombre

de

variables

globalisables

n

a

pas

non

plus

d'effet

significatif

sur

la

taille

de

la

pile

globale

Notons

que

KCM

impl?emente

une

variante

de

l'instruction

telle

qu'elle

est

d?ecrite

dans

le

tutoriel

d'

A

t-Kaci

-LSB-

-RSB-

L'instruction

de

KCM

inclut

un

test

pr?eliminaire

de

d?eterminisme

Dans

un

etat

non

d?eterministe

l'instruction

se

comporte

comme

l'instruction

standard

qui

charge

une

variable

permanente

dans

un

registre

Des

globalisations

inutiles

sont

evit?ees

En

terme

de

vitesse

l'instruction

est

bien

s

ur

plus

rapide

dans

le

cas

non

d?eterministe

mais

moins

rapide

dans

les

cas

d?eterministes

Dans

la

mesure

o?u

les

globalisations

sont

rares

et

l'

etat

d?eterministe

plus

fr?equent

que

l'

etat

non

d?eterministe

cette

variante

n'est

pas

vraiment

justifi?ee

Il

y

a

deux

autres

r?eponses

possibles

a

la

question

du

co

ut

des

variables

globalisables

La

premi?ere

est

que

des

techniques

d'analyse

globale

devraient

permettre

d'

eliminer

la

majorit?e

des

variables

globalisables

Cette

possibilit?e

etait

d?ej?a

evoqu?ee

dans

-LSB-

-RSB-

La

deuxi?eme

r?eponse

est

qu'il

est

facile

de

supprimer

le

probl?eme

des

variables

globalisables

en

globalisant

les

variables

libres

par

d?efaut

Cela

a

et?e

impl?ement?e

par

exemple

dans

la

VAM

-LSB-

-RSB-

et

Aquarius

-LSB-

-RSB-

Les

performances

sont

suppos?ees

am?elior?ees

-LRB-

le

test

de

tra

nage

est

simplifi?e

les

instructions

et

disparaissent

-RRB-

au

prix

d'un

accroissement

de

la

taille

de

la

pile

globale

L'importance

de

cet

accroissement

est

une

question

ouverte

voir

-LSB-

-RSB-

Conclusion

Deux

d?esavantages

potentiels

de

l'

elagage

tel

qu'il

est

impl?ement?e

dans

la

WAM

ont

et?e

pr?esent?es

justifiant

l'

etude

de

variantes

de

l'

elagage

Le

premier

d?esavantage

un

acc?es

syst?ematique

au

code

lors

de

l'empilement

d'un

point

de

choix

ou

d'un

environnement

peut

etre

efficacement

r?esolu

soit

en

faisant

pointer

le

registre

E

sur

le

sommet

de

l'environnement

et

en

le

mettant

a

jour

de

mani?ere

anticip?ee

soit

par

l'utilisation

de

l'

elagage

retard?e

Chacune

de

ces

solutions

peut

etre

utilis?ee

dans

sa

forme

de

base

ou

combin?ee

soit

avec

une

cr?eation

d'environnement

retard?ee

soit

avec

un

sommet

de

pile

locale

explicite

si

l'introduction

d'un

tel

registre

apporte

d'autres

b?en?efices

Il

est

possible

de

mettre

l'accent

sur

la

vitesse

-LRB-

elagage

retard?e

sans

compactage

de

la

pile

-RRB-

ou

sur

la

taille

m?emoire

-LRB-

elagage

anticip?e

-RRB-

Les

diff?erences

de

performance

sont

probablement

minimes

En

particulier

les

fuites

de

m?emoire

dues

a

l'absence

de

compactage

de

la

pile

locale

sont

typiquement

r?eduites

Le

deuxi?eme

d?esavantage

a

savoir

un

plus

grand

nombre

de

variables

globalisables

n

a

qu'un

impact

r?eduit

Le

passage

de

l'optimisation

d'appel

terminal

a

l'

elagage

ne

semble

pas

en

ce

qui

concerne

les

variables

globalisables

influencer

les

performances

de

KCM

de

mani?ere

notable

Nous

pensons

que

ce

r?esultat

se

g?en?eralise

a

la

plupart

des

syst?emes

Prolog

standard

qui

utilisent

une

technologie

de

compilation

semblable

a

celle

utilis?ee

pour

KCM

De

plus

les

variables

globalisables

peuvent

etre

du

moins

Conclusion

partiellement

elimin?ees

gr

ace

a

des

techniques

d'analyse

globale

Enfin

il

est

possible

de

mettre

l'accent

sur

la

vitesse

soit

par

l'utilisation

d'un

elagage

retard?e

soit

par

une

globalisation

syst?ematique

des

variables

libres

Globalement

le

surco

ut

potentiel

de

l'

elagage

ne

justifie

pas

de

se

limiter

a

une

simple

optimisation

d'appel

terminal

et

de

prendre

le

risque

d'importantes

fuites

de

m?emoire

sur

la

pile

globale

dues

a

l'impossibilit

e

de

juger

de

l'utilit

e

des

variables

permanentes

Mentionnons

finalement

que

les

questions

d'

elagage

sont

tr?es

simplement

r?esolues

dans

les

syst?emes

bas?es

sur

une

repr?esentation

des

r?esolvantes

par

empilement

de

buts

-LSB-

-RSB-

L'

elagage

des

variables

permanentes

apparaissant

pour

la

derni?ere

fois

dans

le

but

courant

correspond

a

la

lib?eration

du

premier

but

de

la

r?esolvante

courante

repr?esent?e

explicitement

sur

la

pile

Ce

but

n'est

plus

accessible

et

sera

r?ecup?er?e

au

prochain

passage

du

r?ecup?erateur

de

m?emoire

La

gestion

des

environnements

La

gestion

des

points

de

choix

Dans

la

WAM

la

pile

-LRB-

logique

-RRB-

des

points

de

choix

enregistre

l'existence

dans

l'arbre

de

recherche

d'alternatives

a

la

d?erivation

courante

alternatives

qui

seront

d?evelopp?ees

au

retour

arri?ere

Les

pr?esentations

habituelles

de

la

WAM

consid?erent

la

gestion

de

cette

pile

comme

triviale

il

s

agit

lors

d'un

appel

de

sauver

l'

etat

courant

du

calcul

afin

de

pouvoir

le

restaurer

au

retour

arri?ere

En

pratique

la

mise

en

oeuvre

d'une

gestion

efficace

des

points

de

choix

s

av?ere

assez

subtile

Ce

chapitre

fait

le

point

de

notre

exp?erience

sur

cet

aspect

d'impl

ementation

La

section

etudie

tout

d'abord

la

gestion

des

points

de

choix

dans

la

WAM

montrant

en

particulier

qu'il

n'est

pas

n?ecessaire

de

sauvegarder

dans

chaque

point

de

choix

d'indication

de

la

taille

du

point

de

choix

Les

sections

suivantes

passent

en

revue

des

techniques

qui

en

compl?ement

des

techniques

d'indexation

diminuent

les

acc?es

m?emoire

aux

points

de

choix

Ces

techniques

qui

se

r?esument

a

un

retardement

des

acc?es

m?emoire

combin?e

a

une

utilisation

judicieuse

des

registres

machine

sont

sp?ecialement

utiles

dans

le

cas

de

retours

arri?ere

superficiels

La

section

traite

du

retour

arri?ere

superficiel

la

section

de

la

lecture

retard?ee

des

points

de

choix

et

la

section

de

leur

cr?eation

retard?ee

Partant

d'une

impl?ementation

simple

incluant

certains

surco

uts

de

type

interpr?etatif

nous

d?erivons

une

impl?ementation

adapt?ee

a

la

compilation

en

code

natif

Finalement

la

section

montre

que

l'

elagage

devrait

aussi

etre

appliqu?e

aux

points

de

choix

et

consid?ere

la

possibilit?e

de

r?eutilisation

des

points

de

choix

La

section

conclut

le

chapitre

La

gestion

des

points

de

choix

dans

la

WAM

L'impl

ementation

La

figure

illustre

l'agencement

d'un

point

de

choix

tel

qu'il

est

donn?e

par

Warren

dans

sa

description

de

la

WAM

-LSB-

-RSB-

et

la

figure

une

d?efinition

possible

des

instructions

manipulant

les

points

de

choix

En

fait

la

description

de

Warren

laisse

un

point

dans

l'ombre

comment

l'arit

e

du

point

de

choix

-LRB-

l'arit

e

du

pr?edicat

courant

a

la

cr?eation

du

point

de

choix

c'est

a-dire

le

nombre

d'arguments

sauvegard?es

-RRB-

est-elle

connue

des

instructions

charg?ees

de

sauvegarder

et

restaurer

les

registres

arguments

Le

code

de

la

figure

r?epond

a

la

question

tout

en

restant

fid?ele

a

la

description

de

Warren

en

particulier

en

terme

de

formats

des

instructions

L'instruction

try

-LRB-

-RRB-

cr?ee

un

point

de

choix

L'arit

e

du

point

de

choix

La

gestion

des

points

de

choix

Am

-LRB-

B

-RRB-

-LRB-

B

-RRB-

E

-LRB-

B

-RRB-

CP

-LRB-

E

-RRB-

B

-LRB-

B

-RRB-

bp

-LRB-

B

-RRB-

T

-LRB-

B

-RRB-

G

-LRB-

B

-RRB-

oe

oe

Pile

locale

B

l

Figure

WAM

Agencement

d'un

point

de

choix

est

accessible

par

l'interm

ediaire

du

point

de

continuation

CP

En

effet

CP

-LRB-

call/execute

-RRB-

pointe

par

d?efinition

sur

l'appel

du

pr?edicat

courant

instruction

call

ou

execute

qui

fournit

plus

ou

moins

directement

l'arit

e

de

l'appel

Dans

le

cas

d'un

appel

direct

-LRB-

le

param?etre

de

l'instruction

d'appel

est

l'adresse

du

point

d'entr

ee

de

la

proc?edure

-RRB-

il

suffit

par

exemple

de

syst?ematiquement

ranger

l'arit

e

dans

le

mot

pr?ec?edent

le

point

d'entr

ee

de

la

proc?edure

Dans

le

cas

d'un

appel

indirect

par

l'interm

ediaire

de

la

table

des

proc?edures

l'arit

e

se

trouvera

dans

la

table

avec

le

point

d'entr

ee

de

la

proc?edure

Enfin

l'arit

e

peut

etre

directement

pass?ee

en

param?etre

des

instructions

d'appel

Notons

aussi

le

calcul

du

sommet

de

la

pile

locale

l

max

-LRB-

B

E

-LRB-

CP

-RRB-

-RRB-

L'instruction

retry

-LRB-

-RRB-

met

simplement

a

jour

le

point

de

retour

arri?ere

bp

-LRB-

B

-RRB-

L'instruction

trust

-LRB-

-RRB-

lib?ere

le

point

de

choix

en

redonnant

au

registre

B

son

ancienne

valeur

B

-LRB-

B

-RRB-

Comme

le

sommet

de

la

pile

globale

a

la

cr?eation

du

point

de

choix

G

-LRB-

B

-RRB-

est

cach?e

dans

le

registre

GB

afin

d'acc

el?erer

les

tests

de

tra

la

lib?eration

d'un

point

de

choix

requiert

une

remise

a

jour

de

GB

La

seule

diff?erence

entre

les

instructions

try

retry

et

trust

et

les

instructions

et

correspondantes

est

que

dans

le

cas

de

la

premi?ere

famille

d'instructions

l'adresse

de

la

clause

a

s?electionner

est

donn?ee

en

param?etre

et

l'adresse

de

retour

arri?ere

correspond

simplement

a

l'instruction

suivante

n

a

de

sens

que

si

le

registre

GB

est

un

registre

machine

D'apr

es

l'

etude

de

Touati

et

Despain

-LSB-

-RSB-

les

b?en?efices

de

ce

registre

additionnel

sont

m

eme

dans

ce

cas

marginaux

La

gestion

des

points

de

choix

dans

la

WAM

try

adresse

clause

l

max

-LRB-

B

E

-LRB-

CP

-RRB-

-RRB-

-LRB-

l

arit?e

-LRB-

CP

-RRB-

-RRB-

bp

P

-LRB-

P

-RRB-

ole

-LRB-

l

E

CP

B

bp

T

G

-RRB-

GB

G

P

retry

adresse

clause

bp

-LRB-

B

-RRB-

P

-LRB-

P

-RRB-

P

trust

adresse

clause

B

B

-LRB-

B

-RRB-

GB

G

-LRB-

B

-RRB-

P

fail

arit?e

B

max

-LRB-

B

-LRB-

B

-RRB-

E

-LRB-

B

-RRB-

-LRB-

CP

-LRB-

B

-RRB-

-RRB-

-RRB-

restaurer

etat

-LRB-

arit?e

-RRB-

P

bp

-LRB-

B

-RRB-

empiler

arguments

-LRB-

l

arit?e

-RRB-

for

-LRB-

i

arit?e

i

-LRB-

i

l

-RRB-

-RRB-

l

A

-LSB-

i

-RSB-

restaurer

etat

-LRB-

arit?e

-RRB-

d?etra

ner

-LRB-

-RRB-

G

GB

CP

CP

-LRB-

B

-RRB-

E

E

-LRB-

B

-RRB-

-LRB-

arit?e

-RRB-

d?etra

ner

-LRB-

-RRB-

while

-LRB-

T

T

-LRB-

B

-RRB-

-RRB-

do

d?elier

-LRB-

-LRB-

T

-RRB-

-RRB-

restaurer

arguments

-LRB-

arit?e

-RRB-

for

-LRB-

i

i

arit?e

i

-RRB-

A

-LSB-

i

-RSB-

-LRB-

B

i

-RRB-

Figure

WAM

Instructions

de

gestion

des

points

de

choix

La

gestion

des

points

de

choix

p

-LRB-

f

-RRB-

p

-LRB-

f

-LRB-

X

-RRB-

-RRB-

p

-LRB-

Default

-RRB-

try

retry

trust

try

trust

try

trust

code

de

la

clause

code

de

la

clause

code

de

la

clause

Figure

S?equencement

des

clauses

Famille

try

La

gestion

des

points

de

choix

dans

la

WAM

code

de

la

clause

fail

code

de

la

clause

ajout

d'une

troisi?eme

clause

code

de

la

clause

code

de

la

clause

fail

code

de

la

clause

Figure

S?equencement

des

clauses

Famille

try

me

else

C'est

l'inverse

dans

le

cas

de

la

deuxi?eme

famille

Lorsque

le

m?ecanisme

d'indexation

assurant

un

pr?efiltrage

des

clauses

candidates

en

fonction

de

crit?eres

simples

tels

que

le

type

des

arguments

d'appel

-LRB-

du

premier

argument

dans

la

WAM

standard

-RRB-

conduit

a

g?en?erer

plusieurs

s?equences

de

clauses

candidates

les

instructions

try

retry

et

trust

permettent

de

partager

le

code

des

clauses

apparaissant

dans

plusieurs

s?equences

Ainsi

figure

la

troisi?eme

clause

doit

etre

essay?ee

quel

que

soit

le

type

du

premier

argument

variable

constante

liste

ou

structure

-LRB-

l'instruction

transf?ere

le

contr

ole

a

l'une

des

adresses

pass?ees

en

param?etre

suivant

le

type

du

premier

argument

variable

constante

liste

ou

structure

-RRB-

Dans

le

cas

d'une

s?equence

de

clauses

unique

les

instructions

et

sont

utilis?ees

Elles

permettent

d'ajouter

et

de

supprimer

des

clauses

par

simple

modification

d'une

instruction

-LRB-

voir

exemple

figure

-RRB-

La

primitive

d'

echec

fail

est

charg?ee

du

retour

arri?ere

essentiellement

au

sein

des

instructions

d'unification

En

pratique

fail

est

aussi

utile

en

tant

qu'instruction

afin

de

pouvoir

d?eclencher

un

retour

arri?ere

dans

divers

contextes

indexation

pr?edicats

pr?ed?efinis

conditionnelles

etc.

La

primitive

fail

se

charge

du

d?etra

nage

tous

les

enregistrements

entre

les

registres

T

et

T

-LRB-

B

-RRB-

sont

d?epil?es

et

les

cellules

correspondantes

transform?ees

en

des

auto-r

ef?erences

Les

registres

G

CP

et

E

reprennent

les

valeurs

qu'ils

avaient

a

la

cr?eation

du

point

de

choix

courant

soit

G

-LRB-

B

-RRB-

CP

-LRB-

B

-RRB-

et

E

-LRB-

B

-RRB-

Les

registres

arguments

sont

aussi

restaur?es

et

le

contr

ole

est

transf?er?e

a

l'adresse

donn?ee

par

le

point

de

retour

arri?ere

bp

-LRB-

B

-RRB-

La

primitive

fail

ne

peut

pas

afin

de

restaurer

les

registres

arguments

directement

acc?eder

a

l'arit

e

du

but

cible

du

retour

arri?ere

Cependant

il

lui

est

possible

d'acc

eder

La

gestion

des

points

de

choix

oe

oe

Pile

locale

B

l

E

-LRB-

B

-RRB-

CP

-LRB-

E

-RRB-

T

-LRB-

B

-RRB-

G

-LRB-

B

-RRB-

B

-LRB-

B

-RRB-

bp

-LRB-

B

-RRB-

Am

-LRB-

B

-RRB-

-LRB-

B

-RRB-

m

Figure

Point

de

choix

avec

champ

arit?e

Agencement

au

fond

du

point

de

choix

En

effet

au

moment

d'empiler

un

point

de

choix

le

sommet

de

la

pile

est

donn?e

par

max

-LRB-

B

E

-LRB-

CP

-RRB-

-RRB-

Une

fois

le

point

de

choix

cr?e?e

le

fond

du

point

de

choix

est

donc

max

-LRB-

B

-LRB-

B

-RRB-

E

-LRB-

B

-RRB-

-LRB-

B

-RRB-

-RRB-

-RRB-

-LRB-

et

non

B

-LRB-

B

-RRB-

comme

le

sugg?ere

malencontreusement

-LSB-

-RSB-

-RRB-

ce

qui

donne

acc?es

a

Am

-LRB-

B

-RRB-

alors

que

B

donne

acc?es

a

-LRB-

B

-RRB-

Ce

calcul

du

fond

du

point

de

choix

est

malheureusement

assez

co

uteux

Il

y

deux

mani?eres

de

r?egler

ce

probl?eme

sans

modifier

la

d?efinition

de

fail

ffl

Le

nombre

de

registres

sauv?es

dans

le

point

de

choix

est

constant

ffl

Un

champ

arit?e

est

ajout?e

au

point

de

choix

par

exemple

comme

indiqu?e

figure

a

distance

fixe

de

B.

La

premi?ere

solution

a

et?e

adopt?ee

pour

la

machine

PLM

pour

laquelle

les

registres

arguments

de

la

machine

sont

syst?ematiquement

sauvegard?es

dans

un

point

de

choix

de

taille

fixe

-LSB-

-RSB-

Cela

n'est

evidemment

pas

tr?es

satisfaisant

les

points

de

choix

occupent

plus

de

m?emoire

que

n?ecessaire

le

r?ecup?erateur

de

m?emoire

doit

consid?erer

tous

les

registres

sauvegard?es

comme

racines

de

la

r?ecup?eration

et

g?erer

la

possibilit?e

de

r?ef?erences

illicites

et

le

traitement

des

pr?edicats

d'arit

e

sup?erieure

a

est

rendu

assez

epineux

Un

petit

aspect

positif

est

une

possible

acc?el?eration

de

la

sauvegarde

et

de

la

restauration

des

registres

due

a

l'absence

de

test

Pour

ce

qui

est

de

la

seconde

solution

l'arit

e

peut

etre

pass?ee

comme

param?etre

des

instructions

d'appel

de

pr?edicat

comme

l'

a

sugg?er?e

A

t-Kaci

-LSB-

-RSB-

ou

comme

param?etre

La

gestion

des

points

de

choix

dans

la

WAM

try

arit?e

adresse

clause

l

max

-LRB-

B

E

-LRB-

CP

-RRB-

-RRB-

-LRB-

l

arit?e

-RRB-

bp

P

-LRB-

P

-RRB-

ole

-LRB-

l

arit?e

E

CP

B

bp

T

G

-RRB-

GB

G

P

fail

restaurer

etat

-LRB-

m

-LRB-

B

-RRB-

-RRB-

P

bp

-LRB-

B

-RRB-

restaurer

arguments

-LRB-

arit?e

-RRB-

for

-LRB-

i

i

arit?e

i

-RRB-

A

-LSB-

i

-RSB-

-LRB-

B

i

-RRB-

Figure

Point

de

choix

avec

champ

arit?e

Instructions

des

instructions

charg?ees

de

cr?eer

un

point

de

choix

-LRB-

try

et

-RRB-

comme

par

exemple

dans

le

jeu

d'instructions

utilis?e

par

Tick

pour

etudier

le

comportement

m?emoire

de

Prolog

-LSB-

-RSB-

Cette

seconde

option

est

meilleure

que

la

premi?ere

si

l'arit

e

est

pass?ee

en

param?etre

des

instructions

d'appel

elle

doit

etre

sauvegard?ee

dans

un

registre

temporaire

ce

qui

n

a

pas

de

raison

d'

etre

si

l'ex

ecution

ne

revient

pas

sur

cet

appel

suite

a

un

retour

arri?ere

profond

Les

instructions

correspondantes

sont

donn?ees

figure

-LRB-

les

instructions

retry

et

trust

ne

sont

pas

modifi?ees

-RRB-

Deux

impl?ementations

de

la

primitive

d'

echec

Revenons

sur

la

n?ecessit?e

d'un

champ

arit?e

dans

le

point

de

choix

Ce

champ

est

utilis?e

par

la

primitive

d'

echec

pour

restaurer

les

registres

arguments

Telle

que

d?efinie

ci-dessus

la

restauration

de

l'

etat

au

retour

arri?ere

a

lieu

par

l'interm

ediaire

de

la

primitive

d'

echec

dans

le

contexte

du

but

en

echec

et

non

pas

dans

le

contexte

du

but

cible

du

retour

arri?ere

Aussi

il

n'est

pas

possible

d'indiquer

statiquement

a

la

primitive

fail

l'arit

e

du

point

de

choix

cible

du

retour

arri?ere

En

fait

cette

arit?e

peut

m

eme

changer

d'un

echec

a

l'autre

Il

est

toutefois

possible

de

d?eplacer

une

partie

du

retour

arri?ere

du

but

en

echec

au

but

cible

du

retour

arri?ere

En

effet

la

premi?ere

instruction

ex?ecut?ee

apr?es

un

echec

est

obligatoirement

soit

une

instruction

retry

soit

une

instruction

trust

Chacune

La

gestion

des

points

de

choix

try

arit?e

adresse

clause

l

max

-LRB-

B

E

-LRB-

CP

-RRB-

-RRB-

-LRB-

l

arit?e

-RRB-

bp

P

-LRB-

P

-RRB-

ole

-LRB-

l

E

CP

B

bp

T

G

-RRB-

GB

G

P

retry

arit?e

adresse

clause

restaurer

etat

-LRB-

arit?e

-RRB-

bp

-LRB-

B

-RRB-

P

-LRB-

P

-RRB-

P

trust

arit?e

adresse

clause

restaurer

etat

-LRB-

arit?e

-RRB-

B

B

-LRB-

B

-RRB-

GB

G

-LRB-

B

-RRB-

P

fail

P

bp

-LRB-

B

-RRB-

Figure

WAM

Primitive

d'

echec

r?eduite

Instructions

Le

retour

arri?ere

superficiel

des

op?erations

el?ementaires

effectu?ees

lors

du

retour

arri?ere

le

transfert

de

contr

ole

initial

except?e

peut

etre

d?eplac?ee

de

la

primitive

d'

echec

vers

les

instructions

retry

et

trust

C'est

en

particulier

le

cas

de

la

restauration

des

registres

Comme

ces

instructions

font

partie

du

code

du

but

cible

du

retour

arri?ere

il

n

y

a

aucune

difficult?e

a

ajouter

a

ces

instructions

un

param?etre

indiquant

l'arit

e

du

but

Cette

id?ee

a

et?e

appliqu?ee

dans

les

machines

abstraites

du

syst?eme

ECRC-Prolog

-LSB-

-RSB-

et

de

la

machine

ICM

-LSB-

-RSB-

Dans

ECRC-Prolog

seule

la

restauration

des

registres

a

et?e

retir?ee

de

la

primitive

d'

echec

Dans

ICM

l'action

de

fail

est

limit?ee

au

d?etra

nage

et

au

transfert

de

contr

ole

les

instructions

retry

et

trust

-LRB-

me

-RRB-

sont

plus

complexes

ce

qui

augmente

les

possibilit?es

d'utilisation

du

micro-parall

elisme

disponible

au

niveau

mat?eriel

La

machine

abstraite

de

KCM

va

plus

loin

le

primitive

d'

echec

n'est

qu'un

simple

transfert

de

contr

ole

Le

point

de

retour

arri?ere

bp

-LRB-

B

-RRB-

etant

stock?e

dans

le

registre

machine

BP

-LRB-

n?ecessaire

a

la

cr?eation

retard?ee

des

points

de

choix

voir

section

-RRB-

la

primitive

d'

echec

n'est

qu'un

simple

branchement

conditionnel

jmpcc

FALSE

BP

ce

qui

facilite

l'

ecriture

de

microcode

et

de

macrocode

et

ne

co

ute

que

cycles

en

cas

d'

echec

-LRB-

cycle

en

cas

de

succ?es

-RRB-

D?es

que

la

primitive

d'

echec

inclut

d'autres

op?erations

une

indirection

suppl?ementaire

est

n?ecessaire

d'

o?u

un

co

ut

additionnel

de

cycles

Les

instructions

correspondant

a

l'impl

ementation

d'une

primitive

d'

echec

r?eduite

c'est

a-dire

qui

n'effectue

qu'un

simple

transfert

de

contr

ole

sont

donn?ees

figure

Notons

qu'un

traitement

complet

de

la

restauration

de

l'

etat

par

les

instructions

retry

et

trust

a

aussi

l'avantage

de

faciliter

la

d?efinition

d'un

mode

sp?ecial

de

compilation

adapt?e

a

la

mise

au

point

qui

permet

de

capturer

a

l'ex

ecution

les

liaisons

responsables

d'un

echec

il

suffit

de

remplacer

ces

instructions

par

des

appels

de

proc?edure

donnant

le

contr

ole

au

traceur

Le

retour

arri?ere

superficiel

Principes

La

distinction

entre

les

deux

types

de

retour

arri?ere

profond

et

superficiel

a

et?e

introduit

par

Warren

dans

sa

premi?ere

machine

virtuelle

PLM

-LSB-

-RSB-

Un

retour

arri?ere

superficiel

correspond

a

un

echec

de

l'unification

dans

la

t

ete

d'une

clause

alors

que

toutes

les

clauses

candidates

n'ont

pas

et?e

essay?ees

Un

point

de

choix

a

et?e

cr?e?e

pour

l'appel

courant

et

n

a

pas

encore

et?e

lib?er?e

L'ex

ecution

va

changer

de

clause

mais

ne

va

pas

sortir

du

pr?edicat

courant

Une

fois

les

clauses

candidates

essay?ees

soit

qu'il

n

y

ait

jamais

eu

de

point

de

choix

soit

que

ce

point

de

choix

ait

juste

et?e

lib?er?e

suite

a

l'essai

de

la

derni?ere

clause

possible

un

echec

profond

a

lieu

le

but

cible

du

retour

arri?ere

est

diff?erent

du

but

en

echec

le

tutoriel

d'

A

t-Kaci

-LSB-

-RSB-

toutes

les

op?erations

sont

d?eplac?ees

mais

sans

qu'il

en

soit

tir?e

aucun

avantage

La

gestion

des

points

de

choix

L'observation

essentielle

est

que

le

retour

arri?ere

superficiel

ne

demande

pas

au

contraire

d'un

retour

arri?ere

profond

une

restauration

compl?ete

de

l'

etat

Dans

la

WAM

il

n'est

pas

n?ecessaire

de

restaurer

l'information

de

continuation

c'est

a-dire

les

registres

E

et

CP

Cela

peut

etre

etendu

aux

registres

arguments

Le

compilateur

doit

alors

faire

en

sorte

de

ne

pas

modifier

ces

registres

lors

de

l'unification

-LRB-

cette

condition

peut

etre

rel

ach?ee

nous

y

reviendrons

-RRB-

Bien

s

ur

restauration

du

sommet

de

la

pile

globale

et

d?etra

nage

sont

toujours

requis

La

machine

PLM

g?ere

le

contr

ole

a

l'aide

d'un

enregistrement

d'activation

unique

qui

combine

information

de

continuation

et

information

de

retour

arri?ere

Cette

derni?ere

n'est

pr?esente

que

si

l'enregistrement

d'activation

correspond

a

un

appel

pour

lequel

il

existe

un

point

de

choix

-LRB-

au

sens

g?en?eral

de

ce

terme

-RRB-

Pour

les

besoins

du

retour

arri?ere

le

syst?eme

garde

l'adresse

du

dernier

enregistrement

d'activation

avec

point

de

choix

Lors

d'un

echec

il

suffit

de

comparer

cette

adresse

a

l'adresse

de

l'enregistrement

courant

pour

savoir

si

l'

echec

est

profond

-LRB-

les

adresses

sont

diff?erentes

-RRB-

ou

pas

Dans

la

WAM

ce

n'est

pas

si

simple

et

alors

que

la

PLM

tire

parti

du

retour

arri?ere

superficiel

la

WAM

ne

fait

aucune

diff?erence

entre

les

deux

types

de

retour

arri?ere

Dans

ces

conditions

il

n'est

pas

surprenant

que

les

premi?eres

etudes

sur

le

comportement

m?emoire

de

Prolog

et

de

la

WAM

dues

a

Tick

-LSB-

-RSB-

aient

d?esign?e

les

points

de

choix

comme

les

structures

de

donn?ees

les

plus

fr?equemment

acc?ed?ees

et

les

retours

arri?ere

superficiels

comme

une

source

d'am

elioration

prometteuse

L'impl

ementation

Un

traitement

simple

du

retour

superficiel

dans

la

WAM

repose

sur

l'observation

que

etant

donn?ee

une

s?equence

de

clauses

s?electionnables

apr?es

indexation

un

retour

arri?ere

superficiel

ne

peut

etre

d?eclench?e

que

dans

une

zone

tr?es

d?elimit?ee

la

zone

de

retour

arri?ere

superficiel

constitu?ee

des

t

etes

des

clauses

non

terminales

Supposons

qu'un

nouveau

drapeau

superficiel

indique

au

moment

m

eme

du

d?eclenchement

du

retour

arri?ere

si

l'ex

ecution

se

trouve

en

zone

de

retour

arri?ere

superficiel

-LRB-

superficiel

vrai

-RRB-

ou

pas

-LRB-

superficiel

faux

-RRB-

Il

est

alors

possible

de

savoir

s

il

est

n?ecessaire

de

restaurer

tout

l'

etat

Le

drapeau

superficiel

d?efinit

le

mode

de

retour

arri?ere

Voyons

comment

g?erer

ce

drapeau

Il

suffit

de

comprendre

comment

l'ex

ecution

p?en?etre

dans

la

zone

de

retour

arri?ere

superficielle

et

en

sort

En

marche

avant

l'ex

ecution

p?en?etre

dans

cette

zone

lors

de

la

s?election

de

la

premi?ere

clause

ce

qui

correspond

a

l'ex

ecution

d'une

instruction

try

L'ex

ecution

p?en?etre

aussi

dans

cette

zone

a

la

suite

d'un

retour

arri?ere

quand

une

clause

interm?ediaire

est

s?electionn?ee

Cela

correspond

a

l'ex

ecution

d'une

instruction

retry

Il

y

a

ensuite

deux

mani?eres

de

quitter

la

zone

peu

profonde

soit

l'unification

d'une

des

clauses

non

terminales

r?eussit

eventuellement

apr?es

une

s?erie

de

retours

superficiels

ou

la

clause

terminale

est

s?electionn?ee

a

la

suite

d'un

retour

arri?ere

quel

qu'il

soit

Dans

le

premier

cas

le

cou

de

la

clause

s?eparant

la

t

ete

du

corps

de

la

clause

est

atteint

et

soit

un

nouvel

appel

a

lieu

-LRB-

ex?ecu

Le

retour

arri?ere

superficiel

tion

d'une

instruction

call

ou

execute

-RRB-

soit

l'ex

ecution

quitte

le

pr?edicat

-LRB-

ex?ecution

d'une

instruction

proceed

-RRB-

Le

drapeau

superficiel

devrait

cons?equemment

etre

mis

a

vrai

en

entrant

dans

la

zone

de

retour

arri?ere

superficiel

c'est

a-dire

dans

les

instructions

try

et

retry

et

mis

a

faux

en

quittant

la

zone

dans

les

instructions

trust

ainsi

que

dans

les

instructions

call

execute

et

proceed

suivant

le

cou

de

toute

clause

non

terminale

Notons

qu'invalider

superficiel

dans

toutes

les

instructions

de

contr

ole

ET

est

correct

-LRB-

superficiel

vaut

d?ej?a

faux

-RRB-

bien

qu

eventuellement

non

optimal

Si

l'invalidation

du

drapeau

a

un

co

ut

une

impl?ementation

optimale

requiert

deux

familles

d'instructions

de

contr

ole

ET

une

premi?ere

famille

qui

invalide

le

drapeau

et

une

seconde

qui

ne

s

en

pr?eoccupe

pas

Une

autre

option

est

d'introduire

une

nouvelle

instruction

neck

marquant

le

cou

de

toute

clause

non

terminale

dont

l'unique

r

ole

est

d'invalider

le

drapeau

La

conception

de

la

machine

-LSB-

-RSB-

est

telle

que

le

drapeau

superficiel

est

un

des

bits

de

contr

ole

de

la

ROM

de

d?ecodage

de

l'unit

e

de

recherche

anticip?ee

des

instructions

En

fonction

de

la

valeur

du

drapeau

deux

microprogrammes

diff?erents

peuvent

etre

s?electionn?es

De

plus

le

micro-parall

elisme

de

la

machine

et

son

contr

ole

par

microcode

rendent

possible

une

mise

a

jour

du

drapeau

en

parall?ele

avec

le

transfert

de

contr

ole

qui

a

lieu

lors

d'une

instruction

de

contr

ole

ET

Du

point

de

vue

de

l'unit

e

d'ex

ecution

la

gestion

du

drapeau

ne

co

ute

rien

L'introduction

d'instructions

suppl?ementaires

n'est

pas

n?ecessaire

Le

drapeau

est

syst?ematiquement

invalid?e

dans

chaque

instruction

de

contr

ole

ET

Par

contre

la

machine

abstraite

d'ECRC-Prolog

-LSB-

-RSB-

con?cue

a

la

m

eme

epoque

pour

tourner

sur

des

processeurs

standard

inclut

une

s?erie

d'instructions

neck

La

figure

donne

le

code

des

instructions

que

l'on

obtient

apr?es

introduction

d'une

instruction

neck

et

passage

a

une

primitive

d'

echec

r?eduite

En

guise

d'exemple

le

code

du

pr?edicat

classique

est

donn?e

figure

Ce

code

est

presque

identique

au

code

fourni

par

Warren

comme

exemple

de

code

WAM

-LSB-

-RSB-

Les

seules

deux

diff?erences

sont

le

param?etre

suppl?ementaire

donnant

l'arit

e

du

pr?edicat

-LRB-

instructions

et

-RRB-

et

l'instruction

neck

ajout?ee

au

code

de

la

premi?ere

clause

L'instruction

d'indexation

aiguille

l'ex

ecution

vers

la

s?equence

de

clauses

correspondant

au

type

du

premier

argument

variable

constante

liste

ou

structure

Dans

le

cas

d'une

variable

les

deux

clauses

sont

candidates

-LRB-

etiquette

-RRB-

Dans

le

cas

d'une

constante

seule

la

premi?ere

clause

-LRB-

-RRB-

est

candidate

Dans

le

cas

d'une

liste

seule

la

seconde

clause

est

candidate

-LRB-

-RRB-

Finalement

dans

le

cas

d'une

structure

il

n

y

a

pas

de

clause

candidate

l'instruction

echoue

Nous

avons

suppos?e

ici

que

le

code

des

deux

clauses

etait

partag?e

entre

les

diff?erentes

s?equences

La

premi?ere

clause

appara

t

en

tant

que

clause

non

terminale

dans

la

s?equence

alors

que

la

deuxi?eme

clause

est

toujours

terminale

Aussi

la

premi?ere

clause

peut

conduire

a

un

retour

arri?ere

superficiel

La

drapeau

superficiel

est

mis

La

gestion

des

points

de

choix

try

arit?e

adresse

clause

superficiel

vrai

l

max

-LRB-

B

E

-LRB-

CP

-RRB-

-RRB-

-LRB-

l

arity

-RRB-

bp

P

-LRB-

P

-RRB-

ole

-LRB-

l

E

CP

B

bp

T

G

-RRB-

GB

G

P

retry

arit?e

adresse

clause

d?etra

ner

-LRB-

-RRB-

G

GB

if

-LRB-

superficiel

faux

-RRB-

-LCB-

superficiel

vrai

CP

CP

-LRB-

B

-RRB-

E

E

-LRB-

B

-RRB-

-LRB-

arit?e

-RRB-

-RCB-

bp

-LRB-

B

-RRB-

P

-LRB-

P

-RRB-

P

trust

arit?e

adresse

clause

d?etra

ner

-LRB-

-RRB-

G

GB

if

-LRB-

superficiel

faux

-RRB-

-LCB-

CP

CP

-LRB-

B

-RRB-

E

E

-LRB-

B

-RRB-

-LRB-

arit?e

-RRB-

-RCB-

else

superficiel

faux

B

B

-LRB-

B

-RRB-

GB

G

-LRB-

B

-RRB-

P

fail

P

bp

-LRB-

B

-RRB-

neck

superficiel

faux

Figure

WAM

Gestion

du

retour

arri?ere

superficiel

Instructions

Le

retour

arri?ere

superficiel

concatenate

-LRB-

-LSB-

-RSB-

L

L

-RRB-

concatenate

-LRB-

-LSB-

X

-RSB-

-LSB-

X

-RSB-

-RRB-

concatenate

-LRB-

-RRB-

fail

concatenate

-LRB-

-LSB-

-RSB-

L

L

neck

proceed

-RRB-

fail

concatenate

-LRB-

-LSB-

X

-RSB-

-LSB-

X

-RSB-

-RRB-

execute

concatenate

-LRB-

-RRB-

Figure

Code

de

avec

retour

arri?ere

superficiel

Clause

d'arr

et

en

t

ete

La

gestion

des

points

de

choix

concatenate

-LRB-

-LSB-

X

-RSB-

-LSB-

X

-RSB-

-RRB-

neck

concatenate

-LRB-

execute

-RRB-

Figure

Code

de

avec

retour

arri?ere

superficiel

Clause

r?ecursive

en

t

ete

a

vrai

par

l'instruction

L'insertion

d'une

instruction

neck

garantit

que

le

drapeau

est

invalid?e

en

fin

de

clause

De

plus

la

seconde

clause

etant

toujours

terminale

il

est

possible

de

modifier

les

registres

lors

de

l'unification

afin

de

simplifier

le

passage

des

arguments

et

de

r?eduire

la

longueur

des

cha

nes

de

liaisons

Les

registres

et

qui

contiennent

initialement

les

premier

et

troisi?eme

arguments

de

l'appel

re?coivent

la

queue

des

arguments

et

avant

la

fin

de

la

phase

d'unification

Le

code

g?en?er?e

est

a

comparer

avec

le

code

obtenu

apr?es

inversion

des

deux

clauses

-LRB-

voir

figure

-RRB-

Le

registre

ne

peut

plus

etre

modifi?e

du

fait

d'un

echec

potentiel

qui

r?esulterait

en

un

retour

arri?ere

superficiel

des

instructions

et

La

valeur

de

doit

etre

temporairement

rang?ee

dans

le

registre

et

copi?ee

dans

avant

l'appel

r?ecursif

a

Une

instruction

neck

doit

aussi

etre

introduite

afin

d'invalider

superficiel

eventuellement

mis

a

vrai

par

l'instruction

Notons

que

l'instruction

est

la

derni?ere

instruction

susceptible

d'

echouer

Il

est

donc

l?egitime

de

modifier

le

registre

dans

l'instruction

qui

suit

En

g?en?eral

en

plus

de

ralentir

le

passage

des

arguments

une

impl?ementation

ve

du

retour

arri?ere

superficiel

influe

n?egativement

sur

la

longueur

des

cha

nes

de

liaisons

lorsqu'une

variable

temporaire

est

d?er?ef?erenc?ee

dans

la

zone

de

retour

arri?ere

superficiel

il

n'est

plus

possible

d'utiliser

le

r?esultat

de

la

d?er?ef?erenciation

pour

mettre

a

jour

le

registre

correspondant

et

ainsi

potentiellement

r?eduire

la

cha

ne

de

liaisons

attach?ee

a

cette

variable

Il

est

possible

de

contourner

ce

probl?eme

en

augmentant

la

complexit?e

du

jeu

d'instructions

et

le

nombre

de

registres

utilis?es

a

l'ex

ecution

L'id

ee

est

de

rajouter

des

registres

destination

aux

instructions

d'unification

d?er?ef?eren?cant

des

variables

temporaires

Ces

registres

re?coivent

les

r?esultats

de

la

d?er?ef?erenciation

qui

sont

alors

utilis?es

pour

les

calculs

suivants

Le

retour

arri?ere

superficiel

concatenate

-LRB-

-LSB-

-RSB-

L

L

-RRB-

concatenate

-LRB-

-LSB-

X

-RSB-

-LSB-

X

-RSB-

-RRB-

concatenate

-LRB-

-RRB-

fail

concatenate

-LRB-

-LSB-

-RSB-

L

L

proceed

-RRB-

concatenate

-LRB-

-LSB-

-RSB-

L

L

neck

proceed

-RRB-

fail

concatenate

-LRB-

-LSB-

X

-RSB-

-LSB-

X

-RSB-

-RRB-

execute

concatenate

-LRB-

-RRB-

Figure

Code

de

Sch?ema

a

deux

s?equences

d'instructions

La

gestion

des

points

de

choix

mode

concatenate

-LRB-

-RRB-

concatenate

-LRB-

-LSB-

-RSB-

L

L

-RRB-

concatenate

-LRB-

-LSB-

X

-RSB-

-LSB-

X

-RSB-

-RRB-

concatenate

-LRB-

-RRB-

fail

concatenate

-LRB-

-LSB-

-RSB-

L

L

proceed

-RRB-

concatenate

-LRB-

-LSB-

X

-RSB-

-LSB-

X

-RSB-

-RRB-

execute

concatenate

-LRB-

-RRB-

Figure

Code

de

Utilisation

de

d?eclarations

de

modes

Les

b?en?efices

d'une

bonne

gestion

des

registres

peuvent

etre

partiellement

retrouv?es

en

dupliquant

du

code

Lorsqu'une

clause

appara

t

dans

deux

s?equences

de

clauses

en

position

terminale

dans

l'une

mais

pas

dans

l'autre

le

partage

de

code

interdit

toute

modification

des

registres

Il

est

toutefois

possible

de

g?en?erer

deux

s?equences

d'instructions

une

s?equence

sans

modification

des

registres

que

nous

dirons

de

type

superficiel

et

une

s?equence

de

type

profond

Il

est

alors

possible

de

choisir

la

s?equence

d'instructions

appropri?ee

suivant

la

position

de

la

clause

Cette

technique

est

illustr?ee

toujours

sur

le

m

eme

exemple

du

pr?edicat

figure

Deux

s?equences

d'instructions

sont

g?en?er?ees

pour

la

premi?ere

clause

de

sorte

que

si

l'argument

s

av?ere

etre

une

liste

vide

l'ex

ecution

d'une

instruction

neck

inutile

est

evit?ee

Notons

que

les

deux

versions

d'une

clause

ne

diff?erent

que

dans

la

phase

initiale

d'unification

Afin

de

limiter

le

facteur

d'expansion

du

code

qui

ne

peut

toutefois

etre

sup?erieur

a

le

reste

du

code

peut

etre

partag?e

gr

ace

a

l'utilisation

d'une

instruction

de

branchement

Bien

evidemment

les

registres

peuvent

etre

librement

modifi?es

si

le

compilateur

peut

ecarter

pour

l'une

des

raisons

suivantes

la

possibilit?e

d'un

retour

arri?ere

superficiel

ffl

Les

s?equences

dans

lesquelles

la

clause

appara

t

ne

comportent

qu'une

clause

Par

Le

retour

arri?ere

superficiel

exemple

si

le

pr?edicat

a

pour

mode

dans

un

contexte

donn?e

concatenate

-LRB-

-RRB-

c'est

a-dire

que

son

premier

argument

ne

peut

etre

une

variable

alors

l'indexation

va

choisir

entre

les

deux

clauses

ou

echouer

Le

code

correspondant

est

donn?e

figure

ffl

L'unification

ne

peut

pas

echouer

soit

que

l'unification

se

r?eduise

a

des

mouvements

de

donn?ees

soit

que

des

d?eclarations

ou

une

analyse

statique

permettent

de

garantir

la

forme

des

arguments

Un

traitement

efficace

du

second

cas

conduit

a

fournir

deux

familles

d'instructions

try

retry

et

trust

l'une

avec

support

pour

le

retour

arri?ere

superficiel

l'autre

sans

Il

est

alors

possible

de

choisir

a

la

compilation

de

g?en?erer

du

code

traitant

la

possibilit?e

d'un

retour

arri?ere

superficiel

ou

pas

tout

en

etant

capable

de

modifier

ce

choix

au

sein

m

eme

d'une

s?equence

de

clauses

Etendre

la

port?ee

du

retour

arri?ere

superficiel

etend

la

port?ee

du

retour

arri?ere

superficiel

a

ce

que

nous

appellerons

une

garde

L'id

ee

peut

etre

illustr?ee

par

une

transformation

de

chaque

clause

en

une

forme

normalis?ee

T

ete

<Garde>

Op?erateur

de

choix

<Corps>

Le

corps

de

la

clause

est

s?epar?e

en

deux

parties

une

garde

et

un

corps

La

fronti?ere

entre

les

deux

parties

est

marqu?ee

par

un

op?erateur

de

choix

La

garde

consiste

en

une

s?erie

de

buts

pr?ed?efinis

et

d?eterministes

compil?es

de

telle

sorte

que

ni

les

registres

arguments

ni

les

registres

de

continuation

ne

soient

modifi?es

L'op

erateur

de

choix

peut

etre

soit

une

coupure

soit

une

simple

marqueur

syntaxique

par

exemple

Un

echec

dans

la

garde

n'est

pas

alors

fondamentalement

diff?erent

d'un

echec

dans

la

t

ete

S'il

existe

une

autre

clause

candidate

on

se

retrouve

dans

une

situation

de

retour

arri?ere

superficiel

les

registres

de

continuation

et

les

registres

arguments

ont

d?ej?a

la

bonne

valeur

Il

s

agit

donc

simplement

d'

etendre

la

zone

de

retour

arri?ere

superficiel

aux

gardes

des

clauses

non

terminales

Dans

la

suite

on

consid?erera

la

garde

comme

faisant

partie

de

la

t

ete

de

la

clause

Le

cou

de

la

clause

correspond

alors

a

l'emplacement

de

l'op

erateur

de

choix

Pratiquement

la

composition

des

gardes

d?epend

de

d?etails

d'impl

ementation

Les

pr?edicats

pr?ed?efinis

utilisables

dans

une

garde

sont

typiquement

les

pr?edicats

d'unification

de

comparaison

de

test

de

type

et

de

calcul

arithm?etique

Les

appels

a

la

plupart

de

ces

pr?edicats

sont

habituellement

compil?es

en

ligne

Les

gardes

peuvent

aussi

faire

appel

a

des

pr?edicats

pr?ed?efinis

cod?es

dans

un

langage

autre

que

Prolog

par

exemple

C

dans

un

syst?eme

ecrit

dans

ce

langage

ce

cas

la

compilation

de

l'unification

peut

aussi

etre

simplifi?ee

l'instruction

get

n'est

pas

n?ecessaire

et

le

code

g?en?er?e

pour

-LSB-

X

-RSB-

peut

etre

sp?ecialis?e

L'utilisation

d'une

instruction

aussi

complexe

que

switch

on

term

n'est

pas

non

plus

n?ecessaire

La

gestion

des

points

de

choix

retours

superficiels

programme

nb

retours

t

ete

garde

total

type

arith

boyer

browse

chat

parser

crypt

deriv

fast

mu

flatten

meta

qsort

mu

nand

nreverse

poly

prover

qsort

122 100 100

queens

query

reducer

sdda

sendmore

serialise

simple

analyser

tak

unify

zebra

Table

R?epartition

des

retours

arri?ere

superficiels

entre

t

ete

et

garde

Le

retour

arri?ere

superficiel

Le

tableau

illustre

l'importance

d'

etendre

le

retour

arri?ere

superficiel

aux

gardes

Ce

tableau

donne

pour

chaque

programme

de

test

d'Aquarius

-LSB-

-RSB-

et

relativement

au

nombre

total

de

retours

arri?ere

le

pourcentage

de

retours

arri?ere

superficiels

dans

les

t

etes

et

dans

les

gardes

Les

gardes

incluent

des

appels

aux

pr?edicats

pr?ed?efinis

d'unification

de

test

de

type

et

d'arithm

etique

La

table

donne

aussi

les

poids

respectifs

de

l'arithm

etique

d'une

part

et

de

l'unification

et

du

test

de

type

d'autre

part

Ces

chiffres

ont

et?e

obtenus

en

modifiant

la

partie

g?en?eration

de

code

natif

du

compilateur

Prolog

de

KCM

ajoutant

du

code

d'instrumentation

a

la

d?efinition

des

instructions

de

contr

ole

OU

et

ex?ecutant

sur

KCM

le

code

obtenu

a

partir

du

compilateur

modifi?e

Bien

evidemment

le

nombre

de

retours

arri?ere

superficiels

observ?e

d?epend

du

m?ecanisme

d'indexation

utilis?e

Le

m?ecanisme

utilis?e

dans

le

compilateur

de

KCM

ne

diff?ere

pas

substantiellement

de

la

WAM

Trois

points

peuvent

toutefois

influer

sur

le

nombre

de

retours

arri?ere

et

doivent

donc

etre

signal?es

ffl

Contrairement

a

la

WAM

l'indexation

ne

peut

pas

conduire

a

la

cr?eation

de

deux

points

de

choix

pour

un

m

eme

appel

-LRB-

un

choix

datant

d'ICM

et

motiv?e

par

la

mise

en

oeuvre

de

l'op

eration

de

coupure

voir

section

-RRB-

ffl

Plut

ot

que

d'indexer

sur

un

argument

fix?e

le

premier

le

compilateur

de

KCM

indexe

sur

le

premier

argument

discriminant

-LRB-

les

arguments

etant

examin?es

de

gauche

a

droite

-RRB-

d'

o?u

pour

le

programmeur

une

plus

grande

libert?e

dans

l'agencement

des

arguments

ffl

L'occurrence

d'un

test

de

type

ou

en

t

ete

de

la

garde

de

la

premi?ere

clause

est

prise

en

compte

lors

du

choix

de

l'argument

d'indexation

et

int?egr?e

au

code

g?en?er?e

pour

l'indexation

Ces

points

vont

dans

le

sens

d'une

r?eduction

du

nombre

de

retours

arri?ere

superficiels

tout

en

etant

extr

emement

simples

a

mettre

en

oeuvre

Le

compilateur

peut

aussi

g?en?erer

une

deuxi?eme

s?equence

d'indexation

sur

un

deuxi?eme

argument

discriminant

dans

le

cas

o?u

le

premier

s

av?ere

-LRB-

a

l'ex

ecution

-RRB-

etre

une

variable

Mais

cette

option

n

a

pas

et?e

utilis?ee

ici

-LRB-

il

en

sera

de

m

eme

dans

la

suite

-RRB-

En

effet

des

tests

pr?eliminaires

ont

montr?e

que

bien

qu'utile

dans

certains

cas

d'

o?u

la

cr?eation

d'une

option

de

compilation

une

indexation

sur

deux

arguments

est

en

g?en?eral

n?efaste

ses

effets

positifs

ne

contrebalancent

pas

la

diminution

de

localit?e

due

a

la

croissance

de

la

taille

du

code

Le

programme

de

tri

qsort

est

typique

d'une

large

classe

de

programmes

pour

lesquels

l'extension

du

retour

arri?ere

a

un

impact

significatif

Dans

ce

programme

le

retour

arri?ere

est

limit?e

a

la

garde

de

la

premi?ere

clause

du

pr?edicat

un

test

arithm?etique

qui

d?ecide

a

quelle

partie

de

la

partition

le

premier

el?ement

de

la

liste

a

partitionner

appartient

Les

codes

Prolog

et

WAM

de

sont

donn?es

figure

Une

seconde

version

dans

l'esprit

du

code

g?en?er?e

pour

o?u

le

test

arithm?etique

est

cod?e

en

ligne

est

donn?ee

figure

Des

instructions

arithm?etiques

sp?ecifiques

font

leur

apparition

L'instruction

eval

Vm

An

evalue

l'expression

arithm?etique

repr?esent?ee

dans

le

registre

Vm

et

place

le

r?esultat

de

l'

evaluation

dans

La

gestion

des

points

de

choix

partition

-LRB-

-LSB-

X

L

-RSB-

Y

-LSB-

X

-RSB-

-RRB-

X

Y

partition

-LRB-

L

Y

-RRB-

partition

-LRB-

-LSB-

X

L

-RSB-

Y

-LSB-

X

-RSB-

-RRB-

partition

-LRB-

L

Y

-RRB-

partition

-LRB-

-LSB-

-RSB-

-LSB-

-RSB-

-LSB-

-RSB-

-RRB-

partitition

-LRB-

-LSB-

X

L

-RSB-

-LSB-

X

-RSB-

Y

-RRB-

-LRB-

X

call

Y

-RRB-

cut

partition

-LRB-

L

Y

execute

-RRB-

Figure

Code

de

Le

retour

arri?ere

superficiel

partitition

-LRB-

-LSB-

X

L

-RSB-

Y

-LSB-

X

-RSB-

-RRB-

eval

-LRB-

X

eval

Y

lt

-RRB-

neckcut

partition

-LRB-

L

Y

execute

-RRB-

Figure

Code

de

avec

retour

arri?ere

superficiel

le

registre

An

L'instruction

lt

Vm

Vn

r?eussit

si

le

registre

Vm

repr?esente

un

nombre

inf?erieur

au

nombre

repr?esent?e

par

le

registre

Vn

Avec

ce

type

de

code

un

echec

du

test

arithm?etique

conduit

a

un

retour

arri?ere

superficiel

Notons

que

la

compilation

en

ligne

du

test

a

d'autres

b?en?efices

En

particulier

la

clause

se

comporte

comme

une

clause

binaire

il

n'est

pas

n?ecessaire

de

cr?eer

d'environnement

pour

cette

clause

La

compilation

en

ligne

de

l'arithm

etique

n'est

toutefois

pas

compatible

avec

une

r?ecup?eration

sophistiqu?ee

des

erreurs

Elle

n'est

pas

non

plus

compatible

cela

est

directement

li?e

avec

un

gel

des

buts

arithm?etiques

en

cas

de

d?efaut

d'instanciation

des

arguments

Ainsi

si

le

terme

evalu?e

par

l'instruction

eval

s

av?ere

ne

pas

repr?esenter

un

nombre

il

n'est

pas

possible

de

faire

bien

plus

qu'imprimer

un

message

d'erreur

et

echouer

Dans

le

contexte

du

syst?eme

SEPIA

un

m?ecanisme

de

r?ecup?eration

d'erreur

g?en?erique

a

et?e

d?efini

En

cas

d'erreur

un

ev?enement

dit

synchrone

est

d?eclench?e

et

l'ex

ecution

d'un

pr?edicat

d?edi?e

de

gestion

des

ev?enements

vient

remplacer

l'ex

ecution

du

but

erron?e

-LSB-

-RSB-

En

particulier

si

l'un

des

arguments

de

est

une

variable

une

erreur

d'instanciation

est

d?eclench?ee

Le

gel

d'un

but

arithm?etique

peut

simplement

etre

obtenu

en

red?efinissant

le

pr?edicat

g?erant

ces

erreurs

d'instanciation

comme

un

simple

gel

du

but

arithm?etique

Dans

ce

contexte

maintenir

une

compilation

en

ligne

de

l'arithm

etique

requiert

information

de

typage

et

de

suspension

Une

solution

minimale

consiste

a

fournir

une

option

de

compilation

arithm?etique

en

ligne

qui

force

la

compilation

en

ligne

et

permet

donc

de

compiler

de

la

mani?ere

la

plus

efficace

possible

les

parties

de

programmes

que

l'on

sait

sans

erreur

de

type

et

sans

gel

des

pr?edicats

arithm?etiques

Cette

option

disponible

dans

le

compilateur

KCM

a

et?e

utilis?ee

lors

de

la

compilation

des

programmes

de

la

table

Pr?ecisons

que

l'arithm

etique

compil?ee

La

gestion

des

points

de

choix

avec

cette

option

continue

a

d?etecter

erreurs

de

type

et

Une

solution

plus

satisfaisante

consisterait

a

s

appuyer

sur

des

informations

de

type

et

de

suspension

donn?ees

par

l'utilisateur

ou

calcul?ees

par

analyse

statique

Gestion

du

mode

de

retour

arri?ere

a

la

compilation

En

l'absence

de

support

mat?eriel

la

gestion

du

mode

de

retour

arri?ere

n'est

pas

transparente

Une

plus

grande

sp?ecialisation

du

jeu

d'instructions

permet

de

compiler

les

tests

et

changements

du

mode

de

retour

arri?ere

Utilisation

d'une

primitive

d'

echec

r?eduite

En

premier

lieu

chacune

des

instructions

de

la

figure

qui

d?ependent

du

mode

de

retour

c'est

a-dire

les

instructions

retry

et

trust

donne

naissance

a

deux

instructions

l'une

fonctionnant

en

mode

profond

et

l'autre

en

mode

superficiel

comme

le

montre

la

figure

La

version

en

mode

superficiel

n'ex

ecute

qu'un

sous-ensemble

des

op?erations

effectu?ees

par

la

version

en

mode

profond

ni

les

registres

de

continuation

ni

les

registres

arguments

ne

sont

restaur?es

En

second

lieu

les

s?equences

de

clauses

sont

organis?ees

comme

le

montre

la

figure

En

g?en?eral

deux

s?equences

d'instructions

sont

g?en?er?ees

pour

chaque

clause

une

s?equence

en

mode

superficiel

sans

modification

des

registres

et

une

s?equence

en

mode

profond

Les

queues

de

ces

deux

s?equences

peuvent

etre

partag?ees

comme

pr?ec?edemment

mentionn?e

A

l'entr

ee

de

la

zone

de

retour

superficiel

le

point

de

retour

arri?ere

bp

-LRB-

BP

-RRB-

est

initialis?e

de

mani?ere

a

pointer

sur

le

code

a

ex?ecuter

en

cas

de

retour

arri?ere

superficiel

Ce

code

d?emarre

avec

l'instruction

suivante

dans

le

cas

d'une

instruction

try

ou

Dans

le

cas

d'une

instruction

il

est

n?ecessaire

de

sauter

l'instruction

suivante

A

la

sortie

de

la

zone

de

retour

superficiel

le

point

de

retour

arri?ere

est

soit

mis

a

jour

implicitement

du

fait

de

la

lib?eration

du

point

de

choix

courant

par

l'instruction

trust

soit

mis

a

jour

explicitement

par

une

instruction

neck

ou

La

premi?ere

de

ces

deux

derni?eres

instructions

est

utilis?ee

dans

le

cas

o?u

la

clause

est

partag?ee

entre

plusieurs

s?equences

de

clauses

la

valeur

de

bp

-LRB-

B

-RRB-

est

alors

calcul?ee

dynamiquement

elle

vaut

bp

-LRB-

B

-RRB-

-LRB-

retry/trust

-RRB-

Dans

le

cas

contraire

sa

valeur

peut

etre

calcul?ee

statiquement

et

pass?ee

en

param?etre

de

Dans

le

contexte

d'un

syst?eme

o?u

le

langage

C

est

le

langage

cible

du

compilateur

l'astuce

qui

consiste

a

incr?ementer

bp

-LRB-

B

-RRB-

afin

de

passer

du

point

de

retour

superficiel

au

point

de

retour

profond

et

qui

suppose

donc

qu'il

est

possible

de

directement

manipuler

le

compteur

ordinal

n'est

plus

applicable

De

mani?ere

g?en?erale

la

d?efinition

d'un

bon

sch?ema

de

compilation

du

contr

ole

a

la

fois

efficace

et

portable

n'est

pas

ais?ee

-LRB-

voir

sp?ecificit?e

suppl?ementaire

de

KCM-SEPIA

partag?ee

par

SEPIA

est

que

les

arguments

des

expressions

arithm?etiques

ne

sont

pas

evalu?ees

a

l'ex

ecution

sauf

demande

explicite

d'

evaluation

par

l'interm

ediaire

d'un

appel

au

pr?edicat

pr?ed?efini

Le

retour

arri?ere

superficiel

retry

deep

arit?e

adresse

clause

CP

CP

-LRB-

B

-RRB-

E

E

-LRB-

B

-RRB-

-LRB-

arit?e

-RRB-

d?etra

ner

-LRB-

-RRB-

G

GB

retry

superficiel

bp

-LRB-

B

-RRB-

P

-LRB-

retry

-RRB-

P

retry

shallow

arit?e

adresse

clause

d?etra

ner

-LRB-

-RRB-

G

GB

bp

-LRB-

B

-RRB-

P

-LRB-

retry

-RRB-

P

trust

deep

arit?e

adresse

clause

CP

CP

-LRB-

B

-RRB-

E

E

-LRB-

B

-RRB-

-LRB-

arit?e

-RRB-

d?etra

ner

-LRB-

-RRB-

G

GB

trust

superficiel

B

B

-LRB-

B

-RRB-

GB

G

-LRB-

B

-RRB-

P

trust

shallow

arit?e

adresse

clause

d?etra

ner

-LRB-

-RRB-

G

GB

B

B

-LRB-

B

-RRB-

GB

G

-LRB-

B

-RRB-

P

neck

bp

-LRB-

B

-RRB-

bp

-LRB-

B

-RRB-

-LRB-

retry/trust

-RRB-

neck

static

adresse

retour

profond

bp

-LRB-

B

-RRB-

Figure

Mode

de

retour

compil?e

fail

r?eduit

Instructions

La

gestion

des

points

de

choix

try

arit?e

arit?e

arit?e

arit?e

arit?e

arit?e

arit?e

Figure

Mode

de

retour

compil?e

fail

r?eduit

S?equencement

des

clauses

la

comparaison

par

Demoen

et

Maris

d'un

certains

nombres

de

propositions

r?ecentes

de

compilation

du

contr

ole

ET

-LSB-

-RSB-

-RRB-

Nous

utiliserons

ici

une

extension

du

compilateur

GNU

CC

-LSB-

-RSB-

qui

permet

de

capturer

l'adresse

correspondant

a

une

etiquette

symbolique

dans

une

variable

et

d'utiliser

cette

variable

comme

param?etre

d'une

instruction

goto

La

figure

propose

une

d?efinition

en

C

des

principales

macros

n?ecessaires

a

la

gestion

du

contr

ole

OU

-LRB-

coupure

exclue

-RRB-

La

figure

donne

un

exemple

de

s?equence

de

clauses

Les

etiquettes

et

d?enotent

les

points

d'entr

ee

des

deux

s?equences

d'instruction

de

type

superficiel

et

profond

d'une

clause

et

les

etiquettes

seq

des

etiquettes

statiques

pr?esentes

au

sein

des

instructions

s?equen?cant

les

clauses

o?u

les

etiquettes

seq

correspondent

a

l'instruction

courante

et

a

l'instruction

prochaine

Les

deux

versions

des

instructions

retry

et

trust

l'une

sp?ecifique

au

retour

arri?ere

superficiel

l'autre

au

retour

arri?ere

profond

sont

fusionn?ees

Il

est

ainsi

possible

de

r?eutiliser

le

code

g?en?er?e

pour

le

retour

arri?ere

superficiel

dans

le

traitement

du

retour

arri?ere

profond

Le

passage

du

point

de

retour

superficiel

au

point

de

retour

profond

s

appuie

sur

l'introduction

d'un

nouveau

registre

initialis?e

dans

les

instructions

try

et

retry

et

utilis?e

dans

l'instruction

neck

pour

mettre

a

jour

le

point

de

retour

arri?ere

Comme

pr?ec?edemment

lorsqu'une

clause

n'est

pas

partag?ee

la

valeur

du

point

de

retour

profond

peut

etre

calcul?ee

statiquement

et

le

code

de

la

clause

fusionn?e

au

sein

de

la

s?equence

de

clauses

a

l'aide

des

instructions

donn?ees

figure

La

figure

montre

l'aspect

que

peut

prendre

une

s?equence

de

clauses

pour

laquelle

aucune

des

clauses

n'est

partag?ee

Si

une

partie

seulement

des

clauses

de

la

s?equence

est

partag?ee

les

deux

familles

d'instructions

peuvent

etre

m?elang?ees

librement

Utilisation

d'une

primitive

d'

echec

standard

Dans

ce

cas

c'est

la

primitive

d'

echec

fail

qui

est

sp?ecialis?ee

en

une

primitive

d'

echec

superficiel

et

une

primitive

d'

echec

profond

-LRB-

voir

fi

Le

retour

arri?ere

superficiel

#define

TRY

-LRB-

arit?e

-RRB-

cr?eer

-LRB-

arit?e

-RRB-

goto

#define

RETRY

-LRB-

arit?e

-RRB-

CP

CP

-LRB-

B

-RRB-

E

E

-LRB-

B

-RRB-

-LRB-

arit?e

-RRB-

d?etra

ner

-LRB-

-RRB-

G

GB

bp

-LRB-

B

-RRB-

goto

#define

TRUST

-LRB-

arit?e

-RRB-

CP

CP

-LRB-

B

-RRB-

E

E

-LRB-

B

-RRB-

-LRB-

arit?e

-RRB-

d?etra

ner

-LRB-

-RRB-

G

GB

B

B

-LRB-

B

-RRB-

GB

G

-LRB-

B

-RRB-

goto

#define

NECK

bp

-LRB-

B

-RRB-

#define

FAIL

goto

bp

-LRB-

B

-RRB-

Figure

Mode

de

retour

compil?e

en

C

fail

r?eduit

Instructions

-LRB-

-RRB-

La

gestion

des

points

de

choix

TRY

-LRB-

-RRB-

RETRY

-LRB-

-RRB-

RETRY

-LRB-

-RRB-

TRUST

-LRB-

-RRB-

Figure

Mode

de

retour

compil?e

en

C

fail

r?eduit

S?equencement

des

clauses

-LRB-

-RRB-

#define

-LRB-

arit?e

-RRB-

cr?eer

-LRB-

arit?e

-RRB-

#define

-LRB-

arit?e

-RRB-

CP

CP

-LRB-

B

-RRB-

E

E

-LRB-

B

-RRB-

-LRB-

arit?e

-RRB-

d?etra

ner

-LRB-

-RRB-

G

GB

bp

-LRB-

B

-RRB-

#define

-LRB-

arit?e

-RRB-

CP

CP

-LRB-

B

-RRB-

E

E

-LRB-

B

-RRB-

-LRB-

arit?e

-RRB-

d?etra

ner

-LRB-

-RRB-

G

GB

B

B

-LRB-

B

-RRB-

GB

G

-LRB-

B

-RRB-

#define

-LRB-

-RRB-

bp

-LRB-

B

-RRB-

Figure

Mode

de

retour

compil?e

en

C

fail

r?eduit

Instructions

-LRB-

-RRB-

Le

retour

arri?ere

superficiel

-LRB-

-RRB-

code

clause

compilation

mode

superficiel

-LRB-

-RRB-

code

clause

compilation

mode

superficiel

-LRB-

-RRB-

code

clause

compilation

mode

superficiel

-LRB-

-RRB-

code

clause

compilation

mode

profond

Figure

Mode

de

retour

compil?e

en

C

fail

r?eduit

S?equencement

des

clauses

-LRB-

-RRB-

fail

shallow

d?etra

ner

-LRB-

-RRB-

G

GB

P

bp

-LRB-

B

-RRB-

fail

deep

CP

CP

-LRB-

B

-RRB-

E

E

-LRB-

B

-RRB-

-LRB-

m

-LRB-

B

-RRB-

-RRB-

d?etra

ner

-LRB-

-RRB-

G

GB

echec

superficiel

P

bp

-LRB-

B

-RRB-

Figure

Mode

de

retour

compil?e

fail

standard

Instructions

try

arit?e

retry

arit?e

retry

arit?e

trust

arit?e

Figure

Mode

de

retour

compil?e

fail

standard

S?equencement

des

clauses

La

gestion

des

points

de

choix

concatenate

-LRB-

-LSB-

X

-RSB-

shallow

-LSB-

shallow

X

-RSB-

-RRB-

execute

concatenate

-LRB-

-RRB-

shallow

Figure

Instructions

d'unification

avec

etiquette

d'

echec

gure

-RRB-

Deux

s?equences

d'instructions

peuvent

comme

pr?ec?edemment

etre

g?en?er?ees

pour

chaque

clause

Le

s?equencement

des

clauses

est

organis?ee

comme

dans

la

WAM

standard

-LRB-

voir

figure

-RRB-

Les

instructions

try

et

retry

transf?erent

le

contr

ole

a

la

s?equence

d'instructions

compil?ee

en

mode

superficiel

et

trust

a

la

s?equence

compil?ee

en

mode

profond

La

s?equence

compil?ee

en

mode

superficiel

ne

modifie

pas

les

registres

et

utilise

la

primitive

d'

echec

alors

que

la

s?equence

compil?ee

en

mode

profond

modifie

eventuellement

les

registres

et

utilise

la

primitive

Le

choix

entre

les

primitives

et

requiert

soit

de

dupliquer

toutes

les

instructions

d'unification

qui

peuvent

echouer

soit

de

rendre

le

retour

arri?ere

explicite

en

consid?erant

et

comme

des

instructions

et

en

ajoutant

aux

instructions

d'unification

un

param?etre

suppl?ementaire

une

etiquette

pointant

sur

une

instruction

de

retour

arri?ere

superficiel

ou

profond

suivant

la

s?equence

La

figure

donne

le

code

de

la

clause

r?ecursive

du

pr?edicat

dans

ce

contexte

Notons

que

faisant

l'hypoth

ese

d'une

indexation

sur

le

premier

argument

la

premi?ere

instruction

ne

peut

pas

echouer

et

donc

ne

n?ecessite

pas

d'

etiquette

d'

echec

une

version

sp?ecialis?ee

de

l'instruction

est

utilis?ee

Dans

le

cas

d'une

compilation

vers

C

le

partage

de

l'

etiquette

d'

echec

peut

prendre

une

forme

tout

a

fait

diff?erente

-LRB-

voir

figure

-RRB-

Chaque

instruction

d'unification

peut

etre

compil?ee

en

une

expression

C

qui

retourne

une

valeur

bool?eenne

vrai

pour

un

succ?es

et

faux

pour

un

echec

L'unification

est

alors

compil?ee

en

une

conjonction

d'expressions

utilis?ee

comme

condition

d'une

conditionnelle

o?u

le

premier

terme

de

l'alternative

correspond

au

corps

de

la

clause

et

le

second

terme

a

une

instruction

ou

suivant

le

mode

de

retour

arri?ere

consid?er?e

Cette

technique

a

et?e

utilis?ee

lors

de

l'impl

ementation

de

la

MPPM

-LRB-

Mali

Pedago

Le

retour

arri?ere

superficiel

concatenate

-LRB-

-LRB-

-RRB-

-LSB-

-LRB-

-RRB-

X

-LRB-

-RRB-

-RSB-

if

-LRB-

-LRB-

-RRB-

-LSB-

-LRB-

-RRB-

-RRB-

-LCB-

X

-LRB-

-RRB-

-RSB-

-RRB-

EXECUTE

-LRB-

-RRB-

concatenate

-LRB-

-RRB-

-RCB-

else

-LCB-

-RCB-

Figure

Codage

en

C

de

la

clause

r?ecursive

de

gical

Prolog

Machine

-RRB-

une

machine

Prolog

construite

au

dessus

de

MALI

-LSB-

-RSB-

Discussion

Ces

techniques

n'ont

pas

beaucoup

d'attrait

dans

le

contexte

d'un

emulateur

Par

rapport

a

la

simple

utilisation

d'un

drapeau

certaines

instructions

sont

dupliqu?ees

et

la

taille

du

code

emul?ee

est

accrue

afin

d'

eviter

des

op?erations

qui

sont

en

fait

peu

co

uteuses

en

comparaison

du

travail

global

effectu?e

par

les

instructions

qui

manipulent

des

points

de

choix

Le

probl?eme

est

diff?erent

lors

de

l'utilisation

de

code

natif

La

compilation

en

code

natif

d?ecouvre

naturellement

les

d?etails

des

instructions

et

rend

possible

partage

et

sp?ecialisation

de

code

Par

exemple

l'utilisation

d'une

primitive

d'

echec

r?eduite

rend

possible

la

fusion

des

deux

s?equences

d'instructions

ex?ecut?ees

a

la

suite

d'une

instruction

retry

ou

trust

Dans

le

cas

d'un

retour

arri?ere

superficiel

une

etiquette

interm?ediaire

permet

de

sauter

la

restauration

des

registres

de

continuation

et

des

registres

arguments

-LRB-

figures

et

-RRB-

Un

autre

exemple

est

donn?e

par

la

sp?ecialisation

du

retour

arri?ere

superficiel

Si

le

compilateur

peut

garantir

qu'aucun

terme

compos?e

n

a

et?e

construit

la

mise

a

jour

du

sommet

de

la

pile

globale

G

n'est

pas

n?ecessaire

De

m

eme

si

aucune

variable

ne

peut

etre

li?ee

ce

qui

est

par

exemple

le

cas

quand

l'unification

se

r?eduit

a

une

op?eration

de

filtrage

le

d?etra

nage

n'est

pas

n?ecessaire

Une

variante

int?eressante

consiste

a

combiner

l'utilisation

des

deux

techniques

de

la

mani?ere

suivante

ffl

Les

registres

arguments

sont

restaur?es

par

le

code

du

pr?edicat

cible

du

retour

arri?ere

Le

nombre

d'arguments

a

restaurer

est

alors

connu

statiquement

La

gestion

des

points

de

choix

ffl

D?etra

nage

et

mise

a

jour

du

sommet

de

pile

globale

sont

effectu?es

par

le

code

du

but

en

echec

Il

est

alors

possible

de

sp?ecialiser

le

retour

arri?ere

superficiel

Lecture

retard?ee

des

points

de

choix

Principes

Une

autre

mani?ere

de

r?eduire

la

bande

passante

m?emoire

est

de

retarder

les

acc?es

en

lecture

au

point

de

choix

Lors

d'un

echec

la

WAM

restaure

aussit

ot

l'

etat

sauv?e

dans

le

point

de

choix

courant

Dans

le

cas

d'un

nouvel

echec

seule

la

restauration

des

registres

impliqu?es

dans

la

d?ecision

echec/succ

es

aura

et?e

utile

L'

etat

devrait

etre

restaur?e

paresseusement

suivant

les

besoins

Les

registres

arguments

Dans

-LSB-

-RSB-

Turk

applique

cette

id?ee

aux

registres

arguments

Il

sugg?ere

l'utilisation

d'un

nouveau

mode

d'adressage

pour

les

instructions

d'unification

de

mani?ere

a

ce

que

ces

instructions

acc?edent

aux

arguments

soit

dans

les

registres

soit

dans

le

point

de

choix

Ajoutons

que

lorsque

les

registres

arguments

sont

des

registres

machine

l'acc

es

d'un

champ

argument

dans

le

point

de

choix

devrait

automatiquement

charger

le

registre

argument

correspondant

de

mani?ere

a

acc?el?erer

les

acc?es

ult?erieurs

a

ce

m

eme

argument

Turk

mentionne

aussi

la

n?ecessit?e

de

ne

pas

lib?erer

le

point

de

choix

lors

d'une

instruction

trust

Cette

lib?eration

doit

etre

repouss?ee

au

cou

de

la

clause

Voyons

comment

dans

le

cadre

d'une

primitive

d'

echec

r?eduite

-LRB-

voir

figure

-RRB-

amender

instructions

et

s?equencement

des

clauses

afin

d'impl

ementer

un

acc?es

retard?e

aux

registres

arguments

Instructions

et

s?equencement

des

clauses

des

clauses

sont

donn?es

figure

et

D'une

part

l'instruction

trust

est

sp?ecialis?ee

en

deux

instructions

trust

et

La

nouvelle

instruction

trust

est

identique

a

l'instruction

standard

sauf

que

ni

le

point

de

choix

courant

B

ni

les

registres

arguments

ne

sont

mis

a

jour

De

plus

le

point

de

retour

arri?ere

bp

-LRB-

B

-RRB-

est

modifi?e

de

mani?ere

a

pointer

sur

l'instruction

suivant

l'instruction

trust

une

instruction

qui

en

cas

d'

echec

lib?ere

le

point

de

choix

et

transf?ere

le

contr

ole

au

point

de

retour

arri?ere

D'autre

part

un

succ?es

dans

une

clause

terminale

est

g?er?e

gr

ace

a

l'addition

d'une

instruction

neck

sp?ecifique

qui

lib?ere

le

point

de

choix

en

d?efinissant

le

nouveau

point

de

choix

comme

etant

le

point

de

choix

pr?ec?edent

-LRB-

B

B

-LRB-

B

-RRB-

-RRB-

Reste

un

dernier

probl?eme

que

Turk

ne

mentionne

pas

si

la

derni?ere

clause

n?ecessite

un

environnement

cet

environnement

va

etre

empil?e

avant

que

le

point

de

choix

ne

soit

lib?er?e

En

cas

de

succ?es

la

lib?eration

du

point

de

choix

cr?ee

un

trou

sur

la

pile

Le

probl?eme

est

similaire

au

probl?eme

de

la

lib?eration

du

point

de

choix

a

la

suite

d'une

coupure

-LRB-

voir

section

-RRB-

Lecture

retard?ee

des

points

de

choix

trust

adresse

clause

d?etra

ner

-LRB-

-RRB-

G

G

-LRB-

B

-RRB-

CP

CP

-LRB-

B

-RRB-

E

E

-LRB-

B

-RRB-

GB

G

-LRB-

B

-LRB-

B

-RRB-

-RRB-

bp

-LRB-

B

-RRB-

P

-LRB-

P

-RRB-

P

deep

fail

B

B

-LRB-

B

-RRB-

P

bp

-LRB-

B

-RRB-

neck

trust

B

B

-LRB-

B

-RRB-

Figure

Acc?es

retard?e

aux

arguments

fail

r?eduit

Instructions

try

arit?e

retry

trust

Figure

Acc?es

retard?e

aux

arguments

fail

r?eduit

S?equencement

des

clauses

La

gestion

des

points

de

choix

Les

autres

registres

Il

est

aussi

possible

de

repousser

les

acc?es

aux

registres

de

continuation

E

-LRB-

B

-RRB-

et

CP

-LRB-

B

-RRB-

Pour

chaque

clause

r?eguli?ere

la

premi?ere

action

a

l'entr

ee

de

la

clause

est

de

cr?eer

un

environnement

Pour

ces

clauses

l'

echec

ne

peut

intervenir

qu'apr

es

la

cr?eation

de

l'environnement

qui

d?epend

des

valeurs

des

registres

de

continuation

Dans

le

contexte

de

la

WAM

retarder

la

mise

a

jour

des

registres

de

continuation

n

a

donc

de

sens

que

pour

les

faits

et

les

clauses

binaires

Pour

ces

clauses

la

mise

a

jour

peut

s

effectuer

lorsque

l'ex

ecution

est

sur

le

point

de

quitter

la

clause

juste

avant

l'une

des

instructions

proceed

ou

execute

Cela

peut

etre

etendu

aux

clauses

r?eguli?eres

quand

la

cr?eation

d'environnement

est

retard?ee

-LRB-

voir

section

-RRB-

Dans

ce

cas

les

champs

continuation

de

l'environnement

peuvent

directement

etre

mis

a

jour

a

l'aide

des

champs

continuation

du

point

de

choix

Par

contre

les

acc?es

au

point

de

retour

arri?ere

bp

-LRB-

B

-RRB-

et

au

point

de

retour

de

la

tra

n?ee

T

-LRB-

B

-RRB-

ne

peuvent

pas

etre

retard?es

le

transfert

de

contr

ole

et

le

d?etra

nage

ne

peuvent

etre

evit?es

-LRB-

a

moins

que

le

d?etra

nage

ne

soit

pas

n?ecessaire

du

fait

de

l'absence

de

liaison

-RRB-

En

particulier

un

retard

du

d?etra

nage

influencerait

la

valeur

des

arguments

et

donc

l'unification

de

mani?ere

impr?evisible

S'il

n

y

a

pas

vraiment

d'unification

c'est

a-dire

si

le

cou

de

la

clause

est

atteint

quelle

que

soit

la

forme

des

arguments

le

d?etra

nage

pourrait

etre

retard?e

jusqu'au

point

cou

de

la

clause

mais

comme

il

n

y

a

pas

de

possibilit?e

d'

echec

cela

n

a

pas

d'int

er

et

Finalement

les

champs

point

de

choix

B

-LRB-

B

-RRB-

et

sommet

de

pile

globale

G

-LRB-

B

-RRB-

du

point

de

choix

n'interviennent

pas

lors

du

retour

arri?ere

mais

lors

de

la

lib?eration

du

point

de

choix

par

l'instruction

trust

Notons

que

l'instruction

trust

acc?ede

deux

points

de

choix

diff?erents

tout

d'abord

le

point

de

choix

courant

afin

de

conna

tre

l'adresse

du

point

de

choix

pr?ec?edent

qui

devient

le

nouveau

point

de

choix

puis

ce

nouveau

point

de

choix

pour

mettre

a

jour

le

point

de

retour

arri?ere

sur

la

pile

globale

GB

Cependant

retarder

les

mises

a

jour

correspondantes

n

a

pas

d'int

er

et

les

registres

B

et

GB

doivent

dans

tous

les

cas

etre

mis

a

jour

avant

de

quitter

la

clause

Retour

arri?ere

superficiel

et

lecture

retard?ee

Comme

le

sugg?ere

Turk

dans

-LSB-

-RSB-

une

combinaison

du

support

pour

le

retour

arri?ere

superficiel

et

d'acc

es

en

lecture

retard?es

est

potentiellement

plus

efficace

que

chacune

des

techniques

seules

Une

telle

combinaison

impose

de

garder

un

historique

de

la

localisation

des

arguments

et

des

informations

de

continuation

de

sorte

que

quand

un

argument

ou

une

des

donn?ees

de

continuation

est

n?ecessaire

on

sache

o?u

trouver

la

valeur

correspondante

dans

un

registre

ou

dans

le

point

de

choix

courant

Lorsque

les

acc?es

ne

sont

pas

retard?es

le

mode

de

retour

arri?ere

seul

permet

de

d?ecider

En

l'absence

de

support

pour

le

retour

arri?ere

superficiel

les

donn?ees

sont

dans

le

point

de

choix

sauf

s

il

s

agit

de

la

premi?ere

clause

d'une

s?equence

Lorsque

les

deux

techniques

sont

combin?ees

il

y

a

Lecture

retard?ee

des

points

de

choix

deux

cas

simples

lors

de

l'ex

ecution

de

la

premi?ere

clause

d'une

s?equence

les

donn?ees

sont

dans

les

registres

apr?es

un

retour

arri?ere

profond

les

donn?ees

sont

dans

le

point

de

choix

La

situation

est

bien

plus

complexe

apr?es

un

retour

arri?ere

superficiel

En

effet

les

donn?ees

peuvent

d?ej?a

avoir

et?e

charg?ees

dans

les

registres

ce

qui

ne

peut

etre

d?etermin?e

localement

mais

d?epend

de

l'histoire

du

calcul

Ecartons

tout

d'abord

l'id

ee

d'un

mot

remis

a

z?ero

lors

d'un

retour

arri?ere

profond

dont

le

bit

i

vaudrait

lorsque

le

registre

i

serait

a

jour

Une

telle

technique

a

du

sens

dans

le

contexte

d'une

machine

d?edi?ee

mais

serait

plut

ot

une

source

de

surco

ut

dans

un

contexte

purement

logiciel

La

solution

consiste

alors

en

la

g?en?eration

de

code

sp?ecialis?e

pour

chaque

chemin

possible

C'est

a-dire

que

lors

de

la

compilation

de

la

clause

i

d'une

s?equence

de

clauses

des

s?equences

d'instructions

sp?ecialis?ees

prenant

en

compte

les

registres

d?ej?a

charg?es

sont

g?en?er?ees

Cela

peut

etre

visualis?e

en

construisant

des

etiquettes

d'

echec

par

concat?enation

d'un

pr?efixe

par

exemple

d'un

num?ero

de

clause

et

d'une

cha

ne

de

m

bits

o?u

m

arit?e

c'est

a-dire

le

nombre

de

registres

arguments

plus

-LRB-

pour

les

registres

de

continuation

-RRB-

Le

bit

j

vaut

si

le

contenu

du

registre

j

est

a

jour

Des

etiquettes

plus

compactes

peuvent

etre

obtenues

en

codant

la

cha

ne

de

bits

en

hexad?ecimal

Supposons

que

k

etiquettes

aient

et?e

g?en?er?ees

pour

la

clause

i.

Un

maximum

de

k

diff?erentes

s?equences

d'instructions

sont

alors

g?en?er?ees

pour

la

clause

i

une

s?equence

pour

un

retour

arri?ere

profond

et

k

s?equences

pour

des

retours

arri?ere

superficiels

En

pratique

le

nombre

de

s?equences

peut

etre

moindre

Par

exemple

si

deux

etiquettes

correspondent

a

des

etats

qui

ne

diff?erent

que

par

des

registres

qui

ne

sont

pas

utilis?es

dans

la

clause

suivante

les

etiquettes

et

les

s?equences

d'instructions

correspondantes

peuvent

etre

fusionn?ees

Les

deux

premi?eres

clauses

d'une

s?equence

se

comportent

de

mani?ere

sp?eciale

Dans

le

cas

de

la

premi?ere

clause

une

seule

s?equence

est

n?ecessaire

les

arguments

et

les

informations

de

continuation

sont

dans

les

registres

et

si

l'on

suppose

qu'il

n

y

a

pas

partage

de

code

entre

deux

s?equences

de

clauses

l'ex

ecution

ne

peut

pas

revenir

sur

cette

clause

Quant

a

la

deuxi?eme

clause

elle

ne

requiert

que

deux

s?equences

d'instructions

une

s?equence

pour

les

cas

de

retour

arri?ere

superficiel

-LRB-

toutes

les

donn?ees

sont

dans

les

registres

-RRB-

et

une

s?equence

pour

les

cas

de

retour

arri?ere

profond

-LRB-

toutes

les

donn?ees

sont

dans

le

point

de

choix

et

peuvent

etre

charg?ees

de

mani?ere

paresseuse

-RRB-

Il

est

donc

ais?e

de

combiner

support

du

retour

arri?ere

superficiel

et

acc?es

retard?es

dans

le

cas

de

s?equences

comportant

au

plus

deux

clauses

ce

qui

couvre

typiquement

la

majorit?e

des

cas

Pour

des

s?equences

plus

longues

il

y

a

un

grand

risque

de

voir

le

code

exploser

Par

exemple

un

codage

du

second

pr?edicat

le

plus

utilis?e

du

programme

de

test

comprend

s?equences

d'instructions

alors

que

le

pr?edicat

ne

comprend

que

clauses

La

taille

du

code

peut

toutefois

etre

limit?ee

en

partageant

les

corps

de

clause

Enfin

il

est

toujours

possible

d'augmenter

le

partage

en

revenant

ponctuellement

soit

La

gestion

des

points

de

choix

points

de

choix

evit?es

programme

nb

points

de

choix

t

ete

garde

total

type

arith

total

boyer

browse

chat

parser

crypt

deriv

62 100 100

fast

mu

flatten

meta

qsort

mu

nand

nreverse

poly

prover

qsort

225 100 100 100

queens

query

reducer

sdda

sendmore

serialise

simple

analyser

tak

unify

zebra

Table

Efficacit?e

de

la

cr?eation

retard?ee

des

points

de

choix

a

un

support

standard

du

retour

arri?ere

superficiel

-LRB-

les

registres

sont

recharg?es

en

cas

d'

echec

-RRB-

soit

a

une

lecture

paresseuse

du

point

de

choix

-LRB-

sans

tenir

compte

de

l'

etat

des

registres

-RRB-

La

cr?eation

retard?ee

des

points

de

choix

Principes

Le

support

des

retours

arri?ere

superficiels

et

le

retardement

des

acc?es

en

lecture

n'influent

que

sur

les

acc?es

en

lecture

Le

probl?eme

est

de

diminuer

aussi

les

acc?es

en

ecriture

principalement

la

cr?eation

de

points

de

choix

En

effet

les

donn?ees

de

Tick

La

cr?eation

retard?ee

des

points

de

choix

-LSB-

-RSB-

sur

les

acc?es

aux

points

de

choix

obtenues

sur

programmes

de

taille

moyenne

montrent

que

les

acc?es

en

ecriture

sont

presque

aussi

nombreux

que

les

acc?es

en

lecture

entre

a

des

acc?es

aux

points

de

choix

sont

des

acc?es

en

ecriture

Les

effets

d'une

simple

diminution

des

acc?es

en

lecture

sans

diminution

des

acc?es

en

ecriture

sont

condamn?es

a

etre

limit?es

Premi?ere

impl?ementation

L'id

ee

est

de

retarder

la

cr?eation

du

point

de

choix

jusqu

a

la

sortie

de

la

zone

de

retour

arri?ere

superficiel

avec

la

possibilit?e

que

cette

cr?eation

soit

tout

bonnement

annul?ee

du

fait

de

l'ex

ecution

apr?es

une

s?erie

eventuelle

de

retours

arri?ere

superficiels

d'une

coupure

ou

d'une

instruction

trust

Retarder

la

cr?eation

d'un

point

de

choix

impose

de

garder

dans

des

registres

l'information

n?ecessaire

au

retour

arri?ere

c'est

a-dire

l'information

qui

aurait

et?e

sauv?ee

dans

le

point

de

choix

a

l'appel

du

but

courant

cr?eant

ainsi

un

point

de

choix

virtuel

De

m

eme

que

pour

le

support

du

retour

arri?ere

superficiel

les

registres

arguments

ne

doivent

pas

etre

modifi?es

quitte

a

cr?eer

deux

s?equences

d'instructions

Il

en

est

de

m

eme

des

registres

de

continuation

Notons

qu'il

n'est

pas

possible

de

cr?eer

un

environnement

avant

que

le

point

de

choix

r?eel

n'ait

et?e

cr?e?e

-LRB-

voir

section

-RRB-

sous

peine

de

perdre

la

valeur

de

l'information

de

continuation

a

l'entr

ee

du

pr?edicat

Pour

ce

qui

est

des

autres

registres

le

sommet

de

la

pile

globale

G

est

sauvegard?e

dans

le

point

de

retour

arri?ere

de

la

pile

globale

GB

dont

on

ne

peut

ici

se

passer

Restent

finalement

deux

donn?ees

a

sauvegarder

a

savoir

le

sommet

de

la

tra

n?ee

et

le

point

de

retour

arri?ere

A

priori

deux

solutions

sont

possibles

soit

ces

donn?ees

sont

sauvegard?ees

dans

des

registres

sp?ecifiques

TB

et

BP

soit

elles

sont

empil?ees

sur

la

pile

locale

sous

forme

d'un

point

de

choix

partiel

Notons

que

dans

une

architecture

a

pile

unique

la

cr?eation

d'un

point

de

choix

partiel

a

le

d?esavantage

de

ne

pas

retarder

le

calcul

du

sommet

de

la

pile

Comme

pr?ec?edemment

le

drapeau

superficiel

indique

o?u

trouver

l'

etat

a

restaurer

en

cas

de

retour

arri?ere

point

de

choix

virtuel

dans

le

cas

d'un

retour

arri?ere

superficiel

ou

point

de

choix

r?eel

dans

le

cas

d'un

retour

arri?ere

profond

Le

probl?eme

est

ensuite

de

savoir

que

faire

lorsque

l'ex

ecution

quitte

la

zone

de

retour

arri?ere

superficiel

ffl

en

cou

de

clause

en

l'absence

de

coupure

doit-on

cr?eer

un

point

de

choix

r?eel

ou

simplement

mettre

a

jour

un

point

de

choix

existant

-LRB-

a

moins

que

le

point

de

retour

arri?ere

ne

soit

trait?e

comme

le

point

de

continuation

il

ne

s

agit

alors

que

de

mettre

a

jour

un

registre

-RRB-

ffl

en

cou

de

clause

avec

coupure

ou

lors

de

l'essai

de

la

derni?ere

clause

de

la

s?equence

doit-on

lib?erer

un

point

de

choix

r?eel

ou

virtuel

Pour

r?epondre

a

ces

questions

il

est

n?ecessaire

de

savoir

si

un

point

de

choix

r?eel

a

et?e

cr?e?e

une

information

disponible

a

l'entr

ee

de

la

zone

de

retour

arri?ere

superficiel

Si

La

gestion

des

points

de

choix

try

adresse

clause

superficiel

vrai

faux

GB

G

TB

T

BP

P

-LRB-

P

-RRB-

P

retry

arit?e

adresse

clause

if

-LRB-

superficiel

faux

-RRB-

-LCB-

superficiel

true

true

TB

T

-LRB-

B

-RRB-

CP

CP

-LRB-

B

-RRB-

E

E

-LRB-

B

-RRB-

-LRB-

arit?e

-RRB-

-RCB-

d?etra

ner

-LRB-

-RRB-

G

GB

BP

P

-LRB-

P

-RRB-

P

trust

arit?e

adresse

clause

if

-LRB-

superficiel

faux

-RRB-

-LCB-

TB

T

-LRB-

B

-RRB-

CP

CP

-LRB-

B

-RRB-

E

E

-LRB-

B

-RRB-

-LRB-

arit?e

-RRB-

B

B

-LRB-

B

-RRB-

-RCB-

else

-LCB-

superficiel

faux

if

-LRB-

vrai

-RRB-

B

B

-LRB-

B

-RRB-

-RCB-

d?etra

ner

-LRB-

-RRB-

G

GB

GB

G

-LRB-

B

-RRB-

BP

BP

-LRB-

B

-RRB-

P

fail

P

BP

neck

arit?e

if

-LRB-

superficiel

vrai

-RRB-

-LCB-

superficiel

faux

if

-LRB-

faux

-RRB-

-LCB-

l

max

-LRB-

B

E

size

-LRB-

CP

-RRB-

-RRB-

ole

-LRB-

l

E

CP

B

BP

TB

GB

-RRB-

-RCB-

else

BP

-LRB-

B

-RRB-

BP

-RCB-

Figure

Cr?eation

retard?ee

des

point

choix

Instructions

La

cr?eation

retard?ee

des

points

de

choix

cette

entr?ee

s

est

effectu?ee

au

tout

d?ebut

de

la

zone

suite

a

l'essai

de

la

premi?ere

clause

de

la

s?equence

le

point

de

choix

est

virtuel

Si

cette

entr?ee

r?esulte

d'un

retour

arri?ere

un

point

de

choix

a

d?ej?a

et?e

cr?e?e

Cette

information

disponible

a

l'entr

ee

de

la

zone

de

retour

superficiel

doit

donc

etre

propag?ee

jusqu'au

d?epart

de

la

zone

par

l'interm

ediaire

d'un

second

drapeau

que

nous

appellerons

Ce

drapeau

qui

n

a

de

sens

que

dans

la

zone

de

retour

arri?ere

superficiel

-LRB-

c'est

a-dire

quand

superficiel

vaut

vrai

-RRB-

vaut

vrai

a

la

suite

d'un

retour

profond

l'

etat

a

et?e

sauvegard?e

dans

le

point

de

choix

courant

Le

d?ebut

de

la

zone

de

retour

arri?ere

superficiel

est

marqu?e

par

l'instruction

try

qui

invalide

un

point

de

choix

r?eel

reste

a

cr?eer

Un

retour

dans

la

zone

de

retour

arri?ere

superficiel

est

marqu?e

par

une

instruction

retry

ex?ecut?ee

a

la

suite

d'un

retour

arri?ere

profond

si

superficiel

vaut

faux

retry

met

a

vrai

Le

d?epart

de

la

zone

a

lieu

lors

de

l'ex

ecution

en

mode

de

retour

superficiel

d'une

instruction

neck

ou

trust

En

mode

superficiel

ces

deux

instructions

testent

donc

l'instruction

neck

pour

savoir

si

un

point

de

choix

r?eel

doit

etre

cr?e?e

ou

simplement

mis

a

jour

et

l'instruction

trust

pour

savoir

si

le

point

de

choix

a

lib?erer

est

r?eel

ou

virtuel

Le

choix

d'une

primitive

d'

echec

r?eduite

et

d'une

sauvegarde

de

l'

etat

dans

un

point

de

choix

virtuel

conduit

aux

instructions

figure

obtenues

a

partir

des

instructions

con?cues

pour

le

support

du

retour

arri?ere

superficiel

-LRB-

voir

figure

-RRB-

Ce

code

est

tr?es

similaire

au

code

utilis?e

pour

KCM

les

diff?erences

etant

que

KCM

utilise

une

architecture

a

pile

double

et

sauvegarde

la

valeur

du

registre

BP

a

la

cr?eation

du

point

de

choix

-LRB-

traitement

identique

des

registres

BP

et

CP

-RRB-

Notons

que

le

registre

TB

correspond

au

point

de

retour

arri?ere

sur

la

tra

n?ee

C'est

une

copie

du

champ

T

-LRB-

B

-RRB-

-LRB-

si

le

point

de

choix

est

r?eel

-RRB-

rafra

chie

a

chaque

retour

arri?ere

profond

et

chaque

coupure

La

pr?esence

de

cette

information

dans

un

registre

machine

evite

certains

acc?es

en

lecture

lors

du

test

de

tra

nage

et

du

retour

arri?ere

peu

profond

Comme

pour

le

point

de

retour

arri?ere

de

la

pile

globale

se

pose

le

probl?eme

du

bilan

positif

ou

n?egatif

en

acc?es

m?emoire

Le

tableau

donne

pour

les

programmes

de

tests

du

syst?eme

Aquarius

ex?ecut?es

sur

KCM

le

pourcentage

de

points

ce

choix

evit?es

gr

ace

a

la

cr?eation

retard?ee

des

points

de

choix

Une

autre

impl?ementation

des

drapeaux

Dans

-LSB-

-RSB-

Carlsson

pr?esente

une

impl?ementation

de

la

cr?eation

retard?ee

des

points

de

choix

qui

ne

requiert

pas

l'introduction

de

drapeaux

et

limite

l'introduction

de

nouveaux

registres

a

l'introduction

d'un

registre

BP

En

fait

le

registre

BP

et

le

champ

BP

-LRB-

B

-RRB-

jouent

les

r

oles

respectifs

des

drapeaux

superficiel

et

Le

registre

BP

ne

contient

le

point

de

retour

arri?ere

que

dans

la

zone

de

retour

La

gestion

des

points

de

choix

arri?ere

superficiel

Il

vaut

en

dehors

de

cette

zone

le

point

de

retour

arri?ere

est

alors

rang?e

dans

le

champ

BP

-LRB-

B

-RRB-

Plut

ot

que

de

mettre

superficiel

a

vrai

try

et

retry

initialisent

BP

Plut

ot

que

de

mettre

superficiel

a

faux

trust

et

neck

remettent

BP

a

z?ero

L'instruction

try

cr?ee

un

point

de

choix

partiel

constitu?e

des

seuls

champs

T

-LRB-

B

-RRB-

et

BP

-LRB-

B

-RRB-

le

dernier

champ

etant

mis

a

z?ero

ce

qui

correspond

a

l'invalidation

de

Ce

champ

est

ensuite

test?e

par

les

instructions

neck

et

trust

pour

conna

tre

l'

etat

du

point

de

choix

courant

partiel

ou

complet

Si

le

champ

vaut

neck

compl?ete

le

point

de

choix

et

copie

BP

dans

BP

-LRB-

B

-RRB-

avant

de

remettre

BP

a

z?ero

Notons

que

alors

que

retry

doit

mettre

a

vrai

apr?es

un

retour

arri?ere

profond

il

n

y

a

rien

a

faire

ici

l'information

est

contenue

dans

le

point

de

choix

Cette

technique

est

attrayante

dans

le

contexte

consid?er?e

par

Carlsson

d'une

architecture

a

pile

double

-LRB-

voir

section

-RRB-

avec

utilisation

d'une

primitive

d'

echec

standard

Nous

avons

mentionn?e

ci-dessus

que

la

combinaison

d'une

architecture

a

pile

unique

et

de

points

de

choix

partiels

rendait

impossible

le

retardement

du

calcul

du

sommet

de

la

pile

De

plus

une

primitive

d'

echec

r?eduite

entra

nerait

deux

tests

successifs

du

registre

BP

le

premier

dans

la

primitive

d'

echec

afin

de

savoir

si

le

point

de

retour

est

donn?e

par

BP

ou

BP

-LRB-

B

-RRB-

et

le

second

dans

l'instruction

suivante

retry

ou

trust

afin

de

conna

tre

l'

etat

du

point

de

choix

courant

Notons

que

l'id

ee

de

cr?eer

des

points

de

choix

partiels

permet

de

tirer

parti

d'une

analyse

statique

de

d?eterminisme

Il

s

agit

d'

etendre

les

gardes

aux

buts

dont

on

sait

par

analyse

qu'ils

sont

d?eterministes

ne

lient

pas

de

variable

apparaissant

dans

la

t

ete

de

clause

-LRB-

le

registre

T

n'est

pas

modifi?e

-RRB-

et

ne

cr?eent

pas

de

termes

compos?es

-LRB-

le

registre

G

n'est

pas

modifi?e

-RRB-

Il

est

alors

possible

de

s

epargner

dans

un

premier

temps

la

sauvegarde

des

registres

T

et

G.

En

cas

d'

echec

la

mise

a

jour

du

sommet

de

pile

globale

et

le

d?etra

nage

sont

evit?es

En

cas

de

succ?es

de

la

garde

une

instruction

neck

remplit

les

champs

non

encore

initialis?es

Cette

technique

a

et?e

utilis?ee

par

Zhou

dans

le

contexte

des

enregistrements

d'activation

uniques

de

sa

machine

abstraite

TOAM

-LSB-

-RSB-

Gestion

du

retardement

a

la

compilation

Les

techniques

utilis?ees

pour

supprimer

la

gestion

du

mode

de

retour

arri?ere

a

l'ex

ecution

sont

directement

applicables

au

drapeau

Un

maximum

de

trois

s?equences

d'instructions

est

g?en?er?e

pour

chaque

clause

Deux

s?equences

sont

g?en?er?ees

pour

le

retour

arri?ere

superficiel

Elles

ne

diff?erent

que

par

l'instruction

neck

qui

soit

cr?ee

un

vrai

point

de

choix

-LRB-

s?equence

en

mode

superficiel/point

de

choix

virtuel

-RRB-

soit

met

a

jour

le

champ

point

de

retour

arri?ere

du

point

de

choix

-LRB-

s?equence

en

mode

superficiel/point

de

choix

r?eel

-RRB-

Les

macros

C

de

base

et

une

instance

de

code

de

s?equencement

des

clauses

sont

donn?ees

en

figure

et

Comme

pour

le

support

du

retour

arri?ere

superficiel

des

instructions

sp?ecialis?ees

doivent

etre

introduites

afin

de

g?erer

efficacement

les

clauses

qui

ne

sont

pas

partag?ees

La

cr?eation

retard?ee

des

points

de

choix

#define

TRY

-LRB-

-RRB-

GB

G

TB

T

BP

goto

#define

RETRY

-LRB-

arit?e

-RRB-

CP

CP

-LRB-

B

-RRB-

E

E

-LRB-

B

-RRB-

-LRB-

arit?e

-RRB-

BP

goto

BP

goto

#define

TRUST

-LRB-

arit?e

-RRB-

CP

CP

-LRB-

B

-RRB-

E

E

-LRB-

B

-RRB-

-LRB-

arit?e

-RRB-

B

B

-LRB-

B

-RRB-

GB

G

-LRB-

B

-RRB-

BP

BP

-LRB-

B

-RRB-

goto

#define

BP

-LRB-

B

-RRB-

BP

BP

#define

-LRB-

arit?e

-RRB-

cr?eer

-LRB-

arit?e

-RRB-

BP

#define

d?etra

ner

-LRB-

-RRB-

G

GB

goto

BP

#define

TB

T

-LRB-

B

-RRB-

d?etra

ner

-LRB-

-RRB-

G

GB

goto

BP

Figure

Cr?eation

retard?ee

des

points

de

choix

sans

drapeau

Instructions

La

gestion

des

points

de

choix

TRY

-LRB-

-RRB-

-LRB-

-RRB-

RETRY

-LRB-

-RRB-

TRUST

-LRB-

-RRB-

Figure

Cr?eation

retard?ee

des

points

de

choix

sans

drapeau

S?equencement

des

clauses

entre

diff?erentes

s?equences

Le

point

de

retour

arri?ere

profond

peut

directement

etre

fourni

comme

param?etre

d'une

instruction

-RRB-

De

plus

des

versions

sp?ecialis?ees

de

RETRY

et

TRUST

peuvent

etre

consid?er?ees

Par

exemple

il

n'est

pas

n?ecessaire

de

g?en?erer

de

s?equence

d'instructions

en

mode

superficiel/point

de

choix

r?eel

pour

la

seconde

clause

d'une

s?equence

d'

o?u

la

possibilit?e

de

remplacer

l'instruction

RETRY

g?en?erale

par

l'instruction

de

la

figure

-RRB-

Finalement

la

primitive

d'

echec

peut

etre

sp?ecialis?ee

afin

de

de

pas

ex?ecuter

de

d?etra

nage

ou

de

ne

pas

mettre

a

jour

le

sommet

de

la

pile

globale

Retour

arri?ere

dirig?e

par

une

table

d'adresses

Dans

l'hypoth

ese

d'une

primitive

d'

echec

standard

le

code

de

s?equencement

des

clauses

peut

etre

r?eduit

et

le

nombre

d'indirections

en

cas

de

retour

arri?ere

superficiel

limit?e

a

deux

au

lieu

de

trois

en

impl?ementant

le

choix

entre

s?equence

d'instructions

en

mode

r?eel

et

virtuel

a

l'aide

d'une

table

d'adresses

Partons

des

instructions

de

la

figure

Dans

l'hypoth

ese

d'une

primitive

d'

echec

standard

les

s?equences

en

mode

profond

-LRB-

etiquet?ees

-RRB-

et

superficiel/point

de

choix

r?eel

-LRB-

etiquet?ees

-RRB-

impl?ementant

les

instructions

retry

et

trust

sont

fusionn?ees

en

une

s?equence

d'instruction

point

de

choix

unique

Une

nouvelle

primitive

d'

echec

a

la

charge

de

restaurer

les

registres

de

continuation

et

les

registres

arguments

dans

le

cas

d'une

s?equence

d'instructions

en

mode

profond

Le

r

ole

de

l'instruction

retry

se

r?esume

a

une

mise

a

jour

du

point

de

retour

arri?ere

a

l'un

des

points

d'entr

ee

-LRB-

r?eel

ou

virtuel

-RRB-

de

l'instruction

retry

ou

trust

suivante

a

l'initialisation

de

au

point

d'entr

ee

en

mode

r?eel

de

l'instruction

retry

ou

trust

suivante

et

a

un

saut

a

la

s?equence

d'instructions

compil?ee

en

mode

r?eel

ou

virtuel

de

la

clause

correspondante

La

cr?eation

retard?ee

des

points

de

choix

#define

TRY

-LRB-

-RRB-

GB

G

TB

T

BP

table

goto

#define

TRUST

-LRB-

-RRB-

B

B

-LRB-

B

-RRB-

GB

G

-LRB-

B

-RRB-

goto

#define

d?etra

ner

-LRB-

-RRB-

G

GB

BP

BP

BP

goto

#define

d?etra

ner

-LRB-

-RRB-

G

GB

BP

BP

BP

goto

-LRB-

-RRB-

#define

TB

T

-LRB-

B

-RRB-

d?etra

ner

-LRB-

-RRB-

G

GB

CP

CP

-LRB-

B

-RRB-

E

E

-LRB-

B

-RRB-

-LRB-

arit?e

-LRB-

B

-RRB-

-RRB-

BP

BP

-LRB-

B

-RRB-

BP

BP

BP

goto

-LRB-

-RRB-

#define

BP

-LRB-

B

-RRB-

BP

#define

-LRB-

arit?e

-RRB-

cr?eer

-LRB-

arit?e

-RRB-

Figure

Retour

arri?ere

dirig?e

par

une

table

d'adresses

Instructions

La

gestion

des

points

de

choix

static

void

table

-LSB-

-RSB-

-LCB-

-RCB-

TRY

-LRB-

-RRB-

TRUST

-LRB-

-RRB-

Figure

Retour

arri?ere

dirig?e

par

une

table

d'adresses

S?equencement

des

clauses

La

s?erie

des

instructions

retry

peut

etre

remplac?ee

par

une

table

d'adresses

compos?ee

de

paires

de

points

d'entr

ee

sur

les

s?equences

d'instructions

en

mode

r?eel

et

en

mode

virtuel

Au

retour

arri?ere

plut

ot

que

d'avoir

une

instruction

retry

mettant

a

jour

les

points

de

retour

arri?ere

superficiel

-LRB-

BP

-RRB-

et

profond

-LRB-

-RRB-

les

primitives

d'

echec

mettent

a

jour

le

registre

BP

qui

devient

un

pointeur

sur

la

prochaine

paire

d'adresses

Diff?erentes

primitives

d'

echec

sont

utilis?ees

pour

les

s?equences

d'instructions

en

mode

profond

r?eel

et

virtuel

et

respectivement

Les

instructions

et

utilisent

la

premi?ere

adresse

de

la

paire

courante

-LRB-

mode

r?eel

-RRB-

et

la

seconde

-LRB-

mode

virtuel

-RRB-

La

derni?ere

paire

de

la

table

correspond

a

une

instruction

trust

fonctionnant

soit

en

mode

virtuel

-LRB-

le

registre

GB

est

mis

a

jour

puis

la

derni?ere

clause

est

ex?ecut?ee

en

mode

profond

-RRB-

soit

en

mode

r?eel

identique

au

mode

r?eel

apr?es

lib?eration

du

point

de

choix

courant

L'utilisation

d'une

table

d'adresses

devient

plus

complexe

lorsqu'il

s

agit

de

tirer

parti

du

non-partage

de

certaines

clauses

En

effet

les

sauts

indirects

des

instructions

d'une

clause

non

partag?ee

peuvent

etre

facilement

remplac?es

par

des

sauts

directs

vers

la

s?equence

en

mode

superficiel

de

la

clause

suivante

ou

vers

une

instruction

trust

si

la

clause

suivante

est

la

derni?ere

Le

point

de

retour

arri?ere

profond

est

aussi

bien

connu

Il

s

agit

soit

du

point

d'entr

ee

en

mode

r?eel

de

la

clause

suivante

soit

du

point

d'entr

ee

en

mode

r?eel

de

l'instruction

trust

Il

semble

donc

ne

pas

etre

n?ecessaire

de

faire

figurer

dans

la

table

d'adresses

la

paire

correspondant

a

la

clause

suivant

en

s?equence

cette

clause

non

partag?ee

Le

probl?eme

est

alors

de

g?erer

le

retour

arri?ere

profond

qui

peut

impliquer

aussi

bien

un

saut

direct

qu'un

saut

indirect

Le

type

de

retour

ne

peut

pas

etre

connu

de

la

clause

en

echec

Il

peut

seulement

etre

connu

de

la

clause

qui

par

l'interm

ediaire

d'une

instruction

neck

a

d?efini

le

point

de

retour

arri?ere

L'id

ee

est

donc

de

repasser

par

l'interm

ediaire

de

cette

clause

pour

r?ealiser

le

retour

arri?ere

Ainsi

dans

le

cas

evoqu?e

pr?ec?edemment

d'une

clause

non

partag?ee

suivie

d'une

clause

partag?ee

le

point

Autres

am?eliorations

de

retour

arri?ere

profond

d?efini

par

la

clause

non

partag?ee

va

simplement

pointer

sur

une

instruction

de

saut

direct

vers

la

s?equence

en

mode

profond

de

la

clause

partag?ee

Dans

les

clauses

non

partag?ees

cette

instruction

est

remplac?ee

par

une

instruction

de

saut

indirect

au

travers

de

la

table

d'adresses

Les

retours

arri?ere

superficiels

se

trouvent

donc

favoris?es

au

d?etriment

des

retours

arri?ere

profonds

qui

co

utent

maintenant

soit

trois

sauts

directs

soit

deux

sauts

directs

et

un

saut

indirect

Notons

aussi

que

les

points

de

choix

cr?e?es

pour

des

s?equences

de

clauses

qui

r?eclament

une

table

d'adresses

doivent

a

la

fois

sauvegarder

un

point

de

retour

arri?ere

et

un

pointeur

sur

la

table

d'adresses

Cette

technique

a

et?e

utilis?ee

par

Van

Roy

Demoen

et

Willems

-LSB-

-RSB-

avec

toutefois

une

classification

diff?erente

des

s?equences

d'instructions

Nous

reviendrons

sur

ce

point

apr?es

avoir

trait?e

la

coupure

-LRB-

voir

section

-RRB-

Autres

am?eliorations

L'

elagage

des

points

de

choix

Tout

pr?edicat

constitu?e

de

plus

d'une

clause

peut

etre

facilement

transform?e

en

un

pr?edicat

equivalent

constitu?e

d'une

clause

unique

Le

corps

de

cette

clause

est

alors

une

disjonction

de

conjonctions

Les

points

de

choix

peuvent

etre

vus

comme

les

environnements

d'une

repr?esentation

par

partage

de

structures

de

telles

disjonctions

Une

repr?esentation

par

copie

des

disjonctions

correspondrait

a

une

construction

explicite

des

disjonctions

sous

forme

de

termes

Prolog

Ainsi

le

pr?edicat

a

-LRB-

X

Y

Z

-RRB-

-LRB-

X

Y

Z

-RRB-

a

-LRB-

X

-RRB-

-LRB-

X

-RRB-

a

-LRB-

Y

-RRB-

-LRB-

Y

-RRB-

peut

etre

transform?e

en

a

-LRB-

X

Y

Z

-RRB-

-LRB-

X

Y

Z

-RRB-

-LRB-

X

-RRB-

-LRB-

Y

-RRB-

Cet

exemple

peut

para

tre

simpliste

Notons

toutefois

qu'il

est

toujours

possible

de

se

ramener

a

des

conjonctions

d?eg?en?er?ees

constitu?ees

d'un

but

unique

par

pliage

et

d?efinition

-LRB-

apr?es

une

eventuelle

transformation

de

programmes

pour

g?erer

la

coupure

voir

chapitre

-RRB-

Une

transformation

equivalente

a

la

binarisation

mais

appliqu?ee

aux

disjonctions

plut

ot

qu'aux

conjonctions

donne

alors

a

-LRB-

Alt

X

Y

Z

-RRB-

-LRB-

-LRB-

-LRB-

Alt

Y

-RRB-

X

-RRB-

X

Y

Z

-RRB-

La

gestion

des

points

de

choix

o?u

le

nouvel

argument

Alt

repr?esente

les

termes

non

exploit?es

des

disjonctions

rencontr?ees

depuis

le

d?ebut

de

l'ex

ecution

Notons

que

au

contraire

de

la

transformation

appliqu?ee

aux

incr?ements

de

r?esolvante

cette

transformation

ne

conduit

pas

a

un

programme

Prolog

ex?ecutable

En

effet

il

est

n?ecessaire

de

prot?eger

l'argument

additionnel

des

effets

des

substitutions

affectant

les

autres

arguments

De

plus

le

nouvel

argument

doit

etre

transmis

aux

op?erations

el?ementaires

susceptibles

d'

echouer

afin

de

faire

l'objet

d'un

m?eta

appel

en

cas

d'

echec

Pour

sa

part

la

version

par

partage

de

structures

de

la

transformation

fait

clairement

appara

tre

une

structuration

du

nouvel

argument

en

une

liste

de

points

de

choix

les

points

de

choix

rempla?cant

les

environnements

pr?ec?edemment

obtenus

en

appliquant

le

m

eme

type

de

transformation

aux

conjonctions

-LRB-

voir

section

-RRB-

Sur

l'exemple

pr?ec?edent

on

obtient

a

-LRB-

Alt

X

Y

Z

-RRB-

-LRB-

-LRB-

Alt

Y

X

-RRB-

X

Y

Z

-RRB-

-LRB-

Alt

X

Y

-RRB-

-LRB-

-LRB-

Alt

Y

-RRB-

X

-RRB-

-LRB-

Alt

Y

-RRB-

-LRB-

Alt

Y

-RRB-

Cette

analogie

sugg?ere

de

traiter

les

arguments

des

points

de

choix

comme

les

variables

des

environnements

En

premier

lieu

il

y

a

des

arguments

temporaires

Ce

sont

les

arguments

utilis?es

dans

le

corps

-LRB-

transform?e

-RRB-

de

la

premi?ere

clause

mais

qui

n'interviennent

pas

dans

les

clauses

suivantes

C'est

par

exemple

le

cas

du

troisi?eme

argument

de

dans

l'exemple

ci-dessus

Il

n'est

pas

n?ecessaire

de

sauver

ces

arguments

dans

le

point

de

choix

En

second

lieu

il

est

l?egitime

d'

elaguer

les

points

de

choix

avec

potentiellement

les

m

emes

b?en?efices

que

pour

les

environnements

Dans

l'exemple

ci-dessus

le

premier

argument

du

pr?edicat

bien

qu'utilis

e

dans

la

deuxi?eme

clause

n'est

pas

utilis?e

dans

la

troisi?eme

La

transformation

avec

partage

elimine

cet

argument

de

la

deuxi?eme

instance

du

point

de

choix

La

m?emoire

associ?ee

aux

donn?ees

uniquement

accessibles

par

l'interm

ediaire

de

cet

argument

peut

alors

etre

r?ecup?er?ee

sans

attendre

la

lib?eration

du

point

de

choix

L'id

ee

d'

elaguer

les

points

de

choix

n'est

pas

proprement

nouvelle

Dans

-LSB-

-RSB-

Hickey

et

Mudambi

introduisent

des

variantes

des

instructions

standard

de

gestion

des

points

de

choix

Pour

chacune

des

instructions

un

param?etre

additionnel

donne

une

liste

de

registres

eventuellement

marqu?es

L'instruction

try

sauve

ces

registres

dans

le

point

de

choix

Au

sein

des

instructions

retry

et

trust

le

param?etre

additionnel

indique

dans

quels

registres

charger

les

arguments

sauvegard?es

Les

registres

marqu?es

correspondent

a

des

arguments

devenus

inutiles

qui

peuvent

etre

supprim?es

du

point

de

choix

L'impl

ementation

de

cette

suppression

n'est

toutefois

pas

explicit?ee

Dans

Aquarius

-LSB-

-RSB-

les

arguments

temporaires

ne

sont

pas

sauvegard?es

mais

les

points

de

choix

ne

sont

pas

elagu?es

Une

liste

de

registres

est

aussi

pass?ee

en

param?etre

pour

indiquer

quels

arguments

restaurer

et

o?u

les

Notons

que

alors

que

les

les

instructions

retry

et

trust

ce

param?etre

permet

de

supprimer

certaines

copies

de

registre

a

registre

Autres

am?eliorations

pr?edicats

comprenant

deux

clauses

sont

relativement

fr?equents

-LRB-

cas

typique

des

pr?edicats

r?ecursifs

-RRB-

les

pr?edicats

comprenant

plus

de

deux

clauses

pr?edicats

auxiliaires

r?esultant

de

la

transformation

de

disjonctions

ou

de

constructions

conditionnelles

inclus

sont

relativement

rares

exception

faite

des

pr?edicats

de

type

base

de

donn?ees

d?efinie

par

extension

qui

en

g?en?eral

ne

peuvent

b?en?eficier

de

l'

elagage

A

priori

le

seul

traitement

des

arguments

temporaires

couvre

donc

un

large

eventail

de

cas

Les

deux

propositions

ont

toutefois

un

c

ot?e

ad

hoc

L'analogie

avec

les

environnements

sugg?ere

plut

ot

de

g?erer

les

points

de

choix

a

la

mani?ere

des

environnements

et

de

r?eutiliser

les

id?ees

du

chapitre

En

particulier

allocation

et

lib?eration

de

l'information

de

contr

ole

devraient

etre

d?econnect?ees

de

la

sauvegarde

et

de

la

restauration

des

arguments

En

ce

qui

concerne

l'agencement

d'un

point

de

choix

l'id

ee

est

de

ranger

l'information

de

contr

ole

au

fond

du

point

de

choix

et

les

arguments

au

sommet

ordonn?es

comme

les

variables

permanentes

les

premiers

inutilis?es

au

sommet

De

plus

le

registre

B

devrait

pointer

sur

le

sommet

du

point

de

choix

Les

techniques

d'

elagage

anticip?e

et

d'

elagage

retard?e

sont

alors

ais?ement

applicables

Un

agencement

a

la

WAM

o?u

le

registre

B

pointe

sur

le

fond

du

point

de

choix

n

a

que

peu

d'attrait

Dans

le

cas

d'une

architecture

a

pile

unique

on

retrouve

le

m

eme

type

de

probl?eme

que

pour

les

environnements

Dans

le

cas

d'une

architecture

a

pile

double

le

calcul

du

nouveau

sommet

de

pile

apr?es

une

coupure

est

probl?ematique

La

r?eutilisation

des

points

de

choix

Les

points

de

choix

peuvent

etre

r?eutilis?es

dans

des

conditions

similaires

aux

conditions

de

r?eutilisation

des

environnements

Un

appel

r?ecursif

terminal

peut

r?eutiliser

le

point

de

choix

du

pr?edicat

appelant

si

l'appel

r?ecursif

a

lieu

dans

un

etat

d?eterministe

-LRB-

sinon

le

point

de

choix

n'est

pas

en

sommet

de

pile

-RRB-

et

si

bien

evidemment

le

point

de

choix

du

pr?edicat

appelant

n'est

plus

n?ecessaire

c'est

a-dire

a

et?e

coup?e

ou

lib?er?e

par

une

instruction

trust

Si

la

proc?edure

appelante

est

r?eguli?ere

l'environnement

aussi

peut

etre

r?eutilis?e

Comme

pour

les

environnements

la

r?eutilisation

s

applique

aussi

aux

appels

terminaux

non

r?ecursifs

Les

grandes

lignes

de

la

mise

en

oeuvre

de

la

r?eutilisation

des

points

de

choix

sont

esquiss?ees

par

Meier

dans

-LSB-

-RSB-

Deux

cas

sont

a

consid?erer

l'appel

r?ecursif

a

lieu

dans

une

clause

terminale

-LRB-

le

point

de

choix

est

lib?er?e

par

une

instruction

trust

-RRB-

ou

pas

-LRB-

le

point

de

choix

est

lib?er?e

par

une

op?eration

de

coupure

-RRB-

Ces

deux

cas

sont

bien

plus

proches

que

ne

laisse

supposer

Meier

Illustrons

le

principe

g?en?eral

sur

le

pr?edicat

-LRB-

voir

exemple

de

r?eutilisation

des

environnements

section

-RRB-

Notre

point

de

d?epart

est

le

squelette

du

code

de

avec

r?eutilisation

de

l'environnement

seul

Ce

squelette

est

reproduit

figure

Il

s

agit

alors

de

remplacer

l'instruction

trust

par

une

instruction

retry

afin

de

ne

pas

lib?erer

le

point

de

choix

courant

Cette

instruction

d?efinit

le

point

de

retour

arri?ere

de

telle

sorte

que

en

cas

d'

echec

de

l'appel

a

le

point

de

choix

soit

lib?er?e

et

l'

echec

Comme

apr?es

Meier

-LSB-

-RSB-

la

r?eutilisation

du

point

de

choix

requiert

que

n

echoue

pas

La

gestion

des

points

de

choix

loop

-LRB-

X

-RRB-

end

-LRB-

X

-RRB-

loop

-LRB-

X

-RRB-

process

-LRB-

X

-RRB-

loop

-LRB-

-RRB-

r?eutilisation

de

l'environnement

seul

allocate

loop

instructions

deallocate

proceed

fail

instructions

jump

loop

r?eutilisation

de

l'environnement

et

du

point

de

choix

allocate

allocation

d'un

point

de

choix

partiel

loop

mise

a

jour

du

point

de

choix

BP

-LRB-

B

-RRB-

instructions

deallocate

proceed

instructions

jump

loop

fail

fail

Figure

Exemple

de

r?eutilisation

d'un

point

de

choix

Conclusion

pour

les

environnements

il

est

alors

possible

de

sortir

de

la

boucle

l'allocation

de

la

m?emoire

n?ecessaire

au

point

de

choix

ainsi

que

l'initialisation

des

parties

invariantes

c'est

a-dire

au

moins

des

champs

B

-LRB-

B

-RRB-

E

-LRB-

B

-RRB-

et

CP

-LRB-

B

-RRB-

Les

premi?eres

instructions

de

la

boucle

doivent

alors

initialement

d?efinir

puis

mettre

a

jour

les

autre

champs

Ai

-LRB-

B

-RRB-

bp

-LRB-

B

-RRB-

G

-LRB-

B

-RRB-

et

T

-LRB-

B

-RRB-

-LRB-

ainsi

que

les

registres

GB

et

TB

s

ils

existent

-RRB-

La

disponibilit?e

d'informations

suppl?ementaires

sur

le

pr?edicat

et

donc

sur

le

comportement

de

la

boucle

peut

conduire

a

initialiser

hors

de

la

boucle

G

-LRB-

B

-RRB-

-LRB-

pas

de

cr?eation

de

terme

compos?e

-RRB-

ou

T

-LRB-

B

-RRB-

-LRB-

pas

de

liaison

-RRB-

Finalement

environnement

et

point

de

choix

peuvent

partager

certaines

donn?ees

Ainsi

il

n'est

pas

n?ecessaire

de

sauvegarder

dans

le

point

de

choix

les

registres

de

continuation

E

et

CP

d?ej?a

sauvegard?es

dans

l'environnement

L'instruction

trust

doit

alors

etre

remplac?ee

de

mani?ere

a

restaurer

les

registres

de

continuation

a

partir

de

l'environnement

plut

ot

que

du

point

de

choix

Cela

s

applique

aussi

aux

variables

permanentes

arguments

de

l'appel

Notons

que

ces

am?eliorations

ne

sont

applicables

que

s

il

est

possible

de

garantir

que

le

r?ecup?erateur

de

m?emoire

saura

g?erer

des

points

de

choix

partiellement

remplis

La

r?eutilisation

des

points

de

choix

est

au

moins

partiellement

impl?ement?ee

dans

ProLog

by

BIM

-LSB-

-RSB-

Une

technique

similaire

est

aussi

appliqu?ee

a

l'unique

structure

de

contr

ole

de

la

NTOAM

-LSB-

-RSB-

-LRB-

voir

section

-RRB-

Conclusion

Les

d?etails

de

la

gestion

des

points

de

choix

ont

et?e

explor?es

Une

id?ee

essentielle

est

que

les

point

choix

ne

doivent

pas

n?ecessairement

etre

trait?es

de

mani?ere

monolithique

Les

donn?ees

constitutives

d'un

point

de

choix

peuvent

etre

sauv?ees

et

restaur?ees

ind?ependamment

les

unes

des

autres

d'

o?u

une

r?eduction

des

acc?es

m?emoire

notamment

en

cas

d'

echec

pr?ematur?e

Le

support

des

retours

arri?ere

superficiels

et

la

cr?eation

retard?ee

des

points

de

choix

peuvent

etre

combin?es

avec

un

sch?ema

d'indexation

simple

fournissant

ainsi

un

m?ecanisme

de

s?election

des

clauses

relativement

efficace

et

facile

a

mettre

oeuvre

Ces

techniques

restent

int?eressantes

en

pr?esence

de

techniques

d'indexation

plus

sophistiqu?ees

du

fait

qu'elles

conduisent

a

produire

du

code

dont

la

taille

ne

cro

t

que

lin?eairement

en

fonction

du

nombre

de

clauses

Finalement

de

m

eme

que

les

environnements

les

points

de

choix

peuvent

etre

r?eutilis?es

et

doivent

etre

elagu?es

L'absence

d'

elagage

source

possible

de

fuites

de

m?emoire

peut

etre

consid?er?e

comme

une

imperfection

s?erieuse

de

la

WAM

La

gestion

des

points

de

choix

La

coupure

Le

m?ecanisme

de

coupure

joue

un

r

ole

fondamental

dans

la

viabilit?e

de

Prolog

En

effet

ce

m?ecanisme

fournit

le

moyen

de

contr

oler

l'expansion

de

l'arbre

de

recherche

en

eliminant

a

priori

les

alternatives

vou?ees

a

l'

echec

C'est

aussi

ce

m

eme

m?ecanisme

qui

se

cache

derni?ere

des

primitives

telles

que

la

n?egation

par

l'

echec

et

les

constructions

conditionnelles

Ce

chapitre

d?ecrit

la

mise

en

oeuvre

des

trois

types

principaux

de

coupure

coupure

standard

coupure

locale

et

coupure

s?elective

qui

se

distinguent

par

des

port?ees

diff?erentes

de

leurs

effets

Sont

consid?er?ees

a

la

fois

les

questions

de

compilation

et

de

gestion

m?emoire

Une

premi?ere

section

pr?esente

une

technique

de

mise

en

oeuvre

de

la

coupure

standard

bas?ee

sur

une

transformation

de

programmes

clause

a

clause

Cette

technique

utilis?ee

pour

KCM

est

compar?ee

aux

solutions

d?ecrites

dans

la

litt?erature

La

section

examine

l'influence

de

la

coupure

sur

la

gestion

m?emoire

Une

gestion

statique

de

la

m?emoire

dans

l'esprit

de

la

WAM

requiert

l'introduction

d'une

architecture

a

pile

double

Il

est

alors

possible

de

lib?erer

la

m?emoire

allou?ee

aux

points

de

choix

r?esidant

en

sommet

de

pile

locale

La

section

traite

de

l'extension

de

la

transformation

de

programmes

pr?ec?edemment

cit?ee

a

la

compilation

de

constructions

comme

les

constructions

conditionnelles

o?u

peuvent

appara

tre

des

coupures

locales

La

section

aborde

la

mise

en

oeuvre

des

coupures

s?electives

mettant

en

evidence

une

nouvelle

faiblesse

de

la

WAM

La

section

conclut

le

chapitre

L'impl

ementation

de

l'op

erateur

de

coupure

stan

dard

Une

impl?ementation

ve

Rappelons

bri?evement

les

effets

de

l'op

erateur

de

coupure

standard

ou

coupe-choix

not?e

Notons

tout

d'abord

que

la

coupure

n

a

pas

de

lecture

d?eclarative

ses

effets

ne

peuvent

etre

compris

qu'op

erationnellement

Supposons

qu'un

op?erateur

de

coupure

apparaisse

dans

la

d?efinition

d'un

pr?edicat

p

n.

Un

appel

au

pr?edicat

p

n

va

correspondre

a

la

construction

d'un

sous-arbre

de

recherche

ayant

pour

racine

une

r?esolvante

dont

le

but

courant

est

un

appel

a

p

n.

Ce

sous-arbre

de

recherche

va

d?efinir

la

port?ee

de

eme

majeur

de

Prolog

certaines

coupures

dites

rouges

-LRB-

voir

-LSB-

-RSB-

-RRB-

rendent

incompatibles

lecture

proc?edurale

et

d?eclarative

d'un

programme

La

coupure

l'op

erateur

de

coupure

En

effet

par

d?efinition

l'activation

de

l'op

erateur

de

coupure

va

avoir

pour

effet

d'

eliminer

tous

les

points

de

choix

pr?esents

dans

ce

sous-arbre

Concr?etement

il

va

donc

s

agir

d'

eliminer

tous

les

points

de

choix

-LRB-

il

s

agit

maintenant

de

structures

de

donn?ees

concr?etes

-RRB-

empil?es

apr?es

l'appel

a

p

n.

Vu

la

strat?egie

d'exploration

de

l'arbre

de

recherche

ces

points

de

choix

concrets

correspondent

bien

aux

points

de

choix

abstraits

du

sous-arbre

de

recherche

port?ee

de

l'op

erateur

de

coupure

Le

principe

de

base

de

l'impl

ementation

de

la

coupure

est

donc

tr?es

simple

lors

d'un

appel

le

point

de

choix

courant

ou

point

de

coupure

est

sauvegard?e

et

sera

restaur?e

ult?erieurement

en

cas

de

coupure

eliminant

tous

les

points

de

choix

cr?e?es

entre

le

point

de

coupure

et

la

coupure

Une

impl?ementation

directe

de

ce

principe

est

d?ecrite

par

Bowen

et

al.

dans

-LSB-

-RSB-

Un

nouveau

registre

d'

etat

CUTPT

le

point

de

coupure

-LRB-

cut

point

-RRB-

est

introduit

et

utilis?e

de

la

mani?ere

suivante

ffl

Lors

d'un

appel

-LRB-

instructions

call

et

execute

-RRB-

la

valeur

de

B

est

sauvegard?ee

dans

CUTPT

ffl

En

cas

de

cr?eation

d'un

point

de

choix

pour

l'appel

-LRB-

instructions

try

et

-RRB-

CUTPT

est

sauvegard?e

dans

un

nouveau

champ

CUTPT

-LRB-

B

-RRB-

du

point

de

choix

afin

de

pouvoir

etre

restaur?e

au

retour

arri?ere

ffl

Une

coupure

superficielle

-LRB-

en

cou

de

clause

-RRB-

correspond

a

un

simple

transfert

de

registres

B

CUTPT

ffl

Dans

le

cas

d'une

clause

r?eguli?ere

le

point

de

coupure

est

sauvegard?e

dans

un

nouveau

champ

CUTPT

-LRB-

E

-RRB-

de

l'environnement

Lors

d'une

coupure

profonde

-LRB-

au

sein

d'un

corps

de

clause

-RRB-

un

simple

acc?es

a

l'environnement

courant

permet

d'effectuer

la

coupure

B

CUTPT

-LRB-

E

-RRB-

Bien

s

ur

d?es

que

les

images

de

certains

champs

du

point

de

choix

par

exemple

du

point

de

retour

arri?ere

sur

la

pile

globale

G

-LRB-

B

-RRB-

sont

gard?ees

en

registre

ces

images

doivent

aussi

etre

mises

a

jour

lors

d'une

coupure

En

fait

s

il

n

y

a

pas

eu

de

point

de

choix

cr?e?e

depuis

le

point

de

coupure

ce

n'est

pas

n?ecessaire

la

coupure

est

une

non-op

eration

Ce

cas

peut

facilement

etre

test?e

comme

sugg?er?e

dans

le

tutoriel

d'

A

tKaci

-LSB-

-RSB-

en

comparant

B

et

CUTPT

Si

les

deux

pointeurs

sont

egaux

la

coupure

n

a

pas

d'effet

Notons

aussi

que

l'addition

d'un

champ

CUTPT

-LRB-

B

-RRB-

n'est

n?ecessaire

que

dans

le

cas

d'une

indexation

a

deux

niveaux

ce

qui

est

le

cas

de

la

WAM

La

s?election

d'une

clause

peut

demander

jusqu

a

la

cr?eation

de

deux

points

de

choix

successifs

le

point

de

coupure

est

alors

diff?erent

du

point

de

choix

pr?ec?edent

dont

l'adresse

est

sauvegard?ee

dans

le

champ

B

-LRB-

B

-RRB-

Par

contre

lors

d'une

indexation

a

un

niveau

-LRB-

voir

-LSB-

-RSB-

-RRB-

le

point

de

coupure

et

le

point

de

choix

pr?ec?edent

sont

confondus

le

point

de

coupure

est

en

fait

naturellement

sauvegard?e

dans

le

champ

B

-LRB-

B

-RRB-

L'impl

ementation

de

l'op

erateur

de

coupure

standard

save

choice

Vn

Vn

B

cut

Vn

B

Vn

GB

G

-LRB-

B

-RRB-

Figure

Calcul

du

point

de

coupure

pr?edicat

par

pr?edicat

Instructions

Inconv?enients

L'impl

ementation

ve

pr?ec?edemment

d?ecrite

de

la

coupure

a

l'avantage

d'

etre

tr?es

simple

Elle

n'est

toutefois

pas

sans

inconv?enients

ffl

Le

registre

B

est

syst?ematiquement

copi?e

dans

le

registre

CUTB

alors

qu'il

peut

ne

pas

y

avoir

de

coupure

dans

le

pr?edicat

appel?e

-LRB-

la

pr?esence

d'une

coupure

dans

le

pr?edicat

appel?e

ne

peut

pas

dans

le

contexte

d'une

compilation

incr?ementale

etre

d?etermin?ee

a

la

compilation

-RRB-

ffl

Le

point

de

coupure

est

syst?ematiquement

sauvegard?e

dans

les

points

de

choix

et

restaur?e

au

retour

arri?ere

alors

qu'il

n

y

a

pas

obligatoirement

de

coupure

apr?es

le

retour

arri?ere

ffl

Les

champs

CUTPT

-LRB-

E

-RRB-

et

CUTP

-LRB-

B

-RRB-

accroissent

la

taille

des

points

de

choix

et

des

environnements

ffl

Un

nouveau

registre

d'

etat

est

introduit

r?eduisant

le

nombre

de

registres

disponibles

-LRB-

dans

l'hypoth

ese

d'une

utilisation

de

registres

machine

-RRB-

Le

calcul

du

point

de

coupure

pr?edicat

par

pr?edicat

En

fait

la

plupart

des

inconv?enients

que

l'on

vient

de

mentionner

peuvent

etre

evit?es

en

sauvegardant

le

point

de

coupure

comme

s

il

s

agissait

d'une

variable

plut

ot

que

dans

un

registre

sp?ecialis?e

et

en

effectuant

cette

sauvegarde

une

fois

l'appel

effectu?e

mais

avant

la

cr?eation

eventuelle

d'un

point

de

choix

Ces

effets

peuvent

etre

r?ealis?es

par

une

simple

transformation

de

programmes

d?ecrite

par

Carlsson

dans

un

rapport

sur

Tricia

-LSB-

-RSB-

D?es

qu'un

pr?edicat

contient

un

op?erateur

de

coupure

l'arit

e

du

pr?edicat

est

incr?ement?ee

et

l'argument

additionnel

est

utilis?e

pour

sauvegarder

le

point

de

coupure

La

coupure

p

-LRB-

X

Y

-RRB-

s

-LRB-

X

-RRB-

t

-LRB-

Y

-RRB-

p

-LRB-

X

Y

-RRB-

u

-LRB-

X

Y

-RRB-

p

-LRB-

X

Y

-RRB-

-LRB-

Z

-RRB-

execute

p

-LRB-

X

Y

Z

-RRB-

p

-LRB-

X

allocate

Y

Z

-RRB-

call

s

-LRB-

X

-RRB-

cut

cut

-LRB-

Z

-RRB-

Y

-RRB-

deallocate

execute

t

-LRB-

fail

p

-LRB-

X

Y

-RRB-

execute

u

-LRB-

X

Y

-RRB-

Figure

Code

d'un

pr?edicat

avec

coupure

L'impl

ementation

de

l'op

erateur

de

coupure

standard

Par

exemple

le

pr?edicat

p

-LRB-

X

Y

-RRB-

s

-LRB-

X

-RRB-

t

-LRB-

Y

-RRB-

p

-LRB-

X

Y

-RRB-

u

-LRB-

X

Y

-RRB-

est

transform?e

en

p

-LRB-

X

Y

-RRB-

-LRB-

Cut

-RRB-

p

-LRB-

X

Y

Cut

-RRB-

p

-LRB-

X

Y

Cut

-RRB-

s

-LRB-

X

-RRB-

cut

-LRB-

Cut

-RRB-

t

-LRB-

Y

-RRB-

p

-LRB-

X

Y

-RRB-

u

-LRB-

X

Y

-RRB-

o?u

-LRB-

Cut

-RRB-

sauvegarde

le

point

de

coupure

dans

la

variable

Cut

et

le

but

cut

-LRB-

Cut

-RRB-

effectue

une

coupure

utilisant

pour

point

de

coupure

la

valeur

de

Cut

Les

pr?edicats

et

ne

sont

que

de

pseudo

pr?edicats

pr?ed?efinis

Ils

ne

sont

connus

que

du

qui

les

compile

en

ligne

en

utilisant

les

instructions

Xn

pour

et

cut

Vn

pour

-LRB-

voir

figure

-RRB-

Le

pr?edicat

est

aussi

un

pseudo

pr?edicat

dont

le

code

est

fusionn?e

avec

le

code

g?en?er?e

pour

le

pr?edicat

Le

surco

ut

de

l'appel

peut

etre

simplement

elimin?e

lors

d'une

phase

d'optimisation

a

lucarne

Le

code

obtenu

est

donn?e

figure

Ici

le

point

de

coupure

est

sauvegard?e

dans

une

variable

permanente

Dans

d'autres

cas

il

serait

sauvegard?e

dans

une

variable

temporaire

dans

l'attente

de

la

cr?eation

de

l'environnement

ou

d'une

coupure

superficielle

Dans

le

dernier

cas

le

point

de

coupure

n

a

pas

besoin

de

survivre

au

del?a

du

cou

de

la

clause

Notons

que

le

point

de

coupure

est

un

argument

ordinaire

en

ce

qui

concerne

les

points

de

choix

et

une

variable

permanente

ordinaire

en

ce

qui

concerne

les

environnements

En

particulier

l'

elagage

des

environnements

et

des

points

de

choix

s

appliquent

Par

exemple

lors

de

l'ex

ecution

du

code

figure

il

n

y

a

aucune

raison

de

sauvegarder

le

point

de

coupure

dans

le

point

de

choix

construit

pour

Il

n'est

pas

clair

qu'une

transformation

de

programmes

ait

vraiment

et?e

utilis?ee

dans

le

compilateur

de

Tricia

A

la

lecture

de

-LSB-

-RSB-

il

semble

que

l'instruction

choice

l'

equivalent

de

notre

soit

plut

ot

ins?er?ee

de

mani?ere

ad

hoc

d'

o?u

la

n?ecessit?e

pour

l'instruction

d'accepter

aussi

des

variables

permanentes

en

param?etre

La

m

eme

remarque

s

applique

au

compilateur

d'Aurora

-LSB-

-RSB-

Le

compilateur

d'Aquarius

-LSB-

-RSB-

fait

toutefois

appel

a

une

v?eritable

transformation

de

programmes

Pour

etre

complet

mentionnons

que

le

tutoriel

d'

A

t-Kaci

-LSB-

-RSB-

d?ecrit

une

variante

interm?ediaire

entre

impl?ementation

ve

et

impl?ementation

par

transformation

de

programmes

D'un

c

ot?e

le

point

de

coupure

est

syst?ematiquement

calcul?e

a

chaque

appel

de

pr?edicat

et

sauv?e

dans

les

points

de

choix

avec

registre

et

champ

sp?ecialis?es

D'un

autre

c

ot?e

le

point

de

coupure

n'est

sauvegard?e

dans

les

environnements

en

tant

que

variable

permanente

que

si

cela

est

n?ecessaire

fait

ces

pr?edicats

facilitent

aussi

l'impl

ementation

du

pr?edicat

pr?ed?efini

et

de

ses

variantes

La

coupure

save

cut

Vn

if

-LRB-

superficiel

vrai

vrai

-RRB-

Vn

B

-LRB-

B

-RRB-

else

Vn

B

neck

cut

Vn

if

-LRB-

superficiel

vrai

-RRB-

-LCB-

superficiel

faux

if

-LRB-

vrai

-RRB-

-LCB-

B

B

-LRB-

B

-RRB-

Vn

B

GB

G

-LRB-

B

-RRB-

-RCB-

-RCB-

neck

cut

if

-LRB-

superficiel

vrai

-RRB-

-LCB-

superficiel

faux

if

-LRB-

vrai

-RRB-

-LCB-

B

B

-LRB-

B

-RRB-

GB

G

-LRB-

B

-RRB-

-RCB-

-RCB-

Figure

Calcul

du

point

de

coupure

clause

par

clause

Instructions

Le

calcul

du

point

de

coupure

clause

par

clause

La

technique

pr?ec?edemment

d?ecrite

permet

d'

eviter

l'introduction

d'un

registre

et

de

champs

sp?ecialis?es

Elle

n

evite

toutefois

pas

certains

calculs

inutiles

Consid?erons

un

pr?edicat

constitu?e

de

clauses

qui

comportent

toutes

une

coupure

et

un

appel

a

ce

pr?edicat

pour

lequel

toutes

les

unifications

appel/t

ete

de

clause

echouent

Le

point

de

coupure

n'est

jamais

utilis?e

et

devrait

donc

dans

ce

cas

etre

ignor?e

Pour

ce

faire

le

point

de

coupure

doit

etre

sauv?e

clause

par

clause

et

dans

chaque

clause

au

del?a

du

cou

de

la

clause

En

fait

le

cou

de

la

clause

est

un

bon

endroit

pour

calculer

le

point

de

coupure

Dans

un

sch?ema

de

compilation

f

qui

cr?ee

des

points

de

choix

syst?ematiquement

et

ne

partage

pas

les

clauses

entre

diff?erentes

s?equences

le

point

de

coupure

au

cou

de

la

L'impl

ementation

de

l'op

erateur

de

coupure

standard

clause

d?epend

de

la

position

de

la

clause

dans

la

s?equence

Il

est

egal

au

point

de

choix

courant

dans

le

cas

d'une

clause

terminale

au

point

de

choix

pr?ec?edent

donn?e

par

le

champ

B

-LRB-

B

-RRB-

sinon

Nous

faisons

ici

l'hypoth

ese

d'une

indexation

a

un

seul

niveau

Quand

les

clauses

sont

partag?ees

leur

position

est

connue

dynamiquement

gr

ace

au

mode

de

retour

arri?ere

Le

point

de

coupure

d?epend

alors

du

mode

de

retour

point

de

choix

courant

dans

la

zone

de

retour

arri?ere

superficielle

point

de

choix

pr?ec?edent

hors

de

cette

zone

Si

de

plus

la

cr?eation

des

points

de

choix

est

retard?ee

le

point

de

coupure

peut

correspondre

au

point

de

choix

en

sommet

de

pile

m

eme

si

le

point

de

choix

courant

est

virtuel

-LRB-

faux

-RRB-

Soit

le

pseudo

pr?edicat

pr?ed?efini

qui

unifie

son

argument

une

variable

avec

le

point

de

coupure

calcul?e

au

cou

de

la

clause

Ce

pr?edicat

a

beaucoup

de

points

communs

avec

sauf

qu'il

lie

son

argument

d'entr

ee

une

variable

au

point

de

coupure

plut

ot

qu'au

point

de

choix

courant

De

m

eme

que

pr?ec?edemment

on

applique

dans

un

premier

temps

une

transformation

de

programmes

cette

fois

a

l'

echelle

de

la

clause

Si

la

clause

contient

une

coupure

un

but

-LRB-

Cut

-RRB-

est

ins?er?e

au

cou

de

la

clause

La

variable

Cut

est

une

nouvelle

variable

qui

n'est

pas

utilis?ee

dans

la

clause

initiale

De

plus

tous

les

op?erateurs

de

coupure

de

la

clause

sont

remplac?es

par

des

buts

cut

-LRB-

Cut

-RRB-

o?u

est

d?efini

comme

pr?ec?edemment

Par

exemple

le

pr?edicat

p

-LRB-

X

Y

-RRB-

s

-LRB-

X

-RRB-

t

-LRB-

Y

-RRB-

p

-LRB-

X

Y

-RRB-

u

-LRB-

X

Y

-RRB-

est

transform?e

en

p

-LRB-

X

Y

-RRB-

-LRB-

Cut

-RRB-

s

-LRB-

X

-RRB-

cut

-LRB-

Cut

-RRB-

t

-LRB-

Y

-RRB-

p

-LRB-

X

Y

-RRB-

u

-LRB-

X

Y

-RRB-

Dans

ce

cas

-LRB-

la

coupure

est

profonde

-RRB-

une

instruction

Vn

-LRB-

voir

figure

-RRB-

va

etre

g?en?er?ee

pour

l'appel

a

et

une

instruction

cut

Vn

-LRB-

voir

figure

-RRB-

pour

l'appel

a

Notons

que

pr?ec?ede

le

cou

de

la

clause

afin

de

calculer

le

point

de

coupure

dans

la

zone

de

retour

arri?ere

superficiel

-LRB-

avant

qu'une

instruction

neck

n'invalide

le

drapeau

superficiel

-RRB-

Le

sch?ema

de

compilation

est

un

peu

plus

complexe

dans

le

cas

d'une

coupure

superficielle

Par

exemple

le

pr?edicat

p

-LRB-

X

Y

-RRB-

t

-LRB-

Y

-RRB-

p

-LRB-

X

Y

-RRB-

u

-LRB-

X

Y

-RRB-

est

transform?e

en

p

-LRB-

X

Y

-RRB-

-LRB-

Cut

-RRB-

cut

-LRB-

Cut

-RRB-

t

-LRB-

Y

-RRB-

p

-LRB-

X

Y

-RRB-

u

-LRB-

X

Y

-RRB-

La

coupure

Une

compilation

ind?ependante

des

appels

a

et

et

du

cou

de

la

clause

n'est

pas

optimale

dans

la

mesure

o?u

l'instruction

neck

cr?eerait

un

point

de

choix

qui

serait

imm?ediatement

elimin?e

par

l'instruction

cut

Une

sp?ecialisation

de

cette

s?equence

d'instructions

conduit

a

d?efinir

deux

nouvelles

instructions

et

Vn

qui

combinent

les

trois

instructions

Vn

neck

et

cut

Vn

-LRB-

voir

le

code

correspondant

figure

-RRB-

La

version

sans

param?etre

est

utilis?ee

quand

il

n

y

a

pas

d'autre

coupure

dans

la

clause

Une

autre

possibilit?e

est

de

travailler

au

niveau

de

la

transformation

en

utilisant

un

nouveau

pseudo

pr?edicat

pr?ed?efini

tel

que

-LRB-

Cut

-RRB-

est

equivalent

a

-LRB-

Cut

-RRB-

cut

-LRB-

Cut

-RRB-

Le

choix

entre

et

Vn

d?epend

alors

simplement

du

type

de

la

variable

Cut

temporaire

ou

permanente

Il

y

a

toutefois

un

cas

o?u

le

calcul

du

point

de

coupure

clause

par

clause

n

a

pas

grand

sens

a

savoir

le

cas

o?u

la

premi?ere

clause

de

la

s?equence

qui

contient

une

coupure

ne

peut

pas

echouer

avant

le

point

d'engagement

Ce

cas

est

tr?es

fr?equent

tous

les

exemples

utilis?es

ci-dessus

ob?eissent

en

fait

a

cette

simple

condition

Consid?erons

le

code

interm?ediaire

suivant

o?u

l'instruction

indique

simplement

une

cr?eation

retard?ee

du

point

de

choix

p

-LRB-

X

Y

-RRB-

s

-LRB-

X

-RRB-

t

-LRB-

Y

-RRB-

p

-LRB-

X

Y

-RRB-

u

-LRB-

X

Y

-RRB-

p

-LRB-

X

Y

-RRB-

-LRB-

Z

-RRB-

neck

s

-LRB-

X

-RRB-

cut

-LRB-

-RRB-

cut

-LRB-

Z

-RRB-

Y

-RRB-

t

-LRB-

En

fait

retarder

le

point

de

choix

n

a

pas

d'int

er

et

Les

instructions

et

neck

devraient

etre

fusionn?ees

en

une

instruction

standard

Lors

de

l'ex

ecution

de

le

point

de

coupure

correspond

au

point

de

choix

pr?ec?edant

le

point

de

choix

courant

d'

o?u

un

acc?es

au

champ

B

-LRB-

B

-RRB-

Cette

lecture

m?emoire

sera

tr?es

probablement

servie

par

le

cache

Elle

peut

toutefois

etre

evit?ee

en

revenant

a

la

premi?ere

transformation

de

programmes

A

ce

niveau

l'instruction

neck

cut

ne

prend

que

des

variables

permanentes

en

param?etre

L'utilisation

de

variables

temporaires

appara

t

avec

la

prise

en

compte

des

coupures

locales

-LRB-

voir

section

-RRB-

L'impl

ementation

de

l'op

erateur

de

coupure

standard

save

cut

Vn

neck

cut

Vn

neck

cut

point

de

choix

r?eel

Vn

B

-LRB-

B

-RRB-

Vn

B

-LRB-

B

-RRB-

B

B

-LRB-

B

-RRB-

B

Vn

GB

G

-LRB-

B

-RRB-

GB

G

-LRB-

B

-RRB-

point

de

choix

virtuel

Vn

B

Vn

B

GB

G

-LRB-

B

-RRB-

GB

G

-LRB-

B

-RRB-

retour

profond

Vn

B

Vn

B

non-op

eration

Figure

Coupure

sans

drapeau

Instructions

p

-LRB-

X

Y

-RRB-

s

-LRB-

X

-RRB-

t

-LRB-

Y

-RRB-

p

-LRB-

X

Y

-RRB-

u

-LRB-

X

Y

-RRB-

p

-LRB-

X

Y

-RRB-

-LRB-

Z

-RRB-

execute

p

-LRB-

X

Y

Z

-RRB-

p

-LRB-

X

Y

Z

-RRB-

s

-LRB-

X

-RRB-

Dans

tous

les

autres

cas

un

calcul

clause

par

clause

se

comporte

mieux

en

terme

d'acc

es

m?emoire

aux

donn?ees

Il

n

y

a

pas

d'acc

es

suppl?ementaire

en

ecriture

lors

de

la

cr?eation

d'un

point

de

choix

Dans

les

clauses

terminales

la

restauration

du

point

de

coupure

est

evit?ee

Dans

les

clauses

interm?ediaires

les

acc?es

sont

identiques

lecture

d'un

champ

argument

ou

du

champ

B

-LRB-

B

-RRB-

si

un

point

de

choix

a

et?e

cr?e?e

lecture

d'un

registre

argument

ou

du

registre

B

sinon

Elimination

des

drapeaux

Comme

pr?ec?edemment

le

surco

ut

de

gestion

des

drapeaux

peut

etre

r?eduit

en

cr?eant

des

s?equences

d'instructions

sp?ecialis?ees

Le

principe

en

est

tr?es

simple

les

instructions

et

sont

sp?ecialis?ees

en

fonction

de

la

s?equence

d'instruction

comme

le

montre

la

figure

De

plus

la

contrainte

sur

les

s?equences

de

type

point

de

choix

r?eel

qui

veut

que

les

arguments

soient

restaur?es

en

cas

de

succ?es

peut

etre

rel

ach?ee

dans

le

cas

o?u

la

clause

comporte

une

coupure

superficielle

En

effet

il

ne

sera

pas

n?ecessaire

de

cr?eer

de

point

de

choix

Cela

conduit

a

faire

la

distinction

pour

les

s?equences

de

type

superficiel

entre

s?equence

d?eterministe

-LRB-

pr?esence

d'une

coupure

superficielle

-RRB-

et

s?equence

non

La

coupure

d?eterministe

Dans

le

premier

cas

les

arguments

doivent

etre

restaur?es

en

cas

d'

echec

uniquement

Dans

le

deuxi?eme

cas

ils

doivent

etre

restaur?es

a

la

fois

dans

les

cas

d'

echec

et

dans

les

cas

de

succ?es

Travaux

apparent?es

La

machine

PLM

La

solution

adopt?ee

pour

la

machine

PLM

-LSB-

-RSB-

est

int?eressante

du

fait

qu'elle

pousse

le

principe

de

procrastination

a

son

extr

eme

limite

en

retardant

la

calcul

du

point

de

coupure

jusqu'au

moment

de

la

coupure

m

eme

Cette

solution

s

appuie

sur

un

drapeau

de

coupure

pris

en

compte

au

niveau

mat?eriel

qui

est

tr?es

similaire

au

mode

de

retour

arri?ere

d'ICM

Ce

drapeau

n'est

toutefois

pas

utilis?e

pour

tenir

compte

des

retours

arri?ere

superficiel

ou

calculer

le

point

de

coupure

en

cou

de

clause

Il

est

syst?ematiquement

sauvegard?e

avec

la

valeur

du

registre

B

lors

de

la

cr?eation

d'un

environnement

dans

un

champ

B

-LRB-

E

-RRB-

Lors

de

la

coupure

le

point

de

coupure

est

donn?e

suivant

la

valeur

du

drapeau

soit

par

B

-LRB-

E

-RRB-

soit

par

B

-LRB-

B

-LRB-

E

-RRB-

-RRB-

Une

petite

difficult?e

est

due

au

fait

que

en

cas

de

coupures

multiples

au

sein

d'une

m

eme

clause

le

drapeau

doit

etre

mis

a

faux

lors

de

la

premi?ere

coupure

afin

que

lors

des

coupures

suivantes

le

point

de

coupure

soit

correctement

calcul?e

-LRB-

sa

valeur

est

donn?ee

par

B

-LRB-

B

-LRB-

E

-RRB-

-RRB-

-RRB-

Bien

que

l'id

ee

ait

du

sens

dans

le

contexte

d'une

machine

d?edi?ee

elle

n

a

que

peu

d'int

er

et

dans

le

contexte

d'une

mise

en

oeuvre

logicielle

du

fait

du

surco

ut

de

gestion

du

drapeau

qui

au

contraire

des

drapeaux

superficiel

et

ne

peut

etre

elimin?e

De

plus

a

partir

du

moment

o?u

un

point

de

choix

a

et?e

cr?e?e

pour

le

but

courant

retarder

le

calcul

du

point

de

coupure

a

l'inconv

enient

de

transformer

un

acc?es

m?emoire

local

-LRB-

au

champ

B

-LRB-

B

-RRB-

-RRB-

en

un

acc?es

non

local

r?esultant

de

l'empilement

de

nombreux

points

de

choix

et

environnements

lors

de

l'ex

ecution

des

appels

pr?ec?edant

l'op

erateur

de

coupure

La

proposition

de

Mari?en

et

Demoen

Dans

-LSB-

-RSB-

Mari?en

et

Demoen

proposent

de

calculer

le

point

de

coupure

au

sein

des

instructions

try

retry

et

trust

Le

point

de

coupure

est

l?a

encore

calcul?e

clause

par

clause

mais

de

mani?ere

anticip?ee

La

cr?eation

des

points

de

choix

n

etant

pas

retard?ee

un

calcul

anticip?e

du

point

de

coupure

permet

d'

eviter

l'acc

es

m?emoire

au

champ

B

-LRB-

B

-RRB-

dans

le

cas

de

la

premi?ere

clause

d'une

s?equence

La

proposition

est

la

suivante

Dans

les

instructions

try

et

trust

le

point

de

coupure

est

donn?e

par

cutpt

B.

L'affectation

s

effectue

avant

la

cr?eation

du

point

de

choix

dans

l'instruction

try

et

apr?es

la

suppression

du

point

de

choix

dans

l'instruction

trust

Dans

les

instructions

retry

cutpt

B

-LRB-

B

-RRB-

Le

point

de

coupure

est

directement

rang?e

sur

la

pile

locale

-LRB-

-LRB-

L

-RRB-

B

-RRB-

laissant

deux

cellules

libres

pour

ranger

coupure

superficielle

requiert

la

cr?eation

d'un

environnement

m

eme

si

la

clause

est

un

fait

L'impl

ementation

de

l'op

erateur

de

coupure

standard

l'information

de

continuation

S'il

n

y

a

pas

cr?eation

d'environnement

une

coupure

superficielle

est

equivalente

a

B

-LRB-

L

-RRB-

Si

un

environnement

est

cr?e?e

le

point

de

coupure

devient

partie

int?egrale

de

l'environnement

et

une

coupure

est

equivalente

a

B

E

-LRB-

CUTPT

-RRB-

Afin

de

ne

calculer

le

point

de

coupure

que

lors

de

la

pr?esence

d'une

coupure

deux

familles

d'instructions

try

retry

et

trust

sont

n?ecessaires

l'une

pour

les

clauses

avec

coupure

l'autre

pour

les

clauses

sans

La

fusion

de

l'instruction

avec

try

retry

et

trust

peut

etre

vue

comme

un

bon

point

de

la

proposition

dans

le

contexte

d'un

code

emul?e

La

proposition

multi-s

equences

de

Van

Roy

et

al.

La

proposition

multi-s

equences

de

Van

Roy

et

al.

-LSB-

-RSB-

introduit

quatre

s?equences

d'instructions

d?efinies

a

partir

de

deux

facteurs

l'existence

d'un

point

de

choix

pour

le

but

courant

et

le

d?eterminisme

de

la

clause

Une

clause

est

dite

d?eterministe

si

en

ex?ecutant

des

tests

l'ex

ecution

peut

atteindre

un

point

de

la

clause

le

point

d'engagement

de

sorte

que

toutes

les

clauses

suivantes

peuvent

etre

elimin?ees

sans

affecter

le

r?esultat

du

calcul

-LRB-

elles

echoueront

sans

effet

de

bord

-RRB-

o?u

les

tests

sont

d?efinis

comme

suit

Un

appel

de

pr?edicat

Q

dans

une

clause

P

Q

ou

une

etape

d'unification

Q

dans

une

t

ete

de

clause

est

un

test

si

l'ex

ecution

de

Q

-LRB-

-RRB-

ne

cr?ee

pas

d'effet

de

bord

-LRB-

-RRB-

ne

cr?ee

pas

de

point

de

choix

-LRB-

-RRB-

ne

lie

que

des

variables

locales

a

la

clause

P

et

au

but

Q

-LRB-

-RRB-

ne

cr?ee

pas

de

terme

compos?e

sur

la

pile

globale

Cette

notion

correspond

a

notre

notion

de

garde

qui

est

toutefois

moins

stricte

les

contraintes

-LRB-

-RRB-

et

-LRB-

-RRB-

ont

et?e

rel

ach?ees

sans

co

ut

additionnel

-LRB-

T

et

G

ne

sont

sauvegard?es

que

dans

le

cas

o?u

une

liaison

ou

une

cr?eation

de

terme

compos?e

n'est

pas

exclue

-RRB-

Il

est

donc

possible

de

retarder

la

cr?eation

d'un

point

de

choix

plus

longtemps

et

donc

d'

eviter

un

plus

grand

nombre

de

points

de

choix

Une

autre

diff?erence

importante

est

que

la

proposition

de

Van

Roy

et

al.

ne

fait

pas

la

distinction

entre

des

s?equences

d?eterministes

qui

conduisent

a

un

retour

arri?ere

superficiel

-LRB-

les

s?equences

de

type

superficiel

avec

coupure

superficielle

-RRB-

et

celles

qui

conduisent

a

un

retour

arri?ere

profond

Cela

est

li?e

au

fait

que

le

retour

arri?ere

profond

est

en

fait

impl?ement?e

comme

un

pseudo

echec

superficiel

r?esultant

dans

un

deuxi?eme

temps

en

un

retour

profond

Le

r?esultat

est

que

toutes

les

s?equences

d?eterministes

suppose

qu'il

n

y

ait

pas

d'image

de

champs

du

point

de

choix

dans

les

registres

La

coupure

doivent

restaurer

les

registres

arguments

en

cas

d'

echec

ce

qui

n'est

pas

n?ecessaire

dans

le

cas

d'une

s?equence

de

type

profond

Notons

aussi

qu'une

contrainte

impos?ee

aux

s?equences

non

d?eterministes

est

que

les

tests

ne

doivent

pas

modifier

les

registres

dans

la

perspective

de

la

cr?eation

d'un

point

de

choix

Cette

contrainte

semble

etre

arbitraire

Dans

le

cas

des

s?equences

d?eterministes

les

registres

peuvent

etre

modifi?es

par

exemple

pour

effectuer

un

test

qui

suppose

un

appel

ob?eissant

au

passage

de

param?etres

des

pr?edicats

Prolog

standard

ces

registres

sont

restaur?es

en

cas

d'

echec

On

pourrait

envisager

etendre

cette

id?ee

aux

s?equences

non

d?eterministes

la

restauration

s

appliquant

a

la

fois

aux

echecs

et

aux

succ?es

De

m

eme

dans

le

cas

d'une

s?equence

non

d?eterministe

avec

point

de

choix

il

y

a

d?ej?a

un

point

de

choix

il

n

y

a

pas

de

raison

de

ne

pas

traiter

une

telle

s?equence

de

la

m

eme

mani?ere

qu'une

s?equence

d?eterministe

c'est

a-dire

de

ne

restaurer

les

registres

qu'en

cas

d'

echec

Finalement

la

proposition

de

Van

Roy

et

al.

utilise

une

table

d'adresses

pour

g?erer

le

retour

arri?ere

ainsi

qu'un

drapeau

de

coupure

Ces

techniques

ont

et?e

comment?ees

section

et

section

respectivement

Coupure

et

gestion

m?emoire

L'

elagage

de

l'arbre

de

recherche

par

une

op?eration

de

coupure

rend

inaccessibles

les

parties

non

partag?ees

des

r?esolvantes

correspondant

aux

points

de

choix

plus

jeunes

que

le

point

de

coupure

Les

trois

piles

de

la

WAM

tra

n?ee

pile

locale

et

pile

globale

sont

affect?ees

Cette

section

passe

rapidement

en

revue

les

moyens

de

r?ecup?erer

la

m?emoire

allou?ee

a

la

repr?esentation

de

ces

incr?ements

de

r?esolvante

en

insistant

sur

l'architecture

a

pile

double

une

extension

naturelle

de

la

WAM

qui

permet

en

l'absence

d'op

erateurs

de

coupure

exotiques

la

r?ecup?eration

imm?ediate

de

tous

les

points

de

choix

La

tra

n?ee

Une

coupure

rend

inconditionnelles

toutes

les

liaisons

concernant

des

variables

plus

r?ecentes

que

le

point

de

coupure

Transformer

une

liaison

conditionnelle

en

liaison

inconditionnelle

demande

simplement

de

retirer

l'enregistrement

correspondant

de

la

tra

n?ee

Malheureusement

ces

enregistrements

sont

m?elang?es

a

des

enregistrements

qui

concernant

des

variables

plus

anciennes

restent

valides

Une

proc?edure

de

r?ecup?eration

sp?ecialis?ee

le

nettoyage

de

la

tra

n?ee

une

forme

limit?ee

de

court-circuit

de

variable

d?ej?a

pr?esente

dans

le

syst?eme

PLM

de

Warren

-LSB-

-RSB-

peut

etre

d?eclench?ee

Les

textes

standard

comme

le

tutoriel

d'

A

t-Kaci

-LSB-

-RSB-

et

le

livre

de

Boizumault

-LSB-

-RSB-

consid?ere

le

nettoyage

de

la

tra

n?ee

comme

partie

int?egrale

de

la

coupure

Cette

proc?edure

fonctionne

de

la

mani?ere

suivante

Une

fois

effectu?ee

l'op

eration

de

coupure

proprement

dite

chaque

enregistrement

de

la

tra

n?ee

de

T

-LRB-

B

-RRB-

a

T

est

pass?e

en

revue

Les

enregistrements

devenus

inutiles

sont

simplement

ignor?es

et

les

enregistrements

toujours

Coupure

et

gestion

m?emoire

valides

relog?es

en

cons?equence

En

fin

de

proc?edure

la

valeur

de

T

est

mise

a

jour

V?erifier

si

un

enregistrement

doit

etre

ignor?e

ou

pas

se

r?esume

a

un

simple

test

de

tra

nage

appliqu?e

a

l'adresse

de

la

liaison

Notons

que

la

proc?edure

de

nettoyage

de

la

tra

n?ee

telle

que

nous

venons

de

la

d?ecrire

-LRB-

c'est

par

ailleurs

ainsi

qu'elle

est

habituellement

d?ecrite

-RRB-

n'est

pas

optimale

En

effet

il

n'est

pas

n?ecessaire

de

visiter

le

segment

de

tra

n?ee

compris

entre

le

point

de

coupure

et

le

point

de

choix

suivant

Ce

segment

ne

contient

que

des

enregistrements

de

liaisons

de

variables

plus

anciennes

que

le

point

de

coupure

et

qui

donc

restent

En

particulier

s

il

n

y

a

pas

eu

de

point

de

choix

cr?e?e

depuis

le

point

de

coupure

la

tra

n?ee

n

a

pas

besoin

d'

etre

nettoy?ee

Il

a

d?ej?a

et?e

mentionn?e

que

la

coupure

est

dans

ce

cas

une

non-op

eration

ce

qui

peut

etre

facilement

d?etect?e

en

comparant

le

point

de

coupure

et

le

point

de

choix

courant

La

situation

est

diff?erente

quand

il

y

a

eu

cr?eation

de

point

-LRB-

s

-RRB-

de

choix

Id?ealement

l'agencement

du

point

de

choix

devrait

rendre

accessible

a

partir

de

la

donn?ee

du

point

de

coupure

le

champ

T

-LRB-

B

-RRB-

du

point

de

choix

suivant

le

point

de

coupure

C'est

le

cas

d'un

agencement

compatible

avec

l'

elagage

des

points

de

choix

mais

pas

de

l'agencement

standard

En

fait

de

nombreux

syst?emes

par

exemple

-LRB-

KCM

-RRB-

SEPIA

Prolog/MALI

et

SICS

tus

Prolog

attendent

la

mise

en

route

du

r?ecup?erateur

de

m?emoire

pour

effectuer

un

nettoyage

de

la

tra

n?ee

ce

qui

evite

d'

eventuels

parcours

r?ep?et?es

des

m

emes

portions

de

la

tra

n?ee

Alors

que

SEPIA

et

KCM-SEPIA

se

bornent

a

effectuer

un

nettoyage

de

la

tra

n?ee

classique

Prolog/MALI

et

SICStus

ex?ecutent

des

court-circuits

de

variables

-LSB-

-RSB-

Le

d?esavantage

du

retardement

du

nettoyage

de

la

tra

n?ee

reste

l'existence

lors

du

retour

arri?ere

d'acc

es

m?emoire

en

ecriture

inutiles

correspondant

au

d?etra

nage

de

liaisons

qui

n'auront

plus

d'existence

dans

le

nouvel

etat

Une

solution

partielle

possible

consiste

a

prendre

en

compte

l'extension

de

la

tra

n?ee

pour

le

d?eclenchement

du

r?ecup?erateur

de

m?emoire

afin

de

garantir

une

certaine

localit?e

a

ces

acc?es

et

donc

eviter

de

perturber

la

hi?erarchie

m?emoire

On

peut

aussi

envisager

pour

le

segment

en

sommet

de

pile

non

encore

visit?e

par

le

r?ecup?erateur

de

m?emoire

-LRB-

dans

l'hypoth

ese

d'un

r?ecup?erateur

de

m?emoire

g?en?erationnel

-RRB-

d'appliquer

un

d?etra

nage

s?electif

technique

sugg?er?ee

par

Tick

-LSB-

-RSB-

qui

consiste

a

tester

la

validit?e

d'une

liaison

a

l'aide

du

test

de

tra

nage

avant

d'

ecrire

en

m?emoire

La

pile

locale

De

tous

les

environnements

et

points

de

choix

cr?e?es

depuis

le

point

de

coupure

seul

l'environnement

correspondant

a

la

clause

courante

s

il

y

en

a

un

reste

utile

Si

le

sommet

de

la

pile

locale

est

maintenu

de

mani?ere

anticip?ee

il

doit

etre

recalcul?e

Consid?erons

un

but

pour

lequel

a

la

fois

un

point

de

choix

et

un

environnement

ont

et?e

cr?e?es

Le

recalcul

du

sommet

de

la

pile

au

moment

de

la

coupure

permet

de

r?ecup?erer

la

m?emoire

allou?ee

a

l'ensemble

des

structures

de

contr

ole

cr?e?ees

apr?es

l'environnement

mais

ne

permet

pas

de

r?ecup?erer

la

m?emoire

occup?ee

par

le

point

de

choix

qui

s

est

retrouv?e

enterr?e

apr?es

B.

Demoen

ce

point

aurait

et?e

pris

en

compte

dans

Quintus

Prolog

La

coupure

sous

l'environnement

Ce

probl?eme

est

r?esolu

par

l'adoption

d'une

architecture

a

pile

double

L'architecture

a

pile

double

L'id

ee

de

l'architecture

a

pile

-LRB-

de

contr

ole

-RRB-

double

fut

initialement

propos?ee

par

E.

Tick

et

D.H.D.

Warren

-LSB-

-RSB-

comme

un

moyen

d'am

eliorer

la

localit?e

des

acc?es

a

la

pile

locale

Une

bonne

propri?et?e

de

cette

architecture

mentionn?ee

par

Tick

-LSB-

-RSB-

est

aussi

de

permettre

a

l'op

erateur

de

coupure

de

r?ecup?erer

la

m?emoire

allou?ee

aux

points

de

choix

Finalement

l'architecture

a

pile

double

conditionne

un

support

efficace

du

retour

arri?ere

superficiel

-LRB-

voir

chapitre

-RRB-

Avant

de

d?ecrire

plus

avant

l'architecture

a

pile

double

rappelons

d'abord

quelques

propri?et?es

de

l'architecture

standard

a

pile

-LRB-

de

contr

ole

-RRB-

unique

Dans

une

architecture

a

pile

unique

empiler

une

nouvelle

structure

de

contr

ole

g?ele

toutes

les

structures

pr?ec?edemment

empil?ees

Le

r?esultat

est

que

tant

l'environnement

que

le

point

de

choix

courant

peuvent

se

retrouver

enterr?es

profond

dans

la

pile

L'environnement

courant

n'est

pas

forc?ement

en

sommet

de

pile

De

plus

si

le

point

de

choix

courant

est

le

point

de

choix

le

plus

proche

du

sommet

de

pile

l'environnement

courant

n'est

pas

forc?ement

l'environnement

le

plus

proche

du

sommet

de

pile

Aussi

la

lib?eration

d'un

environnement

par

l'optimisation

d'appel

terminal

ne

veut

pas

dire

que

la

m?emoire

occup?ee

par

cet

environnement

puisse

etre

r?ecup?er?ee

Lorsqu'un

environnement

est

recouvert

par

un

point

de

choix

cela

veut

dire

que

cet

environnement

fait

partie

de

la

r?esolvante

attach?ee

au

point

de

choix

r?esolvante

qui

peut

redevenir

la

r?esolvante

courante

a

l'occasion

d'un

retour

arri?ere

Les

points

de

choix

sont

lib?er?es

soit

par

une

instruction

trust

lorsque

l'ex

ecution

s

appr

ete

a

essayer

la

derni?ere

clause

d'une

s?equence

soit

par

une

op?eration

de

coupure

Cette

lib?eration

est

d?efinitive

la

m?emoire

correspondante

peut

etre

r?ecup?er?ee

Cette

r?ecup?eration

est

ais?ee

dans

le

cas

d'une

instruction

trust

Un

retour

arri?ere

vient

d'avoir

lieu

et

le

point

de

choix

est

en

sommet

de

pile

Les

choses

ne

sont

pas

si

simples

dans

le

cas

d'une

coupure

Les

coupures

superficielles

et

les

coupures

profondes

terminales

sont

faciles

a

g?erer

les

coupures

profondes

non

terminales

ne

le

sont

pas

Consid?erons

le

programme

donn?e

figure

Un

point

de

choix

est

cr?e?e

pour

le

but

a

puis

un

environnement

pour

la

premi?ere

clause

de

a

-LRB-

situation

avant

coupure

de

la

figure

-RRB-

Afin

de

simplifier

le

raisonnement

supposons

que

ne

consiste

qu'en

un

simple

fait

L'ex

ecution

du

but

b

ne

va

pas

modifier

la

pile

Le

point

de

choix

B

-LRB-

a

-RRB-

associ?e

au

but

a

est

alors

lib?er?e

par

l'op

erateur

de

coupure

Comme

B

-LRB-

a

-RRB-

est

recouvert

par

l'environnement

E

-LRB-

a

-RRB-

sa

lib?eration

cr?ee

un

trou

dans

la

pile

-LRB-

situation

apr?es

coupure

de

la

figure

-RRB-

R?ecup?erer

l'espace

allou?e

au

point

de

choix

demande

a

reloger

l'environnement

E

-LRB-

a

-RRB-

L'utilisation

d'une

architecture

a

pile

double

r?esout

aussi

le

probl?eme

Le

point

de

Coupure

et

gestion

m?emoire

a.

B

-LRB-

a

-RRB-

E

-LRB-

a

-RRB-

E

-LRB-

a

-RRB-

trou

a

b

c.

a

Avant

coupure

Apr?es

coupure

Figure

Cr?eation

d'un

trou

sur

la

pile

a

la

suite

d'une

coupure

choix

courant

est

toujours

au

sommet

de

la

pile

de

points

de

choix

qui

se

comporte

comme

une

v?eritable

pile

Le

registre

B

devient

le

sommet

de

la

pile

de

points

de

choix

ainsi

que

le

sommet

du

point

de

choix

courant

Lors

d'une

coupure

la

mise

a

jour

de

B

lib?ere

tous

les

points

de

choix

plus

r?ecents

que

le

point

de

coupure

et

r?ecup?ere

en

m

eme

temps

la

m?emoire

correspondante

En

ce

qui

concerne

la

lib?eration

des

environnements

par

l'optimisation

d'appel

terminal

et

l'

elagage

l'architecture

a

pile

double

ne

se

comporte

pas

diff?eremment

de

l'architecture

standard

Les

environnements

plus

anciens

que

le

point

de

choix

courant

peuvent

etre

lib?er?es

et

donc

dispara

tre

de

la

r?esolvante

courante

tout

en

restant

utile

Le

sommet

de

la

pile

d'environnements

que

nous

continuerons

d'appeler

pile

locale

dans

la

suite

est

donn?e

par

max

-LRB-

e

lb

-RRB-

o?u

lb

marque

l'endroit

o?u

se

serait

trouv?e

le

point

de

choix

courant

dans

une

architecture

a

pile

unique

soit

le

sommet

de

la

pile

locale

lors

de

la

cr?eation

du

point

de

choix

-LSB-

-RSB-

Il

est

aussi

possible

de

d?ecrire

lb

comme

le

point

de

retour

arri?ere

sur

la

pile

locale

par

analogie

avec

les

points

de

retour

sur

la

pile

globale

et

sur

la

tra

n?ee

Le

point

de

retour

sur

la

pile

locale

est

utile

a

chaque

fois

que

le

registre

B

est

utile

dans

une

architecture

a

pile

unique

c'est

a-dire

lors

de

l'ex

ecution

du

test

de

tra

nage

et

du

calcul

du

sommet

de

la

pile

locale

Notons

que

le

calcul

du

sommet

de

la

pile

locale

clairement

requis

lors

de

l'empilement

d'un

nouvel

environnement

est

toujours

requis

lors

de

l'empilement

d'un

nouveau

point

de

choix

non

pas

pour

savoir

o?u

placer

le

point

de

choix

mais

pour

calculer

la

nouvelle

valeur

de

lb

et

la

sauvegarder

dans

le

champ

L

-LRB-

B

-RRB-

qui

vient

doubler

le

champ

B

-LRB-

B

-RRB-

dans

l'agencement

du

point

de

choix

standard

En

fait

suivant

le

contexte

il

est

m

eme

possible

de

se

passer

du

champ

B

-LRB-

B

-RRB-

En

effet

dans

l'hypoth

ese

d'une

primitive

d'

echec

r?eduite

la

taille

du

point

de

choix

courant

est

connue

des

instructions

amen?ees

a

le

d?epiler

-LRB-

param?etre

arit?e

-RRB-

De

m

eme

lors

d'op

erations

qui

demandent

a

parcourir

la

pile

des

points

de

choix

en

partant

du

La

coupure

point

de

choix

courant

-LRB-

ce

peut

etre

le

cas

de

la

proc?edure

de

r?ecup?eration

m?emoire

-RRB-

les

tailles

des

points

de

choix

peuvent

etre

connues

a

partir

des

champs

bp

-LRB-

B

-RRB-

qui

pointant

sur

une

instruction

retry

ou

trust

donnent

au

travers

du

param?etre

arit?e

de

ces

instructions

la

taille

du

point

de

choix

correspondant

On

se

heurte

toutefois

notamment

dans

le

cas

de

code

natif

au

m

eme

type

de

probl?eme

que

lors

de

l'utilisation

du

registre

CP

pour

acc?eder

a

la

taille

de

l'environnement

courant

-LRB-

voir

section

-RRB-

De

plus

l'absence

de

champ

B

-LRB-

B

-RRB-

rend

la

gestion

des

coupures

s?electives

epineuse

-LRB-

voir

section

-RRB-

Comme

pour

G

-LRB-

B

-RRB-

une

question

est

de

savoir

si

une

image

de

L

-LRB-

B

-RRB-

doit

etre

gard?ee

dans

un

registre

-LRB-

machine

-RRB-

LB

De

m

eme

que

pr?ec?edemment

sans

registre

LB

le

test

de

tra

nage

requiert

un

acc?es

en

lecture

suppl?ementaire

lors

d'une

liaison

sur

la

pile

locale

De

plus

le

calcul

du

sommet

de

la

pile

locale

requiert

un

acc?es

en

lecture

D'un

autre

c

ot?e

le

registre

LB

doit

etre

mis

a

jour

a

chaque

changement

du

point

de

choix

courant

Finalement

l'existence

d'un

registre

LB

n

economise

pas

comme

l'existence

d'un

registre

GB

un

acc?es

en

lecture

lors

d'un

echec

Alors

que

le

sommet

de

la

pile

globale

G

est

mis

a

jour

lors

d'un

echec

le

sommet

de

la

pile

locale

ne

l'est

pas

-LRB-

a

moins

d'une

variante

o?u

le

sommet

de

pile

est

calcul?e

de

mani?ere

anticip?ee

-RRB-

Evidemment

la

version

point

de

choix

virtuel

de

la

cr?eation

retard?ee

des

points

de

choix

suppose

l'existence

d'un

registre

LB

La

machine

KCM

qui

utilise

une

architecture

a

pile

double

inclut

un

registre

LB

pour

deux

raisons

l'existence

de

nombreux

registres

machine

-LRB-

-RRB-

et

un

co

ut

r?eduit

des

acc?es

en

lecture

pipelin?es

par

rapport

a

des

lectures

isol?ees

Performance

du

syst?eme

m?emoire

Les

travaux

de

Tick

-LSB-

-RSB-

montrent

que

d'une

part

une

architecture

a

pile

double

n'accro

t

que

tr?es

l?eg?erement

le

nombre

d'acc

es

m?emoire

aux

donn?ees

-LRB-

entre

et

-RRB-

et

d'autre

part

am?eliore

grandement

la

localit?e

des

acc?es

sur

chaque

pile

de

points

de

choix

et

d'environnements

En

particulier

la

profondeur

de

pile

capable

de

couvrir

des

acc?es

est

diminu?ee

de

moiti?e

L'impact

final

de

ces

chiffres

sur

la

performance

n

a

toutefois

pas

et?e

quantifi?e

En

particulier

les

comportements

relatifs

des

architectures

en

pr?esence

de

caches

de

donn?ees

n'ont

pas

et?e

etudi?es

Sur

KCM

il

est

important

de

noter

que

l'architecture

a

pile

double

permet

de

mieux

utiliser

les

diff?erentes

sections

du

cache

de

donn?ees

-LRB-

voir

annexe

A

ainsi

que

-LSB-

-RSB-

pour

une

pr?esentation

plus

approfondie

du

syst?eme

m?emoire

de

KCM

-RRB-

Un

pile

de

contr

ole

unique

utiliserait

une

seule

section

du

cache

soit

Kmots

d'environnements

et

de

points

de

choix

Une

architecture

a

pile

double

permet

de

disposer

de

deux

sections

soit

Kmots

d'environnements

et

Kmots

de

points

de

choix

Non

seulement

la

quantit?e

des

donn?ees

disponibles

dans

le

cache

augmente

mais

encore

il

n

y

a

pas

de

probl?eme

de

collision

entre

environnements

et

points

de

choix

En

ce

qui

concerne

la

consommation

m?emoire

une

architecture

a

pile

double

consomme

autant

de

m?emoire

qu'une

architecture

a

pile

unique

avec

compactage

et

donc

potentiellement

moins

de

m?emoire

qu'une

architecture

a

pile

unique

sans

compactage

Il

n'est

toutefois

pas

clair

que

la

diff?erence

soit

significative

Les

clauses

avec

coupure

Coupure

et

gestion

m?emoire

profonde

non

terminale

sont

en

g?en?eral

moins

fr?equentes

que

les

clauses

sans

coupure

avec

des

coupures

superficielles

ou

des

coupures

terminales

Cr?eation

retard?ee

des

points

de

choix

Consid?erons

le

cas

d'un

appel

a

un

pr?edicat

pour

lequel

il

y

a

plusieurs

clauses

candidates

Si

la

premi?ere

clause

est

une

clause

r?eguli?ere

un

point

de

choix

doit

etre

cr?e?e

puis

un

environnement

Dans

le

contexte

d'une

architecture

a

pile

unique

il

est

absolument

n?ecessaire

d'empiler

le

point

de

choix

avant

l'ordonnancement

dans

l'espace

des

structures

de

contr

ole

doit

strictement

suivre

leur

ordonnancement

temporel

d?efini

par

les

r?egles

de

calcul

et

de

recherche

de

Prolog

En

particulier

empiler

l'environnement

avant

le

point

de

choix

invalide

toutes

les

propri?et?es

de

base

de

l'architecture

a

pile

unique

la

remise

a

jour

du

sommet

de

pile

au

retour

arri?ere

ne

lib?ere

pas

l'environnement

la

mise

a

jour

du

sommet

de

la

pile

a

max

-LRB-

e

b

-RRB-

lors

de

l'optimisation

d'appel

terminal

ne

remet

pas

le

sommet

de

la

pile

a

e

rendant

impossible

la

r?eutilisation

de

l'environnement

le

test

de

tra

nage

ne

marche

plus

etc.

Une

architecture

standard

n'est

donc

clairement

pas

compatible

avec

une

combinaison

de

cr?eation

retard?ee

des

points

de

choix

et

cr?eation

anticip?ee

des

environnements

Cela

n'exclut

pas

toutefois

une

cr?eation

retard?ee

de

toutes

les

structures

de

contr

ole

pourvu

que

les

points

de

choix

soient

empil?es

avant

les

environnements

Le

probl?eme

est

que

cette

condition

rend

impossible

la

sauvegarde

sur

la

pile

des

variable

permanentes

avant

l'empilement

du

point

choix

toutes

les

variables

permanentes

doivent

rester

dans

des

registres

d'

o?u

un

manque

de

flexibilit?e

dans

la

gestion

des

p?enuries

de

registres

machine

ainsi

que

des

mouvements

de

donn?ees

inutiles

Calcul

anticip?e

du

sommet

de

la

pile

locale

Lorsque

dans

le

contexte

de

l'

elagage

retard?e

le

sommet

de

la

pile

locale

L

est

calcul?e

de

mani?ere

anticip?ee

il

est

n?ecessaire

afin

de

ne

pas

cr?eer

de

trou

sur

la

pile

locale

de

bien

mettre

le

registre

L

a

jour

lors

de

la

coupure

cela

ind?ependamment

du

type

d'architecture

a

pile

unique

ou

double

Les

diff?erents

cas

sont

les

suivants

le

point

de

d?epart

etant

que

l

est

toujours

egal

a

max

-LRB-

e

b

-RRB-

dans

le

cas

d'une

pile

unique

et

a

max

-LRB-

e

lb

-RRB-

dans

le

cas

d'une

pile

double

Architecture

a

pile

unique

L

max

-LRB-

e

b

-RRB-

Dans

le

cas

d'une

coupure

profonde

tous

les

points

de

choix

plus

r?ecents

que

e

sont

lib?er?es

L

doit

etre

remis

a

e.

Quand

la

coupure

profonde

est

terminale

elle

est

imm?ediatement

suivie

d'une

instruction

deallocate

qui

remet

L

a

max

-LRB-

e

b

-RRB-

et

d'une

instruction

proceed

Cette

s?equence

peut

etre

sp?ecialis?ee

en

une

instruction

qui

remet

simplement

L

a

max

-LRB-

e

b

-RRB-

toutefois

les

cas

particuliers

de

la

r?eutilisation

des

points

de

choix

et

des

environnements

sections

et

La

coupure

Dans

le

cas

d'une

coupure

superficielle

il

est

n?ecessaire

de

savoir

si

un

environnement

a

et?e

empil?e

ou

non

Dans

le

premier

cas

e

est

clairement

plus

jeune

que

b

et

pointe

sur

le

sommet

de

la

pile

L

ne

change

pas

Dans

le

second

cas

max

-LRB-

e

b

-RRB-

a

exactement

la

m

eme

valeur

qu

a

l'entr

ee

de

la

clause

Si

un

point

de

choix

de

taille

taille

a

et?e

empil?e

L

est

remis

a

L

taille

La

taille

du

point

de

choix

potentiel

peut

simplement

etre

pass?ee

comme

param?etre

de

l'instruction

Notons

que

avec

la

cr?eation

retard?ee

des

points

de

choix

il

n

y

a

pas

d'environnement

au

moment

de

la

coupure

De

plus

dans

le

cas

de

la

cr?eation

de

points

de

choix

partiels

la

taille

d'

elagage

peut

etre

soit

la

taille

-LRB-

variable

-RRB-

d'un

point

de

choix

complet

pass?e

comme

param?etre

a

l'instruction

ou

la

taille

-LRB-

fixe

-RRB-

d'un

point

de

choix

partiel

d?efinie

dans

le

code

de

l'instruction

Architecture

a

pile

double

Le

cas

de

la

coupure

profonde

est

identique

lb

rempla?cant

b.

Pour

ce

qui

est

des

coupures

superficielles

soit

un

environnement

a

et?e

cr?e?e

soit

max

-LRB-

e

lb

-RRB-

a

la

m

eme

valeur

qu

a

l'entr

ee

du

pr?edicat

L

ne

change

pas

La

pile

globale

Lib?erant

points

de

choix

et

environnements

une

op?eration

de

coupure

rend

inaccessibles

les

cellules

sur

la

pile

globale

qui

n

etaient

accessibles

qu'au

travers

de

ces

structures

de

contr

ole

Comme

pour

la

tra

n?ee

donn?ees

utiles

et

inutiles

sont

m?elang?ees

de

sorte

qu'une

r?ecup?eration

instantan?ee

est

rendue

impossible

Une

coupure

est

toutefois

un

point

valable

de

d?eclenchement

de

r?ecup?eration

m?emoire

sur

la

pile

globale

Barklund

et

Millroth

ont

etudi?e

cette

id?ee

dans

-LSB-

-RSB-

se

concentrant

sur

ce

qu'ils

appellent

des

programmes

it?eratifs

Ces

programmes

sont

typiquement

constitu?es

d'un

pr?edicat

r?ecursif

a

droite

qui

it?ere

des

etapes

de

r?e?ecriture

Chaque

r?e?ecriture

est

non

d?eterministe

mais

d?es

qu'une

r?e?ecriture

aboutit

une

coupure

supprime

les

points

de

choix

restants

et

le

processus

continue

a

partie

du

nouvel

etat

l'ancien

etat

devenant

inutile

Un

op?erateur

de

coupure

d?edi?e

appel?e

coupure

avec

r?ecup?eration

et

not?e

est

fourni

a

l'utilisateur

-LRB-

et

potentiellement

a

des

outils

logiciels

-RRB-

pour

signaler

l'occurrence

de

tels

cas

de

figure

La

coupure

avec

r?ecup?eration

a

la

m

eme

s?emantique

op?erationnelle

que

l'op

erateur

de

coupure

standard

en

terme

de

contr

ole

mais

r?ecup?ere

en

plus

la

m?emoire

lib?er?ee

sur

la

tra

n?ee

-LRB-

il

s

agit

en

fait

d'un

nettoyage

de

la

tra

n?ee

-RRB-

et

la

pile

globale

Cette

r?ecup?eration

m?emoire

est

segment?ee

c'est

a-dire

limit?ee

aux

zones

plus

r?ecentes

que

le

point

de

choix

courant

-LSB-

-RSB-

-LRB-

le

dernier

segment

sur

chaque

pile

-RRB-

Bien

que

cette

id?ee

n'ait

pas

et?e

impl?ement?ee

dans

les

syst?emes

Prolog

standard

une

coupure

avec

r?ecup?eration

peut

etre

simplement

impl?ement?ee

dans

ces

syst?emes

equip?es

d'un

r?ecup?erateur

de

m?emoire

g?en?erationnel

faisant

appel

a

la

segmentation

Il

suffit

d'utiliser

l'expansion

de

termes

et

l'habituel

pr?edicat

pr?ed?efini

de

d?eclenchement

de

la

r?ecup?eration

m?emoire

Coupures

locales

Coupures

locales

Principes

Les

coupures

locales

sont

des

coupures

qui

ont

une

port?ee

plus

limit?ee

que

les

coupures

standard

En

particulier

une

coupure

locale

apparaissant

dans

la

d?efinition

d'un

pr?edicat

p

n

ne

peut

en

aucun

cas

eliminer

un

eventuel

point

de

choix

portant

sur

l'appel

du

pr?edicat

p

n

responsable

de

l'activation

de

la

coupure

Syntaxiquement

une

coupure

locale

se

pr?esente

soit

comme

un

op?erateur

not?e

utilis?e

dans

l'

ecriture

de

constructions

conditionnelles

soit

comme

un

op?erateur

de

coupure

standard

au

sein

d'un

argument

du

m?eta

pr?edicat

ou

de

l'un

de

ses

d?eriv?es

par

exemple

Une

construction

conditionnelle

If

Then

Else

ou

If

Then

equivalente

a

If

Then

fail

est

similaire

a

une

disjonction

qui

aurait

pour

premier

terme

If

Then

et

o?u

jouerait

le

r

ole

d'une

coupure

locale

supprimant

le

point

de

choix

associ?e

a

la

disjonction

-LRB-

et

donc

rendant

impossible

l'ex

ecution

du

but

Else

par

retour

arri?ere

-RRB-

si

la

condition

If

r?eussit

Faisant

donc

dans

un

premier

temps

abstraction

de

la

possible

pr?esence

d'un

op?erateur

de

coupure

standard

dans

l'un

des

termes

composant

la

construction

conditionnelle

une

construction

conditionnelle

If

Then

Else

est

equivalente

a

un

but

-LRB-

If

Then

Else

-RRB-

avec

d?efini

comme

suit

-LRB-

If

Then

-RRB-

If

Then

-LRB-

Else

-RRB-

Else

L'op

erateur

se

trouve

transform?e

en

un

op?erateur

de

coupure

standard

limitant

automatiquement

la

port?ee

de

la

coupure

au

sous-arbre

de

recherche

r?esultant

de

l'

appel

de

la

construction

conditionnelle

Cette

equivalence

est

toutefois

approximative

En

effet

les

op?erateurs

de

coupure

standard

pr?esents

dans

les

termes

Then

et

Else

sont

suppos?es

avoir

pour

port?ee

le

pr?edicat

dans

lequel

la

construction

conditionnelle

consid?er?ee

appara

t

plut

ot

que

la

construction

conditionnelle

elle-m

eme

Consid?erons

l'exemple

suivant

p

-LRB-

a

b

c

-RRB-

p

d.

p.

y

en

fait

d?esaccord

sur

le

traitement

des

op?erateurs

de

coupure

dans

les

conditions

des

constructions

conditionnelles

voir

ci-apr

es

La

coupure

Si

la

condition

a

r?eussit

le

point

de

choix

associ?e

a

la

construction

conditionnelle

dispara

t

puis

si

le

but

b

r?eussit

a

son

tour

le

point

de

choix

associ?e

au

but

p.

Par

contre

un

echec

de

la

condition

n

elimine

que

le

point

de

choix

associ?e

a

la

construction

conditionnelle

le

point

de

choix

sur

le

but

p

demeure

Cependant

bien

que

l'op

erateur

de

coupure

standard

coupe

a

travers

les

conjonctions

les

disjonctions

et

les

constructions

conditionnelles

il

reste

local

aux

m?eta

appels

et

en

g?en?eral

aux

pr?edicats

qui

peuvent

etre

vus

comme

d?erivant

de

par

exemple

sa

port?ee

se

limite

au

sous-arbre

r?esultant

du

m?eta

appel

En

fait

il

n

y

a

pas

total

accord

sur

les

pr?edicats

qui

doivent

restreindre

la

port?ee

de

la

coupure

et

ceux

qui

ne

le

doivent

pas

Ainsi

dans

son

livre

-LSB-

-RSB-

O'Keefe

propose

le

moyen

mn?emonique

suivant

Les

lettres

bloquent

l'op

erateur

de

coupure

la

syntaxe

des

structures

de

contr

ole

qui

sont

transparentes

aux

op?erateurs

de

coupure

n'utilise

pas

de

lettre

D'

o?u

l'on

peut

d?eduire

que

la

n?egation

par

l'

echec

ne

restreint

pas

la

port?ee

de

l'op

erateur

de

coupure

et

ne

peut

donc

etre

d?efinie

ni

comme

-LRB-

Goal

-RRB-

call

-LRB-

Goal

-RRB-

fail

-LRB-

-RRB-

ni

comme

-LRB-

Goal

-RRB-

Goal

fail

true

ECLiPSe

-LSB-

-RSB-

et

SICStus

Prolog

-LSB-

-RSB-

d?efinissent

chacun

la

n?egation

par

l'

echec

d'une

mani?ere

qui

contredit

le

moyen

mn?emonique

de

O'Keefe

ECLiPSe

d?efinit

en

coh?erence

avec

la

premi?ere

d?efinition

ci-dessus

-LRB-

la

coupure

est

locale

a

et

-RRB-

SICStus

interdit

l'utilisation

de

l'op

erateur

de

coupure

dans

les

buts

ce

qui

est

en

coh?erence

avec

la

deuxi?eme

d?efinition

sachant

que

SICStus

Prolog

tout

comme

ECLiPSe

interdit

l'utilisation

de

l'op

erateur

de

coupure

dans

la

partie

condition

des

constructions

conditionnelles

Finalement

le

comit?e

de

standardisation

ISO

a

choisi

une

autre

variante

qui

consiste

a

autoriser

la

pr?esence

d'un

op?erateur

de

coupure

tant

dans

une

condition

que

dans

un

appel

a

tout

en

limitant

sa

port?ee

a

la

condition

ou

a

l'appel

-LRB-

voir

par

exemple

le

r?esum?e

du

standard

d

u

a

Covington

-LSB-

-RSB-

-RRB-

une

solution

qui

a

l'avantage

de

r?econcilier

les

deux

d?efinitions

ci-dessus

Ces

difficult?es

rencontr?ees

dans

la

d?efinition

pr?ecise

des

effets

des

op?erateurs

de

coupure

peuvent

etre

attribu?ees

a

la

volont?e

de

concilier

un

certain

nombre

de

buts

contradictoires

-LRB-

-RRB-

d?efinir

un

langage

a

la

syntaxe

et

a

la

s?emantique

r?eguli?ere

syst?emes

a

notre

disposition

lors

de

l'

ecriture

de

ce

texte

etaient

SICStus

et

ECLiPSe

et

SICStus

datant

respectivement

de

mai

et

juin

Coupures

locales

-LRB-

-RRB-

d?efinir

un

langage

expressif

-LRB-

-RRB-

faciliter

la

compr?ehension

des

aspects

op?erationnels

du

langage

Selon

Moss

-LSB-

-RSB-

la

dualit?e

entre

disjonctions

et

conjonctions

rendrait

difficilement

compr?ehensible

un

traitement

diff?erent

des

disjonctions

et

des

conjonctions

Plus

g?en?eralement

le

premier

point

ci-dessus

est

en

faveur

d'un

op?erateur

de

coupure

qui

traverse

aussi

bien

disjonctions

que

m?eta

appels

et

constructions

conditionnelles

-LRB-

tant

est

que

ces

derni?eres

soient

introduites

-RRB-

Notons

que

cette

possibilit?e

n'est

pas

qu'une

vue

de

l'esprit

les

auteurs

de

Prolog/MALI

-LSB-

-RSB-

ont

choisi

de

suivre

cette

voie

Le

deuxi?eme

point

plaide

pour

l'introduction

de

moyens

de

contr

ole

plus

fins

de

la

port?ee

d'une

coupure

moyens

partiellement

fournis

par

les

constructions

conditionnelles

Cette

introduction

est

l?egitim?ee

par

l'exemple

classique

de

l'

ecriture

en

Prolog

d'un

interpr?ete

de

Prolog

tenant

compte

de

la

coupure

-LRB-

voir

par

exemple

l'ouvrage

de

O'Keefe

-LSB-

-RSB-

-RRB-

Cet

exemple

montre

bien

que

l'op

erateur

de

coupure

standard

ne

peut

etre

consid?er?e

comme

le

m?ecanisme

de

coupure

primitif

de

Prolog

Finalement

la

ma

trise

des

aspects

op?erationnels

du

langage

passe

par

une

localisation

des

effets

de

la

coupure

d'

o?u

l'int

er

et

des

constructions

conditionnelles

et

d'une

restriction

de

la

port?ee

de

l'op

erateur

de

coupure

au

sein

d'un

m?eta

appel

Ainsi

la

pr?esence

ou

l'absence

de

coupure

peut

etre

d?etermin?ee

statiquement

Cela

rend

possible

une

compilation

plus

efficace

de

la

coupure

S'il

n

y

pas

de

coupure

aucune

instruction

relative

a

la

coupure

n'est

cr?e?ee

De

mani?ere

plus

fondamentale

la

localisation

des

effets

de

la

coupure

facilite

la

compr?ehension

du

flot

de

contr

ole

du

programme

par

les

programmeurs

mais

aussi

par

des

outils

tels

que

analyseurs

de

d?eterminisme

ou

evaluateurs

partiels

Par

exemple

l'

evaluateur

partiel

de

Sahlin

Mixtus

-LSB-

-RSB-

ne

d?eplie

pas

les

pr?edicats

qui

contiennent

des

coupures

apr?es

evaluation

partielle

afin

d'

etre

s

ur

de

ne

pas

modifier

la

port?ee

d'un

op?erateur

de

coupure

Si

ne

bloquait

pas

les

coupures

aucun

pr?edicat

incluant

un

but

non

d?efini

statiquement

ne

pourrait

etre

d?epli?e

L'impl

ementation

Une

fois

les

pseudo

pr?edicats

et

eventuellement

introduits

ainsi

que

les

instructions

correspondantes

la

prise

en

compte

des

coupures

locales

n'est

plus

qu'une

affaire

de

codage

du

m?eta

pr?edicat

et

de

compilation

plus

pr?ecisement

de

transformation

de

programmes

Codage

du

m?eta

pr?edicat

La

disponibilit?e

des

pr?edicats

et

permet

de

d?efinir

directement

sans

passer

par

une

transformation

du

programme

du

type

de

celle

d?efinie

par

-LSB-

-RSB-

en

fonction

d'un

pr?edicat

traitant

un

but

atomique

En

effet

permet

de

capturer

le

point

de

coupure

a

l'entr

ee

du

m?eta

appel

Comme

le

montre

la

figure

tout

op?erateur

de

coupure

standard

au

sein

de

l'argument

du

m?eta

appel

se

traduit

alors

en

un

but

utilisant

La

coupure

call

-LRB-

Goal

-RRB-

-LRB-

Cut

-RRB-

xcall

-LRB-

Goal

Cut

-RRB-

xcall

-LRB-

Goal

Cut

-RRB-

var

-LRB-

Goal

-RRB-

error

-LRB-

-RRB-

xcall

-LRB-

-LRB-

-RRB-

Cut

-RRB-

xcall

-LRB-

Cut

-RRB-

xcall

-LRB-

Cut

-RRB-

xcall

-LRB-

-LRB-

-RRB-

Cut

-RRB-

-LRB-

var

-LRB-

-RRB-

error

-LRB-

-RRB-

-LRB-

-LRB-

If

Then

-RRB-

-LRB-

call

-LRB-

If

-RRB-

compatible

ISO

xcall

-LRB-

Then

Cut

-RRB-

xcall

-LRB-

Cut

-RRB-

-RRB-

-LRB-

xcall

-LRB-

Cut

-RRB-

xcall

-LRB-

Cut

-RRB-

-RRB-

-RRB-

-RRB-

xcall

-LRB-

Cut

-RRB-

cut

-LRB-

Cut

-RRB-

xcall

-LRB-

call

-LRB-

Goal

-RRB-

-RRB-

call

-LRB-

Goal

-RRB-

xcall

-LRB-

Goal

-RRB-

metacall

-LRB-

Goal

-RRB-

Figure

Esquisse

de

codage

du

m?eta

pr?edicat

Coupures

locales

ce

point

de

coupure

-LRB-

a

moins

qu'il

ne

s

agisse

d'une

coupure

apparaissant

dans

un

m?etaappel

imbriqu?e

-RRB-

Transformation

de

programmes

Nous

avons

vu

que

ignorant

la

pr?esence

possible

d'un

op?erateur

de

coupure

standard

au

sein

d'une

construction

conditionnelle

If

Then

Else

celle-ci

etait

equivalente

a

un

but

-LRB-

If

Then

Else

-RRB-

De

m

eme

une

disjonction

-LRB-

-RRB-

est

equivalente

a

un

but

disj

-LRB-

-RRB-

avec

d?efini

comme

suit

disj

-LRB-

-RRB-

call

-LRB-

-RRB-

disj

-LRB-

-RRB-

call

-LRB-

-RRB-

Certains

syst?emes

Prolog

ont

directement

utilis?e

cette

id?ee

pour

impl?ementer

disjonctions

et

constructions

conditionnelles

Toutefois

outre

le

fait

que

cette

m?ethode

ne

permette

pas

de

traiter

les

coupures

locales

l'efficacit

e

des

programmes

obtenus

n'est

pas

satisfaisante

le

surco

ut

entrain?e

par

la

n?ecessit?e

d'interpr

eter

au

sein

des

appels

au

pr?edicat

des

termes

comme

des

buts

est

en

effet

important

Ce

probl?eme

est

ais?ement

r?esolu

en

sp?ecialisant

les

appels

aux

pr?edicats

et

On

aboutit

ainsi

a

une

transformation

tout

a

fait

classique

qui

simultan?ement

a

son

utilisation

dans

KCM

a

et?e

notamment

utilis?ee

au

sein

de

SICStus

Prolog

-LSB-

-RSB-

et

d'Aquarius

-LSB-

-RSB-

Nous

allons

illustrer

cette

sp?ecialisation

sur

l'exemple

suivant

p

-LRB-

X

Z

-RRB-

q

-LRB-

X

-RRB-

-LRB-

a

-LRB-

X

Y

-RRB-

b

-LRB-

Y

Z

-RRB-

c

-LRB-

X

Z

-RRB-

-RRB-

En

premier

lieu

on

elimine

disjonction

et

constructions

conditionnelles

en

les

rempla?cant

par

des

appels

a

et

p

-LRB-

X

Z

-RRB-

q

-LRB-

X

-RRB-

disj

-LRB-

-LRB-

a

-LRB-

X

Y

-RRB-

b

-LRB-

Y

Z

-RRB-

-RRB-

c

-LRB-

X

Z

-RRB-

-RRB-

disj

-LRB-

-RRB-

call

-LRB-

-RRB-

disj

-LRB-

-RRB-

call

-LRB-

-RRB-

L'

etape

suivante

consiste

a

cr?eer

des

versions

de

et

sp?ecialis?ees

en

fonction

des

arguments

d'appel

ce

qui

permet

de

supprimer

les

appels

a

p

-LRB-

X

Z

-RRB-

q

-LRB-

X

-RRB-

-LRB-

-LRB-

a

-LRB-

X

Y

-RRB-

b

-LRB-

Y

Z

-RRB-

-RRB-

c

-LRB-

X

Z

-RRB-

-RRB-

-LRB-

-LRB-

a

-LRB-

X

Y

-RRB-

b

-LRB-

Y

Z

-RRB-

-RRB-

-RRB-

a

-LRB-

X

Y

-RRB-

b

-LRB-

Y

Z

-RRB-

-LRB-

c

-LRB-

X

Z

-RRB-

-RRB-

c

-LRB-

X

Z

-RRB-

descriptions

de

la

transformation

donn?ees

dans

-LSB-

-RSB-

et

-LSB-

-RSB-

ne

font

toutefois

pas

appel

a

la

notion

de

sp?ecialisation

La

coupure

Finalement

on

elimine

des

arguments

des

pr?edicats

sp?ecialis?es

tous

les

el?ements

variables

locales

a

l'appel

sp?ecialis?e

et

constantes

sans

effet

sur

l'instanciation

de

la

clause

initiale

p

-LRB-

X

Z

-RRB-

q

-LRB-

X

-RRB-

-LRB-

X

Z

-RRB-

-LRB-

X

Z

-RRB-

a

-LRB-

X

Y

-RRB-

b

-LRB-

Y

Z

-RRB-

-LRB-

X

Z

-RRB-

c

-LRB-

X

Z

-RRB-

Les

pr?edicats

sp?ecialis?es

sont

a

nouveau

des

pseudo

pr?edicats

-LRB-

d'

o?u

le

pr?efixe

-RRB-

qui

ne

doivent

pas

etre

visibles

de

l'utilisateur

Dans

le

compilateur

de

KCM

la

transformation

est

int?egr?ee

aux

deux

passes

qui

transforment

le

code

source

en

syntaxe

abstraite

annot?ee

-LRB-

classification

des

variables

classification

des

pr?edicats

-RRB-

La

premi?ere

passe

cr?ee

les

pseudo

buts

et

pr?edicats

sans

se

pr?eoccuper

de

la

composition

exacte

des

pseudo

buts

et

t

etes

des

pseudo

pr?edicats

toutes

les

variables

apparaissant

dans

le

but

initial

sont

collect?ees

Lors

de

cette

passe

sont

aussi

collect?ees

les

informations

qui

vont

permettre

au

cours

de

la

deuxi?eme

passe

de

classifier

les

variables

En

particulier

chaque

variable

est

annot?ee

avec

les

indices

des

buts

dans

lesquels

la

variable

appara

t.

On

sait

ainsi

lors

de

la

deuxi?eme

passe

si

une

variable

est

locale

a

un

but

ou

pas

et

on

peut

alors

fixer

la

composition

exacte

des

pseudo

buts

et

t

etes

des

pseudo

pr?edicats

Lors

de

la

production

de

code

chaque

pr?edicat

est

trait?e

en

m

eme

temps

que

les

pseudo

pr?edicats

qui

lui

sont

associ?es

directement

ou

indirectement

puisqu'une

construction

conditionnelle

peut

par

exemple

contenir

une

disjonction

et

qu'un

pseudo

pr?edicat

peut

donc

etre

lui-m

eme

d?efini

en

fonction

d'autres

pseudo

pr?edicats

La

production

de

code

s

effectue

de

telle

sorte

que

si

dans

une

clause

le

dernier

pr?edicat

appel?e

est

un

pseudo

pr?edicat

-LRB-

c'est

le

cas

de

notre

exemple

-RRB-

le

code

de

ce

pseudo

pr?edicat

est

plac?e

a

la

suite

du

code

de

la

clause

Une

simple

optimisation

a

lucarne

permet

ainsi

d'

eviter

un

saut

et

de

passer

directement

du

dernier

but

de

la

clause

au

code

du

pseudo

pr?edicat

Le

compilateur

d'Aquarius

r?ealise

le

m

eme

type

d'effet

gr

ace

a

l'utilisation

d'une

optimisation

bien

plus

complexe

d'

elimination

des

sauts

-LSB-

-RSB-

Un

dernier

point

a

prendre

en

compte

concerne

la

minimisation

globale

des

mouvements

de

registres

entre

t

ete

de

pr?edicat

et

appel

au

pseudo

pr?edicat

si

cet

appel

est

le

premier

de

la

clause

et

pour

chaque

clause

constitutive

du

pseudo

pr?edicat

entre

la

t

ete

et

le

premier

appel

Dans

le

contexte

de

KCM

le

potentiel

d'une

telle

minimisation

etait

faible

vu

l'efficacit

e

des

mouvements

de

registres

de

la

machine

et

nous

ne

nous

sommes

donc

pas

souci?es

de

ce

probl?eme

Le

traitement

de

l'op

erateur

de

coupure

standard

Les

coupures

locales

introduites

par

l'op

erateur

sont

automatiquement

prises

en

compte

par

la

transformation

pr?ec?edente

Le

m

eme

type

de

transformation

s

applique

aussi

a

des

appels

de

pr?edicats

comme

par

exemple

ou

lorsque

les

arguments

de

ces

appels

sont

instanci?es

-LRB-

ou

m

eme

seulement

partiellement

instanci?es

-RRB-

Reste

donc

a

r?egler

le

traitement

de

l'op

erateur

de

coupure

standard

lorsque

celui-ci

appara

t

dans

une

disjonction

ou

une

construction

conditionnelle

Ce

traitement

est

tr?es

Coupures

s?electives

simple

Si

une

disjonction

ou

une

construction

conditionnelle

contient

un

op?erateur

de

coupure

standard

un

argument

suppl?ementaire

est

ajout?e

au

pseudo

pr?edicat

correspondant

a

savoir

le

point

de

coupure

du

pr?edicat

initial

Cut

et

l'on

ins?ere

si

n?ecessaire

un

but

-LRB-

Cut

-RRB-

au

cou

de

la

clause

initiale

Au

sein

du

pseudo

pr?edicat

l'op

erateur

de

coupure

est

tranform?e

comme

pr?ec?edemment

en

un

but

cut

-LRB-

Cut

-RRB-

sauf

s

il

s

agit

d'une

coupure

correspondant

a

un

op?erateur

On

utilise

alors

une

autre

variable

LocalCut

qui

sera

produite

par

un

but

-LRB-

LocalCut

-RRB-

ins?er?e

au

cou

de

la

clause

du

pseudo

pr?edicat

Dans

le

cas

d'une

construction

conditionnelle

incluant

des

op?erateurs

de

coupure

standard

deux

points

de

coupure

vont

ainsi

coexister

un

point

de

coupure

local

et

un

point

de

coupure

global

de

port?ee

plus

etendue

Cette

port?ee

se

limite

souvent

a

la

clause

appelante

mais

peut

aller

au-del

a

dans

le

cas

de

constructions

imbriqu?ees

Ainsi

la

clause

p

a

-LRB-

b

c

-RRB-

d.

est

transform?ee

en

p

-LRB-

Cut

-RRB-

-LRB-

Cut

-RRB-

-LRB-

Cut

-RRB-

-LRB-

LocalCut

-RRB-

a

cut

-LRB-

LocalCut

-RRB-

-LRB-

Cut

-RRB-

-LRB-

-RRB-

d.

-LRB-

Cut

-RRB-

b

cut

-LRB-

Cut

-RRB-

-LRB-

-RRB-

c.

La

coupure

pr?esente

dans

la

premi?ere

clause

de

est

susceptible

de

couper

des

points

de

choix

cr?e?es

aussi

bien

par

le

pr?edicat

que

par

le

pr?edicat

p

en

supposant

que

la

d?efinition

de

ce

dernier

comporte

plusieurs

clauses

Un

cas

particulier

appara

t

lorsqu'on

autorise

la

pr?esence

de

l'op

erateur

de

coupure

dans

la

condition

des

constructions

conditionnelles

On

se

trouve

alors

en

pr?esence

dans

la

premi?ere

clause

du

pseudo

pr?edicat

correspondant

d'une

coupure

a

port?ee

globale

suivie

d'une

coupure

a

port?ee

locale

moins

etendue

La

coupure

locale

ne

peut

se

borner

a

restaurer

la

valeur

du

point

de

retour

arri?ere

qui

peut

tr?es

bien

correspondre

a

un

point

de

choix

d?ej?a

elimin?e

par

la

coupure

globale

La

solution

consiste

a

remplacer

cette

coupure

locale

par

une

coupure

globale

En

effet

les

points

de

choix

cr?e?es

entre

le

point

de

coupure

global

et

la

pr?ec?edente

coupure

ont

d?ej?a

et?e

elimin?es

une

nouvelle

coupure

globale

n

a

donc

bien

qu'un

effet

local

elle

supprime

les

points

de

choix

cr?e?es

entre

les

deux

coupures

globales

Coupures

s?electives

Certains

syst?emes

par

exemple

NU-Prolog

-LSB-

-RSB-

SICStus

Prolog

-LSB-

-RSB-

et

Prolog/MALI

-LSB-

-RSB-

fournissent

par

l'interm

ediaire

de

nouvelles

primitives

plus

ou

moins

puissantes

La

coupure

soft

cut

Vi

Vj

if

-LRB-

Vi

Vj

-RRB-

-LCB-

if

-LRB-

B

Vi

-RRB-

-LCB-

B

Vj

GB

G

-LRB-

B

-RRB-

-RCB-

else

-LCB-

-LRB-

Vi

-RRB-

Vj

-RCB-

-RCB-

Figure

Instruction

de

coupure

s?elective

la

possibilit?e

d'

eliminer

un

ou

plusieurs

points

de

choix

a

l'int

erieur

m

eme

de

la

pile

de

recherche

sans

toucher

aux

points

de

choix

en

sommet

de

pile

La

forme

la

plus

simple

de

coupure

s?elective

la

coupure

douce

-LRB-

soft

cut

-RRB-

-LSB-

-RSB-

que

nous

noterons

elimine

un

unique

point

de

choix

le

point

de

choix

attach?e

a

l'appel

du

pr?edicat

dans

lequel

la

coupure

appara

t.

On

peut

ainsi

ecrire

le

pr?edicat

pr?ed?efini

de

SICstus

Prolog

tel

que

if

-LRB-

P

Q

R

-RRB-

est

equivalent

a

la

conjonction

-LRB-

P

Q

-RRB-

si

P

r?eussit

au

but

R

sinon

if

-LRB-

P

Q

R

-RRB-

P

Q.

if

-LRB-

R

-RRB-

P

R.

en

evitant

tout

recalcul

de

P

if

-LRB-

P

Q

R

-RRB-

P

Q.

if

-LRB-

R

-RRB-

R.

La

coupure

douce

a

et?e

utilis?ee

par

Naish

pour

impl?ementer

efficacement

les

quantificateurs

de

NU-Prolog

-LSB-

-RSB-

L'impl

ementation

de

cette

forme

de

coupure

est

plus

ou

moins

ardue

suivant

les

d?etails

d'agencement

des

structures

de

contr

ole

Nous

consid?erons

ci-dessous

un

agencement

des

points

de

choix

autorisant

l'

elagage

-LRB-

voir

section

-RRB-

ainsi

que

l'existence

d'une

pile

de

points

de

choix

sp?ecifique

Le

champ

B

-LRB-

B

-RRB-

d'un

point

de

choix

donn?e

est

alors

a

une

distance

fixe

par

exemple

un

mot

m?emoire

du

point

de

choix

pr?ec?edent

L'id

ee

est

la

suivante

on

ins?ere

au

cou

de

la

clause

o?u

la

coupure

appara

t

la

conjonction

-LRB-

B

-RRB-

-LRB-

C

-RRB-

On

capture

ainsi

a

la

fois

le

point

de

l'utilit

e

du

champ

B

-LRB-

B

-RRB-

voir

discussion

section

Coupures

s?electives

oe

oe

oe

oe

oe

Avant

coupure

Apr?es

coupure

Point

de

choix

a

supprimer

Trou

Point

de

coupure

Point

de

coupure

Sommet

de

pile

Sommet

de

pile

Figure

Cr?eation

d'un

trou

sur

la

pile

a

la

suite

d'une

coupure

s?elective

coupure

et

le

point

de

choix

courant

Une

comparaison

du

point

de

choix

courant

et

du

point

de

coupure

permet

de

savoir

si

un

point

de

choix

a

et?e

cr?e?e

a

l'appel

du

pr?edicat

courant

La

coupure

est

transform?ee

en

un

but

-LRB-

B

C

-RRB-

lui-m

eme

directement

compil?e

en

ligne

en

une

instruction

Vi

Vj

-LRB-

voir

figure

-RRB-

Cette

instruction

v?erifie

qu'il

y

ait

bien

un

point

de

choix

a

point?e

par

la

variable

Vi

-LRB-

B

au

niveau

source

-RRB-

et

si

c'est

le

cas

le

supprime

Dans

le

cas

o?u

aucun

nouveau

point

de

choix

n

a

et?e

cr?e?e

il

s

agit

d'une

coupure

standard

Sinon

il

suffit

de

faire

pointer

le

champ

B

-LRB-

B

-RRB-

du

point

de

choix

suivant

le

point

de

choix

a

supprimer

sur

le

point

de

coupure

-LRB-

voir

figure

-RRB-

Notons

que

dans

ce

dernier

cas

un

trou

a

et?e

cr?e?e

sur

la

pile

de

points

de

choix

Cette

m?emoire

ne

peut

cette

fois

etre

r?ecup?er?ee

que

par

un

m?ecanisme

de

compactage

Prolog/MALI

-LSB-

-RSB-

etend

les

possibilit?es

de

coupure

s?elective

en

offrant

a

l'utilisateur

un

acc?es

direct

a

un

equivalent

de

nos

pseudo

pr?edicats

et

ainsi

qu'un

moyen

original

de

capture

du

point

de

coupure

lorsque

le

symbole

se

trouve

en

position

d'argument

il

se

comporte

comme

une

variable

qui

aurait

pour

valeur

le

point

de

coupure

Il

est

ainsi

possible

a

l'utilisateur

de

supprimer

un

ensemble

de

points

de

choix

successifs

d'

o?u

la

possibilit?e

de

cr?eation

instantan?ee

de

trous

de

taille

significative

Le

gestionnaire

de

m?emoire

MALI

-LSB-

-RSB-

sur

lequel

Prolog/MALI

s

appuie

peut

comme

d'habitude

imaginer

un

certain

nombre

de

versions

sp?ecialis?ees

de

l'instruction

en

particulier

une

version

a

utiliser

quand

on

peut

garantir

qu'il

y

aura

un

point

de

choix

a

eliminer

-LRB-

voir

l'exemple

du

pr?edicat

ci-dessus

-RRB-

La

coupure

a

et?e

con?cu

de

mani?ere

a

int?egrer

la

r?ecup?eration

de

tels

trous

dans

son

fonctionnement

de

base

Conclusion

Nous

avons

vu

que

la

coupure

quel

que

soit

son

type

peut

etre

facilement

compil?ee

a

l'aide

de

quelques

instructions

simples

par

l'interm

ediaire

d'une

transformation

de

programmes

Nous

avons

montr?e

comment

int?egrer

la

coupure

a

notre

sch?ema

de

gestion

du

retour

arri?ere

et

de

la

cr?eation

retard?ee

des

points

de

choix

par

s?equences

d'instructions

multiples

Une

architecture

a

pile

double

permet

de

r?ecup?erer

la

m?emoire

allou?ee

a

tous

les

points

de

choix

lib?er?es

par

une

coupure

profonde

non

terminale

Cette

solution

reste

toutefois

inop?erante

lorsque

des

op?erateurs

de

coupure

s?electifs

capable

de

supprimer

des

points

de

choix

profonds

sans

toucher

aux

points

de

choix

en

sommet

de

pile

sont

introduits

Une

gestion

m?emoire

purement

statique

de

la

pile

de

points

ce

choix

telle

qu'elle

est

pratiqu?ee

dans

la

WAM

s

av?ere

insuffisante

Modifications

R?eversibles

L'introduction

dans

un

syst?eme

de

programmation

en

logique

d'extensions

comme

le

coroutinage

les

contraintes

et

les

termes

ne

peut

se

faire

sans

unification

etendue

Il

s

agit

de

compl?ementer

l'unification

syntaxique

habituelle

avec

des

routines

sp?ecifiques

appel?ees

lors

de

l'unification

d'une

classe

particuli?ere

de

termes

dits

interpr?et?es

Ces

routines

d?efinissant

une

unification

s?emantique

doivent

pouvoir

substituer

de

nouveaux

termes

aux

termes

interpr?et?es

initiaux

Nous

appellerons

ces

substitutions

modifications

r?eversibles

La

relation

entre

les

nouveaux

termes

et

les

termes

initiaux

n'est

pas

restreinte

syntaxiquement

sur

l'ensemble

des

extensions

C'est

a

chaque

extension

de

d?efinir

cette

relation

Consid?erons

par

exemple

la

mise

en

oeuvre

du

pr?edicat

pr?ed?efini

-LSB-

-RSB-

o?u

geler

-LRB-

Terme

But

-RRB-

retarde

la

d?emonstration

du

but

But

jusqu

a

ce

que

le

terme

Terme

soit

instanci?e

La

mise

en

oeuvre

de

ce

pr?edicat

s

appuie

sur

l'id

ee

suivante

le

but

geler

-LRB-

Terme

But

-RRB-

o?u

Terme

est

libre

transforme

Terme

en

une

variable

gelante

par

exemple

un

terme

gele

-LRB-

But

-RRB-

Ce

terme

est

interpr?et?e

comme

etant

une

variable

De

plus

l'unification

d'une

variable

gelante

et

d'un

terme

instanci?e

-LRB-

non

interpr?et?e

-RRB-

substitue

le

terme

instanci?e

a

la

variable

gelante

et

ex?ecute

le

but

But

L'unification

de

deux

variables

gelantes

gele

-LRB-

-RRB-

et

gele

-LRB-

-RRB-

substitue

une

nouvelle

variable

gelante

gele

-LRB-

-LRB-

-RRB-

-RRB-

aux

deux

variables

Les

termes

simplement

typ?es

de

Prolog

fournissent

un

autre

exemple

d'extension

faisant

appel

aux

modifications

r?eversibles

Lors

de

l'unification

ces

termes

doivent

etre

normalis?es

gr

ace

aux

techniques

habituelles

du

calcul

-LSB-

-RSB-

De

plus

les

termes

r?esultants

doivent

etre

substitu?es

aux

termes

initiaux

de

mani?ere

r?eversible

Quelle

que

soit

l'impl

ementation

de

l'unification

etendue

cach?ee

au

sein

du

syst?eme

d'ex

ecution

du

langage

ou

accessible

a

l'utilisateur

par

l'interm

ediaire

d'une

interface

g?en?erique

les

modifications

r?eversibles

peuvent

a

priori

etre

impl?ement?ees

de

deux

mani?eres

par

simple

substitution

ou

par

affectation

destructive

combin?ee

a

un

tra

nage

de

valeur

Le

gestionnaire

de

m?emoire

MALI

-LSB-

-RSB-

fait

reposer

la

gestion

des

variables

a

attribut

-LRB-

r?ecemment

renomm?ees

termes

mutables

-RRB-

sur

la

substitution

MALI

a

fourni

la

base

d'impl

ementation

de

plusieurs

syst?emes

Prolog

etendus

Dans

le

dernier

en

date

Prolog/MALI

une

incarnation

compil?ee

de

Prolog

-LSB-

-RSB-

les

variables

a

attribut

jouent

un

r

ole

primordial

-LRB-

coroutinage

unification

rationnelle

unification

des

termes

-RRB-

-LSB-

-RSB-

La

mise

en

oeuvre

du

coroutinage

dans

SICStus

Prolog

repose

sur

le

m

eme

genre

de

techniques

-LSB-

-RSB-

La

substitution

est

aussi

une

partie

int?egrale

de

l'unification

Modifications

R?eversibles

extensible

telle

qu'elle

est

fournie

par

les

interfaces

g?en?eriques

de

Neumerkel

-LSB-

-RSB-

et

Holzbaur

-LSB-

-RSB-

A

la

suite

de

MU-Prolog

-LSB-

-RSB-

l'affectation

destructive

a

et?e

utilis?ee

dans

un

certain

nombre

de

syst?emes

d?evelopp?es

a

l'ECRC

-LSB-

-RSB-

En

particulier

la

technique

d'estampillage

-LSB-

-RSB-

d?evelopp?ee

dans

le

contexte

du

langage

de

programmation

en

logique

par

contraintes

CHIP

-LSB-

-RSB-

a

grandement

influenc?e

la

mise

en

oeuvre

d'autres

langages

de

programmation

du

m

eme

type

Quant

a

l'unification

extensible

l'interface

fournie

par

ECLiPSe

-LSB-

-RSB-

a

notre

connaissance

la

plus

sophistiqu?ee

des

interfaces

g?en?eriques

repose

aussi

sur

l'affectation

destructive

Finalement

dans

beaucoup

de

syst?emes

Prolog

-LRB-

par

exemple

BinProlog

-LSB-

-RSB-

ECLiPSe

-LSB-

-RSB-

SICStus

Prolog

-LSB-

-RSB-

XSB

-LSB-

-RSB-

-RRB-

le

pr?edicat

pr?ed?efini

qui

permet

de

remplacer

destructivement

l'argument

d'un

terme

compos?e

fournit

une

forme

d?eg?en?er?ee

de

modification

r?eversible

Ce

examine

la

s?emantique

-LRB-

op?erationnelle

-RRB-

des

modifications

r?eversibles

ainsi

que

leur

mise

en

oeuvre

a

partir

des

deux

techniques

substitution

et

affectation

destructive

L'organisation

du

chapitre

est

la

suivante

La

premi?ere

section

d?efinie

la

s?emantique

op?erationnelle

des

modifications

r?eversibles

par

le

biais

d'un

m?eta

interpr?ete

fournissant

une

interface

g?en?erique

d'unification

extensible

L'interface

repose

sur

les

variables

a

attribut

D'autres

solutions

sont

rapidement

abord?ees

par

l'interm

ediaire

d'un

exemple

La

section

montre

comment

int?egrer

ce

m?eta

interpr?ete

au

sein

d'un

moteur

Prolog

en

utilisant

la

substitution

Les

inconv?enients

d'une

telle

solution

sont

analys?es

et

des

rem?edes

-LRB-

partiels

-RRB-

propos?es

La

section

montre

que

l'utilisation

de

l'affectation

destructive

combin?ee

au

tra

nage

de

valeurs

r?esout

les

probl?emes

pr?ec?edemment

mentionn?es

Comme

il

s

av?ere

toutefois

que

les

techniques

de

tra

nage

de

valeur

classiques

sont

impr?ecises

-LRB-

estampillage

inclus

-RRB-

c'est

a-dire

sont

activ?ees

plus

que

n?ecessaire

diff?erentes

techniques

pr?ecises

sont

propos?ees

et

analys?ees

Dans

la

section

les

r?esultats

pr?ec?edents

sont

utilis?es

pour

clarifier

la

s?emantique

du

pr?edicat

pr?ed?efini

La

section

conclut

le

chapitre

Une

sp?ecification

des

modifications

r?eversibles

a

par

tir

des

variables

a

attribut

Une

mani?ere

classique

de

d?efinir

pr?ecis?ement

la

s?emantique

op?erationnelle

d'une

extension

Prolog

quelconque

est

d'exhiber

un

m?eta

interpr?ete

aussi

simple

que

possible

impl?ementant

l'extension

Cette

section

d?efinie

les

modifications

r?eversibles

par

le

biais

d'un

m?eta

interpr?ete

avec

unification

extensible

Le

m?eta

interpr?ete

repose

sur

l'utilisation

des

variables

a

attribut

Les

variables

a

attribut

permettent

a

notre

avis

d'impl

ementer

les

modifications

r?eversibles

et

de

raisonner

sur

ces

modifications

de

la

mani?ere

la

plus

naturelle

qui

soit

D'autres

solutions

notamment

les

m?eta

structures

version

pr?eliminaire

de

ce

chapitre

a

et?e

pr?esent?ee

au

s?eminaire

sur

les

techniques

de

mise

en

oeuvre

des

langages

de

programmation

logique

qui

a

suivi

ILPS

-LSB-

-RSB-

Une

sp?ecification

des

modifications

r?eversibles

a

partir

des

variables

a

de

Neumerkel

-LSB-

-RSB-

et

les

pseudo

variables

a

attribut

d'Holzbaur

-LSB-

-RSB-

sont

pr?esent?ees

par

l'interm

ediaire

d'un

exemple

Qu'est

ce

qu'une

variable

a

attribut

Une

variable

a

attribut

peut

etre

consid?er?ee

comme

une

variable

ordinaire

a

laquelle

a

et?e

associ?e

un

attribut

Cet

attribut

est

un

terme

quelconque

L'attribut

pr?ecise

le

sens

de

la

variable

a

attribut

tant

que

la

variable

est

libre

D?es

que

la

variable

est

li?ee

le

lien

entre

la

variable

a

attribut

et

son

attribut

est

perdu

et

la

variable

se

comporte

comme

une

variable

li?ee

ordinaire

Il

est

ainsi

possible

de

modifier

l'attribut

d'une

variable

a

attribut

en

liant

cette

variable

a

une

autre

variable

a

attribut

avec

un

attribut

diff?erent

De

plus

l'existence

des

attributs

affecte

l'unification

d'une

mani?ere

qui

d?epend

partiellement

de

l'extension

consid?er?ee

Deux

cas

doivent

etre

pris

en

compte

l'unification

d'une

variable

a

attribut

et

d'un

terme

instanci?e

et

l'unification

de

deux

variables

a

attribut

Dans

le

premier

cas

la

variable

a

attribut

est

li?ee

au

terme

Dans

le

second

cas

une

des

variables

est

li?ee

a

l'autre

Dans

les

deux

cas

la

variable

li?ee

se

comporte

comme

une

variable

ordinaire

c'est

a-dire

comme

une

r?ef?erence

De

plus

les

attributs

-LRB-

et

le

terme

instanci?e

dans

le

premier

cas

-RRB-

vont

etre

utilis?es

pour

d?eterminer

si

l'unification

est

valide

et

intervenir

dans

l'ex

ecution

d'actions

sp?ecifiques

a

l'extension

consid?er?ee

Le

m?eta

interpr?ete

L'id

ee

de

base

d'une

impl?ementation

des

variables

a

attribut

au

niveau

de

Prolog

est

de

repr?esenter

une

variable

a

attribut

par

un

terme

compos?e

vara

-LRB-

Subst

Attr

-RRB-

o?u

Attr

est

l'attribut

de

la

variable

et

Subst

le

champ

de

substitution

permet

de

lier

la

variable

soit

a

un

terme

ordinaire

soit

a

une

autre

variable

a

attribut

Dans

le

contexte

de

la

WAM

l'unification

est

susceptible

de

cr?eer

des

cha

nes

de

liaisons

qu'il

est

n?ecessaire

de

suivre

pour

conna

tre

la

valeur

de

liaison

d'une

variable

Le

m

eme

cas

se

pr?esente

pour

les

variables

a

attribut

Il

est

n?ecessaire

de

suivre

les

cha

nes

de

liaisons

r?esultant

de

la

liaison

des

champs

de

substitutions

pour

acc?eder

a

la

valeur

de

liaison

d'une

variable

a

attribut

-LRB-

la

variable

est

li?ee

-RRB-

ou

a

son

attribut

-LRB-

la

variable

est

libre

-RRB-

Dans

un

syst?eme

de

modules

bas?e

sur

les

atomes

tous

les

d?etails

de

la

mise

en

oeuvre

peuvent

etre

cach?es

sous

la

donn?ee

d'un

type

de

donn?ee

abstrait

manipul?e

par

l'interm

ediaire

des

pr?edicats

de

la

figure

Ces

d?efinitions

font

l'hypoth

ese

d'une

vision

prescriptive

des

modes

c'est

a-dire

que

si

une

d?eclaration

de

mode

n'est

pas

respect?ee

une

erreur

doit

etre

lev?ee

Le

pr?edicat

v?erifie

qu'un

terme

instanci?e

est

une

variable

a

attribut

Le

pr?edicat

suit

les

cha

nes

de

liaisons

Le

pr?edicat

transforme

une

variable

en

une

variable

a

attribut

Le

pr?edicat

modifie

une

variable

a

attribut

Le

pr?edicat

retourne

l'attribut

courant

d'une

variable

a

attribut

Les

deux

derniers

pr?edicats

et

sont

utilis?es

a

des

fins

Modifications

R?eversibles

mode

-LRB-

-RRB-

-LRB-

vara

-LRB-

-RRB-

-RRB-

mode

dereference

-LRB-

-RRB-

dereference

-LRB-

X

XD

-RRB-

-LRB-

X

vara

-LRB-

Suivant

-RRB-

nonvar

-LRB-

Suivant

-RRB-

dereference

-LRB-

Suivant

XD

-RRB-

X

XD

-RRB-

mode

-LRB-

-RRB-

-LRB-

vara

-LRB-

Attr

-RRB-

Attr

-RRB-

mode

-LRB-

-RRB-

-LRB-

Vara

Attr

-RRB-

dereference

-LRB-

Vara

vara

-LRB-

Subst

-RRB-

-RRB-

-LRB-

Subst

Attr

-RRB-

mode

-LRB-

-RRB-

-LRB-

Vara

Attr

-RRB-

dereference

-LRB-

Vara

vara

-LRB-

Attr

-RRB-

-RRB-

mode

-LRB-

-RRB-

-LRB-

vara

-LRB-

Subst

AttrX

-RRB-

vara

-LRB-

Subst

AttrY

-RRB-

AttrX

AttrY

-RRB-

mode

-LRB-

-RRB-

-LRB-

vara

-LRB-

Terme

AttrX

-RRB-

Terme

AttrX

-RRB-

Figure

Le

type

de

donn?ee

abstrait

variable

a

attribut

Une

sp?ecification

des

modifications

r?eversibles

a

partir

des

variables

a

d'unification

comme

nous

le

verrons

ci-dessous

Deux

nouvelles

clauses

doivent

etre

ajout?ees

a

la

proc?edure

standard

d'unification

du

m?eta

interpr?ete

-LRB-

voir

la

figure

-RRB-

Ces

clauses

impl?ementent

de

mani?ere

directe

l'unification

des

variables

a

attribut

telle

qu'elle

a

et?e

informellement

d?ecrite

ci-dessus

La

d?efinition

des

pr?edicats

d'extension

et

-LRB-

suivant

la

terminologie

d'Holzbaur

-LSB-

-RSB-

-RRB-

d?epend

de

l'extension

consid?er?ee

Deux

exemples

sont

pr?esent?es

ci-dessous

Notons

que

le

pr?edicat

-LRB-

XD

YD

AttrX

AttrY

-RRB-

est

d?efini

de

mani?ere

a

ne

pas

alt?erer

le

raisonnement

equationnel

Si

de

nouvelles

unifications

affectent

la

variable

X

ces

unifications

affecteront

aussi

la

variable

Y

et

vice

versa

Cependant

a

l'appel

du

pr?edicat

-LRB-

XD

AttrX

AttrY

-RRB-

les

attributs

des

variables

X

et

Y

sont

diff?erents

Le

premier

argument

de

permet

de

mettre

a

jour

les

deux

variables

de

mani?ere

a

ce

qu'elles

partagent

un

attribut

commun

Attr

a

l'aide

d'un

but

-LRB-

XD

Attr

-RRB-

Comme

le

passage

de

cet

argument

peut

ne

pas

etre

n?ecessaire

par

exemple

a

cause

d'un

echec

pr?ematur?e

dans

la

combinaison

des

attributs

il

est

aussi

possible

de

ne

passer

que

deux

arguments

la

variable

attribu?ee

restant

libre

et

l'attribut

de

la

variable

a

attribut

li?ee

Le

pr?edicat

est

alors

charg?e

de

r?ecup?erer

l'attribut

de

la

variable

libre

Exemples

Des

termes

modifiables

Une

notion

simple

de

terme

modifiable

peut

etre

mise

en

place

gr

ace

au

but

X

Attr

-LRB-

est

d?eclar?e

etre

un

op?erateur

infixe

-RRB-

qui

d?efinit

la

variable

X

comme

etant

un

terme

modifiable

et

lui

associe

la

valeur

Attr

Cette

valeur

peut

etre

chang?ee

par

de

nouvelles

applications

de

l'op

erateur

et

extraite

gr

ace

a

l'op

erateur

dual

X

Attr

-LRB-

var

-LRB-

X

-RRB-

-LRB-

X

Attr

-RRB-

-LRB-

X

Attr

-RRB-

-RRB-

X

Attr

-LRB-

X

Attr

-RRB-

Modifications

R?eversibles

-LRB-

X

Y

-RRB-

-LRB-

-LRB-

var

-LRB-

X

-RRB-

var

-LRB-

Y

-RRB-

-RRB-

X

Y

dereference

-LRB-

X

XD

-RRB-

dereference

-LRB-

Y

YD

-RRB-

-LRB-

-LRB-

XD

-RRB-

-LRB-

-LRB-

YD

-RRB-

-LRB-

XD

YD

AttrX

AttrY

-RRB-

-LRB-

XD

AttrX

AttrY

-RRB-

-LRB-

XD

YD

AttrX

-RRB-

-LRB-

AttrX

YD

-RRB-

-RRB-

-LRB-

-LRB-

YD

-RRB-

-LRB-

YD

XD

AttrY

-RRB-

-LRB-

AttrY

XD

-RRB-

XD

-LSB-

F

Xs

-RSB-

YD

-LSB-

F

Ys

-RSB-

-LRB-

Xs

Ys

-RRB-

-RRB-

-RRB-

-RRB-

-LRB-

-LSB-

-RSB-

-LSB-

-RSB-

-RRB-

-LRB-

-LSB-

X

Xs

-RSB-

-LSB-

Y

Ys

-RSB-

-RRB-

-LRB-

X

Y

-RRB-

-LRB-

Xs

Ys

-RRB-

Figure

Le

m?eta

interpr?ete

Une

sp?ecification

des

modifications

r?eversibles

a

partir

des

variables

a

Supposons

qu'unifier

un

terme

modifiable

et

un

terme

instanci?e

standard

n'ait

pas

de

sens

et

que

l'unification

de

deux

termes

modifiables

unifie

leurs

valeurs

courantes

-LRB-

d'autres

choix

sont

possibles

-RRB-

la

d?efinition

de

doit

etre

etendue

de

la

mani?ere

suivante

-LRB-

-RRB-

fail

-LRB-

Attr

Attr

-RRB-

La

notion

de

terme

substituable

introduite

dans

Prolog/MALI

-LSB-

-RSB-

fournit

un

autre

exemple

de

terme

modifiable

Un

terme

substituable

est

un

terme

dont

le

foncteur

principal

a

et?e

d?eclar?e

substituable

Un

terme

substituable

se

comporte

de

mani?ere

similaire

a

une

variable

a

attribut

En

particulier

il

est

possible

de

remplacer

un

terme

substituable

par

tout

autre

terme

notamment

un

autre

terme

substituable

Un

programme

incluant

des

termes

substituables

peut

etre

interpr?et?e

en

deux

etapes

Tout

d'abord

une

simple

transformation

de

programmes

remplace

chaque

terme

substituable

Term

par

une

variable

a

attribut

vara

-LRB-

Term

-RRB-

Le

programme

transform?e

peut

alors

etre

ex?ecut?e

par

le

m?eta

interpr?ete

pr?ec?edent

le

pr?edicat

ayant

et?e

red?efini

comme

suit

X

Y

-LRB-

X

Y

-RRB-

Une

bonne

propri?et?e

de

cette

variante

est

que

la

structure

des

termes

substituables

est

accessible

par

unification

Il

est

ainsi

possible

d'

ecrire

substituable

-LRB-

-RRB-

X

compteur

-LRB-

-RRB-

compteur

-LRB-

-RRB-

compteur

-LRB-

Y

-RRB-

Notons

que

notre

d?efinition

initiale

de

terme

modifiable

fournit

un

exemple

d'extension

qui

bien

que

le

raisonnement

equationnel

soit

pr?eserv?e

conduit

a

un

programme

sans

lecture

d?eclarative

Par

exemple

un

but

X

peut

etre

egalement

vrai

ou

faux

au

cours

de

l'ex

ecution

La

variante

ci-dessus

se

comporte

diff?eremment

La

transformation

des

termes

substituables

en

variables

a

attribut

rend

de

plus

tout

raisonnement

equationnel

impossible

Si

dans

l'exemple

pr?ec?edent

la

variable

X

prend

ult?erieurement

la

valeur

compteur

-LRB-

-RRB-

l'

egalit?e

compteur

-LRB-

-RRB-

compteur

-LRB-

Y

-RRB-

est

invalid?ee

L'impl

ementation

de

Avec

notre

d?efinition

des

variables

a

attribut

le

pr?edicat

peut

etre

d?efini

comme

indiqu?e

figure

Cette

d?efinition

est

tr?es

concise

Notons

que

si

lors

de

la

d?emonstration

de

geler

-LRB-

X

But

-RRB-

la

variable

X

est

d?ej?a

instanci?ee

l'unification

de

X

et

de

la

variable

a

attribut

V

r?esulte

en

un

appel

du

pr?edicat

et

donc

en

un

m?eta

appel

du

but

But

Modifications

R?eversibles

geler

-LRB-

X

But

-RRB-

-LRB-

Var

gele

-LRB-

Goal

-RRB-

-RRB-

X

Var

-LRB-

gele

-LRB-

But

-RRB-

-RRB-

call

-LRB-

But

-RRB-

-LRB-

Subst

gele

-LRB-

-RRB-

gele

-LRB-

-RRB-

-RRB-

-LRB-

Subst

gele

-LRB-

-LRB-

-RRB-

-RRB-

-RRB-

Figure

Impl?ementer

a

l'aide

de

variables

a

attribut

-LRB-

-RRB-

geler

-LRB-

gele

-LRB-

But

-RRB-

But

-RRB-

-LRB-

gele

-LRB-

V

But

-RRB-

V

-RRB-

call

-LRB-

But

-RRB-

-LRB-

gele

-LRB-

V

-RRB-

gele

-LRB-

V

-RRB-

-RRB-

V

gele

-LRB-

-LRB-

-RRB-

-RRB-

Figure

Impl?ementer

a

l'aide

de

m?eta

structures

Une

sp?ecification

des

modifications

r?eversibles

a

partir

des

variables

a

geler

-LRB-

X

But

-RRB-

-LRB-

Var

gel

-LRB-

Var

But

-RRB-

-RRB-

X

V.

-LRB-

gele

-LRB-

Var

But

-RRB-

Valeur

-RRB-

-LRB-

Var

-RRB-

Var

Valeur

call

-LRB-

But

-RRB-

-LRB-

gele

-LRB-

-RRB-

gele

-LRB-

-RRB-

-RRB-

-LRB-

-RRB-

-LRB-

-RRB-

-LRB-

gele

-LRB-

-LRB-

-RRB-

-RRB-

-RRB-

Figure

Impl?ementer

a

l'aide

des

variables

a

attribut

d?efinies

par

Holzbaur

Il

est

instructif

de

comparer

cette

d?efinition

avec

les

d?efinitions

propos?ees

par

Holzbaur

-LSB-

-RSB-

l'une

fond?ee

sur

un

raffinement

des

m?eta

structures

de

Neumerkel

-LSB-

-RSB-

-LRB-

voir

figure

-RRB-

l'autre

fond?ee

sur

les

variables

a

attribut

-LRB-

voir

figure

-RRB-

Le

rapport

entre

variable

a

attribut

vara

-LRB-

Subst

Attr

-RRB-

et

la

m?eta

structure

correspondante

est

direct

Il

peut

etre

enonc?e

en

Prolog

de

la

mani?ere

suivante

Attr

-LSB-

Atom

Args

-RSB-

MetaStructure

-LSB-

Atom

Subst

Args

-RSB-

Il

en

r?esulte

que

d?es

que

les

m?eta

structures

sont

utilis?ees

la

gestion

du

champ

de

substitution

est

a

la

charge

de

l'extension

D'apr

es

Holzbaur

-LSB-

-RSB-

il

y

a

en

fait

des

cas

o?u

cela

est

souhaitable

Il

est

facile

de

modifier

notre

sp?ecification

afin

de

satisfaire

cette

contrainte

par

exemple

en

ajoutant

les

champs

de

substitutions

a

la

liste

des

param?etres

des

pr?edicats

d'extension

Outre

le

champ

de

substitution

artefact

qui

permet

d'impl

ementer

l'unification

les

deux

propositions

diff?erent

aussi

dans

la

mani?ere

dont

elles

rep?erent

les

termes

interpr?et?es

Globalement

ces

diff?erences

sont

toutefois

mineures

et

il

est

relativement

simple

de

passer

d'une

proposition

a

l'autre

Au

contraire

des

m?eta

structures

et

des

variables

a

attributs

la

seconde

proposition

d'Holzbaur

-LRB-

voir

figure

-RRB-

ne

peut

pas

etre

simplement

sp?ecifi?ee

en

Prolog

Afin

de

permettre

aux

pr?edicats

d'extension

de

traiter

l'ensemble

du

processus

d'unification

ces

d?efinitions

sont

ves

En

particulier

les

probl?emes

d'enlisement

-LRB-

floundering

-RRB-

ne

sont

pas

trait?es

L'ex

ecution

peut

apparemment

r?eussir

alors

que

des

buts

gel?es

et

donc

non

prouv?es

subsistent

Modifications

R?eversibles

un

attribut

est

un

terme

compos?e

qui

a

pour

premier

argument

la

variable

m

eme

dont

il

est

l'attribut

Cela

ne

cr?ee

pas

r?eellement

de

terme

cyclique

du

fait

que

ce

cycle

est

transparent

pour

l'unification

syntaxique

et

cass?e

par

l'unification

s?emantique

Aussi

une

variable

a

attribut

ne

peut

plus

etre

li?ee

par

une

simple

substitution

La

variable

a

attribut

doit

tout

d'abord

etre

transform?ee

en

une

variable

standard

par

le

pr?edicat

pr?ed?efini

d?etacher

Nous

conjecturons

que

Holzbaur

a

et?e

influenc?e

par

des

consid?erations

d'impl

ementation

li?ees

a

son

syst?eme

cible

SICStus

Prolog

Impl?ementer

les

modifications

r?eversibles

par

sub

stitution

Cette

section

passe

en

revue

les

principaux

probl?emes

pos?es

par

l'int

egration

des

variables

a

attribut

dans

un

moteur

Prolog

tel

que

la

WAM

notamment

au

niveau

de

la

repr?esentation

des

termes

et

de

la

gestion

m?emoire

La

repr?esentation

des

termes

Une

bonne

int?egration

des

variables

a

attribut

requiert

une

repr?esentation

sp?ecifique

de

ces

variables

Coller

a

une

repr?esentation

sous

forme

de

terme

compos?e

d?etruirait

les

bonnes

propri?et?es

de

la

repr?esentation

par

etiquetage

des

pointeurs

de

la

WAM

repr?esentation

qui

vise

a

d?eterminer

aussi

rapidement

que

possible

le

type

d'un

terme

repr?esent?e

par

une

cellule

donn?ee

En

effet

si

les

variables

a

attribut

sont

repr?esent?ees

par

des

termes

compos?es

d?eterminer

le

type

d'un

terme

repr?esent?e

par

une

cellule

etiquet?ee

CMP

demande

a

tester

le

foncteur

r?ef?erenc?e

par

cette

cellule

Si

ce

foncteur

est

le

foncteur

variable

a

attribut

le

champ

substitution

de

la

variable

a

attribut

doit

etre

test?e

Finalement

si

le

champ

est

li?e

une

nouvelle

op?eration

de

d?er?ef?erenciation

est

n?ecessaire

La

solution

la

plus

directe

consiste

a

introduire

un

nouveau

type

de

cellule

une

cellule

variable

a

attribut

etiquet?ee

VRA

La

valeur

d'une

telle

cellule

est

l'adresse

d'un

bloc

de

donn?ees

constitu?e

de

deux

cellules

une

pour

le

champ

substitution

et

une

pour

l'attribut

Il

suffit

de

modifier

l'op

eration

de

d?er?ef?erenciation

de

mani?ere

a

consid?erer

les

cellules

variables

a

attribut

comme

des

r?ef?erences

Le

pr?edicat

de

la

figure

peut

alors

etre

efficacement

int?egr?e

au

sein

de

l'op

eration

de

d?er?ef?erenciation

Il

est

aussi

possible

d'utiliser

une

repr?esentation

par

etiquetage

des

donn?ees

pour

les

variables

a

attribut

Le

champ

substitution

est

alors

etiquet?e

VRA

et

le

bloc

de

donn?ees

repr?esentant

la

variable

a

attribut

est

adress?e

par

l'interm

ediaire

d'une

simple

r?ef?erence

Dans

ce

cas

il

est

n?ecessaire

de

veiller

a

ne

pas

cr?eer

par

copie

de

cellule

VRA

isol?ee

Ceci

cr?eerait

une

confusion

entre

bloc

de

donn?ees

et

r?ef?erence

rendant

impossible

une

r?ecup?eration

m?emoire

pr?ecise

Cette

repr?esentation

a

l'avantage

de

ne

r?eclamer

aucune

modification

de

l'op

eration

de

d?er?ef?erenciation

Elle

r?eclame

toutefois

une

r?ecup?eration

de

m?emoire

par

compactage

afin

de

pr?eserver

la

coh?esion

entre

champ

de

substitution

Impl?ementer

les

modifications

r?eversibles

par

substitution

et

attribut

L'unification

Une

fois

les

probl?emes

de

repr?esentation

r?esolus

etendre

la

proc?edure

g?en?erale

d'unification

et

les

instructions

d'unification

est

ais?e

La

proc?edure

g?en?erale

d'unification

est

un

codage

direct

dans

le

langage

d'impl

ementation

du

pr?edicat

et

les

instructions

d'unification

sont

de

simples

sp?ecialisations

de

cette

proc?edure

-LRB-

voir

-LSB-

-RSB-

-RRB-

A

l'ex

ecution

les

extensions

ne

peuvent

pas

etre

prises

en

compte

a

chaque

etape

du

processus

d'unification

du

moins

s

il

s

agit

d'ex

ecuter

du

code

Prolog

ce

qui

est

le

cas

du

coroutinage

et

des

extensions

d?efinies

en

Prolog

L'unification

compil?ee

n'est

pas

interruptible

a

un

co

ut

raisonnable

Au

lieu

de

cela

les

arguments

des

pr?edicats

d'extension

sont

sauvegard?es

et

pris

en

compte

en

bloc

a

chaque

etape

de

r?esolution

On

pourrait

traduire

ce

fait

dans

notre

m?eta

interpr?ete

en

ajoutant

un

nouvel

argument

au

pr?edicat

Cet

argument

accumulerait

une

liste

d'unifications

etendues

sous

forme

d'appels

aux

pr?edicats

et

liste

a

ins?erer

en

t

ete

de

r?esolvante

avant

l'

etape

de

r?esolution

suivante

Les

d?etails

d'impl

ementation

d'un

certain

nombre

d'instances

de

ce

sch?ema

-LRB-

coroutinage

unification

extensible

logiciel

mat?eriel

-RRB-

peuvent

etre

trouv?es

dans

la

litt?erature

-LSB-

-RSB-

Notons

qu'il

est

souhaitable

de

ne

pas

ralentir

les

programmes

n'utilisant

pas

l'unification

etendue

Cela

sugg?ere

de

ne

pas

introduire

de

nouvelle

structure

de

donn?ees

pour

enregistrer

les

unifications

etendues

et

donc

d'utiliser

la

pile

globale

Quant

au

test

a

chaque

etape

de

r?esolution

de

l'existence

d'unifications

etendues

en

attente

il

peut

etre

rendu

transparent

par

connexion

au

m?ecanisme

g?en?eral

d?etectant

tout

aussi

bien

la

n?ecessit?e

d'une

r?ecup?eration

m?emoire

qu'une

interruption

Gestion

m?emoire

Les

probl?emes

de

gestion

m?emoire

soulev?es

par

les

variables

a

attribut

ont

et?e

initialement

trait?es

par

Le

Huitouze

-LSB-

-RSB-

dans

le

contexte

de

MALI

-LRB-

voir

aussi

la

synth?ese

de

Bekkers

et

al

-LSB-

-RSB-

-RRB-

Ind?ependamment

Neumerkel

a

appliqu?e

des

id?ees

similaires

aux

m?eta

structures

-LSB-

-RSB-

Fondamentalement

la

logique

d'utilit

e

des

variables

a

attribut

-LRB-

et

des

m?eta

structures

-RRB-

est

la

m

eme

que

celle

des

variables

standard

Il

suffit

en

fait

de

raisonner

en

terme

de

liaison

du

champ

de

substitution

Une

variable

a

attribut

qui

a

et?e

li?ee

inconditionnellement

est

transparente

et

peut

etre

court-circuit

ee

-LRB-

la

variable

a

attribut

et

la

valeur

de

liaison

de

sa

variable

de

substitution

sont

confondues

-RRB-

Une

variable

a

attribut

dont

la

valeur

de

liaison

n'est

pas

utilis?ee

peut

etre

soumise

a

une

d?eliaison

anticip?ee

-LRB-

la

variable

de

substitution

est

d?eli?ee

-RRB-

Le

court-circuit

est

sp?ecialement

utile

Tout

d'abord

il

raccourcit

les

cha

nes

de

variables

a

attribut

Ensuite

il

rend

possible

la

r?ecup?eration

de

l'espace

occup?e

par

les

attributs

inutilis?es

-LRB-

qui

autrement

seraient

Modifications

R?eversibles

oe

oe

oe

oe

-RRB-

-RRB-

-RRB-

X

vara

-LRB-

vara

-LRB-

vara

-LRB-

REF

VRA

VRA

VRA

Tra

n?ee

Pile

Globale

REF

REF

Point

de

choix

Point

de

choix

Figure

Mise

a

jour

par

substitution

encore

accessible

au

travers

des

bloc

de

donn?ees

repr?esentant

l'

etat

interm?ediaire

libre

des

variables

a

attribut

-RRB-

Notons

toutefois

que

les

variables

a

attribut

gardent

un

aspect

propre

aux

termes

compos?es

en

ce

qui

concerne

le

marquage

et

la

copie

hors

court-circuit

le

bloc

de

donn?ee

repr?esentant

une

variable

a

attribut

doit

etre

consid?er?e

comme

un

tout

Le

raisonnement

est

le

suivant

si

ce

bloc

de

donn?ees

est

utile

alors

l'

etat

libre

de

la

variable

a

attribut

l'est

et

donc

son

attribut

Les

faiblesses

de

la

substitution

Une

impl?ementation

des

variables

a

attribut

par

substitution

est

par

bien

des

aspects

tr?es

satisfaisante

L'impact

des

modifications

sur

la

performance

des

programmes

n'utilisant

pas

les

variables

a

attribut

est

limit?e

au

surco

ut

d

u

a

l'existence

d'un

nouveau

type

de

variable

Les

modifications

a

apporter

a

l'unification

et

au

r?ecup?erateur

de

m?emoire

sont

aussi

du

moins

conceptuellement

ais?ees

La

principale

faiblesse

de

la

technique

r?eside

en

son

inaptitude

a

eviter

l'allongement

de

certaines

cha

nes

de

liaisons

La

possibilit?e

de

cr?eer

des

cha

nes

de

liaisons

de

longueur

quelconque

est

une

propri?et?e

de

l'impl

ementation

des

substitutions

dans

la

WAM

Cela

ne

cr?ee

habituellement

pas

de

probl?eme

particulier

Les

s?equences

d'unification

conduisant

a

de

longues

cha

nes

sont

suffisamment

complexes

pour

ne

pas

appara

tre

en

pratique

Malheureusement

l'utilisation

des

variables

a

attribut

introduit

de

telles

s?equences

Lors

de

la

mise

a

jour

d'un

attribut

une

nouvelle

variable

a

attribut

est

cr?e?ee

et

unifi?ee

a

une

autre

variable

a

attribut

plus

ancienne

Cette

unification

introduit

une

r?ef?erence

de

la

variable

la

plus

ancienne

vers

la

variable

la

plus

r?ecente

Impl?ementer

les

modifications

r?eversibles

par

substitution

et

non

pas

l'oppos

e

comme

c'est

le

cas

lors

de

l'unification

de

variables

standard

En

l'absence

de

court-circuit

chaque

mise

a

jour

ajoute

un

maillon

a

la

cha

ne

de

liaisons

-LRB-

voir

figure

ignorer

les

points

de

choix

-RRB-

De

plus

en

l'absence

d'unification

r?eelle

-LRB-

c'est

a-dire

d'une

unification

qui

aurait

une

autre

fonction

que

de

mettre

a

jour

un

attribut

-RRB-

la

cha

ne

est

toujours

acc?ed?ee

a

partir

de

sa

racine

Le

co

ut

de

n

mises

a

jour

est

O

-LRB-

-RRB-

La

consommation

m?emoire

est

aussi

elev?ee

elle

est

proportionnelle

pour

chaque

variable

a

attribut

au

nombre

de

mises

a

jour

Notons

que

l'unification

r?eelle

peut

aussi

etre

responsable

de

la

cr?eation

de

cha

nes

de

variables

a

attribut

Mais

cela

n?ecessite

les

m

emes

s?equences

insolites

que

pour

les

variables

standard

alors

que

la

mise

a

jour

des

attributs

est

une

op?eration

courante

qui

dans

les

programmes

o?u

elle

est

utilis?ee

tend

a

etre

tr?es

fr?equente

Le

court-circuit

r?eduit

l'ampleur

du

probl?eme

en

rendant

les

mises

a

jour

inconditionnelles

beaucoup

plus

efficaces

tant

en

temps

qu'en

espace

En

l'absence

de

points

de

choix

le

court-circuit

comprime

totalement

les

cha

nes

de

variables

a

attribut

Cependant

d?es

qu'une

mise

a

jour

conditionnelle

a

lieu

le

court-circuit

n'est

plus

aussi

efficace

Il

est

en

effet

n?ecessaire

de

garder

le

bloc

de

donn?ees

initial

afin

que

la

variable

a

attribut

puisse

au

retour

arri?ere

retrouver

son

ancienne

valeur

de

liaison

par

simple

d?etra

nage

-LRB-

voir

figure

-RRB-

En

particulier

le

court-circuit

ne

change

pas

dans

le

pire

cas

le

co

ut

de

mise

a

jour

Ce

point

est

par

exemple

a

m

eme

de

ralentir

les

programmes

de

propagation

de

contraintes

sur

domaines

finis

Ces

programmes

suivent

habituellement

un

paradigme

de

type

test

et

g?en?eration

-LSB-

-RSB-

En

premier

lieu

un

r?eseau

de

contraintes

connectant

les

diverses

variables

domaine

du

probl?eme

a

r?esoudre

est

mis

en

place

Ces

variables

domaine

sont

repr?esent?ees

par

des

variables

a

attributs

Puis

un

g?en?erateur

de

valeurs

commence

a

instancier

les

variables

domaine

L'instanciation

de

la

premi?ere

variable

domaine

d?emarre

une

etape

de

propagation

de

contraintes

L'ex

ecution

se

poursuit

alors

m

elant

propagation

de

contraintes

et

g?en?eration

de

valeurs

d'

o?u

des

r?eductions

conditionnelles

de

domaines

et

la

cr?eation

de

cha

nes

de

variables

a

attribut

Au

pire

le

g?en?erateur

de

valeurs

peut

cr?eer

un

point

de

choix

par

variable

domaine

et

la

r?eduction

d'un

domaine

a

un

singleton

une

cha

ne

de

longueur

la

taille

du

domaine

Premiers

rem?edes

La

compression

de

chemin

Holzbaur

a

propos?e

d'utiliser

une

technique

de

compression

de

chemin

lors

de

chaque

acc?es

a

une

variable

a

attribut

Il

s

agit

de

garder

les

cha

nes

de

variables

a

attribut

a

la

fois

courtes

et

constantes

-LSB-

-RSB-

La

compression

a

lieu

lors

de

la

travers?ee

d'une

cha

ne

de

variables

a

attribut

Elle

consiste

a

remplacer

le

contenu

de

chaque

champ

de

substitution

soit

par

une

r?ef?erence

au

dernier

maillon

de

la

cha

ne

-LRB-

cas

d'une

simple

lecture

-RRB-

soit

par

une

repr?esentation

de

ce

dernier

maillon

-LRB-

cas

d'une

mise

a

jour

-RRB-

Modifications

R?eversibles

oe

oe

oe

oe

Point

de

choix

Point

de

choix

-RRB-

-RRB-

-RRB-

X

vara

-LRB-

vara

-LRB-

vara

-LRB-

REF

VRA

VRA

VRA

Pile

Globale

REF

REF

Tra

n?ee

REF

VRA

Figure

Mise

a

jour

par

substitution

et

compression

de

chemin

En

d'autres

termes

le

pr?edicat

-LRB-

voir

figure

-RRB-

est

r?e?ecrit

dereference

-LRB-

X

XD

-RRB-

-LRB-

X

vara

-LRB-

Suivant

-RRB-

nonvar

-LRB-

Suivant

-RRB-

setarg

-LRB-

X

XD

-RRB-

dereference

-LRB-

Suivant

XD

-RRB-

X

XD

-RRB-

o?u

setarg

-LRB-

X

XD

-RRB-

remplace

de

mani?ere

r?eversible

le

premier

argument

de

X

c'est

a-dire

le

champ

de

substitution

de

la

variable

a

attribut

courante

dans

la

cha

ne

par

XD

c'est

a-dire

une

repr?esentation

du

r?esultat

de

la

d?er?ef?erenciation

La

figure

montre

le

r?esultat

d'une

telle

compression

Cette

figure

est

a

comparer

avec

la

figure

Toutes

les

cha

nes

sont

r?eduites

a

des

cha

nes

de

longueur

Alors

qu'une

solution

uniquement

bas?ee

sur

la

substitution

ne

fait

que

modifier

des

auto-r

ef?erences

la

compression

modifie

aussi

les

autres

r?ef?erences

D?efaire

de

telles

liaisons

que

nous

dirons

destructives

au

retour

arri?ere

requiert

un

m?ecanisme

plus

puissant

que

le

tra

nage

standard

qui

n'est

capable

que

de

traiter

les

auto-r

ef?erences

Il

est

n?ecessaire

d'enregistrer

a

la

fois

les

adresses

et

les

anciennes

valeurs

des

r?ef?erences

modifi?ees

et

donc

de

recourir

au

tra

nage

de

valeur

Impl?ementer

les

modifications

r?eversibles

par

substitution

La

condition

de

tra

nage

d'une

liaison

destructive

est

identique

a

la

condition

de

tra

nage

d'une

liaison

standard

Si

la

liaison

s

applique

a

une

cellule

plus

ancienne

que

le

point

de

choix

courant

la

liaison

doit

etre

enregistr?ee

sur

la

tra

n?ee

Mais

alors

que

l'enregistrement

sur

la

tra

n?ee

d'une

liaison

standard

ne

comporte

que

l'adresse

de

la

liaison

l'enregistrement

d'une

liaison

destructive

comporte

a

la

fois

l'adresse

de

la

cellule

modifi?ee

et

son

ancienne

valeur

Au

retour

arri?ere

la

cellule

peut

retrouver

son

ancienne

valeur

Afin

de

r?eduire

la

consommation

de

m?emoire

enregistrements

de

liaisons

standard

et

enregistrements

de

liaisons

destructives

peuvent

cohabiter

gr

ace

a

l'ajout

d'une

etiquette

indiquant

le

type

de

l'enregistrement

Turk

a

aussi

propos?e

d'entrelacer

les

deux

types

d'enregistrements

de

mani?ere

a

ne

pas

p?enaliser

la

gestion

des

liaisons

standard

en

l'absence

de

liaisons

destructives

-LSB-

-RSB-

La

compression

de

chemin

sugg?er?ee

par

Holzbaur

s

applique

aussi

bien

a

l'unification

de

variables

a

attribut

en

g?en?eral

qu

a

la

mise

a

jour

des

attributs

Dans

le

cas

g?en?eral

le

dernier

maillon

de

la

cha

ne

n'est

pas

connu

lors

de

la

d?er?ef?erenciation

La

compression

s

ecrit

simplement

en

Prolog

mais

s

av?ere

co

uteuse

sa

mise

en

oeuvre

dans

le

langage

d'impl

ementation

requiert

deux

passes

Le

probl?eme

peut

etre

partiellement

r?egl?e

-LRB-

rappelons

l'importance

de

la

mise

a

jour

des

attributs

-RRB-

en

limitant

la

compression

a

la

mise

a

jour

Dans

ce

cas

la

nouvelle

variable

a

attribut

cr?e?ee

lors

de

la

mise

a

jour

peut

etre

construite

avant

la

d?er?ef?erenciation

Une

r?ef?erence

a

cette

variable

peut

alors

etre

utilis?ee

par

la

proc?edure

de

d?er?ef?erenciation

pour

mettre

a

jour

les

champs

de

substitution

rencontr?es

Notons

aussi

que

la

compression

ne

permet

pas

un

acc?es

direct

au

dernier

maillon

de

la

cha

ne

Comme

le

montre

la

figure

partant

de

la

cellule

VRA

initiale

il

reste

une

indirection

a

travers

la

premi?ere

variable

a

attribut

Cette

indirection

pourrait

etre

supprim?ee

au

prix

d'une

liaison

destructive

suppl?ementaire

et

donc

d'un

enregistrement

suppl?ementaire

sur

la

tra

n?ee

La

repr?esentation

de

Taylor

Il

est

aussi

possible

d'adapter

la

repr?esentation

des

variables

d?evelopp?ee

par

Taylor

dans

le

cadre

du

syst?eme

Prolog

haute

performance

Parma

-LSB-

-RSB-

Cette

repr?esentation

consiste

a

cha

ner

les

r?ef?erences

en

une

liste

circulaire

de

telle

mani?ere

que

lors

de

la

liaison

d'une

variable

toutes

les

cellules

r?ef?eren?cant

cette

variable

puisse

recevoir

individuellement

la

m

eme

valeur

de

liaison

Chaque

liaison

conditionnelle

doit

bien

s

ur

donner

lieu

a

un

tra

nage

de

valeur

Cela

est

compens?e

par

l'absence

de

d?er?ef?erenciation

et

la

possibilit?e

de

g?en?erer

du

code

plus

simple

et

plus

efficace

si

gr

ace

a

une

analyse

globale

certaines

informations

sur

l'instanciation

des

variables

a

l'ex

ecution

sont

connues

Le

champ

de

substitution

peut

etre

utilis?e

pour

cha

ner

les

variables

a

attribut

dans

de

telles

listes

circulaires

Les

mises

a

jour

peuvent

alors

etre

propag?ees

a

chaque

el?ement

de

la

liste

Taylor

n

a

toutefois

pas

r?eellement

d?emontr?e

la

sup?eriorit?e

de

sa

repr?esentation

Il

a

tout

au

plus

montr?e

qu'une

telle

repr?esentation

avait

du

sens.

Les

cha

nes

de

variables

Modifications

R?eversibles

a

attribut

paraissent

devoir

etre

plus

longues

que

les

cha

nes

de

liaisons

standard

Propager

les

mises

a

jour

a

toutes

les

variables

d'une

cha

ne

risque

d'

etre

co

uteux

en

temps

et

en

espace

et

surtout

inutile

dans

bien

des

cas

En

particulier

en

l'absence

d'unification

r?eelle

les

variables

a

attribut

en

milieu

de

cha

ne

-LRB-

telles

que

la

variable

entre

les

deux

points

de

choix

de

la

figure

-RRB-

ne

sont

pas

r?ef?erenc?ees

Une

mise

a

jour

de

leur

valeur

de

liaison

est

donc

inutile

La

compression

de

chemin

se

comporte

mieux

a

cet

egard

Le

court-circuit

anticip?e

En

fait

le

court-circuit

des

variables

a

attribut

peut

partiellement

r?egler

le

probl?eme

des

cha

nes

de

liaisons

lors

de

l'unification

Lors

de

la

mise

a

jour

d'un

attribut

si

la

mise

a

jour

est

inconditionnelle

-LRB-

le

bloc

de

donn?ees

de

la

variable

a

attribut

est

plus

r?ecent

que

le

point

de

choix

courant

-RRB-

la

mise

a

jour

peut

etre

faite

en

place

Il

n'est

pas

n?ecessaire

de

cr?eer

une

nouvelle

variable

a

attribut

ni

de

cr?eer

une

nouvelle

indirection

Une

affectation

destructive

est

tout

a

fait

l?egitime

Elle

est

equivalente

a

-LRB-

-RRB-

cr?eer

une

nouvelle

variable

a

attribut

-LRB-

-RRB-

lier

ancienne

et

nouvelle

variable

-LRB-

-RRB-

marquer

l'ancienne

variable

comme

devant

etre

court-circuit

ee

-LRB-

-RRB-

court-circuiter

l'ancienne

variable

-LRB-

les

r?ef?erences

a

cette

variable

sont

remplac?ees

par

des

r?ef?erences

a

la

nouvelle

variable

-RRB-

-LRB-

-RRB-

d?eplacer

la

nouvelle

variable

pour

lui

faire

occuper

la

place

lib?er?ee

par

l'ancienne

En

fait

une

r?e?ecriture

de

l'ancienne

variable

n'est

correcte

que

s

il

n

y

a

plus

de

r?ef?erence

a

aucune

des

cellules

du

bloc

de

donn?ees

Le

court-circuit

supprime

toute

r?ef?erence

au

champ

de

substitution

Reste

a

veiller

aux

r?ef?erences

au

champ

attribut

De

telles

r?ef?erences

ne

sont

possibles

que

si

l'attribut

est

repr?esent?e

par

une

auto-r

ef?erence

prisonni?ere

-LRB-

voir

section

-RRB-

Il

suffit

donc

de

garantir

que

l'attribut

existe

c'est

adire

qu'une

repr?esentation

de

l'attribut

a

bien

et?e

construite

avant

de

cr?eer

le

bloc

de

donn?ees

de

la

variable

a

attribut

Par

exemple

si

les

variables

a

attribut

sont

exclusivement

cr?e?ees

par

l'interm

ediaire

du

pr?edicat

attacher

pr?ec?edemment

d?efini

il

suffit

de

rendre

ce

pr?edicat

opaque

a

toute

evaluation

En

ce

qui

concerne

le

temps

d'ex

ecution

le

co

ut

d'une

mise

a

jour

en

place

est

identique

a

la

liaison

du

champ

de

substitution

d'une

variable

a

attribut

et

est

donc

strictement

inf?erieur

au

co

ut

d'utilisation

de

la

substitution

supposons

que

le

pr?edicat

est

compil?e

a

l'aide

d'un

compilateur

raisonnable

c'est

a-dire

qui

utilisera

la

r?ef?erence

fournie

dans

le

second

argument

pour

construire

le

bloc

de

donn?ees

de

la

variable

a

attribut

Impl?ementer

les

mises

a

jour

r?eversibles

a

l'aide

de

l'affectation

destructive

Le

court-circuit

anticip?e

requiert

le

passage

de

la

variable

a

attribut

qui

reste

libre

-LRB-

la

plus

ancienne

-RRB-

en

premier

argument

du

pr?edicat

En

fonction

du

type

de

liaison

conditionnel

ou

inconditionnel

le

pr?edicat

peut

alors

d?ecider

de

recourir

a

la

substitution

ou

a

l'affectation

destructive

Notons

que

la

mise

a

jour

du

champ

attribut

de

la

variable

li?ee

n'aurait

pas

de

sens

celle-ci

ne

jouant

qu'un

simple

r

ole

de

r?ef?erence

a

la

variable

libre

Refl?eter

ces

changements

dans

le

m?eta

interpr?ete

ne

peut

etre

fait

de

mani?ere

simple

et

el?egante

Il

est

n?ecessaire

soit

d'introduire

les

concepts

d'

age

et

d'affectation

destructive

au

niveau

m?eta

soit

de

faire

des

hypoth?eses

sur

l'impl

ementation

du

m?etainterpr?ete

de

sorte

que

des

m?eta

pr?edicats

tels

que

et

aient

du

sens

o?u

retourne

en

troisi?eme

argument

le

plus

ancien

de

ses

deux

premiers

arguments

et

r?eussit

si

son

unique

argument

est

plus

ancien

que

le

point

de

choix

courant

Notons

enfin

que

la

compression

ne

s

int?egre

pas

bien

au

court-circuit

anticip?e

Supposons

que

la

compression

ne

concerne

que

la

mise

a

jour

En

l'absence

de

courtcircuit

anticip?e

le

dernier

maillon

de

la

cha

ne

de

variables

a

attribut

est

connu

et

une

seconde

passe

peut

donc

etre

evit?ee

-LRB-

voir

discussion

pr?ec?edente

-RRB-

Avec

le

court-circuit

anticip?e

de

dernier

maillon

ne

peut

plus

etre

connu

avant

d?er?ef?erenciation

Une

seconde

passe

est

a

nouveau

n?ecessaire

Impl?ementer

les

mises

a

jour

r?eversibles

a

l'aide

de

l'affectation

destructive

D'une

part

le

court-circuit

a

montr?e

que

l'affectation

destructive

peut

etre

utilis?ee

de

mani?ere

s

ure

pour

raccourcir

les

cha

nes

de

variables

a

attribut

et

limiter

la

consommation

m?emoire

en

l'absence

de

non-d

eterminisme

D'autre

part

on

a

vu

que

le

tra

nage

de

valeur

permet

de

rendre

r?eversible

l'affectation

destructive

La

combinaisons

de

ces

deux

techniques

autorise

des

mises

a

jour

sans

cr?eation

de

cha

nes

de

liaisons

et

a

un

co

ut

m?emoire

inf?erieur

a

la

substitution

-LRB-

court-circuit

inclus

-RRB-

Les

affectations

destructives

peuvent

aussi

etre

utilis?ees

pour

modifier

les

attributs

en

place

ou

encore

pour

eviter

le

recours

au

champ

de

substitution

La

mise

a

jour

de

l'attribut

Principes

Le

tra

nage

de

valeur

permet

d'

etendre

aux

mises

a

jour

inconditionnelles

le

raisonnement

appliqu?e

section

aux

mises

a

jour

conditionnelles

Tant

qu'il

n

y

a

pas

de

r?ef?erence

pointant

sur

le

champ

attribut

c'est

a-dire

que

le

probl?eme

des

auto-r

ef?erences

prisonni?eres

a

et?e

r?esolu

le

champ

attribut

peut

etre

modifi?e

en

place

Une

mise

a

jour

conditionnelle

donne

lieu

a

un

tra

nage

de

valeur

Toute

indirection

est

evit?ee

-LRB-

voir

la

Modifications

R?eversibles

oe

oe

Point

de

choix

Point

de

choix

-RRB-

-RRB-

-RRB-

X

vara

-LRB-

vara

-LRB-

vara

-LRB-

VRA

Tra

n?ee

Pile

Globale

REF

REF

REF

Figure

Tra

nage

de

valeur

figure

a

comparer

avec

la

figure

-RRB-

L'interface

d'unification

extensible

ne

change

pas

Le

seul

changement

a

apporter

concerne

le

module

Le

pr?edicat

modifie

le

champ

attribut

en

place

mode

-LRB-

-RRB-

-LRB-

Vara

Attr

-RRB-

setarg

-LRB-

Vara

Attr

-RRB-

Discussion

Comparons

l'affectation

destructive

avec

la

substitution

Appliquant

le

court-circuit

anticip?e

sur

les

mises

a

jour

inconditionnelles

les

deux

techniques

sont

trivialement

equivalentes

en

ce

qui

concerne

les

mises

a

jour

inconditionnelles

Une

mise

a

jour

inconditionnelle

par

affectation

destructive

consomme

un

tra

nage

de

valeur

c'est

a-dire

cellules

contre

un

tra

nage

d'adresse

et

une

variable

a

attribut

c'est

a-dire

cellules

par

affectation

destructive

Tant

qu'il

n

y

a

pas

plus

d'une

mise

a

jour

conditionnelle

par

variable

a

attribut

et

par

segment

l'affectation

destructive

consomme

a

tout

moment

moins

de

m?emoire

que

la

substitution

Cependant

d?es

qu'un

attribut

est

modifi?e

en

place

plusieurs

fois

au

sein

du

m

eme

segment

-LRB-

supposez

par

exemple

qu'il

n

y

ait

pas

de

point

de

choix

B

figure

-RRB-

le

test

de

tra

nage

ne

voit

pas

les

mises

a

jour

Chaque

mise

a

jour

est

enregistr?ee

sur

la

Impl?ementer

les

mises

a

jour

r?eversibles

a

l'aide

de

l'affectation

destructive

tra

n?ee

Id?ealement

le

tra

nage

de

valeur

devrait

etre

limit?e

a

un

seul

enregistrement

par

segment

et

par

cellule

celui

correspondant

a

la

premi?ere

modification

Cela

suffirait

a

sauvegarder

l'

etat

de

la

cellule

correspondant

au

segment

pr?ec?edent

Le

tra

nage

de

valeur

peut

etre

am?elior?e

afin

d'

eviter

ce

ph?enom?ene

que

nous

appellerons

tra

nage

aveugle

La

cr?eation

d'une

nouvelle

variable

a

attribut

lors

de

la

premi?ere

mise

a

jour

conditionnelle

fait

qu'un

tel

probl?eme

n'existe

pas

lorsqu'on

utilise

la

substitution

La

consommation

m?emoire

reste

constante

ind?ependante

du

nombre

de

mises

a

jour

Aussi

le

tra

nage

aveugle

rend

l'affectation

destructive

plus

gourmande

en

m?emoire

que

la

substitution

Cela

ne

prend

toutefois

pas

la

r?ecup?eration

de

m?emoire

en

compte

En

effet

il

est

possible

d'

etendre

le

court-circuit

de

mani?ere

a

fusionner

pour

chaque

segment

et

chaque

variable

tous

les

enregistrements

de

tra

nage

en

un

enregistrement

unique

-LRB-

le

plus

ancien

-RRB-

La

synth?ese

de

Bekkers

et

al.

-LSB-

-RSB-

d?ecrit

les

grandes

lignes

de

l'algorithme

correspondant

Dans

ce

cas

la

consommation

m?emoire

redevient

ind?ependante

du

nombre

de

mises

a

jour

Une

fois

l'action

du

r?ecup?erateur

de

m?emoire

prise

en

compte

l'affectation

destructive

consomme

moins

de

m?emoire

que

la

substitution

En

ce

qui

concerne

la

vitesse

d'ex

ecution

l'acc

es

aux

attributs

est

plus

rapide

en

pr?esence

de

points

de

choix

mais

il

y

a

un

certain

nombre

de

surco

uts

dus

au

tra

nage

aveugle

et

au

d?etra

nage

correspondant

ainsi

qu

a

l'extension

de

l'algorithme

de

courtcircuit

La

modification

en

place

des

attributs

La

plupart

du

temps

les

attributs

ne

sont

pas

partag?es

Consid?erons

par

exemple

des

variables

domaine

M

eme

s

il

arrive

que

les

attributs

de

deux

variables

domaine

puissent

etre

identiques

avant

le

d?emarrage

du

processus

de

g?en?eration

de

valeurs

-LRB-

les

variables

sont

d?efinies

sur

le

m

eme

domaine

et

identiquement

contraintes

-RRB-

l'

evolution

de

ces

attributs

va

tr?es

probablement

etre

ind?ependante

Quand

un

attribut

est

mis

a

jour

le

nouvel

attribut

est

tr?es

semblable

au

pr?ec?edent

Il

est

alors

plus

efficace

de

garantir

que

les

attributs

ne

sont

pas

initialement

partag?es

et

de

syst?ematiquement

construire

un

nouvel

attribut

en

modifiant

l'ancien

attribut

en

place

plut

ot

que

par

copie

Les

mises

a

jour

peuvent

alors

se

faire

en

modifiant

les

attributs

-LRB-

l'attribut

de

la

variable

libre

dans

le

cas

d'une

unification

de

deux

variables

a

attribut

-RRB-

en

place

a

l'aide

du

pr?edicat

pr?ed?efini

Cela

est

rendu

possible

en

encapsulant

l'attribut

dans

un

terme

compos?e

utilisant

par

exemple

le

nom

de

l'extension

comme

foncteur

Le

pr?edicat

ne

requiert

alors

que

deux

arguments

a

savoir

les

attributs

sous

forme

encapsul?ee

Par

convention

le

deuxi?eme

argument

par

exemple

contient

syst?ematiquement

l'attribut

de

la

variable

libre

a

utiliser

pour

la

mise

a

jour

L'interface

d'unification

extensible

d'ECLiPSe

-LSB-

-RSB-

repose

sur

cette

id?ee

-LRB-

bien

que

les

d?etails

de

l'interface

ne

suivent

pas

notre

description

-RRB-

Modifications

R?eversibles

Abandonner

le

champ

substitution

L'id

ee

est

de

repr?esenter

une

variable

a

attribut

par

une

r?ef?erence

a

attribut

-LRB-

etiquette

VRA

-RRB-

dont

le

champ

valeur

donne

l'adresse

du

champ

attribut

La

gestion

de

ces

r?ef?erences

est

alors

similaire

a

la

gestion

des

r?ef?erences

standard

sauf

que

les

liaisons

conditionnelles

donnent

lieu

a

un

tra

nage

de

valeur

et

que

bien

evidemment

l'unification

s?emantique

est

prise

en

compte

L'abandon

du

champ

de

substitution

conduit

a

une

consommation

m?emoire

moindre

Le

raisonnement

est

le

suivant

D'une

part

on

gagne

une

cellule

sur

la

repr?esentation

de

chaque

variable

a

attribut

D'autre

part

les

liaisons

conditionnelles

r?esultant

de

l'unification

de

deux

variables

a

attribut

requi?erent

une

cellule

suppl?ementaire

du

fait

du

passage

a

un

tra

nage

de

valeur

Cependant

en

l'absence

de

compression

les

variables

a

attribut

ne

peuvent

etre

li?ees

qu'une

fois

Elles

ne

sont

pas

en

cela

diff?erentes

des

variables

standard

Il

n

y

a

donc

au

plus

qu'un

tra

nage

par

variable

La

consommation

m?emoire

globale

d?ecro

t.

Notons

aussi

que

lorsqu'une

variable

a

attribut

est

instanci?ee

il

n

y

a

plus

d'indirection

entre

la

cellule

repr?esentant

la

variable

et

sa

valeur

de

liaison

Une

complication

est

que

les

r?ef?erences

a

attribut

doivent

pouvoir

comme

les

auto-r

ef?erences

etre

partag?ees

Malheureusement

elles

ne

poss?edent

pas

la

bonne

propri?et?e

des

auto-r

ef?erences

de

pouvoir

etre

partag?ees

par

simple

copie

Aussi

les

instructions

susceptibles

de

copier

de

m?emoire

a

registre

des

r?ef?erences

a

attribut

-LRB-

Yn

Ai

Yn

Ai

et

Xn

en

mode

ecriture

-RRB-

ainsi

que

la

proc?edure

de

d?er?ef?erenciation

doivent

prendre

soin

de

changer

les

r?ef?erences

a

attribut

en

r?ef?erence

standard

Cela

ne

peut

etre

sans

incidence

sur

la

vitesse

d'ex

ecution

Une

solution

mat?erielle

evite

ce

surco

ut

a

la

machine

KCM

Cependant

l'absence

de

ce

support

mat?eriel

aurait

r?esult?e

en

une

perte

de

performance

d'environ

-LRB-

voir

table

A.

-RRB-

En

l'absence

de

r?esultats

exp?erimentaux

exhibant

des

gains

en

m?emoire

substantiels

cette

variante

est

donc

difficile

a

justifier

Am?eliorer

le

tra

nage

de

valeur

f

Eviter

un

tra

nage

aveugle

lors

d'une

mise

a

jour

demande

a

conna

tre

l'

age

de

la

mise

a

jour

pr?ec?edente

ainsi

que

la

possibilit?e

de

comparer

l'

age

de

la

mise

a

jour

courante

-LRB-

en

fait

l'

age

de

la

cellule

a

laquelle

s

applique

la

mise

a

jour

-RRB-

avec

l'

age

du

point

de

choix

courant

Si

la

mise

a

jour

pr?ec?edente

etait

d?ej?a

post?erieure

au

point

de

choix

courant

il

n'est

pas

n?ecessaire

d'enregistrer

la

nouvelle

mise

a

jour

Lorsque

la

substitution

est

utilis?ee

l'

age

de

la

mise

a

jour

est

donn?e

par

l'adresse

du

bloc

de

donn?ees

repr?esentant

les

arguments

de

la

variable

a

attribut

Cette

adresse

peut

facilement

etre

compar?ee

a

l'

age

du

point

de

choix

courant

par

l'interm

ediaire

du

point

de

retour

arri?ere

sur

la

pile

globale

Impl?ementer

les

mises

a

jour

r?eversibles

a

l'aide

de

l'affectation

destructive

oe

oe

t

REF

VRA

t

Point

de

choix

Point

de

choix

Tra

n?ee

Pile

Globale

REF

estampille

t

estampille

t

Figure

Estampillage

Lorsqu'on

s

appuie

sur

l'affectation

destructive

et

un

tra

nage

de

valeur

f

le

bloc

de

donn?ees

ne

bouge

plus

D?eterminer

l'

age

d'une

mise

a

jour

requiert

soit

de

r?einjecter

une

notion

d'

age

explicitement

au

sein

du

bloc

de

donn?ees

soit

de

s

eloigner

d'une

stricte

modification

en

place

Dans

ce

dernier

cas

on

esp?ere

regagner

les

bonnes

propri?et?es

de

la

substitution

tout

en

en

laissant

de

c

ot?e

les

inconv?enients

Comme

le

montre

cette

section

il

est

possible

de

passer

en

douceur

d'une

approche

a

l'autre

L'estampillage

des

liaisons

Le

probl?eme

du

tra

nage

aveugle

a

et?e

attaqu?e

dans

le

contexte

du

langage

de

programmation

logique

avec

contraintes

CHIP

-LSB-

-RSB-

pour

lequel

une

solution

d'estampillage

temporel

-LSB-

-RSB-

a

et?e

adopt?ee

Cette

solution

semble

etre

devenue

la

solution

standard

pour

ce

qui

concerne

les

langages

de

programmation

logique

avec

contraintes

-LSB-

-RSB-

L'estampillage

temporel

d?efinit

l'

age

courant

comme

etant

le

nombre

de

points

de

choix

cr?e?es

le

long

de

la

d?erivation

courante

Ce

nombre

peut

etre

simplement

maintenu

a

l'aide

d'un

compteur

incr?ement?e

a

chaque

cr?eation

de

point

de

choix

et

d?ecr?ement?e

au

retour

arri?ere

Chaque

mise

a

jour

peut

ainsi

etre

estampill?ee

avec

son

age

voir

figure

Lors

d'une

nouvelle

mise

a

jour

si

l'estampille

de

la

mise

a

jour

pr?ec?edente

est

egale

a

la

valeur

courante

du

compteur

il

n

y

a

pas

eu

de

cr?eation

de

point

de

choix

entre

les

deux

mises

a

jour

L'enregistrement

de

la

nouvelle

mise

a

jour

n'est

pas

n?ecessaire

Dans

le

cas

contraire

l'estampille

prend

la

valeur

courante

du

compteur

et

la

mise

a

jour

est

enregistr?ee

sur

la

tra

n?ee

Comme

au

retour

arri?ere

tant

la

cellule

que

son

estampille

devront

retrouver

leurs

anciennes

valeurs

un

enregistrement

comprend

trois

champs

l'adresse

de

la

cellule

mise

a

jour

son

ancienne

valeur

et

son

ancienne

estampille

Modifications

R?eversibles

Un

comparaison

des

figures

et

montre

que

la

consommation

de

la

substitution

avec

court-circuit

ou

de

l'affectation

destructive

avec

estampillage

est

identique

en

ce

qui

concerne

une

mise

a

jour

conditionnelle

Cependant

le

bloc

de

donn?ee

initial

consomme

un

peu

plus

d'espace

dans

le

cas

de

l'estampillage

du

simple

fait

de

l'estampille

Chaque

mise

a

jour

est

aussi

l?eg?erement

ralentie

par

la

n?ecessit?e

de

lire

l'estampille

Globalement

la

gestion

du

compteur

entra

ne

de

plus

un

surco

ut

suppl?ementaire

Le

probl?eme

majeur

est

toutefois

que

le

tra

nage

aveugle

r?eappara

t

avec

la

coupure

Consid?erons

la

mise

a

jour

d'

age

t

de

la

cellule

suivie

de

la

cr?eation

d'un

point

de

choix

d'

age

t

et

de

la

mise

a

jour

d'

age

t

d'une

cellule

Si

le

point

de

choix

dispara

t

du

fait

d'une

coupure

une

nouvelle

mise

a

jour

de

ne

devrait

pas

etre

enregistr?ee

ancienne

et

nouvelle

mise

a

jour

appartenant

maintenant

au

m

eme

segment

Il

semble

donc

que

le

compteur

doive

etre

mis

a

jour

afin

de

refl?eter

l'

age

du

point

de

choix

courant

Cette

mise

a

jour

n'est

toutefois

pas

compatible

avec

une

simple

incr?ementation

du

compteur

lors

de

la

cr?eation

d'un

point

de

choix

Le

premier

point

de

choix

cr?e?e

apr?es

l'op

eration

de

coupure

aurait

pour

age

t

et

une

nouvelle

mise

a

jour

de

ne

serait

alors

pas

enregistr?ee

ce

qui

n'est

pas

correct

Un

rem?ede

simple

consiste

a

ne

pas

changer

le

compteur

lors

de

la

coupure

Mais

la

nouvelle

mise

a

jour

de

est

alors

inutilement

enregistr?ee

Un

estampillage

pr?ecis

L'estampillage

peut

etre

rendu

pr?ecis

en

-LRB-

-RRB-

d?efinissant

la

valeur

du

compteur

comme

etant

l'

age

du

point

de

choix

courant

-LRB-

-RRB-

mettant

a

jour

les

estampilles

lors

d'une

op?eration

de

coupure

Cela

d?ecoule

directement

de

la

discussion

pr?ec?edente

Si

la

premi?ere

condition

est

remplie

la

mise

a

jour

de

suivant

l'op

eration

de

coupure

a

pour

age

t

et

sa

mise

a

jour

n'est

donc

pas

enregistr?ee

Si

la

seconde

condition

est

remplie

l'

age

de

la

premi?ere

mise

a

jour

de

est

modifi?e

afin

de

prendre

en

compte

la

coupure

et

passe

de

t

a

t.

Toute

mise

a

jour

effectu?ee

apr?es

la

cr?eation

d'un

nouveau

point

de

choix

d'

age

t

est

enregistr?ee

sur

la

tra

n?ee

L'estampille

courante

peut

etre

vement

recal?ee

sur

l'

age

du

point

de

choix

courant

en

sauvegardant

dans

chaque

point

de

choix

l'

age

de

sa

cr?eation

Lors

de

la

cr?eation

d'un

nouveau

point

de

choix

l'

age

du

nouveau

point

de

choix

est

simplement

l'

age

du

pr?ec?edent

point

de

choix

incr?ement?e

L'estampille

courante

est

ainsi

enregistr?ee

dans

le

point

de

choix

courant

Elle

peut

eventuellement

etre

gard?ee

dans

un

registre

tout

comme

dans

la

WAM

le

point

de

retour

arri?ere

sur

la

pile

globale

Notons

que

par

comparaison

avec

une

technique

d'estampillage

ve

une

remise

a

jour

de

l'estampille

courante

n'est

n?ecessaire

que

dans

le

cas

d'une

coupure

ce

qui

Impl?ementer

les

mises

a

jour

r?eversibles

a

l'aide

de

l'affectation

destructive

conduit

a

associer

estampille

et

point

de

coupure

En

l'absence

de

coupure

tout

fonctionne

comme

l'estampillage

f.

Chaque

fois

qu'un

point

de

coupure

est

sauvegard?e

l'estampille

courante

est

aussi

sauvegard?ee

Une

op?eration

de

coupure

peut

alors

utiliser

cette

sauvegarde

pour

remettre

a

jour

le

compteur

Nous

faisons

ici

l'hypoth

ese

qu'un

point

de

coupure

hypoth?etique

n'est

pas

syst?ematiquement

sauvegard?e

dans

chaque

point

de

choix

-LRB-

voir

chapitre

-RRB-

L'addition

d'un

nouveau

champ

de

contr

ole

dans

les

point

de

choix

est

evit?ee

En

ce

qui

concerne

la

mise

a

jour

des

estampilles

lors

d'une

op?eration

de

coupure

elle

peut

etre

combin?ee

avec

le

nettoyage

de

la

tra

n?ee

-LRB-

voir

section

-RRB-

Supposons

que

apr?es

coupure

l'

age

du

point

de

choix

courant

est

t.

Toutes

les

cellules

estampill?ees

de

la

pile

r?ef?erenc?ees

par

des

enregistrements

sur

le

segment

en

sommet

de

tra

n?ee

sont

visit?ees

et

les

estampilles

de

valeur

sup?erieure

a

t

reprennent

la

valeur

t.

Evidemment

-LCB-

ceci

correspond

bien

au

nettoyage

de

la

tra

n?ee

-LCB-

les

enregistrements

avec

une

estampille

sup?erieure

ou

egale

a

t

peuvent

aussi

etre

elimin?es

et

les

s?eries

d'enregistrements

correspondant

a

la

m

eme

cellule

fusionn?ees

D?efinition

de

l'estampille

courante

a

partir

de

la

tra

n?ee

Aggoun

et

Beldiceanu

ont

aussi

envisag?e

d'utiliser

le

registre

B

qui

donne

l'adresse

du

point

de

choix

courant

plut

ot

qu'un

compteur

sp?ecifique

mais

ont

rejet?e

cette

possibilit?e

-LSB-

-RSB-

Le

probl?eme

est

qu'une

propri?et?e

fondamentale

du

compteur

est

de

devoir

strictement

cro

tre

avec

la

cr?eation

de

chaque

point

de

choix

Or

le

registre

B

du

fait

de

la

coupure

ne

satisfait

pas

cette

propri?et?e

-LRB-

il

peut

m

eme

d?ecro

tre

-RRB-

Qu'en

est-il

des

autres

points

de

retour

arri?ere

Il

y

a

deux

autres

candidats

possibles

le

point

de

retour

arri?ere

sur

la

pile

globale

gb

et

le

point

de

retour

arri?ere

sur

la

tra

n?ee

tb

Dans

la

WAM

ces

deux

candidats

correspondent

a

des

champs

de

contr

ole

du

point

de

choix

qui

enregistrent

la

valeur

des

sommets

de

la

pile

globale

et

de

la

tra

n?ee

au

moment

de

la

cr?eation

du

point

de

choix

Les

valeurs

de

ces

deux

pointeurs

croissent

avec

la

cr?eation

de

chaque

point

de

choix

et

d?ecroissent

lors

du

retour

arri?ere

et

de

la

coupure

Malheureusement

gb

ne

cro

t

ni

ne

d?ecro

t

de

mani?ere

stricte

mais

peut

rester

constant

dans

le

cas

o?u

aucun

terme

compos?e

n

a

et?e

cr?e?e

A

priori

tb

se

comporte

de

mani?ere

similaire

S'il

n

y

a

pas

d'enregistrement

sur

la

tra

n?ee

tb

reste

constant

Cependant

l'absence

d'enregistrement

indique

une

absence

de

mise

a

jour

et

donc

d'estampillage

Le

fait

que

tb

reste

constant

importe

peu

D'un

autre

c

ot?e

en

cas

de

mise

a

jour

cette

mise

a

jour

est

enregistr?ee

sur

la

tra

n?ee

Le

sommet

de

la

tra

n?ee

cro

t

strictement

Quand

un

nouveau

point

de

choix

est

cr?e?e

la

nouvelle

valeur

de

tb

est

strictement

sup?erieure

a

sa

valeur

pr?ec?edente

Le

point

de

retour

sur

la

tra

n?ee

fournit

donc

des

estampilles

correctes

et

pr?ecises

tout

en

evitant

le

surco

ut

li?e

a

la

gestion

d'un

compteur

sp?ecifique

Un

probl?eme

r?esiduel

est

que

l'utilisation

de

tb

introduit

des

pointeurs

de

la

pile

globale

vers

la

tra

n?ee

Un

compactage

ou

une

copie

de

la

tra

n?ee

requiert

donc

la

mise

a

jour

de

pointeurs

sur

la

pile

globale

Cela

est

r?esolu

en

notant

que

lors

d'une

mise

a

jour

l'adresse

m

eme

de

Modifications

R?eversibles

REF

REF

REF

oe

oe

oeoe

Point

de

choix

Pile

globale

Tra

n?ee

REF

VRA

Figure

Estampillage

a

l'aide

de

la

tra

n?ee

l'enregistrement

empil?e

sur

la

tra

n?ee

fournit

aussi

une

estampille

valide

Comme

cette

adresse

se

situe

entre

l'estampille

courante

tb

et

la

suivante

elle

se

comporte

exactement

comme

tb

en

ce

qui

concerne

la

condition

de

tra

nage

Cellules

estampill?ees

et

enregistrements

de

mise

a

jour

sont

alors

li?es

comme

indiqu?e

figure

Lorsqu'un

enregistrement

est

d?eplac?e

mettre

a

jour

la

cellule

estampill?ee

correspondante

est

trivial

De

plus

les

enregistrements

correspondant

aux

mises

a

jours

successives

de

la

m

eme

cellule

sont

maintenant

li?es

ce

qui

facilite

le

court-circuit

Une

variante

de

cette

technique

consiste

a

garder

les

valeurs

de

liaisons

sur

la

tra

n?ee

comme

indiqu?e

figure

Cela

s

av?ere

etre

une

variante

s?equentielle

des

champs

de

mises

a

jour

cons?ecutives

-LRB-

consecutively

updatable

fields

-RRB-

du

syst?eme

parall?ele

de

programmation

logique

avec

contraintes

ElipSys

-LSB-

-RSB-

Dans

ce

syst?eme

l'acc

es

a

une

valeur

de

liaison

demande

une

indirection

suppl?ementaire

a

travers

le

tableau

des

liaisons

-LRB-

binding

array

-RRB-

la

structure

de

donn?ee

utilis?ee

dans

un

contexte

de

parall?elisme

OU

pour

g?erer

les

multiples

valeurs

de

liaison

d'une

m

eme

variable

Cependant

cette

variante

n

a

que

peu

d'attrait

dans

un

contexte

s?equentiel

En

comparaison

avec

la

solution

pr?ec?edente

il

n

y

a

pas

de

r?eduction

de

la

consommation

m?emoire

La

consommation

m?emoire

sur

la

pile

globale

est

r?eduite

mais

au

prix

d'un

accroissement

au

moins

equivalent

de

la

tra

n?ee

fonction

de

la

taille

exacte

du

premier

enregistrement

sur

la

tra

n?ee

-LRB-

qui

pourrait

eventuellement

etre

r?eduit

a

une

cellule

unique

-RRB-

Acc?eder

les

valeurs

de

liaison

sur

la

tra

n?ee

demande

de

plus

une

indirection

suppl?ementaire

Impl?ementer

les

mises

a

jour

r?eversibles

a

l'aide

de

l'affectation

destructive

REF

REF

REF

REF

oe

oe

oeoe

Point

de

choix

Pile

globale

Tra

n?ee

REF

VRA

Figure

Estampillage

a

l'aide

de

la

tra

n?ee

Variante

Estampillage

a

l'aide

d'adresses

globales

L'id

ee

est

d'utiliser

l'adresse

m

eme

de

la

cellule

mise

a

jour

pour

d?eterminer

l'

age

de

la

liaison

Cela

fonctionne

de

la

mani?ere

suivante

La

cellule

mise

a

jour

est

d?er?ef?erenc?ee

-LRB-

un

code

sp?ecialis?e

peut

etre

utilis?e

la

longueur

de

la

cha

ne

ne

peut

prendre

que

les

valeurs

ou

-RRB-

Si

la

proc?edure

de

d?er?ef?erenciation

retourne

une

cellule

plus

ancienne

que

le

point

de

choix

courant

un

tra

nage

de

valeur

est

effectu?e

une

copie

de

la

cellule

repr?esentant

la

nouvelle

valeur

de

liaison

est

empil?ee

sur

la

pile

globale

et

la

cellule

a

modifier

est

remplac?ee

par

une

r?ef?erence

pointant

sur

cette

copie

Voir

figure

o?u

le

processus

a

et?e

effectu?e

deux

fois

pour

passer

de

l'attribut

a

apr?es

cr?eation

du

point

de

choix

A

et

pour

passer

de

a

apr?es

cr?eation

du

point

de

choix

B.

Si

la

proc?edure

de

d?er?ef?erenciation

ne

retourne

pas

une

cellule

plus

ancienne

que

le

point

de

choix

courant

la

cellule

est

simplement

modifi?ee

en

place

sans

intervention

de

la

tra

n?ee

Notons

que

la

copie

de

la

cellule

repr?esentant

la

nouvelle

valeur

de

liaison

ne

peut

etre

evit?ee

m

eme

s

il

existe

d?ej?a

une

repr?esentation

de

la

nouvelle

valeur

de

liaison

plus

jeune

que

le

point

de

choix

courant

En

effet

cette

repr?esentation

ne

peut

etre

utilis?ee

car

il

n

y

a

aucune

garantie

qu'elle

ne

soit

pas

partag?ee

Une

future

modification

en

place

de

la

cellule

pourrait

cr?eer

des

effets

de

bord

cette

fois

r?eellement

destructifs

Cette

solution

se

situe

entre

une

technique

d'estampillage

ve

et

les

techniques

pr?ecises

pr?ec?edemment

pr?esent?ees

Compar?e

a

l'estampillage

f

le

tra

nage

aveugle

est

evit?e

mais

la

consommation

m?emoire

instantan?ee

peut

etre

sup?erieure

en

l'absence

Modifications

R?eversibles

oe

oe

oe

REF

REF

REF

VRA

Point

de

Choix

A

Point

de

choix

B

Tra

n?ee

Pile

Globale

oe

oe

oe

REF

REF

VRA

Point

de

choix

A

Tra

n?ee

Pile

Globale

Mise

a

jour

dans

le

segment

de

base

A

Mise

a

jour

dans

le

segment

de

base

B

Figure

Estampillage

a

l'aide

d'adresses

globales

Affectation

destructive

et

de

mises

a

jour

successives

Dans

ce

cas

la

consommation

de

m?emoire

sur

la

pile

globale

est

sup?erieure

alors

que

la

consommation

de

m?emoire

sur

la

tra

n?ee

est

identique

En

g?en?eral

cette

consommation

additionnelle

de

pile

globale

conduit

aussi

a

une

consommation

m?emoire

sup?erieure

apr?es

action

du

r?ecup?erateur

de

m?emoire

Compar?ee

a

un

estampillage

pr?ecis

cette

solution

consomme

un

peu

moins

de

m?emoire

autant

pour

une

mise

a

jour

conditionnelle

-LRB-

deux

cellules

de

tra

n?ee

et

une

cellule

de

pile

globale

contre

trois

cellules

de

tra

-RRB-

mais

l'absence

d'estampille

a

proprement

parler

r?eduit

la

consommation

de

m?emoire

sur

la

pile

globale

Un

certain

surco

ut

d

u

a

la

lecture

de

l'estampille

demeure

mais

le

compteur

sp?ecifique

a

disparu

Tra

nage

de

mises

a

jour

multiples

En

m

eme

temps

que

l'estampillage

Aggoun

et

Beldiceanu

-LSB-

-RSB-

ont

introduit

une

seconde

am?elioration

visant

a

r?eduire

la

consommation

m?emoire

et

le

nombre

de

tests

de

tra

nage

Il

s

agit

de

faire

partager

une

m

eme

estampille

et

un

m

eme

enregistrement

de

tra

nage

a

des

mises

a

jours

affectant

des

arguments

cons?ecutifs

d'un

terme

compos?e

L'enregistrement

inclut

une

estampille

commune

l'adresse

de

la

premi?ere

cellule

modifi?ee

le

nombre

de

cellules

modifi?ees

et

la

valeur

pr?ec?edente

de

ces

cellules

Cette

am?elioration

est

parfaitement

compatible

avec

la

technique

pr?ec?edemment

propos?ee

Il

suffit

de

donner

a

la

premi?ere

cellule

le

r

ole

d'estampille

Seules

les

modifications

de

cette

cellule

donneront

lieu

a

copie

les

autres

cellules

peuvent

etre

simplement

modifi?ees

en

place

Affectation

destructive

et

Dans

le

manuel

de

SICStus

Prolog

-LSB-

-RSB-

le

pr?edicat

pr?ed?efini

est

d?ecrit

de

la

mani?ere

suivante

-LRB-

cette

d?efinition

est

plus

pr?ecise

que

dans

bien

d'autres

manuels

-RRB-

setarg

-LRB-

NoArg

TermeCompose

NouvelArg

-RRB-

Remplace

destructivement

l'argument

NoArg

de

TermeCompose

par

NouvelArg

L'affectation

est

d?efaite

au

retour

arri?ere

Cette

op?eration

n'est

s

ure

que

dans

le

cas

o?u

l'ancienne

valeur

de

l'argument

remplac?e

n'est

plus

utilis?ee

L'utilisation

de

ce

pr?edicat

est

d?econseill?ee

l'id

ee

de

remplacement

destructif

etant

etrang?ere

a

la

programmation

logique

suppose

que

tous

les

objets

consid?er?es

ont

la

m

eme

taille

Cela

peut

ne

pas

etre

le

cas

dans

une

impl?ementation

utilisant

des

mots

de

bits

o?u

les

deux

adresses

sauvegard?ees

dans

un

enregistrement

pourraient

etre

rang?ees

dans

un

unique

mot

de

bits

Modifications

R?eversibles

-LRB-

S

-RRB-

setarg

-LRB-

S

-RRB-

-LRB-

U

-RRB-

setarg

-LRB-

toto

-LRB-

U

-RRB-

-RRB-

-LRB-

U

-RRB-

-LRB-

-RRB-

setarg

-LRB-

-RRB-

arg

-LRB-

U

-RRB-

-LRB-

toto

-LRB-

U

-RRB-

toto

-LRB-

U

-RRB-

-RRB-

-LRB-

toto

-LRB-

X

-RRB-

-RRB-

-LRB-

X

-RRB-

-LRB-

X

-RRB-

ECLiPSe

SICStus

BinProlog

XSB

mis

a

jour

var

var

var

var

var

var

mis

a

jour

mis

a

jour

mis

a

jour

mis

a

jour

var

Table

Comportements

compar?es

du

pr?edicat

pr?ed?efini

En

fait

la

discussion

pr?ec?edente

rend

possible

un

raffinement

de

cette

d?efinition

En

effet

une

version

s

ure

de

et

du

pr?edicat

d'acc

es

correspondant

peut

etre

d?efinie

en

terme

de

terme

modifiable

de

la

mani?ere

suivante

-LRB-

No

Terme

NouvelArg

-RRB-

arg

-LRB-

No

Terme

Vara

-RRB-

Vara

NewArg

-LRB-

No

Terme

Arg

-RRB-

arg

-LRB-

No

Terme

Vara

-RRB-

Vara

Arg

Cela

suppose

que

l'argument

No

de

Terme

soit

un

terme

modifiable

Le

pr?edicat

est

s

ur

pour

deux

raisons

La

premi?ere

est

que

l'ancienne

valeur

en

fait

l'ancien

attribut

n'est

pas

d?etruite

La

deuxi?eme

est

que

si

le

terme

compos?e

a

et?e

pr?ec?edemment

unifi?e

a

un

autre

terme

l'

egalit?e

reste

vraie

Bien

s

ur

ces

pr?edicats

ne

sont

pas

particuli?erement

efficaces

Il

est

tout

a

fait

tentant

de

ranger

directement

l'attribut

dans

le

champ

argument

correspondant

du

terme

compos?e

et

de

le

modifier

par

affectation

destructive

Dans

ce

cas

le

m

eme

raisonnement

que

pour

le

court-circuit

anticip?e

s

applique

Si

l'argument

est

initialement

une

variable

et

que

cette

variable

s

av?ere

etre

repr?esent?ee

par

une

auto-r

ef?erence

prisonni?ere

alors

peut

cr?eer

des

effets

de

bord

inattendus

La

table

illustre

le

fait

que

d?es

que

l'argument

remplac?e

est

une

variable

le

comportement

de

varie

enorm?ement

d'un

syst?eme

a

l'autre

La

mention

indique

que

la

variable

X

a

et?e

mise

a

jour

alors

que

var

indique

qu'elle

Conclusion

est

rest?ee

libre

Cependant

si

l'argument

n'est

pas

initialement

une

variable

ne

modifie

pas

l'ancienne

valeur

de

l'argument

qui

peut

donc

etre

utilis?ee

en

toute

s?ecurit?e

Un

deuxi?eme

probl?eme

est

que

les

unifications

ayant

pr?ec?edemment

impliqu?e

le

terme

compos?e

peuvent

etre

invalid?ees

Une

utilisation

s

ure

de

requi?ere

donc

les

pr?ecautions

suivantes

les

termes

compos?es

modifi?es

par

ne

doivent

pas

etre

unifi?es

avec

d'autres

termes

compos?es

et

les

arguments

modifi?es

ne

doivent

pas

etre

initialis?es

par

des

auto-r

ef?erences

prisonni?eres

Conclusion

Un

traitement

des

variables

a

attribut

par

simple

substitution

permet

d'

etendre

l'unification

et

d'effectuer

des

modifications

r?eversibles

de

mani?ere

tr?es

el?egante

Une

telle

impl?ementation

devrait

etre

efficace

sur

une

large

classe

d'applications

en

particulier

sur

les

applications

d?eterministes

Cependant

en

pr?esence

de

non-d

eterminisme

appara

t

le

risque

de

cr?eer

de

longues

cha

nes

de

liaisons

Dans

la

mesure

o?u

les

probl?emes

de

tra

nage

aveugle

sont

r?esolus

par

exemple

en

utilisant

les

adresses

de

la

pile

globale

comme

moyen

d'estampillage

l'affectation

destructive

et

le

tra

nage

de

valeur

r?esout

ce

probl?eme

au

prix

d'une

gestion

de

la

tra

n?ee

l?eg?erement

plus

complexe

L'impact

exact

des

longues

cha

nes

de

liaisons

dans

le

premier

cas

et

de

la

complexit?e

additionnelle

dans

le

second

cas

restent

a

evaluer

Modifications

R?eversibles

Conclusion

Nous

avons

montr?e

que

la

WAM

peut

etre

caract?eris?ee

de

mani?ere

simple

par

deux

choix

essentiels

a

savoir

le

choix

d'une

repr?esentation

des

termes

par

copie

et

le

choix

d'une

repr?esentation

du

contr

ole

par

partage

La

repr?esentation

des

termes

par

copie

se

justifie

essentiellement

par

ses

bonnes

propri?et?es

vis

a

vis

de

la

gestion

dynamique

de

la

m?emoire

ainsi

que

par

une

meilleure

localit?e

La

repr?esentation

du

contr

ole

par

partage

se

justifie

par

la

volont?e

de

compiler

la

r?ecup?eration

de

la

m?emoire

allou?ee

au

contr

ole

La

WAM

etant

la

r?ef?erence

toute

nouvelle

proposition

se

positionne

comme

etant

de

type

WAM

ou

pas

sans

que

cela

ait

un

sens

etabli

L'utilisation

de

la

caract?erisation

ci-dessus

permettrait

d'

eviter

bien

des

ambigu

t?es

En

particulier

il

ne

nous

semble

pas

que

l'introduction

dans

la

machine

abstraite

d'Aquarius

-LSB-

-RSB-

d'instructions

a

plus

faible

grain

que

les

instructions

de

la

WAM

suffise

a

classer

cette

machine

comme

n

etant

pas

de

type

WAM

A

l'oppos

e

MALI

-LSB-

-RSB-

qui

suppose

une

repr?esentation

des

r?esolvantes

par

copie

ne

conduit

pas

a

des

machines

abstraites

de

type

WAM

Cela

dit

notre

etude

du

contr

ole

OU

a

montr?e

que

la

WAM

elle-m

eme

n'est

pas

totalement

coh?erente

vis

a-vis

de

la

repr?esentation

du

contr

ole

par

partage

dans

la

mesure

o?u

les

points

de

choix

ne

sont

pas

soumis

a

l'

elagage

Nous

avons

vu

qu'il

pouvait

facilement

y

etre

rem?edi?e

De

m

eme

il

est

dans

la

logique

de

la

WAM

d'introduire

une

architecture

a

pile

double

afin

de

r?ecup?erer

tous

les

points

de

choix

invalid?es

par

les

op?erateurs

classiques

de

coupure

Accessoirement

la

cr?eation

retard?ee

de

point

de

choix

s

en

trouve

am?elior?ee

Toutefois

l'introduction

d'extensions

comme

la

quantification

explicite

n?ecessite

des

op?erateurs

de

coupure

plus

sophistiqu?es

qui

excisent

des

points

de

choix

en

milieu

de

pile

La

m?emoire

allou?ee

ne

peut

plus

etre

r?ecup?er?ee

par

un

simple

d?epilement

Les

limites

de

la

philosophie

adopt?ee

par

la

WAM

sont

atteintes

En

de?ca

de

ces

grands

choix

de

nombreuses

variantes

sont

possibles

L'

etude

approfondie

de

la

gestion

des

environnements

des

points

de

choix

de

la

coupure

et

des

modifications

r?eversibles

nous

a

permis

de

valider

dans

un

contexte

tant

mat?eriel

que

logiciel

un

certain

nombre

de

choix

faits

lors

de

la

conception

du

jeu

d'instructions

et

du

logiciel

de

la

machine

KCM

ffl

elagage

retard?e

ffl

pile

double

ffl

support

du

retour

arri?ere

superficiel

avec

cr?eation

retard?ee

des

points

de

choix

et

des

environnements

ffl

compilation

de

la

coupure

au

niveau

de

la

clause

par

transformation

de

pro-

Conclusion

grammes

ffl

tra

nage

de

valeur

avec

estampillage

par

adresse

Notons

que

a

l'exception

de

la

gestion

des

environnements

la

plupart

des

techniques

d?evelopp?ees

sont

utilisables

dans

un

contexte

non

WAM

Par

exemple

la

compilation

de

la

coupure

par

transformation

de

programmes

s

etend

tr?es

bien

a

une

repr?esentation

par

copie

Finalement

Prolog

evolue

et

de

nombreuses

extensions

voient

le

jour

La

question

est

de

d?eterminer

les

besoins

g?en?eriques

de

ces

extensions

et

d'inclure

le

support

ad?equat

a

chaque

niveau

du

syst?eme

Dans

ce

contexte

une

impl?ementation

efficace

des

modifications

r?eversibles

est

cruciale

Nous

avons

soulign?e

les

ecueils

des

solutions

classiques

par

unification

ou

par

affectation

destructive

et

tra

nage

de

valeur

avec

estampillage

Une

solution

combinant

unification

et

affectation

destructive

o?u

l'adresse

de

la

modification

sert

d'estampille

evite

ces

ecueils

Perspectives

Les

possibilit?es

d'am

elioration

de

la

WAM

sont

nombreuses

Certaines

sont

sp?ecifiques

a

la

WAM

c'est

le

cas

des

am?eliorations

li?ees

aux

environnements

D'autres

concernant

par

exemple

les

techniques

d'indexation

sont

applicables

plus

largement

En

fait

on

peut

se

demander

si

la

WAM

n

a

pas

v?ecue

et

s

il

ne

serait

pas

judicieux

d'axer

ses

efforts

sur

des

syst?emes

non

WAM

A

partir

du

moment

o?u

toutes

les

objections

contre

les

syst?emes

a

empilement

de

buts

c'est

a-dire

repr?esentant

les

r?esolvantes

par

copie

ont

re?cu

une

r?eponse

il

semble

valoir

la

peine

de

tester

en

vraie

grandeur

une

solution

qui

s

av?ere

plus

simple

a

impl?ementer

BinProlog

-LSB-

-RSB-

a

d?ej?a

d?emontr?e

que

en

d?epit

d'une

consommation

m?emoire

en

g?en?eral

sup?erieure

les

performances

d'un

syst?eme

par

empilement

de

buts

etaient

sur

un

certain

nombre

de

programmes

de

test

standard

comparables

a

celles

d'un

syst?eme

par

empilement

d'environnements

La

simplicit?e

de

l'approche

a

permis

a

l'

equipe

MALI

de

se

d?etacher

des

aspects

bas

niveau

de

la

WAM

pour

proposer

un

gestionnaire

de

m?emoire

g?en?erique

-LSB-

-RSB-

Il

est

a

cet

egard

notable

que

le

premier

syst?eme

Prolog

compil?e

ait

et?e

con?cu

a

partir

d'un

syst?eme

par

empilement

de

buts

en

l'occurrence

MALI

plut

ot

qu

a

partir

d'un

syst?eme

de

type

WAM

-LSB-

-RSB-

Un

grand

int?er

et

de

la

repr?esentation

par

copie

est

qu'elle

permet

une

repr?esentation

directe

du

contr

ole

par

des

termes

du

langage

Cette

propri?et?e

est

utilis?ee

dans

BinProlog

au

travers

de

la

binarisation

une

transformation

de

programmes

de

type

passage

de

continuation

pour

s

affranchir

de

toute

machinerie

sp?ecifique

au

contr

ole

ET

BinProlog

continue

toutefois

a

repr?esenter

le

contr

ole

OU

par

partage

utilisant

une

technologie

issue

de

la

WAM

Les

syst?emes

construits

au

dessus

de

MALI

ont

jusqu

a

pr?esent

aussi

repr?esent?e

le

contr

ole

OU

par

partage

et

mis

en

place

un

niveau

de

machine

abstraite

sp?ecifique

pour

g?erer

l'ensemble

du

contr

ole

L'

etape

suivante

esquiss?ee

par

Lindgren

-LSB-

-RSB-

est

donc

de

rendre

explicite

tout

le

contr

ole

c'est

a-dire

les

trois

continuations

de

succ?es

d'

echec

et

de

coupure

tout

en

prenant

en

compte

le

coroutinage

et

le

traitement

des

exceptions

Cette

perspective

nous

para

t

particuli?erement

prometteuse

La

simplification

correspondante

de

l'impl

ementation

tant

au

niveau

de

la

compilation

qu'au

niveau

de

la

machine

abstraite

devrait

rendre

possible

des

am?eliorations

notamment

par

analyse

statique

autrement

trop

complexes

a

mettre

en

place

Comme

Demoen

et

Mari?en

ont

mis

en

evidence

qu'entre

repr?esentation

des

incr?ements

de

r?esolvantes

par

empilement

de

buts

et

par

empilement

d'environnements

il

ne

pouvait

y

avoir

de

meilleur

choix

-LSB-

-RSB-

il

est

n?ecessaire

de

pouvoir

m?elanger

les

deux

types

de

repr?esentation

au

sein

d'une

m

eme

ex?ecution

L'affectation

destructive

devrait

permettre

d'impl

ementer

la

r?e?ecriture

des

environnements

de

mani?ere

efficace

Dans

ce

contexte

une

etude

approfondie

des

travaux

sur

la

composition

de

continuations

-LRB-

voir

par

exemple

-LSB-

-RSB-

-RRB-

nous

para

t

aussi

importante

La

validation

convaincante

d'un

syst?eme

a

pile

unique

pourrait

passer

par

la

mise

en

place

d'un

laboratoire

d'impl

ementation

une

vieille

proposition

de

Kahn

et

Carlsson

-LSB-

-RSB-

qui

reste

a

l'ordre

du

jour

Il

s

agit

de

structurer

le

compilateur

et

le

syst?eme

d'ex

ecution

de

mani?ere

modulaire

afin

de

pouvoir

construire

et

comparer

a

moindre

co

ut

des

syst?emes

dont

les

architectes

diff?erent

-LRB-

pile

unique

pile

de

contr

ole

OU

sp?ecifique

piles

de

contr

ole

ET

et

OU

sp?ecifiques

-RRB-

mais

pas

la

technologie

de

base

-LRB-

compilation

repr?esentation

des

termes

-RRB-

Id?ealement

on

aimerait

aussi

changer

assez

facilement

certains

el?ements

de

cette

technologie

de

base

-LRB-

par

exemple

passer

d'une

repr?esentation

par

etiquetage

des

pointeurs

a

une

repr?esentation

par

etiquetage

des

donn?ees

-RRB-

La

gestion

m?emoire

est

une

autre

composante

importante

d'un

syst?eme

Prolog

qui

demande

une

etude

comparative

syst?ematique

et

b?en?eficierait

d'un

tel

laboratoire

La

question

est

en

particulier

de

d?eterminer

les

performances

respectives

d'un

r?ecup?erateur

de

m?emoire

g?en?erationnel

par

marquage

et

compactage

et

d'un

r?ecup?erateur

de

m?emoire

g?en?erationnel

par

copie

En

effet

l'utilisation

de

g?en?erations

permet

a

la

r?ecup?eration

par

marquage

et

compactage

de

surmonter

son

handicap

vis

a

vis

de

la

copie

a

savoir

une

complexit?e

proportionnelle

a

la

taille

de

l'ensemble

des

donn?ees

plut

ot

qu

a

la

taille

des

donn?ees

utiles

-LRB-

voir

l'

etude

de

Zorn

dans

le

cadre

de

Common

Lisp

-LSB-

-RSB-

-RRB-

Ces

r?ecup?erateurs

de

m?emoire

devraient

tenir

compte

des

possibilit?es

actuelles

des

syst?emes

de

gestion

de

la

m?emoire

virtuelle

-LRB-

voir

l'exp

erience

de

Cooper

Nettles

et

Subramanian

avec

SML

-LSB-

-RSB-

-RRB-

Finalement

on

ne

saurait

ignorer

les

langages

de

programmation

logique

de

deuxi?eme

g?en?eration

comme

AKL

-LSB-

-RSB-

G?odel

-LSB-

-RSB-

lambdaProlog

-LSB-

-RSB-

Life

-LSB-

-RSB-

Mercury

-LSB-

-RSB-

Bien

que

tous

ces

langages

soient

tr?es

sensiblement

diff?erents

il

se

d?egage

un

certain

consensus

sur

l'introduction

d'un

syst?eme

de

types

polymorphiques

a

la

ML

sur

l'importance

des

contraintes

deux

aspects

qu'ils

seraient

difficile

d'ignorer

sans

produire

des

r?esultats

peu

significatifs

Notons

que

la

prise

en

compte

des

contraintes

m

eme

de

mani?ere

limit?ee

-LRB-

par

exemple

une

simple

int?egration

des

domaines

finis

dans

la

ligne

de

la

proposition

de

Diaz

et

Codognet

-LSB-

-RSB-

-RRB-

a

l'avantage

de

fournir

des

programmes

de

test

qui

bien

que

simples

r?esolvent

des

probl?emes

int?eressants

tout

en

soumettant

le

syst?eme

notamment

le

r?ecup?erateur

de

m?emoire

a

rude

epreuve

Conclusion

Annexes

Une

etude

approfondie

de

la

WAM

Appendix

A

An

Overview

of

the

Knowledge

Crunching

Machine

Reprinted

with

permission

from

Emerging

Trends

in

Database

and

Knowledge

Base

Machines

by

Abdelguerfi

and

Lavington

pages

IEEE

Computer

Society

Press

c

IEEE

The

aim

of

Logic

Programming

is

to

provide

a

single

simple

and

rigorous

language

logic

for

both

expressing

and

reasoning

about

problems

as

well

as

actually

programming

solutions

to

these

problems

The

programming

language

Prolog

has

been

so

far

the

most

successful

incarnation

of

Logic

Programming

Its

success

is

widely

due

to

the

development

of

a

reasonably

efficient

compiler

by

D.H.D.

Warren

-LSB-

-RSB-

a

refinement

of

which

called

the

WAM

-LRB-

Warren

abstract

machine

-RRB-

-LSB-

-RSB-

has

become

the

de

facto

standard

for

implementing

the

language

By

itself

the

breakthrough

of

the

WAM

was

not

however

sufficient

to

reach

the

efficiency

of

imperative

languages

such

as

C.

Bridging

the

gap

requires

combining

advances

in

compiler

and

runtime

technology

processor

design

and

parallelism

All

three

areas

have

been

studied

at

ECRC

within

different

projects

The

KCM

-LRB-

Knowledge

Crunching

Machine

-RRB-

project

started

at

ECRC

in

in

collaboration

with

ECRC

's

shareholders

-LRB-

Bull

ICL

and

Siemens

-RRB-

focused

on

processor

design

while

taking

advantage

of

progress

made

in

compiler

and

runtime

technology

The

project

was

motivated

by

two

years

of

preliminary

studies

-LSB-

-RSB-

which

led

to

the

conclusion

that

the

time

was

ripe

for

an

actual

implementation

The

outcome

of

the

project

is

a

single

user

single

task

high-performance

back-end

processor

to

be

coupled

to

a

workstation

-LSB-

-RSB-

Though

the

KCM

is

dedicated

to

Prolog

it

is

not

restricted

to

Prolog

and

can

be

seen

as

a

sketch

of

a

tagged

general

purpose

machine

with

support

for

Logic

Programming

A

complete

software

environment

has

been

written

including

a

language

independent

kernel

and

an

incremental

Edinburgh-like

Prolog

system

based

on

SEPIA

-LSB-

-RSB-

a

Prolog

system

developed

at

ECRC

and

targeted

to

standard

UNIX

machines

The

Prolog

system

includes

a

number

of

advanced

features

in

particular

modules

and

coroutining

Four

prototype

machines

were

operational

in

July

and

one

of

the

prototypes

is

a

registered

trademark

of

AT&T

An

Overview

of

the

Knowledge

Crunching

Machine

with

a

clock

pushed

beyond

its

nominal

frequency

was

the

first

desk-top

Prolog

machine

to

reach

MLIPS

-LRB-

Mega

Logic

Inferences

per

Second

-RRB-

on

deterministic

list

concatenation

A

small

series

of

pilot

machines

were

subsequently

built

and

installed

to

various

academic

sites

and

research

institutes

by

the

shareholders

This

overview

of

the

KCM

project

is

organized

as

follows

Section

explains

the

main

design

decisions

Sections

and

present

the

hardware

and

software

architecture

of

the

KCM

Section

gathers

evaluation

results

This

includes

a

benefit

analysis

of

the

architectural

features

of

the

KCM

a

performance

comparison

with

ECLiPSe

-LSB-

-RSB-

the

successor

of

SEPIA

running

on

a

SPARCStation

II

and

a

performance

comparison

with

the

VLSI-BAM

-LSB-

-RSB-

a

recent

RISC-based

design

We

conclude

by

sketching

some

important

research

issues

and

perspectives

Familiarity

with

Prolog

-LSB-

-RSB-

and

the

WAM

-LSB-

-RSB-

is

assumed

A.

Basic

Design

Decisions

A.

A

High-level

Architecture

Rationale

The

initial

and

most

important

design

decision

was

to

resort

to

microprogramming

and

provide

at

the

instruction

set

level

WAM-like

instructions

Evan

Tick

put

forward

in

-LSB-

-RSB-

two

main

arguments

to

justify

this

choice

rather

than

translating

the

high-level

architecture

to

a

lower-level

architecture

for

instance

one

of

the

emerging

RISC

-LRB-

Reduced

Instruction

Set

Computer

-RRB-

architectures

-LSB-

-RSB-

Firstly

high-speed

processors

are

ultimately

limited

by

memory

It

turns

out

that

high-level

architectures

require

less

memory

bandwidth

Because

of

the

high

semantic

content

of

each

instruction

less

instructions

are

required

in

order

to

execute

the

same

task

Moreover

the

instruction

flow

is

more

regular

the

numerous

conditional

branches

encountered

during

unification

can

take

place

at

the

microcode

level

and

therefore

do

not

perturb

the

instruction

pipeline

The

memory

system

can

also

be

tailored

to

the

data

referencing

behaviour

of

the

language

The

important

issues

as

far

as

Prolog

is

concerned

are

the

support

of

its

complex

memory

model

consisting

of

a

register

set

several

stacks

and

a

heap

and

shallow

backtracking

-LRB-

i.e.

backtracking

within

a

predicate

invocation

-RRB-

which

has

been

shown

to

be

the

primary

data-memory

reference

bottleneck

of

the

WAM

-LSB-

-RSB-

Secondly

high-level

architectures

facilitate

software

development

e.g.

via

simpler

and

therefore

faster

compilers

In

spite

of

his

confidence

in

the

technology

D.

Patterson

expresses

in

-LSB-

-RSB-

the

concern

that

RISCs

may

not

provide

the

same

advantages

in

the

cost/performance

factor

for

exploratory

environments

An

additional

argument

was

that

designing

a

high

level

architecture

would

make

it

easier

to

specialize

the

data

paths

and

capture

much

of

the

micro-parallelism

available

heap

we

mean

here

the

runtime

heap

We

shall

call

global

stack

the

area

called

heap

in

the

WAM

This

better

corresponds

to

the

way

it

is

accessed

Basic

Design

Decisions

in

each

instruction

Also

the

technology

was

well

understood

and

easy

to

bring

into

play

-LSB-

-RSB-

Hardware

Memory

Architecture

Reducing

memory

penalty

basically

relies

on

a

proper

memory

hierarchy

and

an

appropriate

caching

strategy

It

turns

out

that

the

most

classical

hierarchy

i.e.

a

register

set

local

to

the

execution

unit

cache

-LRB-

s

-RRB-

local

to

the

central

processing

unit

and

external

memory

fits

the

memory

model

of

the

WAM

well

The

idea

of

a

register

set

used

to

perform

argument

passing

and

store

the

state

of

the

computation

is

at

the

heart

of

the

WAM

A

data

cache

has

the

good

property

of

being

able

to

catch

all

types

of

reference

and

therefore

can

cover

caching

of

all

the

different

memory

areas

of

the

WAM

including

the

heap

Using

hardware

registers

to

perform

argument

passing

straightforwardly

suggests

separate

paths

to

code

and

data

memory

an

organization

often

referred

to

as

a

Harvard

architecture

Indeed

each

source

goal

i.e.

a

great

part

of

the

source

program

is

compiled

into

an

argument

passing

sequence

basically

a

sequence

of

simple

load

and

store

instructions

with

the

result

that

code

and

data

are

accessed

simultaneously

at

a

high

rate

On

top

of

providing

twice

the

memory

bandwidth

split

code

and

data

caches

avoid

bad

interferences

between

instruction

and

data

referencing

as

demonstrated

by

Evan

Tick

in

-LSB-

-RSB-

A.

Modifications

to

the

WAM

The

above

considerations

led

us

to

introduce

the

following

variations

to

the

basic

WAM

model

The

Split-stack

Model

The

KCM

assumes

a

split-stack

model

This

organization

first

suggested

by

E.

Tick

and

D.H.D.

Warren

in

-LSB-

-RSB-

and

presented

in

more

detail

in

-LSB-

-RSB-

consists

of

splitting

the

stack

storing

the

environment

and

choice

point

frames

into

two

separate

stacks

an

environment

and

a

choice

point

stack

This

model

has

the

advantage

of

increasing

the

locality

of

environment

and

choice

point

reference

It

also

fits

well

with

delayed

choice

point

creation

-LRB-

see

below

-RRB-

whereas

the

standard

model

imposes

a

strict

order

on

choice

point

and

environment

creation

the

split

stack

model

makes

it

possible

to

start

filling

an

environment

before

pushing

the

choice

point

onto

memory

Caching

Choice

Point

Frames

Most

of

the

memory

bandwidth

loss

due

to

shallow

backtracking

can

be

avoided

by

creating

choice

points

virtually

in

the

register

file

and

pushing

them

onto

memory

only

when

the

execution

can

not

fail

any

longer

If

failure

occurs

restoring

the

computation

state

is

very

cheap

A

first

solution

relies

on

the

use

of

a

second

shadow

register

set

as

in

Pegasus

-LSB-

-RSB-

The

solution

adopted

for

An

Overview

of

the

Knowledge

Crunching

Machine

the

KCM

inspired

by

M.

Meier

-LSB-

-RSB-

is

slightly

less

efficient

but

requires

much

less

hardware

Two

new

registers

are

introduced

a

backtrack

trail

pointer

and

a

backtrack

program

pointer

and

the

compiler

ensures

that

argument

registers

are

not

modified

when

unification

may

result

in

shallow

backtracking

Virtual

choice

points

are

then

created

by

simply

copying

three

registers

-LRB-

top

of

trail

environment

and

global

stack

pointers

-RRB-

into

the

corresponding

backtrack

pointers

and

setting

the

backtrack

program

pointer

to

the

address

of

the

code

to

be

executed

in

case

of

failure

In

case

of

failure

a

flag

shallow

set

when

creating

the

virtual

choice

point

and

reset

when

the

virtual

choice

point

is

turned

into

a

real

choice

point

indicates

whether

the

state

should

be

restored

from

a

virtual

or

a

real

choice

point

In

case

of

success

the

flag

choice

point

set

when

deep

backtracking

takes

place

and

reset

when

a

virtual

choice

point

is

created

indicates

whether

a

real

choice

point

should

be

created

Caching

Environment

Frames

In

the

WAM

permanent

variables

are

allocated

a

slot

in

the

environment

frame

Accessing

a

permanent

variable

is

always

done

via

an

offset

in

the

environment

frame

On

the

KCM

permanent

variables

may

also

be

allocated

a

register

as

temporary

variables

Also

environment

frames

are

not

pushed

onto

memory

before

the

possibility

of

failure

has

been

discarded

Environment

Trimming

Trimming

a

generalization

of

tail

recursion

optimization

or

more

precisely

last

call

optimization

makes

it

possible

to

reuse

permanent

variable

slots

in

the

environment

as

soon

as

these

slots

are

no

longer

needed

The

overall

gain

over

pure

last

call

optimization

is

however

far

from

being

clear

Firstly

the

management

of

the

environment

stack

is

more

costly

Secondly

avoiding

dangling

references

may

introduce

a

significant

overhead

including

numerous

memory

references

because

of

dereferencing

and

may

even

result

in

an

increase

of

the

global

stack

-LRB-

see

the

handling

of

unsafe

variables

in

-LSB-

-RSB-

-RRB-

As

a

result

the

KCM

does

not

trim

environments

eagerly

but

rather

performs

virtual

trimming

at

garbage

collection

time

a

proper

layout

of

the

environment

frames

with

the

current

size

of

the

environment

recorded

in

all

the

non

terminal

call

instructions

as

for

trimming

allows

the

garbage

collector

to

recognize

dead

and

alive

permanent

variables

A.

Implementing

Built-in

Predicates

Microprogramming

the

WAM

provides

all

the

instructions

necessary

to

execute

Prolog

programs

free

of

built-in

predicates

plus

a

few

predicates

e.g.

which

can

be

coded

in

terms

of

WAM

instructions

Implementing

a

full

Prolog

system

is

however

not

possible

even

basic

facilities

like

integer

arithmetic

are

missing

The

PLM

In

order

to

deal

with

this

problem

the

instruction

set

of

the

PLM

an

early

WAM-based

co-processor

developed

within

the

Aquarius

project

at

Berkeley

-LSB-

Basic

Design

Decisions

-RSB-

includes

a

single

escape

instruction

which

makes

it

possible

to

implement

built-in

predicates

in

microcode

Most

of

the

time

-LRB-

integer

divide

and

multiply

floating

point

arithmetic

I/O

-RRB-

the

role

of

escape

is

limited

to

dumping

the

necessary

arguments

and

the

built-in

predicate

identifier

into

a

communication

area

and

subcontracting

the

work

to

the

host

processor

In

such

a

co-processor

approach

sharing

the

data

between

the

host

and

the

coprocessor

requires

identical

data

formats

on

both

processors

This

means

a

non-optimal

architectural

compromise

for

at

least

one

of

the

processors

-LRB-

in

the

case

of

the

PLM

a

Prolog

word

is

restricted

to

bits

-RRB-

It

also

means

frequent

context

switches

between

the

co-processor

and

the

host

as

well

as

sharing

the

memory

bandwidth

This

was

not

acceptable

as

far

as

the

performance

requirements

of

the

KCM

were

concerned

PSI-II

In

PSI-II

ICOT

's

stand-alone

Personal

Sequential

Inference

machine

-LSB-

-RSB-

each

basic

built-in

predicate

is

implemented

as

a

different

machine

instruction

and

fully

executed

by

the

microprogram

of

the

machine

This

is

the

best

solution

as

far

as

performance

is

concerned

but

a

very

costly

one

On

the

one

hand

the

stand-alone

approach

requires

the

development

of

much

peripheral

hardware

and

software

and

does

not

make

it

easy

to

use

existing

application

software

On

the

other

hand

microprogramming

part

of

the

runtime

significantly

increases

the

complexity

of

the

system

however

good

the

microprogramming

environment

may

be

The

KCM

Taking

the

previous

remarks

into

account

the

KCM

was

designed

as

a

back-end

processor

to

be

connected

to

a

UNIX

host

as

shown

in

Figure

A.

Thus

the

KCM

acts

as

a

disk-less

terminal-less

machine

with

I/O

operations

supported

through

remote

servers

on

the

host

The

whole

Prolog

runtime

can

however

be

implemented

on

the

back-end

processor

The

cost

to

be

paid

for

such

a

loose

coupling

is

some

limitation

on

the

granularity

of

host-KCM

interactions

Also

the

instruction

set

of

the

KCM

includes

both

Prolog

instructions

and

general

purpose

instructions

-LSB-

-RSB-

High-level

Prolog

instructions

close

to

the

WAM

instructions

implement

the

basic

Prolog

mechanisms

-LRB-

unification

backtracking

indexing

and

cut

-RRB-

Low-level

general

purpose

instructions

constitute

a

general

purpose

instruction

set

to

be

used

to

implement

the

functionality

that

the

standard

WAM

does

not

provide

The

general

purpose

instructions

though

supporting

tagged

data

did

not

need

to

be

tied

to

Prolog

and

therefore

make

it

possible

to

implement

other

languages

e.g.

Lisp

or

even

C

on

the

KCM

To

facilitate

such

implementations

the

KCM

kernel

and

the

low-level

code

generation

tools

are

language

independent

As

a

result

though

the

KCM

is

dedicated

to

Prolog

it

is

not

restricted

to

Prolog

and

can

be

seen

as

a

sketch

of

a

tagged

general

purpose

machine

with

support

for

Logic

Programming

An

Overview

of

the

Knowledge

Crunching

Machine

HOST

BUSLOCAL

BUSPRIVATE

MEMORY

CPUINTERFACE

WITH

COMMUNICATION

MEMORY

HOST

Figure

A.

The

KCM

System

VALUEGCOPCODEOPCODEZONE

TYPEZONE

Figure

A.

KCM

Word

Format

A.

Word

Format

A

tagged

architecture

The

WAM

assumes

tagged

data

words

i.e.

a

basic

entity

consists

of

a

value

plus

an

additional

tag

field

giving

information

on

the

type

of

the

entity

Most

commercial

Prolog

systems

running

on

general-purpose

computers

pack

tag

and

value

into

a

word

thus

reducing

the

range

of

virtual

addresses

and

integers

Many

tagged

architectures

store

a

value

with

a

to

tag

The

problem

is

then

to

switch

between

this

non

standard

word

length

and

the

usual

word

format

on

the

host

A

solution

is

to

use

bits

internally

but

bits

externally

i.e.

in

memory

and

on

disk

-LSB-

-RSB-

There

are

also

software

systems

which

use

bits

to

store

a

Prolog

entity

SEPIA

is

one

of

them

This

solution

was

adopted

for

the

KCM

which

is

built

as

a

tagged

machine

bits

for

the

value

part

and

bits

for

the

tag

part

as

shown

in

Figure

A.

Basic

Design

Decisions

Code

words

are

also

long

This

has

two

main

benefits

Firstly

this

simplifies

addressing

there

is

a

single

notion

of

KCM

word

Secondly

the

instruction

formats

can

be

made

regular

and

simple

Also

apart

from

the

Prolog

indexing

instructions

all

the

instructions

can

be

one

word

long

These

are

common

RISC

features

A

simple

encoding

of

the

instruction

fields

removes

instruction

decoding

time

from

a

critical

execution

path

and

saves

decoding

hardware

at

the

cost

of

a

slight

degrading

of

memory

behaviour

The

Representation

of

Unbound

Variables

The

WAM

has

a

self-referencing

representation

of

variables

i.e.

the

value

of

an

unbound

variable

is

its

own

address

Also

unbound

variables

and

references

do

not

require

different

tags

This

is

very

convenient

for

instance

a

variable

can

be

loaded

in

a

register

without

any

tag

manipulation

Supporting

debugging

and

metaterms

used

for

the

implementation

of

coroutining

-LRB-

see

A.

-RRB-

requires

dropping

this

representation

so

that

an

unbound

variable

can

be

associated

information

like

its

print

name

for

debugging

purposes

or

more

generally

a

pointer

to

a

term

on

the

global

stack

as

is

the

case

with

metaterms

Different

tags

are

then

necessary

to

recognize

unbound

variables

metaterms

and

references

This

also

means

that

the

trail

a

stack

used

to

remember

the

bindings

to

be

undone

on

backtracking

becomes

a

value

trail

i.e.

stores

both

the

address

of

the

binding

and

its

previous

value

instead

of

the

address

alone

A.

Practical

Hardware

and

Software

Issues

Size

All

the

boards

composing

the

KCM

were

designed

to

fit

into

the

cabinet

of

the

disk-less

desktop

workstation

which

was

selected

as

the

host

of

the

prototype

systems

i.e.

a

Bull

built

around

a

Motorola

The

CPU

was

implemented

on

one

large

printed

circuit

board

-LRB-

-RRB-

The

interface

and

the

main

memory

are

separate

boards

of

double-eurocard

format

Technology

The

KCM

was

implemented

using

standard

TTL

and

CMOS

off-theshelf

components

Top-of-the-range

ASIC

technology

was

not

considered

worthwhile

in

spite

of

its

performance

advantage

for

an

exploratory

project

Nevertheless

two

small

um

CMOS

ASIC

chips

were

used

in

order

to

fulfill

the

size

requirements

A

Single-task

System

The

objective

was

essentially

to

simplify

the

design

of

the

memory

system

The

absence

of

context-switch

made

it

possible

to

implement

virtual

caches

avoiding

a

systematic

address

translation

phase

and

to

store

the

whole

page

table

on

the

processor

getting

rid

of

the

usual

Translation

Lookaside

Buffer

mechanisms

pilot

systems

were

also

hosted

by

Siemens

-LRB-

NS

based

-RRB-

and

ICL

-LRB-

Intel

-RRB-

machines

An

Overview

of

the

Knowledge

Crunching

Machine

CONTROL

UNIT

EXECUTION

UNIT

PREFETCH

UNIT

CODE

CACHE

DATA

CACHE

MMUCONDITION

CODE

OFFSETBUS

IBUS

CBUS

ABUS

DBUS

PBUS

PBUS

RLOCAL

BUS

Figure

A.

Top

Level

Architecture

A.

Hardware

Architecture

The

data

paths

of

the

KCM

shown

in

Figure

A.

follow

directly

from

the

abovementioned

considerations

It

is

a

Harvard

architecture

a

prefetch

unit

connected

to

a

code

cache

and

an

execution

unit

connected

to

a

data

cache

In

between

the

caches

and

memory

the

memory

management

unit

deals

with

address

translation

and

protection

A

centralized

microcoded

control

unit

drives

the

processor

The

following

sections

examine

these

different

units

in

more

detail

Further

details

can

be

found

in

-LSB-

-RSB-

A.

Control

and

Pipelining

Figure

A.

shows

the

basic

micro

and

macro

pipelining

Micro

Pipeline

Micro

instructions

are

issued

at

the

rate

of

one

micro

instruction

per

cycle

while

the

current

micro

instruction

held

in

the

Micro

Instruction

Register

-LRB-

MIR

-RRB-

is

executed

the

address

of

the

next

instruction

is

computed

and

the

instruction

Hardware

Architecture

IBMAPROMSEQUENCERRAMMIRPSPTPCU

FLAGS

IBIR

CODE

CACHE

CONDITION

BITS

FETCHDECODEEXECUTEPRU

Figure

A.

KCM

Pipelining

An

Overview

of

the

Knowledge

Crunching

Machine

read

from

the

microcode

RAM

-LRB-

x

bits

-RRB-

Apart

from

sequential

execution

the

control

flow

can

be

altered

in

sophisticated

ways

including

subroutine

calls

conditional

execution

and

branch

address

calculation

Macro

Pipeline

The

macro

pipeline

is

a

conventional

fetch-decode-execute

pipeline

The

register

TP

holds

the

address

of

the

currently

executing

instruction

stored

in

the

Instruction

Register

-LRB-

IR

-RRB-

and

SP

the

address

of

the

next

instruction

stored

in

the

Instruction

Buffer

-LRB-

IB

-RRB-

The

Program

Pointer

-LRB-

P

-RRB-

points

to

the

instruction

being

fetched

from

the

code

cache

In

order

to

cope

with

the

latency

of

the

cache

instruction

fetching

is

split

into

two

stages

a

cache

addressing

stage

and

a

cache

access

stage

Decoding

involves

computing

the

address

of

the

microcode

routine

corresponding

to

the

instruction

held

in

IB

The

usual

scheme

consists

of

using

the

instruction

opcode

as

an

address

into

a

mapping

memory

-LRB-

here

a

programmable

ROM

-RRB-

In

the

KCM

additional

bits

are

taken

into

account

a

macro

interrupt

bit

a

single-step

bit

and

Prolog

status

flags

-LRB-

unification

mode

shallow

and

choice

point

flags

-RRB-

Specialized

entry

points

can

then

be

associated

with

each

possible

configuration

of

these

bits

which

therefore

do

not

need

to

be

tested

at

execution

time

Whereas

the

first

three

stages

of

the

macro

pipeline

are

always

one

cycle

long

the

execute

stage

has

a

variable

length

The

minimum

length

is

one

cycle

This

corresponds

to

many

general

purpose

instructions

-LRB-

e.g.

register

transfer

logical

and

simple

integer

arithmetic

instructions

data

write

operations

-RRB-

There

is

no

maximum

length

many

Prolog

instructions

involve

dereferencing

which

is

an

unbound

operation

The

basic

latency

of

prefetching

can

be

reduced

in

two

cases

Firstly

in

the

case

of

control

flow

instructions

using

immediate

addressing

specific

hardware

decoding

of

the

instruction

opcode

makes

it

possible

to

anticipate

the

pipeline

break

during

the

decode

stage

and

reduce

the

latency

to

cycles

Secondly

the

microcoding

of

conditional

control

flow

instructions

favors

the

branch

not

taken

path

the

pipeline

does

not

stall

and

the

instruction

costs

cycle

The

branch

taken

path

is

then

slightly

more

costly

cycles

than

a

standard

pipeline

break

As

for

accessing

the

code

cache

a

data

cache

access

takes

cycles

Only

the

first

cycle

is

visible

in

case

of

a

write

operation

the

actual

write

is

performed

transparently

by

the

cache

hardware

When

microprogramming

read

operations

can

be

pipelined

-LRB-

the

next

address

can

be

sent

while

getting

the

previous

data

-RRB-

This

can

not

be

done

however

at

the

macrocode

level

data

load

instructions

take

two

cycles

A.

The

Execution

Unit

Basic

Data

Processing

A

basic

data

processing

operation

consists

of

the

following

operations

-LRB-

see

Figure

A.

-RRB-

Hardware

Architecture

RadRddIBIR

RACREGISTER

FILEALU

C

ALU

D

FPUMWACTRAILTVMBUS

DBUS

CBUS

ABUS

BBUS

IBUS

OFSBUS

ABUS

Dto/from

PRU

AddressDatato/from

DATA

CACHEOffset

from

ucodeRasRds

Figure

A.

The

Execution

Unit

An

Overview

of

the

Knowledge

Crunching

Machine

-LRB-

-RRB-

Two

words

A

and

B

are

read

from

the

x

register

file

-LRB-

A

can

also

come

from

the

Prefetch

Unit

in

case

of

immediate

addressing

-RRB-

-LRB-

-RRB-

Binary

data

manipulation

is

performed

on

A

and

B

or

unary

data

manipulation

is

performed

on

B

with

A

used

as

input

to

address

calculation

-LRB-

which

includes

plain

transfers

of

A

and

B

to

C

and

D

respectively

-RRB-

-LRB-

-RRB-

The

results

C

and

D

are

written

back

into

the

register

file

A

conventional

ALU

and

FPU

are

used

to

deal

with

IEEE

arithmetic

and

logical

operations

These

operations

only

concern

the

value

part

of

a

word

The

tag

of

the

result

is

simply

obtained

by

passing

through

the

tag

of

B

The

ALU

and

FPU

status

flags

are

stored

in

a

special

register

the

Processor

Status

Word

-LRB-

PSW

-RRB-

together

with

all

the

other

status

flags

of

the

machine

-LRB-

e.g.

the

Prolog

flags

-RRB-

Tag

Handling

Tag

handling

is

limited

to

the

following

few

specialized

operations

ffl

The

Tag-Value

Multiplexer

-LRB-

TVM

-RRB-

can

pass

data

through

transfer

data

from

the

tag

field

to

the

value

field

and

vice

versa

as

well

as

manipulate

the

garbage

collection

bits

affecting

the

PSW

ffl

The

Multi-Way

Address

Calculator

-LRB-

MWAC

-RRB-

supports

type

testing

e.g.

during

unification

From

the

type

fields

of

A

and

B

and

a

microcode

function

code

this

PROM

computes

a

three-bit

value

which

is

stored

in

the

PSW

to

be

used

by

the

sequencer

together

with

the

ALU

Zero

Bit

to

compute

the

target

address

of

a

microcode

branch

The

Trail

The

role

of

the

Trail

Unit

-LRB-

TRAIL

-RRB-

is

very

specific

to

Prolog

The

binding

of

variables

older

than

the

current

backtrack

point

have

to

be

recorded

on

the

trail

stack

so

that

the

binding

can

be

undone

on

backtracking

Deciding

whether

a

variable

is

older

than

the

current

backtrack

point

basically

requires

two

comparisons

one

to

decide

whether

the

variable

is

on

the

environment

or

on

the

global

stack

and

one

to

decide

whether

the

variable

is

older

than

the

backtrack

point

The

TRAIL

maintains

a

copy

of

the

three

relevant

stack

pointers

and

performs

the

comparisons

in

parallel

with

dereferencing

The

Register

Address

Calculation

Unit

The

main

role

of

the

Register

Address

Calculation

unit

-LRB-

RAC

-RRB-

is

to

select

the

source

-LRB-

microcode

macrocode

or

internal

increment/decrement

-RRB-

of

the

register

addresses

The

increment/decrement

mode

together

with

pipelined

memory

access

supports

-LRB-

in

microcode

-RRB-

the

fast

saving

and

restoring

of

contiguous

registers

-LRB-

e.g.

choice

point

creation

and

access

-RRB-

Hardware

Architecture

Address

Calculation

Address

calculation

is

very

simple

a

signed

offset

is

added

to

a

base

address

provided

on

bus

A

The

offset

source

is

either

the

operand

field

of

the

macro

or

microinstruction

or

an

offset

coming

from

the

RAC

The

base

source

is

either

the

operand

field

of

the

macroinstruction

-LRB-

absolute

addressing

-RRB-

or

the

register

file

An

important

point

is

that

both

A

and

C

are

connected

as

address

inputs

to

the

data

cache

All

in

all

this

supports

besides

absolute

addressing

the

two

basic

addressing

modes

required

by

Prolog

ffl

a

pre

and

post

increment/decrement

addressing

mode

to

access

stacks

growing

in

either

direction

ffl

an

indexed

addressing

mode

to

access

control

frames

-LRB-

e.g.

choice

point

and

environment

-RRB-

and

symbol

table

frames

-LRB-

e.g.

functor

and

procedure

descriptors

-RRB-

A.

The

Prefetch

Unit

The

prefetch

unit

shown

in

Figure

A.

supports

the

pipeline

described

in

A.

P

can

be

incremented

every

cycle

with

the

registers

SP

TP

IB

and

IR

all

clocked

P

can

alternatively

take

its

value

from

the

value

field

of

the

macroinstruction

-LRB-

instruction

buffer

IB

-RRB-

or

from

the

execution

unit

via

D

-LRB-

i.e.

either

from

a

register

or

from

memory

-RRB-

Also

SP

the

address

of

the

next

instruction

can

be

sent

to

the

execution

unit

via

D

-LRB-

i.e.

either

to

a

register

or

to

memory

-RRB-

These

basic

data

paths

make

it

possible

to

implement

efficiently

both

Prolog

control

flow

mechanisms

-LRB-

i.e.

continuation

and

backtracking

-RRB-

as

well

as

a

standard

call/return

mechanism

Additional

multiplexer

inputs

are

used

together

with

the

PRU-EXU

connection

for

code

access

instruction

emulation

interrupt

handling

injecting

constants

from

the

macroinstruction

to

the

EXU

and

supporting

the

Prolog

indexing

instructions

A.

The

Memory

System

Semantics

of

an

Address

The

KCM

uses

word

addressing

a

KCM

address

is

as

any

KCM

word

-LRB-

Figure

A.

-RRB-

bits

long

The

least

significant

bits

of

the

value

part

of

the

address

covers

two

virtual

spaces

of

GBytes

each

one

for

code

one

for

data

Each

virtual

space

is

accessible

via

a

specific

set

of

load

and

store

operations

incremental

compilation

can

then

store

new

instructions

directly

in

the

code

cache

without

any

cache

flush

or

memory

management

operation

In

the

case

of

a

data

address

the

zone

field

of

the

tag

indicates

to

which

zone

the

address

is

supposed

to

belong

More

precisely

a

zone

is

a

contiguous

segment

of

the

virtual

space

with

associated

start

and

end

addresses

as

well

as

valid

types

for

read

and

write

access

For

instance

in

KCM-SEPIA

an

integer

is

never

valid

Also

since

compound

terms

are

stored

in

the

global

stack

an

address

with

type

list

or

structure

can

only

address

An

Overview

of

the

Knowledge

Crunching

Machine

SP

IBTP

IRP

PBUS

DBUS

Ato/from

EXU

BUS

Ito/from

CODE

CACHE

Figure

A.

The

Prefetch

Unit

Hardware

Architecture

the

global

stack

There

are

possible

zones

with

zone

illegal

and

zone

reserved

by

the

kernel

for

kernel

data

Each

main

data

area

of

the

system

-LRB-

heap

environment

stack

control

stack

-RRB-

is

mapped

onto

a

different

zone

Zones

provide

an

additional

protection

mechanism

at

the

virtual

level

On

each

access

to

the

data

cache

the

consistency

of

the

type

zone

and

value

of

the

access

is

checked

This

mechanism

is

used

to

detect

stack

overflow

and

trigger

garbage

collection

Zones

are

also

used

to

implement

a

kind

of

cheap

set-associativity

The

data

cache

is

divided

into

sections

indexed

by

the

most

significant

three

bits

of

the

zone

field

i.e.

there

are

two

zones

in

each

section

The

different

zones

can

then

be

allocated

into

different

zone

pairs

so

that

mutual

interferences

can

be

minimized

Each

cache

section

actually

behaves

as

a

smaller

cache

The

Caches

Both

caches

contain

Kwords

-LRB-

Kbytes

-RRB-

They

are

virtual

avoiding

an

additional

address

translation

stage

and

direct-mapped

i.e.

there

is

no

associativity

in

order

to

keep

them

simple

and

fast

-LRB-

cycle

access

time

-RRB-

The

cache

lines

are

one

word

long

However

if

a

code

cache

miss

occurs

up

to

code

cache

lines

are

filled

The

code

cache

is

logically

write-through

-LRB-

every

code

write

access

is

flushed

out

to

main

memory

-RRB-

whereas

the

data

cache

is

copy-back

-LRB-

a

data

write

access

to

a

cached

virtual

address

is

not

flushed

out

to

main

memory

-RRB-

The

rationale

is

a

very

low

code

write

ratio

and

an

unusually

high

data

write

ratio

essentially

due

to

backtracking

and

structure

copying

-LSB-

-RSB-

The

data

cache

can

work

in

dereferencing

mode

If

the

address

input

is

a

reference

a

read

takes

place

and

the

result

is

again

used

as

address

input

if

it

is

not

hardwired

control

aborts

the

operation

As

a

result

reference

chains

are

followed

in

memory

at

the

rate

of

one

reference

per

cycle

The

data

cache

also

supports

the

non

self-referencing

representation

of

unbound

variables

When

accessing

an

unbound

variable

it

can

return

for

argument

passing

purposes

a

reference

to

the

unbound

variable

rather

than

the

unbound

variable

itself

The

Memory

Management

Unit

The

MMU

provides

the

two

levels

of

memory

management

functions

sketched

above

virtual

address

translation

and

zone

check

For

the

sake

of

simplicity

the

entire

page

table

is

stored

in

RAM

in

the

MMU

at

the

cost

of

a

quite

large

page

size

-LRB-

Kwords

-RRB-

Each

entry

consists

of

status

bits

-LRB-

reference

history

and

access

rights

-RRB-

and

an

physical

page

number

The

zone

table

entries

are

also

stored

in

RAM

Zones

have

a

granularity

of

Kwords

Main

Memory

The

main

memory

is

implemented

using

SMD

technology

with

components

mounted

on

both

sides

The

design

allows

for

one

or

two

boards

with

size

or

Mbytes

Pilot

systems

were

configured

with

a

single

board

using

chips

An

Overview

of

the

Knowledge

Crunching

Machine

The

main

memory

is

bits

wide

Page

mode

is

used

to

access

two

words

at

a

time

and

form

a

KCM

word

A

physical

memory

access

via

a

cache

is

in

the

order

of

microsecond

A.

The

Interface

Board

The

interface

board

is

the

sole

mechanism

by

which

the

KCM

can

communicate

with

the

outside

world

It

provides

Megabytes

of

dual

ported

memory

which

can

be

accessed

from

both

the

host

and

the

KCM

side

as

well

as

a

programmable

timer

accessible

from

KCM

The

interface

supports

interrupting

the

KCM

by

the

host

and

vice

versa

It

also

supports

initializing

and

controlling

the

KCM

via

specific

configuration

and

service

mechanisms

A.

Software

Architecture

Figure

A.

gives

an

overall

picture

of

the

KCM

Software

System

This

system

consists

of

ffl

OS

software

split

between

the

KCM

kernel

on

the

KCM

and

software

on

the

host

which

provides

the

KCM

with

standard

UNIX

services

such

as

secondary

storage

file

and

terminal

access

ffl

KCM-SEPIA

a

Prolog

system

which

runs

entirely

on

the

KCM

on

top

of

the

kernel

ffl

System

debugging

and

development

tools

used

for

low-level

system

development

and

debugging

as

well

as

bootstrapping

A.

Operating

System

Software

Host

Software

The

UNIX

host

kernel

contains

a

small

driver

to

support

delivery

of

interrupts

between

the

KCM

and

a

user

process

on

the

host

and

mapping

of

the

dual

ported

interface

memory

including

interface

registers

into

the

address

space

of

a

user

level

process

on

the

host

Aside

from

this

driver

all

host

code

for

dealing

with

the

KCM

operates

at

user

level

in

order

to

facilitate

the

connection

of

the

KCM

to

different

host

machines

A

message

passing

system

on

the

host

is

provided

to

allow

a

number

of

processes

to

communicate

with

each

other

and

the

KCM

Agents

can

be

dynamically

added

and

removed

from

the

system

Blocking

and

non-blocking

communication

is

supported

The

system

is

broadcast

based

with

message

filtering

to

reduce

overheads

Broadcasting

facilitates

monitoring

the

agent

monitoring

message

traffic

for

debugging

or

development

purposes

can

be

connected

at

any

time

Software

Architecture

File

Agent

Macro

AssemblerLinkerProlog

CompilerUNIX

-LRB-

with

KCM

device

driver

-RRB-

LoaderMonitorsSymbol

ServerMessage

Passing

ServerTty

AgentHARDWAREEmulatorSystem

Developmentand

Debugging

ToolsRemote

ServersSystem

GenerationToolsHardware

ManagerKernel

Control

AgentPROLOG

SYSTEMKERNELKCMHOST

Figure

A.

KCM

Software

Architecture

The

file

and

tty

agents

handle

remote

file

and

terminal

input/output

operations

on

behalf

of

the

KCM

Communication

between

the

KCM

and

the

Host

There

are

two

modes

for

communication

between

the

KCM

and

the

host

software

The

first

mode

is

used

for

initial

booting

of

the

KCM

kernel

and

for

testing

and

debugging

of

the

KCM

at

the

microcode

and

hardware

levels

Requests

from

agents

wishing

to

communicate

with

the

KCM

such

as

a

monitor

or

a

loader

for

stand-alone

binary

files

are

handled

by

a

hardware

access

manager

agent

-LRB-

HAM

-RRB-

This

agent

knows

how

to

perform

low

level

operations

such

as

starting

the

clock

loading

microcode

stepping

through

macrocode

and

accessing

internal

registers

and

memory

on

the

KCM

via

access

to

the

interface

registers

In

the

second

mode

the

KCM

kernel

is

running

The

Kernel

Control

Agent

-LRB-

KCA

-RRB-

is

responsible

for

forwarding

messages

from

the

interface

memory

into

the

message

passing

system

and

vice

versa

The

principle

is

the

following

The

KCM

kernel

provides

the

host

with

the

address

of

a

buffer

on

the

interface

memory

-LRB-

empty

in

case

of

a

communication

from

the

host

to

the

KCM

full

in

the

other

direction

-RRB-

An

interrupt

notifies

the

host

of

An

Overview

of

the

Knowledge

Crunching

Machine

the

availability

of

this

address

in

a

well

defined

location

on

the

interface

board

KCA

transfers

the

data

from

or

to

the

host

by

DMA

-LRB-

Direct

Memory

Access

-RRB-

resets

the

buffer

address

and

sends

an

interrupt

to

notify

the

KCM

that

the

transfer

has

been

done

The

KCM

Kernel

The

KCM

kernel

provides

programs

running

on

the

KCM

UNIX

like

operating

system

services

via

a

system

call

interface

This

includes

a

unified

file

abstraction

interface

for

input/output

reliable

signal

delivery

to

user-defined

handlers

with

provision

for

cheap

critical

sections

debugging

and

profiling

support

and

memory

management

-LSB-

-RSB-

The

KCM

kernel

supports

the

memory

model

of

the

KCM

In

particular

it

is

possible

to

specify

at

run

time

and

on

a

zone

by

zone

basis

how

the

kernel

should

behave

in

case

of

a

trap

due

to

an

out

of

bound

access

to

the

zone

register

a

fatal

error

in

the

user

program

automatically

grow

the

zone

or

send

a

signal

to

the

user

program

The

latter

two

options

can

also

be

combined

The

KCM

kernel

is

not

multi-threaded

It

has

however

been

designed

to

allow

concurrency

in

the

paging

operations

A.

The

Prolog

System

KCM-SEPIA

KCM-SEPIA

is

an

incremental

Edinburgh-like

Prolog

system

which

provides

the

user

with

a

large

subset

of

SEPIA

-LRB-

about

built-in

predicates

-RRB-

including

the

following

advanced

features

ffl

Coroutining

Delay

declarations

define

the

condition

under

which

a

call

should

be

delayed

with

resuming

taking

place

when

unification

results

in

negating

the

condition

This

modification

of

the

strict

left-to-right

computation

rule

of

Prolog

makes

it

possible

for

instance

to

get

the

efficiency

of

standard

backtracking

on

plain

generate

and

test

programs

or

to

avoid

infinite

loops

thus

preserving

completeness

-LSB-

-RSB-

ffl

Event

handling

A

general

and

flexible

event

handling

mechanism

connects

synchronous

events

-LRB-

raised

by

the

program

itself

e.g.

on

an

incorrect

argument

to

a

built-in

predicate

-RRB-

and

asynchronous

events

-LRB-

external

to

the

program

e.g.

interrupts

-RRB-

to

user

defined

event

handlers

-LSB-

-RSB-

ffl

A

predicate

based

module

system

which

facilitates

the

structuring

of

large

applications

while

solving

the

contradictory

requirements

of

free

access

for

metaprogramming

purposes

and

information

access

restrictions

-LSB-

-RSB-

KCM-SEPIA

runs

on

top

of

the

KCM

kernel

It

is

divided

into

two

layers

the

runtime

layer

and

the

Prolog

layer

-LSB-

-RSB-

Software

Architecture

The

runtime

layer

is

loaded

at

boot

time

by

the

kernel

It

is

the

core

of

the

system

It

maintains

the

Prolog

runtime

structures

i.e.

the

functor

and

procedure

tables

a

low-level

runtime

database

based

on

property

lists

I/O

stream

descriptors

and

an

asynchronous

event

handler

table

It

includes

basic

event

handling

and

memory

management

facilities

as

well

as

a

Prolog

loader

The

Prolog

loader

is

in

particular

used

to

load

incrementally

the

binary

object

files

composing

the

upper

Prolog

layer

The

Prolog

layer

implements

the

built-in

predicates

of

KCM-SEPIA

Whereas

the

runtime

layer

is

static

the

Prolog

layer

can

be

modified

incrementally

This

greatly

facilitated

the

development

of

the

Prolog

system

The

Prolog

layer

includes

quite

classically

an

incremental

compiler

a

reader/writer

a

debugger

a

predicate

and

internal

indexed

database

based

on

the

runtime

database

and

a

garbage

collector

Coroutining

is

also

implemented

at

this

level

Note

that

there

is

no

interpreter

the

debugger

debugs

compiled

code

-LSB-

-RSB-

The

following

paragraphs

focus

on

details

specific

to

the

KCM

Stack

Management

and

Garbage

Collection

The

zone

mechanism

makes

it

possible

to

closely

match

the

virtual

space

allocated

to

a

stack

with

the

actual

size

of

the

stack

M.L.

Ross

and

K.Ramamohanarao

have

shown

that

this

drastically

reduces

page

traffic

-LSB-

-RSB-

The

Prolog

stacks

are

initially

spread

over

the

whole

virtual

space

so

that

a

collision

is

practically

excluded

and

allocated

a

limited

number

of

virtual

pages

The

behaviours

of

the

corresponding

zones

are

set

so

that

the

zones

are

automatically

extended

with

a

notification

sent

to

KCM-SEPIA

This

notification

is

used

to

keep

memory

usage

statistics

and

trigger

garbage

collection

Garbage

collection

is

however

not

triggered

at

each

stack

expansion

but

rather

after

a

user-defined

amount

of

global

stack

has

been

used

up

or

if

physical

memory

is

about

to

be

exhausted

Once

garbage

has

been

collected

unused

pages

beyond

stack

tops

are

deallocated

Note

that

the

actual

garbage

collection

can

not

occur

right

on

zone

growth

which

may

happen

at

any

time

during

the

execution

but

must

be

delayed

until

specific

points

in

the

execution

namely

procedure

calls

and

exits

where

the

state

of

the

computation

e.g.

the

sources

of

alive

data

is

well

defined

This

is

achieved

by

using

a

PSW

bit

set

by

the

signal

handler

dealing

with

zone

growth

and

tested

at

all

the

procedure

calls

and

exits

This

test

thanks

to

careful

microprogramming

can

be

done

at

no

cost

When

the

bit

is

set

the

few

registers

necessary

to

resume

the

execution

basically

a

program

pointer

and

on

a

procedure

call

the

arguments

of

the

call

are

saved

and

garbage

collection

can

take

place

This

scheme

has

to

be

contrasted

with

the

usual

software

implementations

which

rely

on

explicit

overflow

checks

-LRB-

see

for

instance

-LSB-

-RSB-

-RRB-

impeding

execution

speed

Another

interesting

feature

of

the

garbage

collector

common

to

SEPIA

and

KCM

SEPIA

is

its

use

of

data

words

The

possibility

of

storing

a

full

address

plus

garbage

collection

bits

in

any

pointer

tag

makes

it

possible

to

build

relocation

chains

An

Overview

of

the

Knowledge

Crunching

Machine

during

the

mark

link

phase

and

thus

perform

collection

in

a

single

pass

-LSB-

-RSB-

The

Prolog

Compiler

The

incremental

Prolog

compiler

bears

much

resemblance

to

the

compiler

of

M.

Carlsson

-LSB-

-RSB-

e.g.

construction

of

an

abstract

tree

compilation

of

control

structures

including

cut

by

source

transformation

flattening

of

terms

support

of

shallow

backtracking

There

are

however

significant

differences

For

instance

register

allocation

takes

place

during

code

generation

rather

than

in

subsequent

pass

implementing

a

variant

of

the

algorithm

of

G.

Janssens

et

al.

-LSB-

-RSB-

Also

indexing

is

done

prior

to

clause

compilation

Knowing

the

indexed

argument

selected

by

the

compiler

makes

it

possible

to

get

rid

of

redundant

unification

instructions

during

clause

compilation

Compound

terms

in

the

body

are

compiled

in

a

breadth-first

manner

as

described

by

M.

Meier

in

-LSB-

-RSB-

Finally

arithmetic

expressions

can

be

compiled

in

different

modes

In

debugging

mode

arithmetic

expressions

are

interpreted

By

default

they

are

translated

into

a

series

of

primitive

predicates

-LRB-

e.g.

Z

is

X

Y

is

compiled

as

-LRB-

X

Y

-RRB-

Z

-RRB-

When

running

in

coroutining

mode

these

primitive

predicates

delay

if

not

sufficiently

instantiated

they

raise

an

error

otherwise

For

experimental

purposes

arithmetic

can

also

be

fully

compiled

in-line

in

which

case

it

can

not

coroutine

and

simply

prints

a

message

and

fails

when

an

error

occurs

A

further

optimization

consists

of

getting

rid

of

generic

arithmetic

Note

that

in

all

cases

arithmetic

expressions

are

type-checked

at

run-time

Coroutining

The

implementation

of

coroutining

is

based

on

the

following

sketchy

ideas

Delay

declarations

for

a

given

predicate

are

translated

into

normal

Prolog

clauses

which

are

prepended

to

the

clauses

making

up

the

predicate

This

translation

is

made

possible

by

the

introduction

of

a

variant

of

-LSB-

-RSB-

freeze

-LRB-

Goal

Vars

NVVars

-RRB-

whose

semantics

are

delay

Goal

until

any

variable

of

Vars

is

unified

or

any

variable

of

NVVars

is

instantiated

to

a

non

variable

term

The

link

between

variables

and

frozen

goals

is

kept

via

attributed

variables

called

metaterms

in

-LRB-

KCM

-RRB-

SEPIA

as

suggested

in

-LSB-

-RSB-

The

unification

of

metaterms

is

recorded

on

a

special

stack

whose

lifetime

is

limited

to

a

procedure

call

in

particular

it

is

reset

on

backtracking

and

sets

the

same

PSW

bit

as

the

garbage

collector

At

the

next

procedure

call

or

exit

a

metaterm

handler

will

then

retrieve

the

frozen

goals

attached

to

the

bound

variables

and

wake

them

up

if

necessary

The

point

is

that

very

little

hardware

and

firmware

support

is

necessary

As

already

mentioned

the

self

referencing

representation

of

variables

has

to

be

dropped

and

a

new

tag

introduced

Unification

instructions

include

a

new

case

for

metaterms

similar

to

the

ordinary

case

except

that

some

information

has

to

be

pushed

onto

a

special

stack

Also

this

stack

has

to

be

reset

on

backtracking

Finally

the

same

mechanism

can

be

used

to

indicate

the

necessity

for

a

garbage

collection

or

of

coroutining

This

mechanism

can

actually

be

seen

as

a

general

way

to

resynchronize

asynchronous

events

with

the

Prolog

execution

Handling

these

events

is

then

slightly

delayed

but

cheaper

Software

Architecture

Also

hardware

and

firmware

support

e.g.

support

for

dereferencing

in

the

cache

and

microcoded

multi-way

branch

makes

it

possible

to

completely

avoid

slowing

down

part

of

the

execution

using

standard

Prolog

when

another

part

resorts

to

coroutining

A.

System

Debugging

and

Development

Tools

A

prerequisite

to

the

development

of

KCM

assembly

code

was

the

availability

of

the

associated

software

tools

on

the

host

assembler

linker

and

loader

The

assembler

provides

recursive

macro

capabilities

conditional

assembly

typed

expressions

and

support

for

a

language

definable

symbol

attribute

system

-LSB-

-RSB-

A

separate

preprocessor

further

supports

basic

loop

and

conditional

constructs

The

loader

connects

to

the

message

passing

system

It

is

used

to

down-load

stand-alone

programs

e.g.

the

KCM

kernel

to

the

KCM

For

bootstrapping

purposes

the

Prolog

compiler

can

also

run

on

the

host

on

top

of

SEPIA

Several

monitor

agents

helped

debugging

the

system

at

different

levels

microcode

macrocode

or

Prolog

The

latter

called

the

runtime

debugger

relies

on

the

kernel

debugging

support

via

the

runtime

layer

of

KCM-SEPIA

and

the

message

passing

system

to

safely

access

the

registers

and

memory

of

the

KCM

perform

single-stepping

and

set

breakpoints

It

is

written

in

Prolog

and

runs

on

the

host

on

top

of

SEPIA

It

is

therefore

able

to

print

KCM

Prolog

data

in

its

Prolog

form

Its

extensibility

made

it

easy

to

add

a

number

of

modules

specific

to

the

main

runtime

data

structures

The

runtime

debugger

was

especially

valuable

when

tracking

down

problems

in

the

runtime

layer

or

problems

due

to

incorrect

compiled

code

that

could

not

be

pinned

down

by

the

Prolog

debugger

on

the

KCM

A

symbol

server

agent

supports

symbolic

debugging

within

the

macro

monitor

and

the

runtime

debugger

An

emulator

reproduces

the

behaviour

of

the

KCM

with

perfect

caches

at

the

instruction

set

level

The

emulator

allowed

validation

of

the

instruction

set

and

testing

of

major

parts

of

the

system

long

before

the

hardware

and

the

kernel

were

available

It

was

later

used

to

gather

execution

profile

statistics

for

evaluation

A.

Implementation

Languages

Four

main

languages

were

used

to

implement

the

system

C

and

Prolog

on

the

host

Prolog

assembly

code

and

microcode

on

the

KCM

Table

A.

gives

the

approximate

size

of

the

software

-LRB-

firmware

included

-RRB-

and

shows

the

respective

shares

of

the

four

implementation

languages

The

sizes

are

given

in

number

of

lines

blank

lines

and

comments

excluded

Quite

a

lot

of

code

was

developed

for

the

host

the

macro

assembler

is

the

biggest

C

program

with

lines

Also

the

weight

of

firmware

and

assembly

code

is

very

important

The

kernel

and

the

KCM-SEPIA

runtime

layer

have

been

totally

implemented

in

assembly

code

They

are

respectively

and

lines

long

The

Prolog

layer

An

Overview

of

the

Knowledge

Crunching

Machine

Language

KCM

Host

Prolog

C

KCM

ass

ucode

Total

Table

A.

Software

Size

of

KCM-SEPIA

also

includes

lines

of

assembly

code

most

of

it

due

to

the

debugger

and

the

garbage

collector

The

rest

of

it

is

essentially

microcode

test

programs

Finally

more

than

half

of

the

firmware

is

also

devoted

to

test

programs

A.

Evaluation

A.

Benefit

Analysis

of

Architectural

Features

The

hardware

evaluation

of

-LSB-

-RSB-

gives

some

insight

into

the

performance

benefit

associated

with

each

of

the

main

architectural

features

of

the

KCM

The

instrumentation

facilities

of

the

emulator

made

it

easy

to

use

a

what-if

approach

the

performance

degradation

was

quantified

on

the

basis

that

a

specific

part

of

the

hardware

is

removed

or

changed

Table

A.

summarizes

the

results

on

a

set

of

standard

benchmark

programs

-LSB-

-RSB-

These

programs

do

not

contain

built-in

predicates

other

than

simple

type

testing

and

arithmetic

predicates

The

arithmetic

predicates

were

compiled

in-line

with

generic

arithmetic

Hardware

Feature

Loss

Tagged

Architecture

Harvard

Architecture

Stack

Oriented

CPU

Copy-Back

Data

Cache

Unification

and

Switch

-LRB-

multi-way

branch

on

tag

-RRB-

Prolog

Flags

-LRB-

flag

dependent

execution

-RRB-

Dereferencing

-LRB-

following

reference

chain

-RRB-

Trail

Operation

-LRB-

pointer

comparisons

-RRB-

Load

Term

-LRB-

argument

passing

-RRB-

Choice

Point

-LRB-

creation/restoring

-RRB-

Prolog

Support

Total

Table

A.

Hardware

Evaluation

of

the

KCM

Removing

the

facility

of

the

CPU

to

simultaneously

handle

tag

and

value

and

re

Evaluation

ducing

the

data

paths

of

the

execution

unit

and

data

cache

to

bits

accounts

for

a

performance

loss

of

Without

a

Harvard

architecture

and

the

separate

access

paths

to

code

and

data

the

speed

of

the

KCM

would

decrease

by

not

taking

hit

ratio

degradation

into

account

Omitting

stack

support

-LRB-

address

calculation

and

register

file

-RRB-

leads

to

a

degradation

of

The

write

policy

of

the

data

cache

has

an

important

influence

-LRB-

-RRB-

on

the

performance

as

well

The

specific

Prolog

hardware

support

sums

up

to

a

total

of

As

mentioned

in

-LSB-

-RSB-

the

complexity

in

term

of

number

of

gates

of

this

hardware

is

small

compared

to

other

architectural

features

and

has

therefore

the

best

performance/cost

ratio

but

is

not

sufficient

to

make

a

fast

machine

The

hardware

evaluation

also

focused

on

memory

behaviour

and

the

design

of

appropriate

cache

systems

which

because

processor

speed

increases

faster

than

main

memory

speed

is

bound

to

very

much

affect

performance

The

study

suggests

that

some

degree

of

associativity

in

the

code

cache

may

be

worthwhile

providing

that

the

cycle

time

is

not

impacted

too

much

Splitting

the

data

cache

into

sections

is

shown

to

perform

well

for

small

caches

of

up

to

Kwords

A

simple

direct-mapped

cache

is

then

more

efficient

because

of

the

under

utilization

of

some

sections

Though

associative

caches

are

not

well

adapted

to

a

stack

reference

model

-LSB-

-RSB-

some

degree

of

associativity

may

alleviate

in

the

case

of

bigger

caches

the

weight

of

interferences

Finally

the

time

spent

on

cache

misses

is

shown

to

be

mainly

due

to

write

misses

hence

the

idea

of

introducing

a

write

buffer

after

the

cache

A.

The

KCM

vs

ECLiPSe

on

a

SUN

SPARCStation

II

ECLiPSe

ECLiPSe

-LRB-

ECRC

Common

Logic

Programming

System

-RRB-

-LSB-

-RSB-

integrates

within

a

single

system

the

facilities

of

SEPIA

-LRB-

compiler

coroutining

polished

user

interface

-RRB-

MegaLog

-LRB-

persistence

-RRB-

-LSB-

-RSB-

and

Opium

-LRB-

extensible

debugging

environment

-RRB-

-LSB-

-RSB-

The

basic

reason

why

ECLiPSe

provides

a

better

basis

for

comparison

than

SEPIA

the

reference

version

of

SEPIA

as

far

as

KCM-SEPIA

is

concerned

is

that

the

emulator

has

been

enhanced

to

use

threaded

code

and

make

better

use

the

registers

of

the

SPARC

therefore

getting

closer

to

the

mode

of

operation

of

the

KCM

while

not

altering

any

language

features

or

important

implementation

decisions

-LRB-

like

words

-RRB-

Note

that

the

compiler

has

also

been

further

enhanced

-LRB-

peephole

optimization

and

indexing

-RRB-

so

that

it

generates

code

of

better

quality

than

the

compiler

of

KCM

SEPIA

Benchmark

Figures

Our

comparisons

will

be

based

on

what

will

be

referred

to

as

the

Aquarius

benchmark

suite

This

is

a

set

of

benchmark

programs

put

together

from

a

number

of

different

sources

as

part

of

the

Aquarius

project

-LRB-

University

of

California

at

Berkeley

-RRB-

This

suite

is

well

known

in

the

Prolog

community

it

has

among

others

been

used

to

assess

the

performance

of

the

BAM

processor

-LSB-

-RSB-

the

Aquarius

Prolog

Compiler

-LSB-

-RSB-

and

Parma

a

Prolog

compiler

for

the

MIPS

RISC

architecture

An

Overview

of

the

Knowledge

Crunching

Machine

-LSB-

-RSB-

It

is

also

interesting

in

that

it

includes

programs

of

different

sizes

and

programming

styles

and

does

not

discard

the

use

of

important

built-in

predicates

such

as

or

which

often

represent

as

shall

be

seen

an

important

share

of

the

execution

time

Note

that

versions

of

the

programs

flatten

and

sdda

without

calls

to

have

been

added

to

the

initial

benchmarks

to

get

a

better

feel

for

the

weight

of

this

predicate

Table

A.

compares

the

speed

-LRB-

cpu

time

in

ms

-RRB-

and

static

code

size

-LRB-

in

bytes

-RRB-

of

the

KCM

and

ECLiPSe

running

on

a

SUN

SPARCStation

II

a

fast

SPARCStation

built

around

a

MHz

SPARC

processor

with

a

instruction

and

data

directmapped

cache

The

execution

times

have

been

obtained

by

incrementally

compiling

and

running

each

program

one

after

another

in

a

repeat/fail

loop

such

that

each

program

runs

about

seconds

This

guarantees

that

the

timing

intervals

are

well

above

the

clock

accuracy

and

averages

some

cache

behaviour

due

to

the

initial

state

of

the

cache

-LRB-

s

-RRB-

On

the

KCM

the

programs

have

been

compiled

with

default

arithmetic

compilation

Ratios

are

relative

to

the

KCM

i.e.

a

factor

greater

than

indicates

that

the

KCM

is

faster

-LRB-

speed

-RRB-

or

that

its

code

is

more

compact

-LRB-

size

-RRB-

Two

speed

ratios

are

given

an

absolute

one

and

a

scaled

one

the

latter

compensating

for

the

difference

of

cycle

time

between

the

KCM

and

the

SPARC

The

idea

is

to

abstract

as

far

as

can

be

achieved

from

the

implementation

technology

Let

us

note

however

that

scaled

ratios

are

bound

to

be

favorable

to

the

KCM

for

two

reasons

Firstly

the

scaling

factor

does

not

apply

to

main

memory

access

Secondly

a

much

faster

clock

may

require

some

simplifications

of

the

architecture

detrimental

to

the

performance

Results

As

can

be

seen

from

the

table

the

KCM

outperforms

ECLiPSe

running

on

a

SPARCStation

II

by

an

average

factor

close

to

This

is

quite

a

good

result

considering

the

technology

of

the

KCM

and

the

relative

merits

of

the

compilers

all

the

more

as

most

of

the

discrepancy

between

the

different

programs

can

be

explained

by

the

weight

of

built-in

predicates

as

illustrated

by

Figure

A.

which

relates

absolute

speed

ratios

to

the

percent

of

time

spent

executing

built-in

predicates

These

measures

are

based

on

run-time

profiling

In

terms

of

scaled

ratio

the

KCM

is

an

order

of

magnitude

faster

on

programs

free

of

built-in

predicates

with

the

performance

degrading

regularly

with

increasing

weights

of

the

built-in

predicates

This

behaviour

is

not

surprising

Prolog

has

been

used

to

implement

many

bits

of

KCM-SEPIA

where

C

is

used

in

SEPIA

The

compilation

technology

used

on

the

KCM

does

not

make

it

possible

to

match

the

performance

of

the

C

implementation

when

considering

machines

of

equal

raw

power

Moreover

the

low-level

parts

of

the

system

written

in

assembler

do

not

benefit

from

the

hardware

support

for

Prolog

This

is

again

the

raw

power

of

the

machine

which

matters

and

the

further

step

would

be

to

repeat

the

process

in

order

to

also

average

the

influence

of

different

relative

locations

in

the

direct-mapped

caches

of

the

procedures

making

up

the

programs

Evaluation

Benchmark

KCM-SEPIA

ECLiPSe

speed

-LRB-

ms

-RRB-

size

-LRB-

bytes

-RRB-

speed

-LRB-

ms

-RRB-

absolute

scaled

size

-LRB-

bytes

-RRB-

boyer

-LRB-

-RRB-

-LRB-

-RRB-

-LRB-

-RRB-

browse

-LRB-

-RRB-

-LRB-

-RRB-

-LRB-

-RRB-

chat

parser

-LRB-

-RRB-

-LRB-

-RRB-

-LRB-

-RRB-

crypt

-LRB-

-RRB-

-LRB-

-RRB-

-LRB-

-RRB-

deriv

-LRB-

-RRB-

-LRB-

-RRB-

-LRB-

-RRB-

fast

mu

-LRB-

-RRB-

-LRB-

-RRB-

-LRB-

-RRB-

flatten

-LRB-

-RRB-

-LRB-

-RRB-

-LRB-

-RRB-

flatten

nowrite

-LRB-

-RRB-

-LRB-

-RRB-

-LRB-

-RRB-

meta

qsort

-LRB-

-RRB-

-LRB-

-RRB-

-LRB-

-RRB-

mu

-LRB-

-RRB-

-LRB-

-RRB-

-LRB-

-RRB-

nand

-LRB-

-RRB-

-LRB-

-RRB-

-LRB-

-RRB-

nreverse

-LRB-

-RRB-

-LRB-

-RRB-

-LRB-

-RRB-

poly

-LRB-

-RRB-

-LRB-

-RRB-

-LRB-

-RRB-

prover

-LRB-

-RRB-

-LRB-

-RRB-

-LRB-

-RRB-

qsort

-LRB-

-RRB-

-LRB-

-RRB-

-LRB-

-RRB-

queens

-LRB-

-RRB-

-LRB-

-RRB-

-LRB-

-RRB-

query

-LRB-

-RRB-

-LRB-

-RRB-

-LRB-

-RRB-

reducer

-LRB-

-RRB-

-LRB-

-RRB-

-LRB-

-RRB-

reducer

nowrite

-LRB-

-RRB-

-LRB-

-RRB-

-LRB-

-RRB-

sdda

-LRB-

-RRB-

-LRB-

-RRB-

-LRB-

-RRB-

sdda

nowrite

-LRB-

-RRB-

-LRB-

-RRB-

-LRB-

-RRB-

sendmore

-LRB-

-RRB-

-LRB-

-RRB-

-LRB-

-RRB-

serialise

-LRB-

-RRB-

-LRB-

-RRB-

-LRB-

-RRB-

simple

analyser

-LRB-

-RRB-

-LRB-

-RRB-

-LRB-

-RRB-

tak

-LRB-

-RRB-

-LRB-

-RRB-

-LRB-

-RRB-

unify

-LRB-

-RRB-

-LRB-

-RRB-

-LRB-

-RRB-

zebra

-LRB-

-RRB-

-LRB-

-RRB-

-LRB-

-RRB-

average

-LRB-

-RRB-

-LRB-

-RRB-

-LRB-

-RRB-

standard

deviation

-LRB-

-RRB-

-LRB-

-RRB-

-LRB-

-RRB-

Table

A.

The

KCM

vs

KCM

is

therefore

outperformed

The

abstract

ECLiPSe

code

is

slightly

larger

than

the

native

KCM

code

in

spite

of

a

more

compact

encoding

This

may

be

due

to

larger

code

for

indexing

-LRB-

on

more

than

one

argument

-RRB-

and

the

compilation

of

compound

term

unification

into

two

different

unification

sequences

a

read

and

a

write

sequence

-LSB-

-RSB-

These

results

have

to

be

moderated

by

the

fact

that

ECLiPSe

resorts

to

a

threadedcode

emulator

rather

than

to

native

code

execution

Running

the

same

benchmarks

on

SISCtus

the

latest

version

of

the

Prolog

system

developed

at

the

Swedish

Institute

of

Computer

Science

-LSB-

-RSB-

shows

a

speed-up

of

two

on

average

between

the

execution

of

byte

code

and

native

code

in

spite

of

a

twofold

increase

of

the

code

size

Note

also

that

compilation

into

native

code

is

typically

only

twice

slower

than

compilation

into

byte

code

which

is

quite

acceptable

An

Overview

of

the

Knowledge

Crunching

Machine

Speed-up

wrt

weigth

of

built-in

predicates

regression

speed-up

runtime

Figure

A.

Speed-up

wrt

weight

of

built-in

predicates

A.

The

KCM

vs

the

BAM

The

BAM

Following

their

work

on

the

PLM

the

Aquarius

project

took

the

approach

of

designing

simultaneously

a

general-purpose

microprocessor

extended

to

provide

extra

support

for

Prolog

the

BAM

-LSB-

-RSB-

and

an

optimizing

Prolog

compiler

-LSB-

-RSB-

The

overall

architecture

of

the

BAM

has

quite

a

number

of

points

in

common

with

the

KCM

a

tagged

Harvard

architecture

support

for

stack

operations

-LRB-

including

a

four-port

register

file

-RRB-

a

direct-mapped

cache

with

a

copy

back

policy

It

is

however

radically

different

from

the

KCM

in

that

it

is

essentially

a

RISC

architecture

in

particular

ffl

There

is

no

microcoded

control

though

internal

opcodes

can

be

viewed

as

a

simple

form

of

microcode

ffl

The

execution

unit

uses

a

five-stage

pipeline

All

branch

and

jump

instructions

are

delayed

with

the

following

instruction

executed

if

not

annulled

ffl

The

instruction

set

is

about

twice

smaller

than

the

one

of

the

KCM

Evaluation

ffl

The

Prolog

specific

instructions

while

being

of

higher

level

than

typical

RISC

instructions

are

of

lower

level

than

the

Prolog

instructions

of

the

KCM

Benchmark

Figures

Table

A.

compares

the

speed

-LRB-

cpu

time

in

ms

-RRB-

and

static

code

size

-LRB-

in

bytes

-RRB-

of

the

KCM

and

the

BAM

Scaled

ratios

are

relative

to

the

KCM

On

the

KCM

the

figures

rely

on

the

same

methodology

as

described

before

The

benchmarks

are

compiled

with

in-line

arithmetic

to

take

into

account

the

fact

that

the

absence

of

coroutining

arithmetic

and

simpler

error

handling

allows

the

BAM

to

compile

arithmetic

in-line

Moreover

integer

arithmetic

is

used

In

order

to

get

fast

arithmetic

the

BAM

uses

the

most

significant

four

bits

of

a

word

for

tagging

associating

tags

-LRB-

-RRB-

and

-LRB-

-RRB-

to

non-negative

and

negative

integers

and

compiling

arithmetic

in-line

by

using

special

version

of

arithmetic

instructions

which

trap

on

overflow

The

equivalent

level

of

optimization

on

the

KCM

could

have

been

obtained

by

microcoding

special

versions

of

the

most

frequent

arithmetic

instructions

using

multi-way

branching

The

timing

of

these

instructions

would

have

been

very

close

-LRB-

possibly

slightly

better

-RRB-

than

the

series

of

simpler

instructions

generated

for

in-line

integer

arithmetic

The

execution

times

for

the

BAM

are

extracted

from

-LSB-

-RSB-

They

are

simulated

in

warm

start

-LRB-

i.e.

each

benchmark

is

run

twice

and

the

first

result

is

ignored

-RRB-

assuming

a

MHz

clock

and

direct-mapped

write

back

caches

The

Aquarius

compiler

-LSB-

-RSB-

includes

a

global

analysis

module

which

infers

implementation

type

information

and

makes

it

possible

to

reduce

dereferencing

and

trailing

Results

with

and

without

analysis

are

given

The

benchmarks

are

separated

into

two

series

of

programs

with

the

second

series

including

all

the

programs

written

by

members

of

the

Aquarius

project

In

general

the

two

series

of

programs

use

very

different

programming

styles

relying

on

assumptions

on

the

capabilities

of

the

compiler

In

particular

the

first

series

uses

cut

to

express

determinacy

and

assumes

that

indexing

is

limited

to

the

functor

of

the

first

argument

whereas

the

second

series

uses

mutually

exclusive

tests

to

express

determinacy

and

assumes

better

indexing

Other

points

to

be

kept

in

mind

are

that

the

figures

given

for

the

KCM

correspond

to

an

incremental

system

-LRB-

non

recursive

calls

within

a

procedure

are

indirect

calls

via

the

procedure

table

-RRB-

Also

garbage

collection

and

coroutining

are

taken

into

account

This

requires

additional

work

on

procedure

calls

-LRB-

event

test

-RRB-

and

during

unification

-LRB-

dereferencing

value

trailing

-RRB-

and

does

not

allow

uninitialized

cells

to

cross

procedure

call

boundaries

To

our

knowledge

these

issues

are

not

taken

into

account

in

the

figures

of

-LSB-

-RSB-

Results

Without

Global

Analysis

Not

taking

global

analysis

into

account

the

BAM

does

not

on

average

bring

any

clear

performance

advantage

over

the

KCM

on

the

first

series

of

benchmarks

The

lower

ratios

of

browse

and

qsort

point

to

possible

An

Overview

of

the

Knowledge

Crunching

Machine

Benchmark

KCM

VLSI-BAM

-LSB-

-RSB-

no

analysis

analysis

ms

bytes

ms

scaled

bytes

ms

scaled

bytes

boyer

-LRB-

-RRB-

-LRB-

-RRB-

browse

-LRB-

-RRB-

-LRB-

-RRB-

chat

parser

-LRB-

-RRB-

-LRB-

-RRB-

deriv

-LRB-

-RRB-

-LRB-

-RRB-

mu

-LRB-

-RRB-

-LRB-

-RRB-

nreverse

-LRB-

-RRB-

-LRB-

-RRB-

prover

-LRB-

-RRB-

-LRB-

-RRB-

qsort

-LRB-

-RRB-

-LRB-

-RRB-

queens

-LRB-

-RRB-

-LRB-

-RRB-

query

-LRB-

-RRB-

-LRB-

-RRB-

serialise

-LRB-

-RRB-

-LRB-

-RRB-

zebra

-LRB-

-RRB-

-LRB-

-RRB-

average

-LRB-

-RRB-

-LRB-

-RRB-

std

deviation

-LRB-

-RRB-

-LRB-

-RRB-

crypt

-LRB-

-RRB-

-LRB-

-RRB-

fast

mu

-LRB-

-RRB-

-LRB-

-RRB-

flatten

-LRB-

-RRB-

-LRB-

-RRB-

meta

qsort

-LRB-

-RRB-

-LRB-

-RRB-

nand

-LRB-

-RRB-

-LRB-

-RRB-

poly

-LRB-

-RRB-

-LRB-

-RRB-

reducer

-LRB-

-RRB-

-LRB-

-RRB-

sdda

-LRB-

-RRB-

-LRB-

-RRB-

simple

analyser

-LRB-

-RRB-

-LRB-

-RRB-

tak

-LRB-

-RRB-

-LRB-

-RRB-

unify

-LRB-

-RRB-

-LRB-

-RRB-

average

-LRB-

-RRB-

-LRB-

-RRB-

std

deviation

-LRB-

-RRB-

-LRB-

-RRB-

Table

A.

The

KCM

vs

the

BAM

compiler

improvements

in

the

area

of

indexing

and

factoring

The

lower

ratio

of

queens

seems

however

more

architecture

related

This

program

spends

most

of

its

time

in

inline

arithmetic

where

the

KCM

is

slower

than

the

BAM

because

of

slower

dereferencing

-LRB-

the

dref

instruction

of

the

BAM

costs

cycles

on

average

whereas

the

corresponding

instruction

of

the

KCM

is

at

least

cycles

long

-RRB-

and

arithmetic

operations

-LRB-

catching

overflows

requires

an

additional

conditional

jump

-RRB-

On

the

second

series

of

benchmarks

the

KCM

is

on

average

outperformed

by

a

factor

of

Part

of

it

is

due

to

compilation

and

programming

style

issues

An

extreme

example

is

given

by

tak

This

program

computes

a

particular

value

of

the

Takeuchi

function

and

amounts

to

recursive

invocations

of

a

predicate

and

simple

integer

arithmetic

An

efficient

execution

of

the

program

relies

on

the

compiler

recognizing

that

X

Y

and

X

Y

are

complementary

deterministic

tests

and

avoiding

the

creation

of

a

choice

point

The

program

results

in

standard

implementations

-LRB-

e.g.

KCM

ECLiPSe

or

SICStus

-RRB-

in

the

creation

of

a

choice

point

at

each

invocation

of

Evaluation

and

the

duplication

of

many

inequality

tests

These

implementations

expect

to

be

written

with

a

single

test

and

a

Such

a

version

of

tak

runs

in

ms

on

the

KCM

which

gives

a

scaled

ratio

of

instead

of

Another

source

of

inefficiency

comes

from

the

weight

of

the

built-in

predicate

in

flatten

and

sdda

In

-LSB-

-RSB-

P.

Van

Roy

mentions

that

these

programs

perform

well

wrt

Quintus

Prolog

because

is

much

faster

in

Aquarius

The

code

size

of

the

BAM

remains

more

than

twice

the

one

of

KCM

in

spite

of

a

much

tighter

encoding

of

instructions

and

data

on

bits

The

Benefits

of

Static

Analysis

Incremental

compilation

has

been

assumed

so

far

i.e.

each

predicate

is

compiled

in

isolation

without

taking

into

account

any

context

of

execution

Static

analysis

makes

it

possible

to

significantly

improve

the

quality

of

the

code

generated

by

specializing

it

to

its

execution

context

Much

effort

has

been

devoted

to

the

static

analysis

of

logic

programs

since

the

early

work

of

C.

Mellish

-LSB-

-RSB-

which

has

led

together

with

the

parallel

maturing

of

basic

compilation

techniques

to

the

emergence

of

optimizing

compilers

such

as

the

Aquarius

compiler

and

Parma

The

static

analyzers

of

these

systems

are

based

on

abstract

interpretation

-LSB-

-RSB-

They

essentially

associate

type

information

with

each

predicate

argument

This

includes

knowledge

of

the

instantiation

state

of

an

argument

-LRB-

e.g.

whether

it

is

bound

or

not

-RRB-

as

well

as

information

on

its

machine

representation

state

-LRB-

e.g.

whether

it

is

dereferenced

or

not

-RRB-

This

knowledge

makes

it

possible

to

greatly

simplify

unification

possibly

replacing

it

by

standard

assignment

and

improve

indexing

The

technique

has

however

a

number

of

shortcomings

It

is

slow

and

therefore

not

well

suited

to

quick

prototyping

For

instance

Parma

analyzes

the

parser

of

in

seconds

on

a

MIPS

and

it

takes

the

Aquarius

compiler

minutes

minutes

of

which

are

devoted

to

global

analysis

to

compile

it

on

a

SPARCstation

This

program

is

compiled

in

on

the

KCM

or

on

a

SPARCStation

II

running

SICStus

-LRB-

byte

code

-RRB-

Also

meta-programming

and

extra-logical

features

confound

analysis

This

topic

is

extensively

covered

in

-LSB-

-RSB-

and

some

partial

remedies

are

considered

Finally

some

programs

escape

static

analysis

because

of

their

inherently

dynamic

character

-LRB-

e.g.

zebra

and

constraint

satisfaction

problems

in

general

-RRB-

In

the

case

of

the

BAM

Table

A.

shows

that

global

analysis

is

especially

successful

in

reducing

the

code

size

which

gets

close

to

the

size

of

the

code

of

the

KCM

The

speed-up

due

to

global

analysis

remains

low

around

on

average

It

is

also

interesting

to

compare

the

respective

performance

of

the

Aquarius

compiler

on

the

BAM

with

Parma

It

turns

out

that

the

gain

through

global

analysis

obtained

by

Parma

is

close

to

twice

the

speed-up

obtained

by

the

Aquarius

compiler

on

the

BAM

The

result

is

that

though

Parma

is

slower

than

Aquarius/BAM

without

static

analysis

it

is

able

to

catch

up

when

static

analysis

is

used

-LSB-

-RSB-

This

is

not

surprising

since

was

the

initial

formulation

of

Evan

Tick

in

-LSB-

-RSB-

An

Overview

of

the

Knowledge

Crunching

Machine

one

can

expect

smaller

gains

from

static

analysis

when

starting

from

a

machine

with

Prolog

support

Other

important

factors

are

discrepancies

in

the

abstract

machines

the

respective

quality

of

the

analyzers

-LRB-

e.g.

the

types

of

Parma

are

more

precise

than

the

ones

of

Aquarius

-RRB-

Another

point

to

be

kept

in

mind

when

comparing

Parma

with

the

Aquarius

compiler

is

that

Parma

is

specific

to

a

given

processor

Portability

issues

may

make

it

necessary

to

give

up

some

optimizations

Static

Analysis

and

the

KCM

Static

analysis

techniques

can

also

be

applied

to

the

KCM

but

not

as

successfully

Static

analysis

decreases

the

weight

of

high-level

Prolog

instructions

in

favor

of

general

purpose

instructions

Delays

due

to

pipeline

breaks

on

load

operations

and

conditional

branches

become

a

bottleneck

-LSB-

-RSB-

A.

Conclusion

and

Perspectives

The

ambition

of

the

KCM

project

was

to

better

understand

the

benefits

and

limitations

of

CPU

hardware

support

for

Prolog

An

experimental

approach

was

taken

a

machine

was

built

and

the

accompanying

software

developed

including

a

full-blown

incremental

Prolog

system

This

leaves

few

doubts

as

to

the

feasibility

of

the

approach

as

well

as

its

difficulties

Assuming

incremental

compilation

a

first

result

is

that

hardware

support

can

indeed

significantly

speed-up

Prolog

In

spite

of

a

now

obsolete

technology

the

KCM

is

still

twice

as

fast

as

its

companion

system

ECLiPSe

running

on

a

SUN

SPARC

Station

II

This

corresponds

to

a

tenfold

scaled

speed-up

ratio

on

programs

free

of

built-in

predicates

and

to

an

average

ratio

of

about

on

the

Aquarius

benchmark

suite

Experiments

with

SICStus

show

that

native

code

compilation

may

divide

these

ratios

by

about

which

leaves

us

with

still

comfortable

speed-up

ratios

of

-LRB-

average

-RRB-

to

-LRB-

maximum

-RRB-

A

second

result

is

that

according

to

the

results

of

the

comparison

of

the

KCM

and

the

BAM

specialized

RISC

and

CISC

architectures

exhibit

very

similar

performance

Static

analysis

however

by

breaking

apart

and

simplifying

basic

Prolog

operations

such

as

unification

reduces

the

benefits

of

dedicated

hardware

and

favors

architectures

implementing

efficiently

simple

load/store

and

conditional

branch

instructions

CISC

architectures

are

outperformed

and

specialized

and

general

purpose

RISC

architectures

get

very

close

This

is

all

the

more

important

as

in

spite

of

its

shortcomings

static

analysis

is

a

very

promising

technique

-LRB-

see

for

instance

the

comparisons

between

C

and

Prolog

in

-LSB-

-RSB-

-RRB-

A

practical

full-blown

system

mixing

incrementally

compiled

and

optimized

code

remains

however

to

be

implemented

Another

major

aspect

of

the

discussion

is

that

specialized

hardware

calls

for

specialized

software

On

the

KCM

firmware

and

assembly

code

accounts

for

of

the

code

and

dedicated

C

code

for

another

This

is

probably

close

to

an

upper

bound

RISC

architectures

have

the

good

property

of

getting

rid

of

firmware

More

code

can

Conclusion

and

Perspectives

be

written

in

Prolog

especially

if

a

Prolog

optimizing

compiler

is

available

Note

however

that

it

looks

difficult

to

achieve

the

portability

of

symbolic

assembly

languages

such

as

Lisp

by

writing

for

instance

the

garbage

collector

in

Prolog

An

option

would

have

been

to

develop

an

extension

of

a

lower

level

language

like

C

able

to

efficiently

handle

tagged

words

A

last

point

is

that

Prolog

and

Logic

Programming

is

moving

ahead

Prolog

implementation

techniques

which

significantly

depart

from

the

WAM

are

put

forward

BinProlog

-LSB-

-RSB-

MALI

-LSB-

-RSB-

and

the

VAM

-LSB-

-RSB-

are

some

examples

At

the

level

of

the

computational

model

the

integration

of

constraints

-LSB-

-RSB-

of

parallelism

-LSB-

-RSB-

and

work

on

deductive

databases

-LSB-

-RSB-

break

the

rigid

control

strategy

of

Prolog

The

integration

of

objects

-LSB-

-RSB-

and

functions

-LSB-

-RSB-

are

also

very

active

research

areas

This

advocates

concentrating

on

software

improvements

which

are

at

least

of

comparable

potential

benefit

but

cheaper

to

unveil

and

easier

to

share

The

introduction

of

user

defined

memory

management

in

recent

micro-kernel

based

operating

systems

follows

the

same

philosophy

and

can

actually

be

used

to

implement

some

of

the

memory

management

ideas

described

above

-LRB-

triggering

of

garbage

collection

improvement

of

paging

-RRB-

This

does

not

preclude

hardware

support

but

suggests

that

it

be

restricted

to

facilities

which

may

be

useful

to

the

implementation

of

a

wide

variety

of

languages

Tagged

data

fast

conditional

branching

on

user

flags

and

intelligent

memory

model

support

look

like

good

candidates

Also

performance/silicon

area

should

not

be

the

only

criterion

e.g.

a

tagged

architecture

avoids

resorting

to

tricks

when

implementing

dynamic

typing

and

may

therefore

save

development

and

maintenance

efforts

Acknowledgements

The

KCM

results

from

a

group

effort

At

ECRC

the

following

people

directly

contributed

to

the

project

Jean-Michel

Beacco

Hans

Benker

Sylvie

Bescos

Andr?e

Bolle

Michel

Dorochevsky

Lindsay

Errington

Ludwig

Fingerhut

Philippe

Holleville

Thomas

Jeffr?e

Liang-Liang

Li

Stefano

Novello

Anita

P?ohlmann

Jonathan

Price

Bruno

Poterie

Alan

Sexton

Heinz

Seidl

Olivier

Thibault

and

G?unter

Watzlawik

Jean-Claude

Syre

deserves

a

special

mention

for

having

started

the

project

and

led

it

with

enthusiasm

until

he

left

ECRC

in

Summer

Special

thanks

are

also

due

to

the

SEPIA

team

and

especially

to

M.

Meier

and

J.

Schimpf

for

their

time

and

expertise

There

was

joint

development

work

with

Bull/GIPSI

Siemens

and

ICL

for

the

KCM

interface

boards

and

host

software

Siemens

took

part

in

the

design

of

the

memory

boards

and

manufactured

the

memory

and

processor

boards

They

also

assembled

the

pilot

machines

The

KCM

project

would

not

have

been

possible

without

the

strong

backing

of

Bill

O'Riordan

Owen

Evans

and

Malcolm

Rigg

at

ICL

Peter

M?uller

Stoy

Walter

Woborschil

and

Peter

Stock

at

Siemens

Mireille

Ducass?e

Michel

Dorochevsky

Micha

Meier

Mike

Reeve

Joachim

Schimpf

and

an

anonymous

reviewer

provided

valuable

comments

on

drafts

of

this

paper

An

Overview

of

the

Knowledge

Crunching

Machine

R?ef?erences

bibliographiques

-LSB-

-RSB-

Advanced

Micro

Devices

-LCB-

Microprogrammable

Products

-LCB-

Data

Book

-LSB-

-RSB-

A.

Aggoun

and

N.

Beldiceanu

-LCB-

Time

stamps

techniques

for

the

trailed

data

in

constraint

logic

programming

systems

-LCB-

In

S.

Bourgault

and

M.

Dincbas

editors

Programmation

en

Logique

Actes

du

eme

S?eminaire

pages

-LCB-

France

Telecom

CNET

Mai

-LSB-

-RSB-

A.

Aggoun

and

N.

Beldiceanu

-LCB-

Overview

of

the

CHIP

compiler

system

-LCB-

In

F.

Benhamou

and

A.

Colmerauer

editors

Constraint

Logic

Programming

Selected

Research

chapter

pages

-LCB-

MIT

Press

-LSB-

-RSB-

H

A

t-Kaci

-LCB-

Warren

's

Abstract

Machine

A

Tutorial

Reconstruction

-LCB-

MIT

Press

-LSB-

-RSB-

H

A

t-Kaci

and

A.

Podelski

-LCB-

Towards

a

meaning

to

LIFE

-LCB-

In

Proceedings

of

the

International

Symposium

on

Programming

Language

Implementation

and

Logic

Programming

pages

-LCB-

Springer-Verlag

August

-LSB-

-RSB-

J.-M

Andreoli

and

R.

Pareschi

-LCB-

Linear

objects

Logical

processes

with

built-in

inheritance

-LCB-

New

Generation

Computing

-LCB-

-LSB-

-RSB-

A.W.

Appel

-LCB-

Compiling

with

Continuations

-LCB-

Cambridge

University

Press

-LSB-

-RSB-

K.

Appleby

M.

Carlsson

S.

Haridi

and

D.

Sahlin

-LCB-

Garbage

collection

for

Prolog

based

on

WAM

-LCB-

Communications

of

the

ACM

-LRB-

-RRB-

-LCB-

June

-LSB-

-RSB-

J.

Barklund

-LCB-

Efficient

interpretation

of

Prolog

programs

-LCB-

In

Proceedings

of

the

SIGPLAN

Symposium

on

Interpreters

and

Interpretive

Techniques

pages

-LCB-

St.

Paul

Minnesota

USA

June

ACM

Press

-LCB-

SIGPLAN

Notices

Vol

Nb

-LSB-

-RSB-

J.

Barklund

and

H.

Millroth

-LCB-

Garbage

cut

for

garbage

collection

of

iterative

Prolog

programs

-LCB-

In

Proceedings

of

the

Symposium

on

Logic

Programming

-LSB-

-RSB-

pages

-LCB-

-LSB-

-RSB-

Y.

Bekkers

-LCB-

Programmation

en

logique

de

Prolog

a

Prolog

-LCB-

Document

d'habilitation

IRISA/IFSIC

Mars

Une

etude

approfondie

de

la

WAM

-LSB-

-RSB-

Y.

Bekkers

B.

Canet

O.

Ridoux

and

L.

Ungaro

-LCB-

MALI

a

memory

with

a

real-time

garbage

collector

for

implementing

logic

programming

languages

-LCB-

In

Proceedings

of

the

Symposium

on

Logic

Programming

-LSB-

-RSB-

pages

-LCB-

-LSB-

-RSB-

Y.

Bekkers

and

J.

Cohen

editors

-LCB-

Proceedings

of

the

International

Workshop

on

Memory

Management

-LRB-

IWMM

-RRB-

number

in

Lecture

Notes

in

Computer

Science

Springer-Verlag

September

-LSB-

-RSB-

Y.

Bekkers

O.

Ridoux

and

L.

Ungaro

-LCB-

Dynamic

memory

management

for

sequential

logic

programming

languages

-LCB-

In

Bekkers

and

Cohen

-LSB-

-RSB-

pages

-LCB-

-LSB-

-RSB-

H.

Benker

J.-M

Beacco

S.

Bescos

M.

Dorochevsky

Th

Jeffr?e

A.

P?ohlmann

J.

Noy?e

B.

Poterie

A.P.

Sexton

J.-C

Syre

O.

Thibault

and

G.

Watzlawik

-LCB-

KCM

A

Knowledge

Crunching

Machine

-LCB-

In

Proceedings

of

the

Annual

International

Symposium

on

Computer

Architecture

pages

-LCB-

Jerusalem

Israel

June

IEEE

Computer

Society

Press

-LSB-

-RSB-

H.

Benker

M.

Dorochevsky

J.

Noy?e

and

A.P.

Sexton

-LCB-

A

Knowledge

Crunching

System

-LCB-

In

Proceedings

of

the

ITG/GI-Conference

Architecture

of

Computing

Systems

pages

-LCB-

Munich

March

-LSB-

-RSB-

H.

Benker

Th

Jeffr?e

J.

Noy?e

A.

P?ohlmann

S.

Schmitz

J.-C

Syre

and

O.

Thibault

-LCB-

Final

specification

report

on

a

high

speed

inference

co-processor

-LCB-

Technical

Report

ECRC

February

-LCB-

In

two

parts

-LSB-

-RSB-

H.

Benker

Th

Jeffr?e

A.

P?ohlmann

O.

Thibault

G.

Watzlawik

and

Syre

J.-C

-LCB-

KCM

functional

description

-LCB-

Technical

Report

ECRC

March

-LSB-

-RSB-

H.

Benker

Th

Jeffr?e

A.

P?ohlmann

O.

Thibault

G.

Watzlawik

and

Syre

J.-C

-LCB-

KCM

hardware

implementation

-LCB-

Technical

Report

ECRC

March

-LSB-

-RSB-

J.

Bevemyr

and

T.

Lindgren

-LCB-

A

simple

and

efficient

copying

garbage

collector

for

Prolog

-LCB-

In

Hermenegildo

and

Penjam

-LSB-

-RSB-

pages

-LCB-

-LSB-

-RSB-

J.

Bocca

-LCB-

MegaLog

-LCB-

a

platform

for

developing

knowledge

base

managemet

systems

-LCB-

In

International

Symposium

on

Database

Systems

for

Advanced

Applications

Tokyo

pages

-LCB-

April

-LSB-

-RSB-

P.

Boizumault

-LCB-

PROLOG

The

Implementation

-LCB-

Princeton

University

Press

-LSB-

-RSB-

K.A.

Bowen

K.A.

Buettner

C.

Cicekli

and

A.K.

Turk

-LCB-

The

design

and

implementation

of

a

high-speed

incremental

portable

Prolog

compiler

-LCB-

In

Shapiro

-LSB-

-RSB-

pages

-LCB-

-LSB-

-RSB-

P.

Brisset

-LCB-

Compilation

de

Prolog

-LCB-

PhD

thesis

Universit?e

de

Rennes

I

France

R?ef?erences

bibliographiques

-LSB-

-RSB-

P.

Brisset

-LCB-

Metaterms

with

several

attributes

-LCB-

In

ILPS

Workshop

on

Methodologies

for

Composing

Logic

Programs

Vancouver

Canada

-LSB-

-RSB-

P.

Brisset

T.

Fr?uhwirth

P.

Lim

M.

Meier

T.

Le

Provost

J.

Schimpf

and

M.

Wallace

-LCB-

ECLiPSe

Extensions

User

Manual

-LCB-

ECRC

Munich

Germany

July

-LSB-

-RSB-

P.

Brisset

S.

Le

Huitouze

and

O.

Ridoux

-LCB-

Prolog/Mali

Reference

Manual

-LRB-

Draft

-RRB-

-LCB-

IRISA

-LSB-

-RSB-

P.

Brisset

and

O.

Ridoux

-LCB-

The

compilation

of

Prolog

and

its

execution

with

MALI

-LCB-

Technical

Report

INRIA

January

-LSB-

-RSB-

P.

Brisset

and

O.

Ridoux

-LCB-

Continuations

in

Prolog

-LCB-

In

Warren

-LSB-

-RSB-

pages

-LCB-

-LSB-

-RSB-

P.

Brisset

and

O.

Ridoux

-LCB-

The

architecture

of

an

implementation

of

Prolog

Prolog/Mali

-LCB-

In

De

Bosschere

et

al.

-LSB-

-RSB-

pages

-LCB-

-LSB-

-RSB-

M.

Bruynooghe

-LCB-

A

practical

framework

for

the

abstract

interpretation

of

logic

programs

-LCB-

Journal

of

Logic

Programming

-LRB-

-RRB-

-LCB-

-LSB-

-RSB-

M.

Bruynooghe

and

M.

Wirsing

editors

-LCB-

Proceedings

of

the

International

Symposium

on

Programming

Language

Implementation

and

Logic

Programming

number

in

Lecture

Notes

in

Computer

Science

Leuven

Belgium

August

Springer-Verlag

-LSB-

-RSB-

M.

Carlsson

-LCB-

Compilation

for

Tricia

and

its

abstract

machine

-LCB-

Technical

Report

UPMAIL

Uppsala

University

-LSB-

-RSB-

M.

Carlsson

-LCB-

Freeze

indexing

and

other

implementation

issues

in

the

WAM

-LCB-

In

J.-L

Lassez

editor

Proceedings

of

the

International

Conference

on

Logic

Programming

pages

-LCB-

Melbourne

Australia

May

MIT

Press

-LSB-

-RSB-

M.

Carlsson

-LCB-

On

the

efficiency

of

optimising

shallow

backtracking

in

compiled

Prolog

-LCB-

In

Levi

and

Martelli

-LSB-

-RSB-

pages

-LCB-

-LSB-

-RSB-

M.

Carlsson

-LCB-

Design

and

Implementation

of

an

OR-Parallel

Prolog

Engine

-LCB-

PhD

thesis

The

Royal

Institute

of

Technology

Stockholm

March

-LSB-

-RSB-

M.

Carlsson

and

P.

Szeredi

-LCB-

The

Aurora

abstract

machine

and

its

emulator

-LCB-

Research

Report

SICS

-LSB-

-RSB-

M.

Carlsson

J.

Wid?en

J.

Andersson

S.

Andersson

K.

Boortz

H.

Nilsson

and

T.

Sj?oland

-LCB-

SICStus

Prolog

User

's

Manual

-LCB-

SICS

October

-LCB-

SICS

Technical

Report

B.

-LSB-

-RSB-

M.

Carlsson

J.

Wid?en

J.

Andersson

S.

Andersson

K.

Boortz

H.

Nilsson

and

T.

Sj?oland

-LCB-

SICStus

Prolog

User

's

Manual

-LCB-

SICS

January

-LCB-

Version

SICStus

Prolog

Une

etude

approfondie

de

la

WAM

-LSB-

-RSB-

J.

Chassin

de

Kergommeaux

and

P.

Codognet

-LCB-

Parallel

logic

programming

systems

-LCB-

Technical

Report

RR

Laboratoire

de

G?enie

Informatique

Grenoble

May

-LSB-

-RSB-

K.L.

Clark

-LCB-

Logic-programming

schemes

and

their

implementation

-LCB-

In

J.-L

Lassez

and

G.

Plotkin

editors

Computational

Logic

Essays

in

Honor

of

Alan

Robinson

chapter

pages

-LCB-

MIT

Press

-LSB-

-RSB-

K.L.

Clark

and

S.-A

T?arnlund

editors

-LCB-

Logic

Programming

volume

of

APIC

Studies

in

Data

Processing

-LCB-

Academic

Press

-LSB-

-RSB-

A.

Colmerauer

-LCB-

Prolog

and

infinite

trees

-LCB-

In

Clark

and

T?arnlund

-LSB-

-RSB-

pages

-LCB-

-LSB-

-RSB-

E.

Cooper

S.

Nettles

and

I.

Subramanian

-LCB-

Improving

the

performance

of

SML

garbage

collection

using

application-specific

virtual

memory

management

-LCB-

In

Proceedings

of

the

seventh

ACM

Conference

on

LISP

and

Functional

Programming

pages

-LCB-

San

Francisco

California

USA

June

ACM

Press

-LSB-

-RSB-

M.A.

Covington

-LCB-

ISO

Prolog

A

summary

of

the

draft

proposed

standard

-LCB-

Preprint

of

Appendix

A

of

Prolog

Programming

in

Depth

by

M.A.

Covington

D.

Nute

and

A.

Vellino

-LRB-

Pentice-Hall

in

preparation

-RRB-

July

-LSB-

-RSB-

A.

Davison

-LCB-

Design

issues

for

logic

based

object

oriented

programming

languages

-LCB-

Research

report

Imperial

College

-LSB-

-RSB-

K.

De

Bosschere

B.

Demoen

and

P.

Tarau

editors

-LCB-

ILPS

Post-Conference

Workshop

on

Implementation

Techniques

for

Logic

Programming

Languages

November

-LSB-

-RSB-

D.

de

Villeneuve

-LCB-

ECRC

Prolog

intermediate

language

PLM

-LCB-

Technical

Report

ECRC

May

-LSB-

-RSB-

J.

Debray

K.

De

Bosschere

and

D.

Gudeman

-LCB-

Call

forwarding

A

simple

low-level

code

optimization

technique

-LCB-

In

E.

Tick

and

G.

Succi

editors

Implementations

of

Logic

Programming

Systems

Kluwer

Academic

Publishers

-LSB-

-RSB-

S.

K.

Debray

-LCB-

A

simple

code

improvement

scheme

for

Prolog

-LCB-

In

Levi

and

Martelli

-LSB-

-RSB-

pages

-LCB-

-LSB-

-RSB-

C.

Delobel

M.

Kifer

and

Y.

Masugana

editors

-LCB-

Deductive

and

Object-Oriented

Databases

Second

International

Conference

DOOD

number

in

Lecture

Notes

in

Computer

Science

Munich

Germany

December

Springer-Verlag

-LSB-

-RSB-

B.

Demoen

-LCB-

On

the

transformation

of

a

Prolog

program

to

a

more

efficient

binary

program

-LCB-

In

K.-K

Lau

and

T.P.

Clement

editors

Logic

program

synthesis

and

transformation

proceedings

of

LOPSTR

International

workshop

Workshops

in

computing

pages

-LCB-

Springer-Verlag

R?ef?erences

bibliographiques

-LSB-

-RSB-

B.

Demoen

and

A.

Mari?en

-LCB-

Implementation

of

Prolog

as

binary

definite

programs

-LCB-

In

A.

Voronkov

editor

Logic

Programming

Proceedings

of

the

first

and

second

Russian

Conference

on

Logic

Programming

number

in

Lecture

Notes

in

Artificial

Intelligence

pages

-LCB-

Springer-Verlag

-LSB-

-RSB-

B.

Demoen

and

G.

Maris

-LCB-

A

comparison

of

some

schemes

for

translating

logic

to

C.

-LCB-

In

J.

Barklund

B.

Jayaraman

and

J.

Tanaka

editors

Proceedings

of

the

post-ICLP

worshop

on

Parallel

and

Data

Parallel

Execution

of

Logic

Programs

pages

-LCB-

Santa

Margherita

Italy

Uppsala

University

-LCB-

UP

MAIL

Technical

Report

June

-LSB-

-RSB-

P.

Deransart

and

J.

Ma

luszy?nski

editors

-LCB-

Programming

Language

Implementation

and

Logic

Programming

number

in

Lecture

Notes

in

Computer

Science

Linkoeping

Sweden

August

Springer-Verlag

-LSB-

-RSB-

D.

Diaz

and

P.

Codognet

-LCB-

A

minimal

extension

of

the

WAM

for

clp

-LRB-

FD

-RRB-

-LCB-

In

Warren

-LSB-

-RSB-

pages

-LCB-

-LSB-

-RSB-

M.

Dincbas

P.

Van

Hentenryck

H.

Simonis

T.

Graf

and

F.

Berthier

-LCB-

The

constraint

logic

programming

language

CHIP

-LCB-

In

Proceedings

of

the

International

Conference

on

Fifth

Generation

Computer

Systems

pages

-LCB-

ICOT

-LSB-

-RSB-

T.

Dobry

-LCB-

A

coprocessor

for

AI

LISP

Prolog

and

data

bases

-LCB-

In

IEEE

editor

Compcon

pages

-LCB-

Xenologic

-LSB-

-RSB-

T.P.

Dobry

-LCB-

A

High

Performance

Architecture

for

Prolog

-LCB-

Parallel

Processing

and

Fifth

Generation

Computing

Kluwer

Academic

Publishers

-LSB-

-RSB-

T.P.

Dobry

A.M.

Despain

and

Y.N.

Patt

-LCB-

Performance

studies

of

a

Prolog

machine

architecture

-LCB-

In

Proceedings

of

the

Annual

International

Conference

on

Computer

Architecture

pages

-LCB-

IEEE/ACM

IEEE

Computer

Society

Press

May

-LSB-

-RSB-

T.P.

Dobry

Y.N.

Patt

and

A.M.

Despain

-LCB-

Design

decisions

influencing

the

microarchitecture

for

a

Prolog

machine

-LCB-

In

ACM

SIGMICRO

Newsletter

MICRO

Proceedings

pages

-LCB-

December

-LCB-

ACM

SIGMICRO

Newsletter

Vol

Nb

-LSB-

-RSB-

M.

Dorochevsky

-LCB-

KCM-Sepia

implementation

-LCB-

Technical

Report

ECRC

December

-LSB-

-RSB-

M.

Dorochevsky

-LCB-

Key

features

of

a

Prolog

module

system

-LCB-

Technical

Report

ECRC

March

-LSB-

-RSB-

M.

Dorochevsky

J.

Noy?e

and

O.

Thibault

-LCB-

Has

dedicated

hardware

for

Prolog

a

future

-LCB-

In

H.

Boley

and

M.M.

Richter

editors

Processing

Declarative

Knowledge

International

Workshop

PDK

Proceedings

pages

-LCB-

SpringerVerlag

July

Une

etude

approfondie

de

la

WAM

-LSB-

-RSB-

M.

Dorochevsky

and

A.

V?eron

-LCB-

Binding

techniques

and

garbage

collection

for

OR-Parallel

CLP

systems

-LCB-

In

Bruynooghe

and

Wirsing

-LSB-

-RSB-

pages

-LCB-

-LSB-

-RSB-

M.

Ducass?e

and

A.-M

Emde

-LCB-

Opium

a

debugging

environment

for

Prolog

development

and

debugging

research

-LCB-

ACM

Software

Engineering

Notes

-LRB-

-RRB-

-LCB-

January

-LSB-

-RSB-

ECRC

Munich

Germany

-LCB-

ECLiPSe

User

Manual

August

-LSB-

-RSB-

ECRC

Munich

Germany

-LCB-

ECLiPSe

User

Manual

January

-LSB-

-RSB-

T.

Fr?uwirth

A.

Herold

V.

K?uchenhoff

T.

Le

Provost

P.

Lim

E.

Monfroy

and

M.

Wallace

-LCB-

Constraint

logic

programming

an

informal

introduction

-LCB-

In

G.

Comyn

N.E.

Fuchs

and

M.J.

Ratcliffe

editors

Logic

Programming

in

Action

Second

International

Logic

Programming

Summer

School

LPSS

volume

of

Lecture

Notes

in

Artificial

Intelligence

Springer-Verlag

September

-LSB-

-RSB-

D.

Gudeman

-LCB-

Representing

type

information

in

dynamically

typed

languages

-LCB-

Technical

Report

TR

Department

of

Computer

Science

The

University

of

Arizona

October

-LSB-

-RSB-

M.

Hermenegildo

and

J.

Penjam

editors

-LCB-

Proceedings

of

the

International

Symposium

on

Programming

Language

Implementation

and

Logic

Programming

number

in

Lecture

Notes

in

Computer

Science

Madrid

Spain

September

-LSB-

-RSB-

T.

Hickey

and

S.

Mudambi

-LCB-

Global

compilation

of

Prolog

-LCB-

Journal

of

Logic

Programming

-LRB-

-RRB-

-LCB-

November

-LSB-

-RSB-

M.

Hill

S.

Eggers

J.

Larus

G.

Taylor

G.

Adams

B.K.

Bose

G.

Gibson

P.

Hansen

J.

Keller

S.

Kong

C.

Lee

D.

Lee

J.

Pendleton

S.

Ritchie

D.

Wood

B.

Zorn

P.

Hilfinger

D.

Hodges

R.

Kerz

J.

Ousterhout

and

D.

Patterson

-LCB-

Design

decisions

in

SPUR

-LCB-

Computer

-LRB-

-RRB-

-LCB-

November

-LSB-

-RSB-

P.M.

Hill

and

J.W.

Lloyd

-LCB-

The

G?odel

Programming

Language

-LCB-

MIT

Press

-LSB-

-RSB-

C.J.

Hogger

-LCB-

Introduction

to

Logic

Programming

-LCB-

Academic

Press

-LSB-

-RSB-

S.

H?olldobler

-LCB-

On

the

Foundations

of

Equational

Logic

Programming

volume

of

Lecture

Notes

in

Computer

Science

-LCB-

Springer-Verlag

-LSB-

-RSB-

B.K.

Holmer

B.

Sano

M.

Carlton

P.

Van

Roy

R.

Haygood

W.R.

Bush

and

A.M.

Despain

-LCB-

Fast

Prolog

with

an

extended

general

purpose

architecture

-LCB-

In

Proceedings

of

the

Annual

International

Conference

on

Computer

Architecture

IEEE/ACM

IEEE

Computer

Society

Press

May

-LSB-

-RSB-

C.

Holzbaur

-LCB-

Metastructures

vs.

attributed

variables

in

the

context

of

extensible

unification

-LCB-

In

Bruynooghe

and

Wirsing

-LSB-

-RSB-

pages

-LCB-

R?ef?erences

bibliographiques

-LSB-

-RSB-

ICL/ECRC

-LCB-

SEPIA

User

Manual

June

-LSB-

-RSB-

IEEE

-LCB-

Proceedings

of

the

Symposium

on

Logic

Programming

Salt

Lake

City

Utah

USA

September

IEEE

Computer

Society

Press

-LSB-

-RSB-

IEEE

-LCB-

Proceedings

of

the

Symposium

on

Logic

Programming

San

Francisco

California

USA

August

September

IEEE

Computer

Society

Press

-LSB-

-RSB-

J.

Jaffar

and

M.J.

Maher

-LCB-

Constraint

logic

programming

A

survey

-LCB-

Journal

of

Logic

Programming

-LCB-

May/July

-LCB-

Volume

-LCB-

Special

Issue

Ten

Years

of

Logic

Programming

-LSB-

-RSB-

S.

Janson

and

S.

Haridi

-LCB-

Programming

paradigms

of

the

Andorra

kernel

language

-LCB-

In

V.

Saraswat

and

K.

Ueda

editors

Logic

Programming

Proceedings

of

the

International

Symposium

pages

-LCB-

San

Diego

California

USA

MIT

Press

-LSB-

-RSB-

G.

Janssens

B.

Demoen

and

A.

Mari?en

-LCB-

Improving

the

register

allocation

of

WAM

by

recording

unification

-LCB-

In

R.A.

Kowalski

and

K.A.

Bowen

editors

Proceedings

of

the

International

Conference

and

Symposium

on

Logic

Programming

pages

-LCB-

Seattle

August

MIT

Press

-LSB-

-RSB-

K.M.

Kahn

and

M.

Carlsson

-LCB-

How

to

implement

Prolog

on

a

Lisp

machine

-LCB-

In

J.A.

Campbell

editor

Implementations

of

Prolog

Artificial

Intelligence

pages

-LCB-

Ellis

Horwood

-LSB-

-RSB-

R.

Kowalski

-LCB-

Logic

for

Problem

Solving

-LCB-

Artifical

Intelligence

Series

NorthHolland

-LSB-

-RSB-

A.

Krall

and

T.

Berger

-LCB-

Fast

Prolog

with

a

based

Prolog

compiler

-LCB-

In

Bruynooghe

and

Wirsing

-LSB-

-RSB-

pages

-LCB-

-LSB-

-RSB-

P.

Kursawe

-LCB-

How

to

invent

a

Prolog

machine

-LCB-

New

Generation

Computing

-LCB-

-LSB-

-RSB-

S.

Le

Huitouze

-LCB-

Mise

en

Oeuvre

de

Prolog

II/MALI

-LCB-

PhD

thesis

Universit?e

de

Rennes

I

December

-LCB-

In

French

-LSB-

-RSB-

S.

Le

Huitouze

-LCB-

A

new

data

structure

for

implementing

extensions

to

Prolog

-LCB-

In

Deransart

and

Ma

luszy?nski

-LSB-

-RSB-

pages

-LCB-

-LSB-

-RSB-

G.

Levi

and

M.

Martelli

editors

-LCB-

Proceedings

of

the

International

Conference

on

Logic

Programming

MIT

Press

June

-LSB-

-RSB-

T.

Lindgren

-LCB-

A

continuation

passing

style

for

Prolog

-LCB-

In

M.

Bruynooghe

editor

Logic

Programming

Proceedings

of

the

International

Symposium

pages

-LCB-

Ithaca

New

York

USA

MIT

Press

Une

etude

approfondie

de

la

WAM

-LSB-

-RSB-

J.W.

Lloyd

-LCB-

Foundations

of

Logic

Programming

-LCB-

Springer-Verlag

second

extended

edition

-LSB-

-RSB-

E.L.

Lusk

and

R.A.

Overbeek

editors

-LCB-

Proceedings

of

the

North

American

Conference

on

Logic

Programming

MIT

Press

October

-LSB-

-RSB-

V.

S.

Madan

C.-J

Peng

and

G.

S.

Sohi

-LCB-

On

the

adequacy

of

direct

mapped

caches

for

Lisp

and

Prolog

data

reference

patterns

-LCB-

In

Lusk

and

Overbeek

-LSB-

-RSB-

pages

-LCB-

-LSB-

-RSB-

A.

Mari?en

-LCB-

Improving

the

Compilation

of

Prolog

in

the

Framework

of

the

Warren

Abstract

Machine

-LCB-

PhD

thesis

KU

Leuven

September

-LSB-

-RSB-

A.

Mari?en

and

B.

Demoen

-LCB-

On

the

Management

of

Choicepoint

and

Environment

Frames

in

the

WAM

-LCB-

In

Lusk

and

Overbeek

-LSB-

-RSB-

pages

-LCB-

-LSB-

-RSB-

A.

Mari?en

G.

Janssens

A.

Mulkers

and

M.

Bruynooghe

-LCB-

The

impact

of

abstract

interpretation

An

experiment

in

code

generation

-LCB-

In

Levi

and

Martelli

-LSB-

-RSB-

pages

-LCB-

-LSB-

-RSB-

M.

Meier

-LCB-

Event

Handling

in

Prolog

-LCB-

In

Lusk

and

Overbeek

-LSB-

-RSB-

pages

-LCB-

-LSB-

-RSB-

M.

Meier

-LCB-

Shallow

backtracking

in

Prolog

programs

-LCB-

Technical

report

ECRC

April

-LSB-

-RSB-

M.

Meier

-LCB-

Compilation

of

compound

terms

in

Prolog

-LCB-

In

S.

Debray

editor

Proceedings

of

the

North

American

Conference

on

Logic

Programming

pages

-LCB-

MIT

Press

November

-LSB-

-RSB-

M.

Meier

-LCB-

Recursion

vs.

iteration

in

Prolog

-LCB-

In

Proceedings

of

the

International

Conference

on

Logic

Programming

Paris

France

pages

-LCB-

MIT

Press

June

-LSB-

-RSB-

M.

Meier

-LCB-

Better

late

than

never

-LCB-

In

Tick

and

Succi

-LSB-

-RSB-

-LSB-

-RSB-

M.

Meier

A.

Aggoun

D.

Chan

D.

Dufresne

R.

Enders

D.

Henry

de

Villeneuve

A.

Herold

P.

Kay

B.

Perez

E.

van

Rossum

and

J.

Schimpf

-LCB-

SEPIA

an

extendible

Prolog

system

-LCB-

In

G.

Ritter

editor

Proceedings

of

the

World

Computer

Congress

IFIP

pages

-LCB-

IFIP

August

-LSB-

-RSB-

M.

Meier

and

J.

Schimpf

-LCB-

An

architecture

for

Prolog

extensions

-LCB-

In

Proceedings

of

the

Third

International

Workshop

on

Extensions

of

Logic

Programming

pages

-LCB-

Bologna

Italy

-LSB-

-RSB-

C.S.

Mellish

-LCB-

The

automatic

generation

of

mode

declarations

for

Prolog

programs

-LCB-

Research

Report

University

of

Edinburgh

R?ef?erences

bibliographiques

-LSB-

-RSB-

C.S.

Mellish

-LCB-

An

alternative

to

structure

sharing

-LCB-

In

Clark

and

T?arnlund

-LSB-

-RSB-

pages

-LCB-

-LSB-

-RSB-

L.

Moreau

and

C.

Queinnec

-LCB-

Partial

continuations

as

the

difference

of

continuations

a

duumvirate

of

control

operators

-LCB-

In

Hermenegildo

and

Penjam

-LSB-

-RSB-

pages

-LCB-

-LSB-

-RSB-

C.

Moss

-LCB-

CUT

PASTE

defining

the

impure

primitives

of

Prolog

-LCB-

In

Shapiro

-LSB-

-RSB-

pages

-LCB-

-LSB-

-RSB-

G.

Nadathur

and

D.

Miller

-LCB-

An

overview

of

Prolog

-LCB-

In

Proceedings

of

the

Fifth

International

Conference

and

Symposium

on

Logic

Programming

Seattle

USA

pages

-LCB-

MIT

Press

August

-LSB-

-RSB-

L.

Naish

-LCB-

An

introduction

to

MU-Prolog

-LCB-

Technical

Report

University

of

Melbourne

July

-LSB-

-RSB-

L.

Naish

-LCB-

Negation

and

control

in

Prolog

volume

of

Lecture

Notes

in

Computer

Science

-LCB-

Springer-Verlag

-LSB-

-RSB-

L.

Naish

-LCB-

Negation

and

quantifiers

in

NU-Prolog

-LCB-

In

Shapiro

-LSB-

-RSB-

pages

-LCB-

-LSB-

-RSB-

H.

Nakashima

and

K.

Nakajima

-LCB-

Hardware

architecture

of

the

sequential

inference

machine

PSI-II

-LCB-

In

Proceedings

of

the

Symposium

on

Logic

Programming

-LSB-

-RSB-

pages

-LCB-

-LSB-

-RSB-

U.

Neumerkel

-LCB-

Extensible

unification

by

metastructures

-LCB-

In

M.

Bruynooghe

editor

Proceedings

of

the

Workshop

on

Meta-Programming

in

Logic

Programming

pages

-LCB-

K.U.

Leuven

Dept.

of

Computer

Science

-LSB-

-RSB-

J.

Noy?e

-LCB-

ICM

The

abstract

machine

-LCB-

Technical

Report

ECRC

April

-LSB-

-RSB-

J.

Noy?e

-LCB-

KCM

instructions

-LCB-

Technical

Report

and

ECRC

January

-LCB-

In

two

parts

Revised

October

-LSB-

-RSB-

J.

Noy?e

-LCB-

Backtrackable

updates

-LCB-

In

De

Bosschere

et

al.

-LSB-

-RSB-

pages

-LCB-

-LSB-

-RSB-

J.

Noy?e

-LCB-

An

overview

of

the

Knowledge

Crunching

Machine

-LCB-

In

M.

Abdelguerfi

and

S.

Lavington

editors

Emerging

Trends

in

Database

and

Knowledgebase

Machines

IEEE

Computer

Society

Press

November

-LSB-

-RSB-

J.

Noy?e

-LCB-

To

trim

or

not

to

trim

-LCB-

In

Tick

and

Succi

-LSB-

-RSB-

-LSB-

-RSB-

J

Noy?e

and

J.-C

Syre

-LCB-

Design

and

evaluation

of

an

inference

crunching

machine

-LCB-

In

M.

Kitsuregawa

and

H.

Tanaka

editors

Proceedings

of

the

International

Workshop

on

Database

Machines

and

Knowledge

Base

Machines

pages

-LCB-

Kluwer

Academic

Publishers

October

Une

etude

approfondie

de

la

WAM

-LSB-

-RSB-

R.A.

O'Keefe

-LCB-

The

Craft

of

Prolog

-LCB-

MIT

Press

-LSB-

-RSB-

D.A.

Patterson

-LCB-

Reduced

instruction

set

computers

-LCB-

Communications

of

the

ACM

-LRB-

-RRB-

-LCB-

January

-LSB-

-RSB-

D.A.

Plaisted

-LCB-

The

occur-check

problem

in

Prolog

-LCB-

New

Generation

Computing

-LRB-

-RRB-

-LCB-

-LCB-

Reprinted

from

International

Symposium

on

Logic

Programming

February

Atlantic

City

NJ

pp.

IEEE

-LSB-

-RSB-

O.

Ridoux

-LCB-

Mali

Tutorial

and

reference

manual

-LCB-

Internal

Report

IRISA

October

-LSB-

-RSB-

J.A.

Robinson

-LCB-

A

machine-oriented

logic

based

on

the

resolution

principle

-LCB-

JACM

-LRB-

-RRB-

-LCB-

-LSB-

-RSB-

M.L.

Ross

and

K.

Rammaohanarao

-LCB-

Paging

strategy

for

Prolog

based

on

dynamic

virtual

memory

-LCB-

Technical

Report

TR

University

of

Melbourne

August

-LSB-

-RSB-

K.F.

Sagonas

T.

Swift

D.S.

Warren

S.

Dawson

and

P.

Rao

-LCB-

The

XSB

Programmer

's

Manual

Version

-LCB-

SUNY

at

Stony

Brook

May

-LSB-

-RSB-

D.

Sahlin

-LCB-

An

Automatic

Partial

Evaluator

for

Full

Prolog

-LCB-

PhD

thesis

The

Royal

Institute

of

Technology

Stockholm

March

-LSB-

-RSB-

D.

Sahlin

and

M.

Carlsson

-LCB-

Variable

shunting

for

the

WAM

-LCB-

Research

Report

SICS

-LSB-

-RSB-

J.

Schimpf

-LCB-

Garbage

collection

for

Prolog

based

on

twin

cells

-LCB-

In

Proceedings

of

the

NACLP

Workshop

on

Logic

Programming

Architectures

and

Implementations

-LSB-

-RSB-

K.

Seo

and

T.

Yokota

-LCB-

Pegasus

an

ASIC

implementation

of

high-performance

Prolog

processor

-LCB-

In

Euro

ASIC

May

-LSB-

-RSB-

A.P.

Sexton

-LCB-

KCM

macro

assembler

reference

manual

-LCB-

Technical

Report

ECRC

July

-LSB-

-RSB-

A.P.

Sexton

-LCB-

KCM

operating

system

interface

manual

-LCB-

Technical

Report

ECRC

December

-LSB-

-RSB-

E.

Shapiro

editor

-LCB-

Proceedings

of

the

Third

International

Conference

on

Logic

Programming

number

in

Lecture

Notes

in

Computer

Science

London

July

Springer-Verlag

-LSB-

-RSB-

Z.

Somogyi

F.

Henderson

and

T.

Conway

-LCB-

The

implementation

of

Mercury

an

efficient

purely

declarative

logic

programming

language

-LCB-

In

De

Bosschere

et

al.

-LSB-

-RSB-

pages

-LCB-

R?ef?erences

bibliographiques

-LSB-

-RSB-

R.M.

Stallman

-LCB-

Using

and

Porting

GNU

CC

-LCB-

Free

Software

Foundation

October

-LCB-

for

GCC

version

-LSB-

-RSB-

L.

Sterling

and

E.

Shapiro

-LCB-

The

Art

of

Prolog

Advanced

Programming

Techniques

-LCB-

MIT

Press

edition

-LSB-

-RSB-

P.

Tarau

-LCB-

A

compiler

and

a

simplified

abstract

machine

for

the

execution

of

binary

metaprograms

-LCB-

In

Proceedings

of

the

Logic

Programming

Conference

pages

-LCB-

Tokyo

Japan

September

ICOT

-LSB-

-RSB-

P.

Tarau

-LCB-

Ecological

memory

management

in

a

continuation

passing

Prolog

engine

-LCB-

In

Bekkers

and

Cohen

-LSB-

-RSB-

pages

-LCB-

-LSB-

-RSB-

P.

Tarau

-LCB-

Low-level

issues

in

implementing

a

high-performance

continuation

passing

binary

prolog

engine

-LCB-

In

Actes

des

Journ?ees

Francaises

de

Programmation

Logique

-LSB-

-RSB-

P.

Tarau

and

M.

Boyer

-LCB-

Elementary

logic

programs

-LCB-

In

Deransart

and

Ma

luszy?nski

-LSB-

-RSB-

pages

-LCB-

-LSB-

-RSB-

P.

Tarau

and

U.

Neumerkel

-LCB-

A

novel

term

compression

scheme

and

data

representation

in

the

BinWAM

-LCB-

In

Hermenegildo

and

Penjam

-LSB-

-RSB-

pages

-LCB-

-LSB-

-RSB-

A.

Taylor

-LCB-

LIPS

on

a

MIPS

Results

from

a

Prolog

compiler

for

a

RISC

-LCB-

In

D.H.D.

Warren

and

P.

Szeredi

editors

Proceedings

of

the

Int

Conf

on

Logic

Programming

pages

-LCB-

Jerusalem

Israel

June

MIT

Press

-LSB-

-RSB-

A.

Taylor

-LCB-

High

Performance

Prolog

Implementation

-LCB-

PhD

thesis

Basser

Department

of

Computer

Science

University

of

Sydney

June

-LSB-

-RSB-

A.

Taylor

-LCB-

High

performance

Prolog

on

a

RISC

-LCB-

New

Generation

Computing

-LCB-

-LSB-

-RSB-

O.

Thibault

-LCB-

Hardware

evaluation

of

KCM

-LCB-

In

Tools

For

Artificial

Intelligence

pages

-LCB-

IEEE

IEEE

Computer

Society

Press

November

-LSB-

-RSB-

O.

Thibault

-LCB-

Design

and

Evaluation

of

a

Symbolic

Processor

-LCB-

PhD

thesis

Universit?e

Paul

Sabatier

Toulouse

III

Toulouse

France

Mai

-LSB-

-RSB-

E.

Tick

-LCB-

Prolog

memory-referencing

behavior

-LCB-

Technical

Report

Stanford

University

September

-LSB-

-RSB-

E.

Tick

-LCB-

Lisp

and

Prolog

memory

performance

-LCB-

Technical

Report

Stanford

University

January

-LSB-

-RSB-

E.

Tick

-LCB-

Memory

Performance

of

Prolog

Architectures

-LCB-

Frontiers

in

Logic

Programming

Architecture

and

Machine

Design

Kluwer

Academic

Publishers

Une

etude

approfondie

de

la

WAM

-LSB-

-RSB-

E.

Tick

-LCB-

Memory

and

buffer-referencing

characteristics

of

a

WAM-based

Prolog

-LCB-

Journal

of

Logic

Programming

-LCB-

-LSB-

-RSB-

E.

Tick

and

G.

Succi

editors

-LCB-

Implementations

of

Logic

Programming

Systems

-LCB-

Kluwer

Academic

Publishers

-LSB-

-RSB-

E.

Tick

and

D.H.D.

Warren

-LCB-

Towards

a

pipelined

Prolog

processor

-LCB-

In

International

Symposium

on

Logic

Programming

pages

-LCB-

Atlantic

City

New

Jersey

USA

February

IEEE

Computer

Society

Press

-LSB-

-RSB-

H.

Touati

and

A.

Despain

-LCB-

An

empirical

study

of

the

Warren

Abstract

Machine

-LCB-

In

Proceedings

of

the

Symposium

on

Logic

Programming

-LSB-

-RSB-

pages

-LCB-

-LSB-

-RSB-

A.

K.

Turk

-LCB-

Compiler

optimizations

for

the

WAM

-LCB-

In

Shapiro

-LSB-

-RSB-

pages

-LCB-

-LSB-

-RSB-

M.

Van

Caneghem

-LCB-

L'anatomie

de

Prolog

II

-LCB-

InterEditions

Paris

-LSB-

-RSB-

P.

Van

Hentenryck

-LCB-

Constraint

Satisfaction

in

Logic

Programming

-LCB-

Logic

Programming

MIT

Press

-LSB-

-RSB-

E.

van

Rossum

-LCB-

Impl?ementation

d'un

debugger

Prolog

-LCB-

Master

's

thesis

Facult?es

Universitaires

N.D.

de

la

Paix

Namur

-LCB-

In

French

-LSB-

-RSB-

P.

Van

Roy

-LCB-

Can

Logic

Programming

Execute

as

Fast

as

Imperative

Programming

-LCB-

PhD

thesis

University

of

California

Berkeley

December

-LSB-

-RSB-

P.

Van

Roy

-LCB-

The

wonder

years

of

sequential

Prolog

implementation

-LCB-

Journal

of

Logic

Programming

-LCB-

May/July

-LCB-

Volume

-LCB-

Special

Issue

Ten

Years

of

Logic

Programming

-LSB-

-RSB-

P.

Van

Roy

B.

Demoen

and

Y.D.

Willems

-LCB-

Improving

the

execution

speed

of

compiled

Prolog

with

modes

clause

selection

and

determinism

-LCB-

In

TAP

SOFT

Proceedings

of

the

International

Joint

Conference

of

Theory

and

Practice

of

Software

Development

Lecture

Notes

in

Computer

Science

pages

-LCB-

Springer-Verlag

March

-LSB-

-RSB-

P.

Van

Roy

and

A.

M.

Despain

-LCB-

High-performance

logic

programming

with

the

Aquarius

Prolog

compiler

-LCB-

Computer

-LRB-

-RRB-

-LCB-

January

-LSB-

-RSB-

P.

Van

Roy

T.

Lindholm

R.A.

O'Keefe

and

A.

Krall

-LCB-

Net

Talk

term

comparisons

with

variables

-LCB-

ALP

Newsletter

Volume

November

-LSB-

-RSB-

D.H.D.

Warren

-LCB-

Implementing

Prolog

compiling

predicate

logic

programs

-LCB-

Research

Report

and

University

of

Edinburgh

Department

of

Artificial

Intelligence

R?ef?erences

bibliographiques

-LSB-

-RSB-

D.H.D.

Warren

-LCB-

An

improved

Prolog

implementation

which

optimises

tail

recursion

-LCB-

In

Logic

Programming

Workshop

Debrecen

Hungary

July

-LSB-

-RSB-

D.H.D.

Warren

-LCB-

An

abstract

Prolog

instruction

set

-LCB-

Technical

Note

SRI

International

October

-LSB-

-RSB-

D.H.D.

Warren

-LCB-

The

SRI

model

for

or-parallel

execution

of

Prolog

Abstract

design

and

implementation

-LCB-

In

Proceedings

of

the

Symposium

on

Logic

Programming

-LSB-

-RSB-

pages

-LCB-

-LSB-

-RSB-

D.S.

Warren

editor

-LCB-

Proceedings

of

the

International

Conference

on

Logic

Programming

Budapest

Hungary

MIT

Press

-LSB-

-RSB-

G.

Watzlawik

-LCB-

KCM

microcoding

manual

-LCB-

Technical

Report

ECRC

March

-LCB-

In

two

parts

-LSB-

-RSB-

G.

Watzlawik

H.

Benker

and

J.

Noy?e

-LCB-

-LCB-

Technical

Report

ECRC

February

-LSB-

-RSB-

Xenologic

-LCB-

Assembly

Programming

Manual

November

-LSB-

-RSB-

N.-F

Zhou

-LCB-

Global

optimizations

in

a

Prolog

compiler

for

the

TOAM

-LCB-

The

Journal

of

Logic

Programming

-LRB-

-RRB-

-LCB-

April

-LSB-

-RSB-

N.-F

Zhou

-LCB-

On

the

direct

parameter

passing

mechanism

for

Prolog

compilers

-LCB-

In

D.

Miller

editor

Logic

Programming

Proceedings

of

the

International

Symposium

Vancouver

Canada

Logic

Programming

series

Research

Reports

and

Notes

MIT

Press

October

-LCB-

Poster

-LSB-

-RSB-

N.-F

Zhou

-LCB-

On

the

scheme

of

passing

arguments

in

stack

frames

for

Prolog

-LCB-

In

P.

Van

Hentenryck

editor

Proceedings

of

the

International

Conference

on

Logic

Programming

pages

-LCB-

Santa

Margherita

Italy

MIT

Press

-LSB-

-RSB-

B.G.

Zorn

-LCB-

Comparing

mark-and-sweep

and

stop-and-copy

garbage

collection

-LCB-

In

Proceedings

of

the

ACM

Conference

on

Lisp

and

Functional

Programming

pages

-LCB-

Nice

France

June

ACM

Press

Index

termes

Prolog

affectation

destructive

-LCB-

A

t-Kaci

-LRB-

tutoriel

-RRB-

analyse

globale

Aquarius

arbre

de

recherche

architecture

Harvard

argument

registre

temporaire

arit?e

d'un

point

de

choix

champ

attribut

Aurora

auto-r

ef?erence

prisonni?ere

repr?esentation

B

voir

point

de

choix

courant

backtrack

point

voir

point

de

choix

courant

backtrack

program

pointer

voir

point

de

retour

arri?ere

BAM

binarisation

BinProlog

BP

voir

point

de

retour

arri?ere

cellule

de

foncteur

de

terme

compos?e

m?emoire

variable

a

attribut

cha

ne

de

liaisons

champ

de

substitution

CHIP

clause

binaire

d?efinie

r?eguli?ere

code

emul?e

natif

compilation

en

ligne

KCM

vers

C

compression

de

chemin

compteur

ordinal

constante

construction

conditionnelle

continuation

d'

echec

de

succ?es

continuation

program

pointer

voir

point

de

continuation

contraintes

copie

de

structures

coroutinage

coupe-choix

voir

coupure

coupure

-LCB-

avec

r?ecup?eration

m?emoire

drapeau

de

et

tra

nage

aveugle

influence

de

l'indexation

locale

port?ee

profonde

s?elective

standard

Index

superficielle

court-circuit

de

variable

anticip?e

CP

voir

point

de

continuation

cr?eation

anticip?ee

des

environnements

cr?eation

retard?ee

des

environnements

des

points

de

choix

cut

point

voir

point

de

coupure

dangling

reference

voir

r?ef?erence

illicite

PLM

d?eliaison

anticip?ee

d?er?ef?erenciation

d?erivation

d?etra

nage

s?electif

drapeau

de

coupure

duplication

de

cible

de

branchement

E

voir

environnement

courant

early

reset

voir

d?eliaison

anticip?ee

echec

primitive

d'

r?eduit

standard

ECLiPSe

ECRC-Prolog

point

de

choix

elagage

des

environnements

a

prix

r?eduit

anticip?e

KCM

retard?e

KCM

WAM

elagage

des

points

de

choix

ElipSys

empilement

d'environnements

de

buts

environnement

-LCB-

Aurora

courant

cr?eation

anticip?ee

cr?eation

retard?ee

elagage

elagage

retard?e

enregistrement

d'activation

KCM

r?eutilisation

inter-clauses

intra-clause

SEPIA

SICStus

Prolog

sommet

de

pile

locale

explicite

taille

taille

explicite

WAM

estampillage

des

liaisons

etat

d?eterministe

etiquetage

des

donn?ees

des

pointeurs

etiquette

fait

foncteur

cellule

de

fuite

de

m?emoire

G

voir

sommet

de

la

pile

globale

garde

GB

voir

point

de

retour

arri?ere

sur

la

pile

globale

globalisation

KCM

heap

backtrack

point

voir

point

de

retour

arri?ere

sur

la

pile

globale

ICM

point

de

choix

incr?ement

de

r?esolvante

indexation

Index

KCM

ISO

KCM

-LCB-

compilation

en

ligne

environnement

globalisation

indexation

pile

double

point

de

choix

primitive

d'

echec

last

argument

overlapping

voir

recouvrement

du

dernier

argument

last

backtrack

point

voir

point

de

choix

courant

last

environment

voir

environnement

courant

lecture

retard?ee

des

points

de

choix

logique

d'utilit

e

machine

abstraite

MALI

m?eta

interpr?ete

m?eta

structure

mode

d'unification

de

retour

arri?ere

ecriture

lecture

point

de

choix

modification

des

registres

arguments

MPPM

MU-Prolog

nettoyage

de

la

tra

n?ee

agencement

du

point

de

choix

NTOAM

NU-Prolog

op?erateur

de

choix

de

coupure

voir

coupure

optimisation

d'appel

terminal

de

r?ecursion

a

gauche

terminale

P

voir

compteur

ordinal

parall?elisme

Parma

partage

de

s?equences

d'instructions

de

structures

des

clauses

des

repr?esentations

de

variables

des

r?esolvantes

point

de

choix

et

environnement

partage

de

structures

passage

de

continuation

Pegasus

pile

de

recherche

double

KCM

globale

locale

sommet

machine

PLM

point

de

choix

-LCB-

arit?e

champ

constante

courant

cr?eation

retard?ee

compilation

ECRC-Prolog

elagage

ICM

lecture

retard?ee

KCM

nettoyage

de

la

tra

n?ee

partiel

Index

r?eel

KCM

r?eutilisation

SICStus

Prolog

virtuel

WAM

point

de

continuation

point

de

coupure

point

de

retour

arri?ere

sur

la

pile

globale

sur

la

pile

locale

sur

la

tra

n?ee

pointeur

de

structure

port?ee

de

la

coupure

primitive

d'

echec

KCM

principe

de

procrastination

ProLog

by

BIM

Prolog/MALI

pseudo

pr?edicat

PSI-II

Quintus

Prolog

recouvrement

du

dernier

argument

r?ecup?eration

m?emoire

d?eclenchement

et

m?emoire

virtuelle

g?en?erationnelle

instantan?ee

par

copie

par

marquage

et

compactage

par

marquage

et

copie

segment?ee

r?ef?erence

a

attribut

partage

illicite

registre

argument

modification

p?enurie

r?egle

de

calcul

de

recherche

repr?esentation

d?er?ef?erenc?ee

r?esolution

SLD

r?esolvante

courante

retour

arri?ere

PLM

profond

superficiel

KCM

zone

de

table

d'adresses

r?eutilisation

des

environnements

inter-clauses

intra-clause

des

points

de

choix

S

voir

pointeur

de

structure

segment

SEPIA

SICStus

Prolog

soft

cut

voir

coupure

s?elective

sommet

de

la

pile

globale

de

la

pile

locale

de

la

tra

n?ee

sp?ecialisation

de

code

source

de

s?equences

d'instructions

structure

structure

de

contr

ole

unique

structure

pointer

voir

pointeur

de

structure

substitution

champ

succ?es

T

voir

sommet

de

la

tra

n?ee

Index

tag-on-data

voir

etiquetage

des

donn?ees

tag-on-pointer

voir

etiquetage

des

pointeurs

tas

voir

pile

globale

TB

voir

point

de

retour

arri?ere

sur

la

tra

n?ee

terme

compos?e

cellule

de

infini

interpr?et?e

modifiable

rationnel

repr?esentation

test

d'occurrence

de

globalisation

de

tra

nage

TOAM

top

of

heap

voir

sommet

de

la

pile

globale

of

trail

voir

sommet

de

la

tra

n?ee

trail

voir

tra

n?ee

trail

tidying

voir

nettoyage

de

la

tra

n?ee

tra

nage

aveugle

-LCB-

de

valeur

multiple

tra

n?ee

nettoyage

transformation

de

programmes

Tricia

trimming

voir

elagage

trous

cr?eation

de

typage

unification

algorithme

et

variables

a

attribut

etendue

extensible

syntaxique

et

s?emantique

valeur

de

liaison

VAM

variable

a

attribut

globale

globalisable

KCM

instanci?ee

libre

li?ee

locale

permanente

a

ecriture

unique

temporaire

variable

shunting

voir

court-circuit

de

variable

VLSI-BAM

WAM

auto-r

ef?erence

prisonni?ere

code

empilement

d'environnements

environnement

gestion

des

liaisons

indexation

machine

abstraite

point

de

choix

points

de

continuation

registres

repr?esentation

des

termes

retour

arri?ere

superficiel

tas

variable

globalisable

variable

permanente

XSB

zone

de

retour

arri?ere

superficiel

R?esum?e

Cette

th?ese

etudie

en

profondeur

quatre

aspects

importants

de

la

mise

en

oeuvre

de

Prolog

dans

le

contexte

de

la

WAM

-LRB-

machine

abstraite

de

Warren

-RRB-

et

de

ses

variantes

Les

trois

premiers

aspects

le

contr

ole

avant

le

retour

arri?ere

et

la

coupure

couvrent

la

majeure

partie

du

contr

ole

standard

de

Prolog

Le

dernier

aspect

traite

des

techniques

de

modification

r?eversible

Sur

chacun

de

ces

aspects

nous

faisons

le

point

sur

les

nombreuses

variantes

de

la

WAM

Accessoirement

un

certain

nombre

de

choix

effectu?es

lors

de

la

conception

de

la

machine

KCM

-LRB-

Knowledge

Crunching

Machine

-RRB-

sont

pr?esent?es

et

valid?es

La

WAM

se

caract?erise

essentiellement

par

une

repr?esentation

du

contr

ole

par

partage

de

structures

Ce

choix

se

justifie

par

une

politique

visant

a

compiler

autant

que

se

peut

la

r?ecup?eration

de

la

m?emoire

allou?ee

au

contr

ole

Tirer

toutes

les

cons?equences

de

ce

choix

nous

conduit

a

privil?egier

les

raffinements

de

la

WAM

suivants

double

pile

de

contr

ole

elagage

des

points

de

choix

et

r?eutilisation

des

blocs

de

contr

ole

Sont

aussi

etudi?ees

des

techniques

visant

a

limiter

le

trafic

m?emoire

notamment

lors

de

retours

arri?ere

superficiels

et

la

compilation

de

la

coupure

par

transformation

de

programmes

Les

techniques

de

modification

r?eversible

jouent

un

r

ole

majeur

dans

la

mise

en

oeuvre

de

nombreuses

extensions

par

exemple

contraintes

et

termes

Elles

fournissent

un

bon

exemple

de

la

mani?ere

d'

etendre

les

possibilit?es

d'un

syst?eme

Prolog

a

partir

de

modifications

mineures

du

moteur

Prolog

de

base

Nous

montrons

comment

pallier

aux

inconv?enients

des

impl?ementations

classiques

unification

ou

affectation

destructive

de

ces

techniques

Mots-Cl

es

programmation

en

logique

sch?emas

d'ex

ecution

machines

Prolog

compilation

WAM

-LRB-

machine

abstraite

de

Warren

-RRB-

Abstract

This

thesis

studies

in

depth

four

main

aspects

of

Prolog

implementation

in

the

context

of

the

WAM

-LRB-

Warren

abstract

machine

-RRB-

and

its

variants

The

first

three

aspects

forward

execution

shallow

backtracking

and

pruning

cover

most

of

Prolog

standard

control

The

fourth

aspect

deals

with

backtrackable

updates

For

each

of

these

aspects

the

main

WAM

variants

are

reviewed

in

a

reasoned

way

In

addition

a

number

of

choices

made

during

the

design

of

the

KCM

-LRB-

Knowledge

Crunching

Machine

-RRB-

are

presented

and

validated

The

WAM

can

basically

be

characterized

by

a

structure

sharing

representation

of

control

This

choice

is

justified

through

a

policy

intended

to

compile

as

much

as

possible

the

recovery

of

memory

allocated

for

control

purposes

Drawing

all

the

consequences

of

this

choice

leads

us

to

promote

the

following

WAM

refinements

split-stack

architecture

choice

point

trimming

and

control

frame

reuse

The

reduction

of

memory

traffic

in

particular

during

shallow

backtracking

and

the

compilation

of

the

cut

operator

via

program

transformation

are

also

studied

Backtrackable

updates

are

essential

to

the

implementation

of

many

Prolog

extensions

like

constraints

and

terms

The

introduction

of

backtrackable

updates

provides

a

good

example

of

how

much

more

powerful

systems

can

be

built

with

very

limited

changes

to

the

basic

Prolog

engine

It

is

shown

that

standard

implementations

based

either

on

unification

or

on

destructive

assignments

have

some

flaws

Remedies

are

considered