Esta página ainda não foi traduzida para esta versão. A versão em inglês é a referencia autoritária. Ver versão em inglês →

Unidades de Medida

Defina e rastreie unidades físicas para reduzir bugs catastróficos de análise dimensional.

Unidades de Medida e Análise Dimensional

O Sounio fornece suporte de primeira classe para Unidades de Medida (Units of Measure) e Análise Dimensional Estática. Ao contrário de bibliotecas convencionais em outras linguagens que adicionam sobrecarga em tempo de execução (runtime overhead), o Sounio resolve e valida as unidades inteiramente em tempo de compilação no compilador native-v2.

A análise dimensional é crucial para computação científica, farmacocinética e engenharia de precisão, prevenindo erros catastróficos (como a mistura de mg com mcg, ou a soma incompatível de massa e volume).


1. Declaração de Unidades e Dimensões

No Sounio, novas unidades são declaradas de forma global usando a palavra-chave unit seguida por seu identificador e opcionalmente sua correspondência dimensional no compilador:

unit mg                  // Unidade de massa: miligramas
unit L                   // Unidade de volume: Litros
unit h                   // Unidade de tempo: horas
unit mg_per_L            // Unidade derivada: miligrama por Litro

As dimensões são rastreadas internamente através de uma tabela de símbolos de unidades (SymUnit). O compilador native-v2 mapeia as grandezas utilizando expoentes inteiros sobre a base dimensional MKS (Metro-Quilo-Segundo) ou o sistema farmacológico equivalente.


2. Tipos Quantidade (Quantities)

Para declarar uma variável associada a uma unidade de medida, anexe a unidade ao tipo da variável ou utilize a sintaxe de sufixo literal:

let dose: mg = 500.0
let volume: L = 2.5
let concentration: mg_per_L = 200.0

Os valores numéricos subjacentes são armazenados como números de ponto flutuante (f64), garantindo que não haja qualquer impacto ou sobrecarga de performance durante a execução.


3. O Mecanismo de Validação Dimensional (VAR_UNIT_DIM)

No compilador native-v2 (lean_single.sio), o módulo de verificação de tipos rastreia e valida as dimensões físicas através do mecanismo VAR_UNIT_DIM.

Operações Aritméticas e Verificação de Regras

  1. Adição e Subtração: Só podem ser realizadas entre quantidades que possuam dimensões estritamente idênticas.

    let m1: mg = 100.0
    let m2: mg = 50.0
    let total_mass = m1 + m2           // OK: tipo mg
    
    let volume: L = 1.0
    let invalido = m1 + volume         // ERRO de Compilação: Incompatibilidade Dimensional!
  2. Multiplicação e Divisão: Geram novas unidades combinadas combinando as dimensões físicas dos operandos.

    let dose: mg = 500.0
    let vol: L = 2.0
    let c: mg_per_L = dose / vol       // OK: tipo resultante correto
  3. Cancelamento Dimensional: O compilador simplifica expressões dimensionais idênticas. Dividir mg por mg resulta em uma quantidade adimensional (f64 pura).


4. Constantes de Dimensão Física no Compilador

O Sounio native-v2 define constantes explícitas para dimensões farmacológicas e físicas cruciais na modelagem científica:

  • DIM_MASS_CONC: Concentração de Massa (ex: $mg/L$ ou $\mu g/mL$).
  • DIM_AMOUNT_CONC: Concentração de Quantidade de Matéria (ex: $mmol/L$).
  • DIM_ACTIVITY_CONC: Concentração de Atividade Enzimática ou Biológica (ex: $UI/L$).
  • DIM_LEN_TIME: Dimensão espaço-temporal composta.

Essas constantes fundamentam as rotinas de verificação do compilador, prevenindo que um argumento incorreto seja passado para funções de modelos fisiológicos (PBPK), por meio do mecanismo unit_call_arg_mismatch.


5. Casos de Rejeição em Tempo de Compilação (Compile-Fail)

O compilador rejeita estritamente qualquer tentativa de violação de contrato dimensional. Veja abaixo exemplos de testes de aceitação incluídos na suite de testes do compilador:

Rejeitar Velocidade no lugar de Aceleração (unit_derived_acceleration_reject_velocity.sio)

unit m;
unit s;
unit m_s;      // metros por segundo (velocidade)
unit m_s2;     // metros por segundo ao quadrado (aceleração)

let v: m_s = 10.0
let a: m_s2 = v   // ERRO DE COMPILAÇÃO: Tipo esperado m_s2, encontrado m_s

Rejeitar Massa Atribuída como Concentração (unit_literal_clinical_reject_mass_as_amount_concentration.sio)

unit mg;
unit mmol_L;

let dose: mg = 500.0
let conc: mmol_L = dose  // ERRO DE COMPILAÇÃO: Incompatibilidade de unidades físicas entre mg e mmol_L!

6. Estado de Maturidade e Diretrizes

A validação de unidades no compilador Sounio passou por uma grande evolução e agora é um recurso de produção/beta avançado:

  1. Garantia de Tipos Estática: Toda a verificação dimensional ocorre estaticamente.
  2. Conversões Explícitas: Conversões entre unidades de dimensões compatíveis (ex: $g$ para $mg$) exigem funções de conversão explícitas ou multiplicadores declarados para manter a autoria e proveniência claras, prevenindo erros implícitos de arredondamento.
  3. Segurança em Modelos Clínicos: No desenvolvimento de modelos farmacocinéticos (como o modelo de Vancomicina na pasta stdlib/clinical/), o uso correto das unidades de medida de massa, tempo e fluxo é um requisito verificado compulsoriamente pelos scripts de gate de CI antes de qualquer integração.