Standard ML

Origem: Wikipédia, a enciclopédia livre.
Standard ML
Paradigma Multiparadigma:
Surgido em 1983 (40–41 anos)
Última versão SML '97 (1997; há 27 anos)
Estilo de tipagem
  • estática
  • forte
Dialetos:
Influenciada por ML
Influenciou Rust
Extensão do arquivo: .sml

Standard ML (SML) é uma linguagem de programação funcional de propósito geral modular com verificação e inferência de tipos em tempo de compilação. É popular entre pesquisadores de linguagem de programação e compiladores.

SML é uma descendente moderno da linguagem ML utilizada em lógica de funções computáveis (LCF). Distingue-se das outras linguagens utilizadas atualmente devido sua característica funcional e devido sua especificação formal, dado como escrever regras e semântica operacional na definição da Standard ML. [1]

Linguagem[editar | editar código-fonte]

Standard ML é uma linguagem de programação funcional com algumas características impuras. Softwares escritos em SML consistem de expressões a serem avaliadas, ao contrário de declarações ou comandos, apesar de algumas expressões de retorno de uma unidade de "trivial" valor e apenas são avaliados por seus efeitos colaterais.

Como toda linguagem de programação funcional, uma característica fundamental do SML é função, que é usada para a captação. Por exemplo, a função fatorial pode ser expresso como:

fun factorial n = 
  if n = 0 then 1 else n * factorial (n - 1)

Um compilador SML é requirido para inferir o tipo estático int -> int desta função fornecida pelo usuário, sem anotação de tipo. Ou seja, tem a deduzir que n"" só é usado com expressões inteiro, e deve, portanto, por si só, um número inteiro, e que todas expressões produzem expressões com funções retornando inteiros.

A mesma função pode ser expressa com as definições em que as condicionaisif-then-else são substituídas por uma seqüência de "templates" da função fatorial avaliados para valores específicos, separados por "|", que são avaliados um por um na ordem escrita até que seja encontrada uma correspondência:

fun factorial 0 = 1
  | factorial n = n * factorial (n - 1)

Isto pode ser reescrito usando uma instrução, num caso similar como este:

val rec factorial =
  fn n => case n of 0 => 1
   | n => n * factorial (n - 1)

ou como uma função lambda:

val rec factorial = fn 0 => 1 | n => n * factorial(n - 1)

Aqui, a palavra-chave val introduz uma ligação de um identificador para um valor, fn apresenta a definição de uma função função anônima, e case introduz uma seqüência de padrões e expressões correspondentes.

Usando uma função local, esta função pode ser reescrita de forma mais eficiente de estilo tail recursive.

fun factorial n = let
  fun lp (0, acc) = acc
    | lp (m, acc) = lp (m - 1, m * acc)
  in
    lp (n, 1)
  end

(O valor de uma expressão let é o da expressão entre in e end.) O encapsulamento de uma invariante preservando cauda-do-loop apertado recursivamente com um ou mais parâmetros acumuladores dentro de uma função externa invariável-livre, como pode ser visto aqui, é uma expressão comum em SML, e aparece com grande frequência no código SML.

Tipos sinônimos[editar | editar código-fonte]

O tipo sinônimo é definido com a palavra reservada type. Aqui é um tipo sinônimo para pontos no plano, e as funções de computação das distâncias entre dois pontos e a área de um triângulo com cantos dada pela fórmula de Heron.

type loc = real * real

fun dist ((x0, y0), (x1, y1)) = let
  val dx = x1 - x0
  val dy = y1 - y0
  in
    Math.sqrt (dx * dx + dy * dy)
  end

fun heron (a, b, c) = let
  val ab = dist (a, b)
  val bc = dist (b, c)
  val ac = dist (a, c)
  val perim = ab + bc + ac
  val s = perim / 2.0
  in
    Math.sqrt (s * (s - ab) * (s - bc) * (s - ac))
  end

Implementações[editar | editar código-fonte]

Existem muitas implementações SML, incluindo:

  • MLton é uma implementação com um compilador que produz código muito rápido comparado a outras implementações ML. [1]
  • Standard ML of New Jersey (abreviado SML/NJ) é um compilador completo, com bibliotecas associadas, ferramentas, shell interativo e documentação. [2]
  • Moscow ML é uma implementação de peso, baseado no CAML Light runtime engine. Esta implementa a linguagem SML completa. Incluindo módulos SML e muitas bibliotecas SML básicas. [3]
  • Poly/ML é uma implementação completa do SML que produz um código muito rápido e que suporte hardware multicore (via Pthreads)
  • TILT é um compilador para certificação completa do SML. Ele é usado digitando línguas intermediárias para otimizar o código e assegurar a regularidade, e pode compilar para linguagem Assembly.
  • HaMLet é um interpretador SML que pretende ser uma implementação de referência precisa e acessível do padrão SML.
  • ML Kit implementações que comporta um garbage collector (que pode ser desativado) visando aplicações de tempo real.
  • SML.NET permite compilação para o Microsoft CLR e tem extensões para linkagem com outro código .NET.

Ver também[editar | editar código-fonte]

Referências

  1. Milner, R.; Mads Tofte, Robert Harper e D. MacQueen. (1997). The Definition of Standard ML (Revised). [S.l.]: MIT Press. ISBN 0-262-63181-4 

Ligações externas[editar | editar código-fonte]