Commit c8103c1a authored by Finn Teegen's avatar Finn Teegen

Merge branch 'readme' into 'master'

Update the readme file

Closes #91

See merge request !27
parents 83978093 4939bd68
===============================================================================
==
== Münster-Curry-Compiler
== Distribution zur Anwendung als Frontend in PAKCS
==
== Letztes Update: 27.10.05
Diese Distribution enthält die modifizierte Version des
Münster-Curry-Compilers (MCC) für die Verwendung als Frontend in PAKCS. Dieses
System ist u.a. in der Lage aus Curry-Programmen (entwickelt nach
PAKCS-Standard) Flat-Darstellungen (FlatCurry ".fcy", FlatInterface ".fint"
und FlatXML "_flat.xml"), sowie Abstract-Darstellungen (AbstractCurry ".acy"
und untyped AbstractCurry ".uacy") zu generieren.
1. Installation
---------------
1.1 Installation der Binary-Distribution
Die Binary-Distribution befindet sich in einem tar-Archiv und wird
durch folgendes Kommando entpackt:
tar zxvf <Distribution>.tar.gz
Danach steht der Compiler im Verzeichnis 'mcc' zur Verfügung.
1.2 Installation der Source-Distribution
Nach dem Entpacken des tar-Archivs mittels
tar zxvf <Distribution>.tar.gz
kann der Compiler durch Aufruf von 'make' im Verzeichnis 'mcc' installiert
werden. Bei Recompilierung (z.B. nach Änderungen in der Quelldateien)
wird empfohlen vor einer erneuten Installation 'make clean' auszuführen.
Nach erfolgreicher Installation befindet sich in beiden Fällen im Verzeichnis
'mcc/bin/' folgende ausführbare Datei:
cymake - der Curry-Programm-Builder
Dieses Tool übersetzt Curry-Programme unter Berücksichtigung der Import-
abhängigkeiten.
2. Kommandoübersicht
--------------------
In der folgenden Tabelle sind die Optionen zur Generierung der jeweiligen
Darstellungen für das Kommando 'cymake' aufgelistet:
--flat : Erzeugt FlatCurry- und FlatInterface-Datei
--xml : Erzeugt FlatXML-Datei
--acy : Erzeugt (typinferierte) AbstractCurry-Datei
--uacy : Erzeugt ungetypte AbstractCurry-Datei
3. Erzeugung von FlatCurry- und FlatXML-Programmen
--------------------------------------------------
Die Übersetzung eines Curry-Programms 'file.curry', sowie sämtlicher
importierter Module nach FlatCurry bzw. FlatInterface, bewirkt folgendes
Kommando:
cymake --flat <filename>
Hierdurch werden die Dateien mit den entsprechenden Endungen ".fcy" und
".fint" generiert. Der Dateiname <filename> kann hierbei mit oder ohne
Endung ".curry" bzw. ".lcurry" angegeben werden.
Die analogen Übersetzungen in die FlatXML-Darstellung bewirkt folgendes
Kommando:
cymake --xml <file name>
Die hierdurch generierte Flat-XML-Datei hat die Endung '_flat.xml'.
4. Erzeugung von AbstractCurry-Programmen
-----------------------------------------
Die Übersetzung eines Curry-Programms 'file.curry' nach (typgeprüftem)
AbstractCurry bewirkt folgendes Kommando:
cymake --acy <filename>
Hierdurch wird die entsprechende Datei (mit der Endung ".acy") generiert.
Der Dateiname <filename> kann hierbei mit oder ohne Endung ".curry" bzw.
".lcurry" angegeben werden.
Ungetypte, bzw. typsignierte AbstractCurry-Programme werden mit folgendem
Kommando generiert:
cymake --uacy <filename>
Die hierdurch generierte Datei besitzt die Endung ".uacy".
Die Generierung des ungetypten AbstractCurry-Programms findet ohne
Typüberprüfung statt (d.h. auch Programme mit Typfehlern werden übersetzt).
Alle Funktionen besitzen entweder die im Quellprogramm angegebenen Typsignatur,
oder, sofern diese nicht vorhanden ist, den Dummy-Typ "prelude.untyped".
In beiden Fällen werden für die Übersetzung FlatCurry-Dateien
für alle importierten Module erzeugt. Dies ist notwendig, da die
entsprechenden Interfaces für die Typinferenz (nur im Fall der getypten
AbstractCurry-Generierung) und die statisch-semantische Analyse benötigt
werden.
5. Anmerkungen
--------------
- Um die PAKCS-Bibliotheken (insbesondere die Prelude) für Übersetzungen
nutzen zu können muß die Umgebungsvariable 'PAKCS_LIB' auf die
entsprechenden Pfade verweisen, z.B. mittels
export PAKCS_LIB=<pakcs path>/pacs/lib:<pakcs path>/pacs/lib/meta:...
wobei <pakcs path> das Verzeichnis ist, das die PAKCS-Distribution
enthält.
- Im Gegensatz zu PAKCS erlaubt das Frontend die Verwendung anonymer
Variablen (dargestellt durch dem Unterstrich '_') in Typdeklarationen,
z.B.
data T _ = C
Bekannte Probleme
------------------
- Lambda-, do-, if-, case-, oder let-Ausdrücke, die in Argumenten von
Funktionsaufrufen verwendet werden, müssen immer geklammert werden.
- 'let'-Anweisungen dürfen nicht folgendes Layout besitzen:
let x = <expr>
in ...
- Die Regeln einer Funktionsdeklaration müssen immer zusammenstehen, d.h.
nicht durch andere Deklarationen unterbrochen werden.
- Es ist bislang nicht möglich, den Konstruktor für leere Listen [], sowie
den Unit-Konstruktor () zu qualifizieren (z.B. führt 'prelude.[]' zu
einem Fehler). Der Listenkonstruktor (:), sowie Tupel-Konstruktoren
dagegen sind qualifizierbar.
- FlatXML-Übersetzungen können derzeit mittels der Funktionen aus dem
PAKCS-Modul "FlatXML" noch nicht eingelesen werden, da es Unstimmigkeiten
zwischen dem generierten und den erforderlichen Formaten gibt.
- Bei der Erzeugung von typgeprüftem AbstractCurry können die im Quelltext
verwendeten Bezeichner für Typvariablen nicht ins AbstractCurry-Programm
übernommen werden. Stattdessen generiert der Übersetzer neue
Bezeichner.
- Bei der Erzeugung von ungetyptem AbstractCurry werden Typsynonyme in
Typsignaturen von Funktionen nicht dereferenziert.
- Das Frontend gibt derzeit noch keinerlei Warnungen aus.
# Curry Frontend
The Curry frontend parses source files (`.curry`), emits errors and
warnings, performs various checks and transformations and
generates FlatCurry (`.fcy`, `.fint`) or AbstractCurry (`.acy`, `.uacy`),
amonst other formats.
The project originated from a modified version of the Münster-Curry-Compiler
(MCC) for use with [PAKCS](https://git.ps.informatik.uni-kiel.de/curry/pakcs),
but can also be used with a variety of other backends, most notably including
[KiCS2](https://git.ps.informatik.uni-kiel.de/curry/kics2).
## Requirements
* `cabal-install`
* A recent version of the `curry-base` package, installed locally
## Building
To build the project, run `cabal v1-build`.
## Running
To run the project, use `cabal v1-run`.
Alternatively, you can launch the built executable manually from `dist/build/curry-frontend`.
## Usage
For a detailed overview of the available options, you can use the following command:
`curry-frontend --help`
### Available Formats
```
--flat : Generate a FlatCurry (.fcy) and FlatInterface (.fint) file
--xml : Generate a FlatXML (_flat.xml) file
--acy : Generate a (type-inferred) AbstractCurry (.acy) file
--uacy : Generate an untyped AbstractCurry (.uacy) file
```
The generation of an untyped AbstractCurry program is performed without
type checking (i.e. programs with type checks will compile). All functions
will either have the type signature specified in the source or, if not
available, the dummy type `prelude.untyped`.
FlatCurry files will always be generated for the imported modules,
since the interfaces are required for static-semantic analysis and type
inference (only for typed AbstractCurry).
## Remarks
- To use the PAKCS libraries (especially for the `Prelude`), the environment
variable `PAKCS_LIB` has to point to the correct paths, e.g. using
`export PAKCS_LIB=[pakcs path]/pacs/lib:[pakcs path]/pacs/lib/meta:...`
where `[pakcs path]` is the directory containing the PAKCS distribution.
- In contrast to PAKCS, the frontend allow use of anonymous variables
(denoted by an underscore `_`) in type declarations, e.g.
```curry
data T _ = c
```
## Known Issues
[See GitLab](https://git.ps.informatik.uni-kiel.de/curry/curry-frontend/-/issues)
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment