Sto leggendo tramite OCaml lead designer's 1994 paper on modules, types, and separate compilation. (gentilmente indicato da Norman Ramsey in another question). Comprendo che il documento discute le origini del sistema di firma/tipo di modulo presente in OCaml. Si, l'autore propone l'interpretazione opaca delle dichiarazioni di tipo nelle firme (per consentire la compilazione separata) insieme alle dichiarazioni del tipo manifest (per espressività). Il tentativo di mettere insieme alcuni esempi del mio per dimostrare il tipo di problemi la firma del modulo di notazione OCaml sta cercando di risolvere Ho scritto il seguente codice in due file:Tipi di modulo OCaml e compilazione separata
Nel file di ordering.ml
(o .mli
- Ho provato sia) (file a):
module type ORDERING = sig
type t
val isLess : t -> t -> bool
end
e nel file di useOrdering.ml
(file di B):
open Ordering
module StringOrdering : ORDERING
let main() =
Printf.printf "%b" StringOrdering.isLess "a" "b"
main()
L'idea è di aspettarsi che il compilatore si lamenta (durante la compilazione del secondo file) che non sono disponibili sufficienti informazioni sul modulo sul modulo StringOrdering
per digitare l'applicazione StringOrdering.isLess
(e quindi motivare la necessità della sintassi with type
). Tuttavia, sebbene il file A compili come previsto, il file B fa sì che il 3.11.2 ocamlc
si lamenti per un errore di sintassi. Ho capito che le firme avevano lo scopo di permettere a qualcuno di scrivere codice basato sulla firma del modulo, senza accesso all'implementazione (la struttura del modulo).
Confesso che io non sono sicuro circa la sintassi: module A : B
che ho incontrato in this rather old paper on separate compilation ma mi fa chiedere se esiste la sintassi tale o simile (senza coinvolgere funtori) per permettere a qualcuno di scrivere il codice solo sulla base del tipo di modulo, con l'attuale struttura del modulo fornita al momento del collegamento, simile a come si possono usare i file *.h
e *.c
in C/C++. Senza una tale capacità sembrerebbe che i tipi di modulo/le firme siano fondamentalmente per sigillare/nascondere l'interno dei moduli o più controlli/annotazioni di tipo esplicito, ma non per la compilazione separata/indipendente.
In realtà, guardando il OCaml manual section on modules and separate compilation sembra che la mia analogia con unità di compilazione C è rotto perché il manuale di OCaml definisce l'unità di compilazione OCaml di essere il duo A.ml
e A.mli
, mentre in C/C++ i file .h
vengono incollati al unità di compilazione di qualsiasi file importato .c
.
Come ha risposto brevemente la risposta di Thomas, non esiste una compilazione separata per impostazione predefinita per la compilazione nativa. Vorrei che ci fossero, e ho inserito un desiderio di funzionalità in Mantis a questo effetto: http://caml.inria.fr/mantis/view.php?id=4389. Se qualcuno sa come ottenere una compilazione nativa separata in OCaml (come Thomas ha affermato che era possibile), sarei ESTREMAMENTE interessato a sentirlo. –
@PascalCuoq: perché dici che non puoi compilare separatamente il codice nativo in Ocaml? Certo che puoi. –
In realtà, ho appena modificato i due file come suggerito nella risposta di Thomas e in effetti puoi compilare separatamente bytecode (ocamlc) o nativo (ocamlopt). –