Últimamente he tenido más tiempo para escribir código en Zig, y ha sido bueno para mi alma. Este artículo comparte ideas sobre las abstracciones en Zig, incluidas técnicas que el autor ha encontrado útiles pero que rara vez se emplean de forma más amplia.
Se ha escrito mucho sobre las interfaces de Zig, y con razón. Aunque no es una característica del lenguaje, las interfaces son la forma de facto de implementar polimorfismo en tiempo de ejecución en Zig. Se ha hablado más sobre comptime de Zig y cómo puede aprovecharse para evitar los problemas de rendimiento del despacho dinámico y escribir código elegante y orientado a los datos.
El polimorfismo en Zig se obtiene convencionalmente de una de dos maneras. Las interfaces dinámicas usan punteros opacos, tablas virtuales y despacho dinámico para lograr polimorfismo en tiempo de ejecución. El tipado pato en tiempo de compilación usa reflexión de tipos, sentencias switch y monomorfización en tiempo de compilación para lograr polimorfismo estático. Esta situación ha demostrado ser eficaz, pero no está exenta de compromisos. Las interfaces ofrecen contratos de tipos familiares de otros lenguajes, pero como son modulares en tiempo de ejecución, presentan una barrera difícil para el compilador y, por tanto, una sobrecarga de rendimiento. Para código crítico en rendimiento, Zig normalmente recurre al tipado pato en tiempo de compilación, que detecta las violaciones de interfaz en tiempo de compilación pero aún requiere documentar cuidadosamente el contrato.
Los desarrolladores que vienen de los traits de Rust o de las typeclasses de Haskell pueden encontrar este esquema simplista, y Zig efectivamente aspira a ser simple. El autor sostiene que, con un poco de adaptación, son posibles abstracciones similares sobre tipos en el espacio de usuario de Zig. La propuesta es una nueva convención para definir contratos de tipo en tiempo de compilación como Traits, sin requerir bibliotecas ni mecanismos adicionales. Se inspira en la programación funcional en general y en OCaml en particular.
Un Trait se define como un struct en tiempo de compilación que contiene funciones relacionadas sobre un tipo dado. El artículo lo ilustra con un trait Reducer para plegado, donde un tipo forma un reducer bajo un valor vacío y una operación de combinación. Los traits separados de suma y producto para i32 muestran cómo la misma lógica genérica de reduce puede reutilizarse, y cómo el compilador puede incorporar y desenrollar el bucle. El autor concluye que los traits son simplemente un montón de diversión.
Fuente: Hacker News · Resumido por HeadlinesBriefing