Länkning av Prolog under C

Relevanta dokument
732G Linköpings universitet 732G11. Johan Jernlås. Översikt. Repetition. Felsökning. Datatyper. Referenstyper. Metoder / funktioner

TDIU01 - Programmering i C++, grundkurs

F5: Högnivåprogrammering

F5: Högnivåprogrammering

TDDC77 Objektorienterad Programmering

Classes och Interfaces, Objects och References, Initialization

Objektorienterad Programmering (TDDC77)

Classes och Interfaces, Objects och References Objekt-orienterad programmering och design (DIT952) Niklas Broberg, 2016

I Skapa Hej.java och skriv programmet. I Kompilera med javac Hej.java. I Rätta fel och repetera tills du lyckas kompilera ditt program

ITK:P1 Föreläsning 1. Programmering. Programmeringsspråket Java. Stark typning Explicit typning Strukturerat Hög säkerhet

Arv: Fordonsexempel. Arv. Arv: fordonsexempel (forts) Arv: Ett exempel. En klassdefinition class A extends B {... }

Typkonvertering. Java versus C

Föreläsning 9 i programmeringsparadigm. Unifiering (Brna Chapter 4.1).

LÖSNINGSFÖRSLAG Programmeringsteknik För Ing. - Java, 5p

Gissa det hemliga talet

Dagens föreläsning. Diverse Common Lisp. Konstanter, parametrar, globala variabler

5. En metod som anropar sig själv a) får inte förekomma i Java-program b) kallas destruktiv c) kallas iterativ d) kallas rekursiv 6. Vilka värden har

Föreläsning 5-6 Innehåll. Exempel på program med objekt. Exempel: kvadratobjekt. Objekt. Skapa och använda objekt Skriva egna klasser

Introduktion till Datalogi DD1339. Föreläsning 2 22 sept 2014

Programmera i C Varför programmera i C när det finns språk som Simula och Pascal??

Föreläsning 5-6 Innehåll

(Man brukar säga att) Java är... Denna föreläsning. Kompilering av Java. Historik: Java. enkelt. baserat på C/C++ Allmänt om Java

Programmering B med Visual C

Vad händer när man kör ett program? Program och processer. Funktionsanrop. Avsluta programmet

Datatyper och kontrollstrukturer. Skansholm: Kapitel 2) De åtta primitiva typerna. Typ Innehåll Defaultvärde Storlek

Dynamiskt minne. Vad är dynamiskt minne Motivering Hur gör man i C Övningar

Idag. Javas datatyper, arrayer, referenssemantik. Arv, polymorfi, typregler, typkonvertering. Tänker inte säga nåt om det som är likadant som i C.

Motivation. Programmeringsuppgift: En första ansats: Lagra info om anställda Håll reda på varje anställds närmaste chef. som också är en anställd!

Diagnostiskt Prov. Antaganden Om förutsättningar saknas I en uppgift skall rimliga antaganden göras och nedtecknas.

Övning från förra gången: readword

Objektorienterad Programmering (TDDC77)

Föreläsning 2 Objektorienterad programmering DD1332. Typomvandling

Programmering för språkteknologer I, VT2012. Rum

Johan Karlsson Datavetenskap för teknisk kemi, 10p, moment 1 Datavetenskap Umeå Universitet. Tentamen

Tentamen FYTA11 Javaprogrammering

Programmering av inbyggda system. Kodningskonventioner. Viktor Kämpe

Programmeringsteknik med C och Matlab

Lite om felhantering och Exceptions Mer om variabler och parametrar Fält (eng array) och klassen ArrayList.

Stack och subrutiner Programmeringskonventionen

Lösningar till tentamen i EIT070 Datorteknik

Miniprojekt: MEX och molekyldynamik

Objektorienterad programmering i Java I. Uppgifter: 2 Beräknad tid: 5-8 timmar (OBS! Endast ett labbtillfälle) Att läsa: kapitel 5 6

Övningsuppgifter kapitel 8

Programmering, grundkurs, 8.0 hp HI1024, HI1900 etc., Tentamen TEN1. Måndagen den 10 januari 2011,

Föreläsning 4. Klass. Klassdeklaration. Klasser Och Objekt

Högskolan Dalarna sid 1 av 7 DI-institutionen Hans-Edy Mårtensson Sten Sundin

FÖRSLAG TILL LÖSNINGAR FÖR TENTAMEN I INTERNETPROGRAMMERING MED JAVA, 5p för SY , kl

Skizz till en enkel databas

DD1361 Programmeringsparadigm. Carina Edlund

DIAGNOSTISKT PROV. Tid. Hjälpmedel. Antaganden. Rättning. Övrigt. Diagnostiskt Prov. Klockan Inga

Tentamen ID1004 Objektorienterad programmering October 29, 2013

DD1361 Programmeringsparadigm HT15

I denna laboration undersöker vi hur aritmetiska beräkningar utförs. Vi tittar på olika variabeltyper: 8-bitars, 16-bitars, 32-bitars och flyttal.

Assemblerprogrammering, ARM-Cortex M4 del 3

Introduktion till arv

Inlämningsuppgift : Finn. 2D1418 Språkteknologi. Christoffer Sabel E-post: csabel@kth.se 1

Programmeringsteknik med C och Matlab

Språket Python - Del 1 Grundkurs i programmering med Python

Programmering med Java. Grunderna. Programspråket Java. Programmering med Java. Källkodsexempel. Java API-exempel In- och utmatning.

Vem är vem på kursen. Objektorienterad programvaruutveckling GU (DIT011) Kursbok Cay Horstmann: Big Java 3rd edition.

2 Pekare och dynamiska variabler.

Det finns många flaggor till g++,

Anteckningar 1: Grundläggande saker

Programsystemkonstruktion med C++: Övning 1. Karl Palmskog september 2010

Bankkonto - övning. Övning 2 Skriv en metod, geträntan, som returnerar räntan.

Föreläsning 3-4 Innehåll

Namn: Personnr: 1 2D1310 Programmeringsteknik i Java för B,V (1p) 13 januari 2001, kl Hjälpmedel: En Javabok. För betyget godkänt krävs at

Digital- och datorteknik

Objektorienterade programmeringsspråk. Objektorienterade språk. Den objekt-orienterade modellen. Jämför med icke-oo

KLASSER. Inkapsling Abstrakt datatyp Public och private. Klassmedlemmar Datamedlemmar Exempel Funktionsmedlemmar

Konvertering från sträng. Winstrand Development

Övning2. Variabler. Data typer

Felhantering TDDD78, TDDE30, 729A

F8: Typkonvertering i C++

Tentamen *:58/ID100V Programmering i C Exempel 3

Övningar Dag 2 En första klass

2D1311 Programmeringsteknik för Bio1 och Bio2, vt 2003 Fiktivt prov På flervalsfrågorna är endast ett svar rätt om inget annat anges i frågan! Det rik

#include <stdio.h> #include <string.h>

Enkla datatyper minne

Kompilering och exekvering. Föreläsning 1 Objektorienterad programmering DD1332. En kompilerbar och körbar java-kod. Kompilering och exekvering

Static vs Dynamic binding Polymorfism. Objekt-orienterad programmering och design (DIT953) Niklas Broberg, 2018

Grundläggande programmering med C# 7,5 högskolepoäng

Dagens föreläsning. Repetition. Repetition - Programmering i C. Repetition - Vad C består av. Repetition Ett första C-program

C++ - En introduktion

Institutionen för elektro- och informationsteknologi, LTH

Datorteknik. Föreläsning 5. Realtidssystem och realtidsprogrammering. Institutionen för elektro- och informationsteknologi, LTH.

EDAA20 Programmering och databaser. Mål komprimerat se kursplanen för detaljer. Checklista. Föreläsning 1-2 Innehåll. Programmering.

Föreläsning 8 - del 2: Objektorienterad programmering - avancerat

Tentamen OOP

Föreläsning 3-4 Innehåll. Diskutera. Metod. Programexempel med metod

Static vs Dynamic binding Polymorfism. Objekt-orienterad programmering och design Alex Gerdes, 2016

Mål. Datorteknik. Innehåll. Innehåll (forts) Hur ser ett program ut? Hur skapas maskinkoden?

C++ Objektorientering - Klasser. Eric Elfving

732G Linköpings universitet 732G11. Johan Jernlås. Översikt. Repetition. Muddy. Funktioner / metoder. Punktnotation. Evalueringsordning

Programsystemkonstruktion med C++: Övning 2. Karl Palmskog september 2010

Variabler, värden och typer

Variabler, värden och typer

Funktionspekare, inledning: funktionsanropsmekanismen. Anrop via pekare

Polymorfi. Objektorienterad och komponentbaserad programmering

DD1361 Programmeringsparadigm HT15

Transkript:

Länkning av Prolog under C Kent Boortz Swedish Institute of Computer Science Box 1263, S-164 28 Kista, Sweden 1 september 1991 T91:14 Sammanfattning SICStus länkmoduler ger möjlighet att blanda Prolog- och C-kod. Till skillnad från SICStus "Foreign Interface" kan anrop ske åt båda håll från Prolog till C och från C till Prolog. 1. Inledning Detta är en översiktlig teknisk beskrivning av SICStus länkmodulsystem. Läsaren förutsätts ha tillgång till källkod och kännedom om övriga delar av systemet. 2. Systemets delar SICStus länkmodulsystem ger möjlighet att blanda Prolog och C och är en utökning av Prologsystemet. Inga betydande förändringar av grundsystemet har gjorts. Ett länkmodulsystem består av: Användarens Prolog- och C-program SICStus emulator som ett bibliotek Gränssnittsfunktioner och deklarationer sicstus.c och sicstus.h Systempredikat och runtime -system skrivna i Prolog 3. Användning Den Prologkod som ska ingå i användarens program kompileras med det normala SICStussystemet till "Quick Load"-filer. Kontrollen av exekveringen av Prolog från C sker enligt nedanstående mönster. 1. Initiera Prolog-systemet SP_initialize() Prologs dataareor initieras och runtimesystemet laddas in. 2. Ladda in Prolog-programmet SP_load() Användarens "Quick Load"-filer laddas in. 3. Ta fram predikatets definition SP_predicate() Detta ger oss en referens till en struktur i minnet som motsvarar predikatets definition. 1

# Länkning av Prolog under C, K. Boortz, SICS/LPS 4. Skapa målet Argumenten till målet lagras i Prologs temporärregister och i en struktur som används vid skräpsamling. En valpunkt och en omgivning skapas för att hantera kontrollen mellan Prolog och C. Dessa två data-objekt beskrivs senare. 5. Utvärdera målet Vid utvärderingen av första lösningen kommer Prologsystemet att göra ett normalt anrop till predikatet. Resterande lösningar fås genom backning. 6. Avsluta målet Avslutningen kan göras på två sätt genom att alla val som skapats sedan målet initierades rensas bort eller genom att allt som ändrats sedan målet initierades återställs. Det senare används då program körs för att skapa sido-effekter 1 men det minne som Prolog-systemet använt sedan målet skapades kan återanvändas. 3.1. Att hitta en enda lösning För att hitta en enda lösning anropas funktionen SP_next_solution() endast en gång.! " 3.2. Att hitta flera lösningar För att hitta flera lösningar anropas funktionen SP_next_solution() tills alla lösningar utvärderats. $! " # Här behövs inget anrop till SP_close_query() eller SP_cut_query() eftersom en total utvärdering av ett mål i sig självt återställer Prolog-systemet till läget innan målet skapades. 3.3. Nästlade anrop Om flera mål är aktiva är ordningen på utvärderingen mycket viktig. Anropen måste vara strikt nästlade. Detta innebär att om vi skapar målet A, tar fram första lösningen och sedan skapar målet B måste vi avsluta utvärderingen av B innan vi kan fortsätta utvärderingen av A. Ett exempel 1 Med sidoeffekter menas vanligtvis I/O eller förändring av Prologs interna databas med assert/retract eller record/erase. 2

# Länkning av Prolog under C, K. Boortz, SICS/LPS och Prolog-programmet. % & & ' ( & ) & ' * ) + *, * ) % % $ %! ( ( (! (, ) ) - % # ) / 0 1 $ / 4. SICStus emulator som ett bibliotek Hela SICStus, tillsammans med gränssnittsfunktionerna, kompileras till ett ar -bibliotek och länkas ihop med användarens program. 1. SICStus länkas ihop med gränsnittsfunktionerna Detta skapar filen lsp.o. 2. Ett biblioteksarkiv skapas Programmet ar skapar arkivet libsicstus.a från objektfilen lsp.o. 3. Arkivet optimeras Programmet ranlib gör att länkning med arkivet går snabbare. Arkivet inkluderas i användarens program med flaggan -lsicstus till länkaren. SICStus innehåller en hel del ickelokala symboler som kan ha samma namn som symboler i användarens program. Ett speciellt verktyg loadstrip tar bort onödiga symboler ur SICStus innan biblioteksarkivet skapas (endast Sun3 och Sun4/SparcStation). 5. Initiering Prolog-systemet initieras på samma sätt som i ett system utan länkmodul. Skillnaden är att ingen toppnivå anropas och att den valpunkt som kommer att ligga längst ned i valpunkt-stacken inte kommer att anropa predikatet reinitialize/0 vid ett fail. Detta skulle ha återstartat Prologsystemet och anropat toppnivån. Det fallet kan inte uppstå i länkmodulsystemet om det används rätt. 6. Gränssnitt Gränssnittet består av ett antal funktioner Konverteringsfunktioner Konverterar mellan data i C och den representation av data som finns i Prolog. 3

Interaktion med emulatorn Efter konvertering av data exekverar emulatorn prolog-programmet. Emulatorns tillstånd kan ändras genom anrop av "cut" eller "fail". Det är viktigt att gränssnittet anropas med rätt argument. Det är inte i alla lägen möjligt för gränssnittsfunktionerna att upptäcka att ett argument är fel. Vissa fel, som att ett värde av typen SP_query verkligen är giltigt, skulle kunna kontrolleras men kontrolleras inte av effektivitetsskäl. 6.1. Återfå kontroll till gränssnittet Det mest centrala i gränssnittet är sättet att komma tillbaka till C-koden efter att en lösning har sökts. Det finns två sätt att avsluta på. Antingen har vi lyckats hitta en lösning eller så har vi misslyckats med att hitta en lösning. Ett WAM-register, CP, pekar ut den WAM-kod som ska köras om anropet lyckats. Det gamla värdet på CP sparas undan genom att skapa en ny omgivning med WAM-instruktionen allocate. Det nya CP sätts att peka på en enda WAMinstruktion RET_TRUE. Denna instruktion ger kontrollen tillbaka till gränssnittet. Gränssnittet återställer omgivningen och därmed rätt CP genom att göra en deallocate. En ny valpunkt skapas innan anropet. Denna valpunkt kommer att plockas upp om anropet misslyckas. Detta återställer alla WAM-register och minnesareor till vad de var när valpunkten skapades. Den första klausul som finns i retry-trust-kedjan i denna valpunkt består av en enda WAM-instruktion EXIT_TOPLEVEL (namnet valt av historiska skäl). Denna klausul kommer att köras och ge kontrollen tillbaka till gränssnittet. 6.2. Interaktion mellan Prolog och C Emulatorn anropas genom funktionen wam(). Denna får som argument en struktur, worker, innehållande WAM-registren. Worker har utökats med två fält. message ett värde enligt nedan predicate det predikat som ska anropas Värden som skickas till wam() EXECUTE_L anropa predikatet som anges i fältet predicate. PROCEED_L fortsätt körningen. Används efter det att gränssnittet ombetts av funktionen wam() att anropa ett predikat skrivet i C och detta anrop lyckats. FAIL_L prova ytterligare lösningar. Returnerade värden av wam() EXECUTE_L anropa ett predikat skrivet i C och anropa wam() igen med resultatet, PROCEED_L eller FAIL_L. Att wam() returnerar i detta fall är för att undvika att anropa wam() rekursivt. 4

PROCEED_L lyckades att bevisa målet. Ordna resultatet och returnera till anroparen av gränssnittet. Term-pekarna som skickades till SP_open_query() sätts till termerna som är resultatet. Detta är nödvändigt eftersom termerna som skickades från början kan ha flyttats i minnet vid skräpsamling. FAIL_L misslyckades att bevisa målet. Returnerar till anroparen av gränssnittet. 6.3. Gränssnittsfunktioner Här följer en övergripande beskrivning av respektive gränssnittsfunktion SP_predicate() skapar en funktor, struct definition, om inte en sådan redan finns, och returnerar en pekare till denna SP_qid. Denna pekare kommer aldrig att ändras för predikatet med detta namn och aritet och kan användas i flera anrop. 2 2 2 2 SP_open_query() skapar ett mål. Målet skapas direkt i Prologs dataareor vilket gör att det inte går att skapa flera anrop åt gången eller att använda SP_qid igen för ett nytt anrop. ' 3 2 ' 3 SP_next_solution() anropar emulatorn på två sätt. Om målet just skapats anropas emulatorn med meddelandet EXECUTE_L. Annars anropas den med FAIL_L för att få ytterligare lösningar. SP_cut_query() kan avsluta en utvärdering av ett mål. Skär bort alla kvarvarande lösningar sedan målet skapades genom att sätta aktuell valpunkt till den valpunkt som gällde före anropet av predikatet. Minnet återställs inte. SP_close_query() avslutar en utvärdering av ett mål. Förutom samma beteende som SP_cut_query() så återställs alla Prologs minnesareor och register till läget innan anropet av predikatet. SP_query() är en kombination av anrop till SP_open_query(), SP_next_solution() och SP_cut_query(). Resultatet ligger kvar i minnet och återvinns inte. 2 ' 2 3 5

SP_query_cut_fail() är en kombination av anrop till SP_open_query(), SP_next_solution() och SP_close_query(). Alla prologs minnesareor och register återställs till läget före anropet. Denna funktion används för prolog-program där endast sido-effekter önskas. 2 ' 6.4. Skräpsamling Data som pekas ut vid ett anrop kan komma att flyttas av Prolog-systemets skräpsamling garbage collection. Därför skickas inte vid skapandet av ett mål själva pekaren till en term utan adressen till den variabel som pekaren ligger i. Gränssnittet ansvarar för att pekarna till termer ska vara rätt efter anrop av Prolog. Den valpunkt som skapas när ett mål sätts upp innehåller register X0. Denna binds till en struktur som skapas på Prologs heap. Namnet på strukturen är predikatets namn. Argumenten är par av adressen till inargumenten och inargumenten själva. Som exempel ' 3 3 3 4 ) ' 3 3 3 5 6 6.5. Termers livslängd En begränsning i nuvarande länkmodulsystem är att pekare till en term som inte är argument till ett anrop till Prolog kan vara felaktiga efter detta anrop. Detta sker t.ex. om skräpsamligen har flyttat termen men gränsnittet inte har haft tillgång till pekarens adress. 7. Konvertering av data Konverteringsfunktionerna mellan C och prologs datatyper är mycket enkla och få. SICStus möjlighet att använda heltal med godtycklig storlek används inte i nuvarande implementation av länkmodulsystemet. void SP_put_variable(SP_term *t) Skapa en ny obunden variabel void SP_put_integer(SP_term *t, long l) Skapa ett Prolog-heltal från ett C-heltal void SP_put_float(SP_term *t, double d) Skapa ett Prolog-flyttal från ett C-flyttal void SP_put_atom(SP_term *t, char *name) Skapa en atom från en C-sträng void SP_put_compound(SP_term *t, char *name, int arity) Skapa en sammansatt struktur med obundna variabler som argument void SP_put_arg(int i, SP_term t, SP_term arg) Fyll i det i:e argumentet av en sammansatt term int SP_get_integer(SP_term t, long *l) Omvandlar en term till ett heltal int SP_get_float(SP_term t, double *d) Omvandlar en term till ett flyttal 6

int SP_get_atom(SP_term t, char **a) Ger en pekare till namnet på en atom som en C-sträng. Denna pekare är unik för alla atomer med samma namn så pekaren kan användas för att avgöra om två atomer är lika utan att jämföra tecken för tecken. Strängen får under inga omständigheter modifieras då den används internt av Prolog-systemet. int SP_get_compound(SP_term t, char **name, int *arity) Ger namnet och ariteten på den funktor som unikt identifierar en sammansatt term. Pekaren till strängen tillsammans med ariteten kan användas för att avgöra om två sammansatta termer är lika. int SP_get_arg(int i, SP_term t, SP_term *arg) Returnerar det i:e argumentet av en sammansatt term. int SP_term_type(SP_term t) Returnerar typen av termen t SP_VARIABLE, SP_INTEGER, SSP_FLOAT, SSP_ATOM eller SP_COMPOUND; 8. Övriga gränssnittsfunktioner int SP_unify(SP_term x, SP_term y) Unifierar två termer. int SP_compare(SP_term x, SP_term y) Returnerar -1 om x @< y, 0 om x == y och 1 om x @> y. int SP_toplevel() Anropar toppnivån. All signalhantering är avstängd. 9. Predikat skrivna i C Det går att skriva egna predikat i C och använda dessa i länkmodulsystemet. Dessa skiljer sig från den typ som foreign-snittet använder. Här sker ingen automatisk typkonvertering utan det är istället användarens eget ansvar att konvertera data. Länkmodulsystemet kan användas rekursivt så att ett C-predikat kan anropa Prolog igen. SP_pred_ref SP_install_c_predicate(char *name, int arity, char *module, BOOL (*procedure)()) Installerar ett predikat skrivet i C. Predikatet ska returnera 1 för success och 0 för failure. Alla argumenten ska vara av typen SP_term. Det går att anropa länkmodulsystemet igen inifrån ett predikat skrivet i C. Det finns ingen begränsning av antalet rekursiva anrop som kan göras mellan C och Prolog. 10. Minskad funktionalitet Trots att mycket lite skiljer mellan att köra Prolog med länkmodulsystemet och utan så finns det vissa skillnader. 7

Signalhanteringen Denna är avstängd. Detta för att C-programmet kan ha definierat ett eget beteende vid signaler. Detta ger problem att använda debuggern vid fel. Istället får debuggern anropas explicit i Prolog-koden med predikatet trace/0. Save restore Denna funktionalitet förutsätter saker om systemets minne och kan inte användas. Godtyckligt stora heltal Dessa kan användas i Prolog men inte konverteras till och från C. 8