# ML Estàndard

L'ML Estàndard, conegut per les sigles SML, de l'anglès Standard ML, és un llenguatge de programació funcional per a aplicacions de tota mena, amb comprovació de tipus en temps de compilació, i inferència de tipus.
És popular entre desenvolupadors de compiladors, i investigadors de llenguatges de programació, així com demostradors de teoremes.
SML és un descendent modern del llenguatge de programació ML emprat en el projecte de demostració de teoremes "Lògica per a funcions computables".
Es distingeix entre altres llenguatges de programació en què té una especificació formal i semàntica operacional proposades a "La Definició de Standard ML (1990)" i revisada i simplificada en l'edició de 1997.

## Programa "Hola Món"

Podem descarregar l'intèrpret sml de SML de New Jersey
* cas de Linux, del paquet smlnj
* altrament el podeu descarregar d'aquí.
Instruccions per a l'intèrpret
* la grafia de l'apuntador (el text que l'intèrpret escriu per indicar que espera l'entrada) normal de l'intèrpret és '-'. Si la comanda és incompleta (ex. ens hem deixat el punt i coma final) canvia a '='
* Per carregar un fitxer sml la comanda és: use "nomfitxer" ;
També podem obtenir els compiladors MLton i MLkit.

## Característiques

Vegeu ref.

### Generals

* Avaluació primerenca (Semàntica estricta). Les expressions s'avaluen i associen als símbols lligats seguint l'ordre de les declaracions.

### Identificadors

Vegeu ref.

### Sintaxi

Vegeu enllaç. Les instruccions, excepte la darrera, se separen amb punt i coma. Els punt i coma a fi de línia es poden estalviar.
Per especificar més d'una instrucció en una expressió (per ex. prints, o assignacions, a més de l'expressió de retorn) cal no ometre els punt-i-coma de separació.

#### Comentaris
### Tipus
#### Tipus bàsics

Consulteu-ne les operacions a la biblioteca SML Basis
, atenció: el signe menys de l'oper. unària (un sol operand) es fa
, implementa les operacions a nivell de bit , consulteu precisions amb ([Large]Word.fromInt ~1) , opcionalment hi pot haver Word<N>.word (word<N> per abreujar) , els intercanvis entre tipus de dif. precisió es poden fer passant pel tipus LargeWord

#### Tipus algebraics
##### Tipus polimòrfics

Tipus parametritzats. Cas de prefix
* un apòstrof: com ('a) indica variable de tipus
* doble apòstrof: com (''a) afegeix requeriment que la variable implementi igualtat (per a tipus eqtype)

#### clàusula eqtype t: estableix que el tipus implementa igualtat

El símbol = està sobrecarregat per les operacions d'igualtat de diversos tipus, però no tots els tipus l'implementen.
En els patrons només es poden emprar literals de tipus que implementin igualtat.
Els Reals no es considera que implementen igualtat. Tenen una operació de comparació específica amb doble signe igual (==) igualtat exceptuant NaNs (no-numèrics); (!=): negat de (==); (?=): igualtat bit a bit sense tenir en compte el signe quan és zero.
Els Arrays tenen una igualtat especial (igualtat de referències), són iguals només si són el mateix (creats en la mateixa crida).
Per explicitar el requeriment que un tipus implementi igualtat, les operacions polimòrfiques que fan servir igualtat sobre alguns dels paràmetres, han de distingir-ne els paràmetres de tipus mitjançant el prefix de doble apòstrof.

#### Restricció de tipus
### Expressions
#### Lligams

Associació d'un símbol a una expressió

#### Operadors

Vegeu ref.

#### Funcions Currificables

Vegeu currificació.

#### encaixos de patrons

'_' és el comodí
* as patterns: v com <patró>
* encaix de registres

#### excepcions

ex.:

### Mòduls
#### el tipus d'una estructura: Signatura

Col·lecció d'especificacions (type, datatype, exception i tipus de variables).

##### herència en signatures

* especialització afegint funcions
* especialització per refinament de tipus

#### Functors: Estructures paramètriques

* L'argument formal pot ser una signatura o una seqüència sig .. end.
* El paràmetre actual pot ser una estructura o una seq. struct .. end.

#### adscripció transparent (:) d'una estructura a una signatura

Els constructors de tipus queden accessibles. Es diu que la signatura queda augmentada amb els tipus concrets.
Els elements de l'estructura no descrits a la signatura quedaran d'ús intern o accés privat (no exportats).

#### adscripció opaca (:>) d'una estructura a una signatura (tipus opacs)

Els tipus queden opacs i no se'n podran emprar els constructors. Només se'n podran manipular els elements per les operacions de la signatura.
Els elements de l'estructura no descrits a la signatura quedaran d'ús intern o accés privat.

#### importació

Els fitxers que contenen les estructures emprades, les localitza el compilador de la manera següent:

##### cas d'aplic. d'un sol mòdul

el compilador les busca a la Biblioteca Basis instal·lada

##### cas d'aplic. multi-mòdul

cal declarar els diferents fitxers de codi en un fitxer de projecte. Vegeu secció

#### Aplicacions multi-mòdul

Hi ha dos sistemes diferents
* MLBasis
suportat per MLton i MLkit
* Compilation Manager
suportat per SML/NJ i fins ara per MLton que n'abandona el suport en futures versions.

#### Arrencada

Per ex.:

#### Compilació i exec.
##### Mlton

cas d'aplicació multi-mòdul o bé si fem servir alguna biblioteca de funcionalitat addicional, cal crear un fitxer de projecte .mlb

##### MLKit

cas d'aplicació multi-mòdul, crear fitxer de projecte ".mlb"

##### SML de New Jersey

Permet compilar a un format anomenat heap-image. Vegeu Compilation Manager.
Cal construir el programa com a biblioteca i exportar (ho fa el ml-build) una funció inicial (la típica main) amb tipus (nom_del_programa * llista_de_params_de_la_comanda retornant codi de finalització :OS.Process.status) com a l'exemple següent:
Fitxer de projecte segons especificació "Compilation Manager":
Compilació amb ml-build, genera fitxer de tipus heap-image amb nom com a nom_sortida "." arquitectura "-" sistema_operatiu
ha generat nj_hola.x86-linux; execució:
dona la següent sortida:

### Efectes col·laterals
#### Programació imperativa (canvis d'estat)

* ref introdueix una referència a l'allotjament d'un altre objecte
* ! és l'operador invers que ens revela el valor de l'objecte referit per la variable
* := assigna un valor a l'objecte referit per la variable, modificant-ne l'estat
Clàusula "while" (resultat que depèn d'un estat consultat per l'expr_booleana)

## Compiladors

* SMLNJ: SML de New Jersey projecte de Bell Labs, Lucent Technologies i les universitats de Princeton i Yale. Plataformes a la ref.
* MLton: coordinat per la Univ. de Chicago Plataformes: un munt
* MLkit: Compilador amb gestió de memòria basada en regions, capaç de no incrementar l'ús de memòria en les iteracions, si es segueixen les directrius proposades. Coordinat per la Univ. de Copenhaguen. No suporta múltiples fils d'execució (ang:threads). Suport incomplet dels nombres reals. Plataformes: x86
Comparació de rendiment dels compiladors de SML

## Biblioteca bàsica

L'API d'elements bàsics del llenguatge s'anomena SML Basis Library i en trobareu les definicions aquí.
Les funcions i símbols predefinits, accessibles sense qualificar, són l'estructura "General", la "List" i part de la "Option" de la SML Basis Library.
Atenció: la majoria dels operadors binaris definits en estructures de l'API no inclouen la declaració infix. per tant han de precedir la parella d'operands, per ex.:

## Curiositats
### Precisió dels tipus bàsics

funcions:
En un ord. x86 Pentium de 32 bits tenim els següents resultats
| estructura del tipus | expressió | valor als compiladors | valor als compiladors | valor als compiladors |
| estructura del tipus | expressió | sml (smlnj) | mlkit | mlton |
| Int | precisioSencers Int.precision | 31 bits | 31 (predeterminat), 32 (cas de --no_gc) | 32 bits |
| LargeInt | precisioSencers LargeInt.precision | arbitrària | arbitrària | arbitrària |
| Real | precisioReals Real.precision | 53 bits | precisió no implementada | 53 bits |
| LargeReal | precisioReals LargeReal.precision | 53 bits | precisió no implementada | 53 bits |
| Word | Word.toString (Word.fromInt ~1) | 7FFFFFFF | 7FFFFFFF (predet.), FFFFFFFF (cas de -no_gc) | FFFFFFFF |
| LargeWord | LargeWord.toString (LargeWord.fromInt ~1) | FFFFFFFF | FFFFFFFF | FFFFFFFFFFFFFFFF |

## Referències

* 1 2 SML de New Jersey (anglès)
* ↑ SmlNJ Interactiu
* 1 2 Compilador MLton (anglès)
* 1 2 Compilador MLkit Arxivat 2005-12-14 a Wayback Machine. (anglès)
* ↑ StandardML(anglès)
* ↑ SML identifiers(anglès)
* ↑ Univ. Edimburg - Sintaxi de SML
* ↑ Igualtat polimòrfica(anglès)
* ↑ Equality type(anglès)
* ↑ Equality type variable(anglès)
* ↑ Precedència dels operadors(anglès)
* ↑ MLBasis (anglès)
* ↑ Compilation Manager de SML/NJ(anglès)
* ↑ Compilation Manager a MLton(anglès)
* ↑ MLton notes de la versió 2010...(anglès) Abandó del suport de Compilation Manager: Deprecated features: .CM input files
* ↑ MLton - Estructures de funcionalitat addicional(anglès)
* ↑ Mlton - Exemples .mlb (compilació multi-mòdul) (anglès)
* ↑ MLKit - Fitxers mlb de compilació de projecte Arxivat 2010-04-16 a Wayback Machine. (anglès)
* ↑ SML-NJ Compilation Manager (anglès)
* ↑ Coordinació de SML de New Jersey
* ↑ SMLNJ - README(anglès) Plataformes suportades
* ↑ «MatthewFluet».
* ↑ Característiques - Portabilitat(anglès)
* ↑ «MLkit - grau d'implementació de les biblioteques estàndard (Basis)». Arxivat de l'original el 2010-04-15. [Consulta: 18 setembre 2010].
* ↑ MLton.org - Rendiment dels compiladors SML(anglès)
* ↑ Biblioteca SML Basis Lib. (anglès)
* ↑ SML Basis Top level environment - Elements predefinits a nivell principal (anglès)
* ↑ Biblioteca SML Basis Lib. Funcions predefinides - Estructura "General" (anglès)
* ↑ Biblioteca SML Basis Lib. Funcions predefinides - Estructura "Option" (anglès)

## Vegeu també

* Objective Caml

## Enllaços externs

* SML a SourceForge.net - web de coordinació de projectes del llenguatge SML
* Què és SML (anglès)
* Guia-presentació de SML (anglès) Presentació introductòria de bona legibilitat.
* Programming in Standard ML '97: A Tutorial Introduction (anglès) Una bona guia (en PDF).