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
-
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! -
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 -
Cancelamento Dimensional: O compilador simplifica expressões dimensionais idênticas. Dividir
mgpormgresulta em uma quantidade adimensional (f64pura).
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:
- Garantia de Tipos Estática: Toda a verificação dimensional ocorre estaticamente.
- 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.
- 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.