Samtidig ML - Concurrent ML
| Paradigme | Samtidig databehandling |
|---|---|
| Familie | ML |
| Først dukkede op | 1991 |
| Internet side | http://cml.cs.uchicago.edu/ |
| Større implementeringer | |
| SML / NJ , MLton , Manticore | |
Samtidig ML (CML) er en samtidig udvidelse af Standard ML programmeringssprog kendetegnet ved sin evne til at gøre det muligt for programmører at skabe kombinerbare kommunikation abstraktioner , der er første klasse i stedet bygget ind i sproget. Designet af CML og dets primitive operationer er blevet vedtaget på flere andre programmeringssprog som GNU Guile , Racket og Manticore.
Begreber
Mange programmeringssprog, der understøtter samtidighed, tilbyder kommunikationskanaler, der tillader udveksling af værdier mellem processer eller tråde, der kører samtidigt i et system. Kommunikation etableret mellem processer kan følge en bestemt protokol, der kræver, at programmøren skriver funktioner for at etablere det krævede kommunikationsmønster. I mellemtiden kræver et kommunikationssystem ofte oprettelse af flere kanaler, såsom til flere servere , og derefter vælges mellem de tilgængelige kanaler, når nye data er tilgængelige. Dette kan opnås ved hjælp af afstemning , f.eks. Ved valgoperationen på Unix-systemer.
Kombination af både applikationsspecifikke protokoller og kommunikation med flere parter kan være kompliceret på grund af behovet for at indføre polling og kontrol for blokering inden for en eksisterende protokol. Samtidig ML løser dette problem ved at reducere denne kobling af programmeringskoncepter ved at introducere synkroniserbare begivenheder . Begivenheder er en førsteklasses abstraktion, der kan bruges med en synkroniseringsoperation (kaldet synci CML og Racket) for potentielt at blokere og derefter producere en værdi, der skyldes kommunikation (for eksempel data transmitteret på en kanal).
I CML kan begivenheder kombineres eller manipuleres ved hjælp af et antal primitive operationer. Hver primitive operation konstruerer en ny begivenhed snarere end at ændre begivenheden på stedet, hvilket muliggør konstruktion af sammensatte begivenheder, der repræsenterer det ønskede kommunikationsmønster. For eksempel tillader CML programmøren at kombinere flere underhændelser for at skabe en sammensat begivenhed, der derefter kan foretage et ikke-deterministisk valg af en af underhændelserne. En anden primitiv opretter en ny begivenhed, der vil ændre den værdi, der skyldes synkronisering på den oprindelige begivenhed. Disse begivenheder er udtryk for kommunikationsmønstre, der på et ikke-CML-sprog typisk vil blive håndteret ved hjælp af en polling-loop eller funktion med håndterere til hver slags begivenhed.
Hej Verden
Her er et program, der udskrives "Hello, world!"til konsollen. Det gyder en tråd med en kanal til strenge og en anden tråd, der udskriver en streng modtaget på kanalen. Det bruger SML / NJ og CML. (Bemærk, at bunkenavnet vil være forskelligt på ikke linux-x86-platforme; du skal muligvis ændre linjen med "cml_test.x86-linux" til noget andet.)
| cml_test.cm |
|---|
Library
structure Hello
is
$cml/basis.cm
$cml/cml.cm
cml_test.sml
|
| cml_test.sml |
structure Hello = struct
open CML
fun hello () = let
val c : string chan = channel ()
in
spawn (fn () => TextIO.print (recv c));
send (c, "Hello, world!\n");
exit ()
end
fun main (_, argv) =
RunCML.doit (fn () => ignore (spawn hello), NONE)
end
|
| bash |
|---|
$ ml-build cml_test.cm Hello.main
Standard ML of New Jersey v110.60 [built: Mon Nov 27 14:19:21 2006]
[scanning cml_test.cm]
[library $cml/basis.cm is stable]
[library $cml/cml.cm is stable]
[parsing (cml_test.cm):cml_test.sml]
[creating directory .cm/SKEL]
[library $cml/cml-internal.cm is stable]
[library $cml/core-cml.cm is stable]
[library $SMLNJ-BASIS/basis.cm is stable]
[compiling (cml_test.cm):cml_test.sml]
[creating directory .cm/GUID]
[creating directory .cm/x86-unix]
[code: 2170, data: 42, env: 2561 bytes]
[scanning 18518-export.cm]
[scanning (18518-export.cm):cml_test.cm]
[parsing (18518-export.cm):18518-export.sml]
[compiling (18518-export.cm):18518-export.sml]
[code: 309, data: 37, env: 42 bytes]
$ heap2exec cml_test.x86-linux cml_test
$ ./cml_test
Hello, world!
|