OCamlAan de slag met OCaml


Opmerkingen

Deze sectie geeft een overzicht van wat ocaml is en waarom een ontwikkelaar het misschien wil gebruiken.

Het moet ook alle grote onderwerpen binnen ocaml vermelden en naar de gerelateerde onderwerpen verwijzen. Aangezien de documentatie voor ocaml nieuw is, moet u mogelijk eerste versies van die gerelateerde onderwerpen maken.

Installatie op Windows (native)

premisse

Deze instructie toont een procedure voor het installeren van native OCaml-binaire bestanden in Windows. Als uw besturingssysteem Windows 10 (Insider Preview) build 14316 of hoger is, kunt u OCaml ook installeren via Bash op Ubuntu op Windows . Volg in dit geval de instructie om OCaml op Ubuntu te installeren.

Installeer OCaml en Opam

Download OCaml officiële distributie . Het bevat zowel OCaml-compilers als Opam-pakketbeheer. Stel dat u de software in C:/OCaml hebt geïnstalleerd. Om zeker te zijn dat u OCaml correct hebt geïnstalleerd, opent u cmd.exe en typt u ocaml .

Als het bericht 'ocaml' is not recognized as an internal or external command, operable program or batch file moet u C:/OCaml/bin aan uw pad (omgevingsvariabele).

Voeg OCaml-binaire bestanden toe aan het pad

in Control Panel > System and Security > System > Advanced system settings (on the left) > Environment Variables en selecteer vervolgens Path op het tabblad System Variable en vervolgens Edit .

Voeg C:/OCaml/bin; naar de lijst.

Installeer Cygwin

Zonder Cygwin kunt u Opam niet gebruiken. In feite, als je probeert te openen Opam typen opam in cmd.exe het een boodschap toont: Fatal error: exception Unix.Unix_error(20, "create_process", "cygcheck") .

Download Cygwin en start het installatieprogramma. Controleer de volgende pakketten:

  • automake
  • diffutils
  • libreadline
  • maken
  • m4
  • mingw64-x86_64-gcc-core
  • mingw64-x86_64-gmp
  • mingw64-x86_64-openssl
  • mingw64-x86_64-pkg-config
  • mingw64-x86_64-sqlite3
  • lap
  • rlwrap
  • uitpakken
  • wget

Stel dat u de software hebt geïnstalleerd in C:/cygwin ( C:/cygwin64 voor 64bit-versie). Open cmd en typ wget (of een van de uitvoerbare bestanden in C:/cygwin/bin ) om te controleren of u de Cygwin-uitvoerbare bestanden kunt gebruiken. Als het uitvoerbare bestand niet wordt geopend, voegt u C:/cygwin/bin aan uw pad (omgevingsvariabele).

Configureer Opam

Open cmd.exe en typ opam init om Opam te configureren.

Installeer vervolgens ocamlfind (onderdeel van de OCaml-compiler) met

opam install ocamlfind
opam config env
 

Controleer of ocamlfind is geïnstalleerd door het in cmd.exe typen.

De opdracht opam config env wordt gebruikt om de map met uitvoerbare bestanden van opam toe te voegen aan het omgevingspad. Als u na uitloggen ocamlfind niet meer kunt bereiken, kunt u het handmatig toevoegen door de volgende regel aan het pad toe te voegen: C:/Users/<your user>/Documents/.opam/system/bin/ .

Pakketten installeren

Pakketten worden geïnstalleerd via Opam met het commando opam install xyz waarbij xyz de naam van het pakket is.

Installeer UTop

Probeer de opdracht opam install utop . Als u geen fouten hebt, opent u het uitvoerbare bestand door utop typen.

Als u het bericht ziet

[ERROR] The compilation of zed failed at "ocaml setup.ml -build".
 

u moet de afzonderlijke pakketten handmatig installeren. Probeer het opnieuw:

opam install zed
opam install lambda-term
opam install utop
 

Zowel lambda-term als utop mogelijk niet geïnstalleerd. Zie de sectie Problemen oplossen.

Core installeren

U kunt installeren core -pakket met opam install core . Op de Windows 64bit-versie (en 64bit Cygwin) ziet u de volgende fout:

[ERROR] core is not available because your system doesn't comply with os != "win32" & ocaml-version = "4.02.3".
 

Problemen oplossen: kan geen normaal bestand maken

Als het pakket met de naam xyz.10.1 niet kan worden geïnstalleerd (waarbij xyz de naam van het pakket is en 10.1 de versie ervan) met het volgende bericht:

install: cannot create regular file '/cygdrive/c/Users/<your user>/Documents/.opam/system/bin/<something>': File exists
 

Je moet in deze map gaan:

C:\Users\<your user>\Documents\.opam\repo\default\packages\<xyz>\<xyz.10.1>\files 
 

en verwijder het bestand xyz.10.1.install .

Problemen oplossen: kan gedeelde bibliotheek niet laden

Als u een Opam-pakket probeert te openen (bijvoorbeeld: utop ) en deze foutmelding verschijnt:

Fatal error: cannot load shared library dlllwt-unix_stubs
Reason: The specified module could not be found.
 

Voer opam config env opnieuw uit en probeer het uitvoerbare bestand opnieuw te openen.

Installatie of instellingen

OPAM installeren

OPAM is een pakketbeheerder voor OCaml. Het bouwt en beheert eenvoudig compilerversies en OCaml-bibliotheken voor u.

De eenvoudigste manier om OPAM op uw besturingssysteem te installeren, is door een pakketbeheerder voor uw systeem te gebruiken. bijv. apt-get, yum of homebrew.

Mac OSX installatie-instructies

Werk homebrew- formules bij en installeer OPAM.

brew update
brew install opam
 

Ubuntu installatie-instructies

add-apt-repository ppa:avsm/ppa
apt-get update
apt-get install ocaml opam
 

Compileren vanuit de bron

wget http://caml.inria.fr/pub/distrib/ocaml-4.03/ocaml-4.03.0.tar.gz
tar xf ocaml-4.03.0.tar.gz
cd ocaml-4.03.0
./configure -prefix installation_path
make world.opt
make install
 

OPAM initialiseren

Nadat u OPAM hebt geïnstalleerd, voert u opam init en volgt u de instructies.

Als je klaar bent, zou je de OCaml-interpreter vanuit je shell moeten kunnen gebruiken.

$ ocaml
        OCaml version 4.03.0

#
 

Je eerste programma in OCaml

Nu de OCaml-distributie beschikbaar is op uw favoriete besturingssysteem, kunnen we uw eerste programma maken in OCaml: de Hallo wereld!

We hebben verschillende manieren om een OCaml-programma te starten.

De REPL (topniveau)

U kunt uw code interactief uitvoeren met het topniveau . Met het OCaml- topniveau kunt u OCaml-code schrijven en uitvoeren als een UNIX-shell. Daarna controleert het topniveau onmiddellijk het type van uw code. U kunt dus snel en gemakkelijk sommige delen van de code testen zonder compilatie en uitvoering.

U kunt het hoogste niveau starten met de opdracht ocaml . Vervolgens kunt u een OCaml- zin schrijven die eindigt op ;; die onmiddellijk wordt geëvalueerd. Het hoogste niveau geeft het type en de waarde van uw uitdrukking weer vlak na:

# "Hello Worlds!";;
- : string = "Hello Worlds!"
 

Het is ook mogelijk om het topniveau in uw bestand te starten. Je kunt deze uitleg daarover zien.

Om uw invoer op het hoogste niveau te vergemakkelijken, kunt u een tool zoals ledit of rlwrap die enkele functies biedt (zoals invoergeschiedenis):

 $ ledit ocaml

 $ rlwrap ocaml
 

Compilatie naar de bytecode

We hebben twee verschillende compilers, een die compileert naar bytecode en de andere die compileert naar native code. De eerste is dezelfde als de bytecode van de virtuele machine van Java. De bytecode is dus minder efficiënt maar draagbaarder.

We hebben enkele uitbreidingsbestanden die worden gebruikt door de OCaml-compilers:

uitbreiding definitie
.ml De broncode (als .c in C)
.mli De interface (als .h in C)
.cmo Broncode gecompileerd door ocamlc in bytecode
.cmi Interfacecode samengesteld door ocamlc
.cmx en .o Broncode gecompileerd door ocamlopt in native code
.cma Bibliotheek (bucket van sommige *.cmo ) in bytecode
.cmxa en .a Bibliotheek in native code
.cmxs Bibliotheek in native code (om dynamisch te laden)

De bytecode- compiler is ocamlc .

U hebt verschillende gemeenschappelijke opties:

  • -c : om een bronbestand te compileren zonder het koppelingsproces (om een uitvoerbaar bestand te produceren). Het commando ocaml -c foo.ml produceert dus een .cmo bestand. In tegenstelling tot C waarin het headerbestand niet hoeft te worden gecompileerd, is het in OCaml noodzakelijk om het .mli bestand te compileren: ocaml -c foo.mli .

U moet eerst de interface compileren. Wanneer u achteraf het bronbestand compileert, probeert OCaml te controleren of de implementatie overeenkomt met de interface.

Het .mli bestand is niet verplicht. Als u een .ml bestand zonder .mli bestand .mli , zal OCaml automatisch een .cmi bestand produceren.

  • -o : om enkele .cmo bestanden te compileren naar een uitvoerbaar bestand. Bijvoorbeeld: ocamlc -o program foo.cmo bar.cmo . Deze bestanden moeten worden gerangschikt op basis van de afhankelijkheden waarvan het eerste bestand geen afhankelijkheid heeft.

  • -I : om een andere map aan te geven waar de compiler de benodigde bestanden voor de compilatie kan vinden (zoals de interface of broncode). Het is hetzelfde als de -I van een C-compiler.

We hebben veel andere opties. U kunt de handleiding bekijken voor meer informatie.

Dus je kunt nu hello.ml schrijven en dit bestand compileren met ocamlc -o hello hello.ml om een bytecode- programma te produceren:

let () = print_endline "Hello World!"
 

De let () = ... is de eerste invoer van uw programma (zoals de main in C). Daarna gebruiken we de functie print_endline (geleverd door de standaardbibliotheek) met het argument "Hello World!" om Hello Worlds af te drukken met een nieuwe regel in de standaarduitvoer.

Na de compilatie heb je het .cmo bestand en het .cmi bestand automatisch geproduceerd door de compiler en je programma hello . U kunt uw programma openen en bovenaan dit bestand ziet u:

#!/usr/local/bin/ocamlrun
 

Dat betekent dat uw programma het ocamlrun programma (geleverd door de distributie) nodig heeft om de bytecode uit te voeren (zoals de JVM).

Compilatie naar de native code

We hebben een andere compiler die native code produceert. De compiler is: ocamlopt . Het resulterende uitvoerbare bestand kan echter niet op de meeste andere architecturen werken.

ocamlopt gebruikt dezelfde opties als ocamlc zodat u ocamlopt -o hello hello.ml kunt uitvoeren. Hierna ziet u een .cmx en een .o bestand.

Ten slotte kunt u vanuit uw bytecode / native code-programma het volgende uitvoeren:

$ ./hello
Hello World!
$