Internos do compilador
As decisões de design chave que tornam Perry rápido
01NaN-Boxing
Os valores são armazenados como floats de 64 bits com padrões de bits especiais para ponteiros, permitindo tipos union sem overhead de runtime. Isso permite que (string | number)[] funcione eficientemente.
Ao codificar informações de tipo diretamente nos bits de payload NaN do IEEE 754, Perry evita a necessidade de tagged unions ou valores encapsulados. Uma única palavra de 64 bits pode representar qualquer tipo de valor JavaScript — números usam sua representação natural, enquanto strings, objetos e outros valores alocados no heap usam padrões de bits de ponteiro que ficam dentro da faixa NaN.
02Monomorphization
Generics são especializados em tempo de compilação, como em Rust. Cada instanciação de tipo gera código otimizado, eliminando o overhead de verificação de tipo em runtime.
Quando você escreve Array'<'number'>' e Array'<'string'>', Perry gera duas implementações separadas e totalmente otimizadas. Isso significa que operações de array em números usam aritmética de máquina direta — sem type guards, sem dispatch dinâmico, sem boxing.
03Static Dispatch
Sem tabelas virtuais. Chamadas de método são resolvidas em tempo de compilação, permitindo chamadas de função diretas e otimizações de inlining.
Runtimes OOP tradicionais usam vtables para resolução de métodos, adicionando uma camada de indireção em cada chamada. Perry resolve todas as chamadas de método estaticamente durante a compilação, transformando chamadas de método de interface em saltos diretos. Isso também libera inlining agressivo — métodos pequenos são frequentemente incorporados diretamente em seus pontos de chamada.
04Zero-Cost Abstractions
Classes, interfaces e generics TypeScript compilam para código nativo eficiente sem overhead de representação em runtime.
O sistema de tipos do TypeScript existe apenas em tempo de compilação — e Perry leva isso literalmente. Interfaces não produzem código runtime. Hierarquias de classes são achatadas. Restrições genéricas são resolvidas para tipos concretos. O binário compilado contém apenas a lógica real, sem a maquinaria de abstração que interpretadores tipicamente carregam.