Se presenta el lenguaje de programación Solod (So), que proporciona un subconjunto del lenguaje Go, transcompilado a una representación en el lenguaje C (C11), apta para ser compilada por los compiladores GCC, Clang y zig cc. La diferencia clave entre Solod y Go y Tinygo es el uso de la gestión manual de memoria, que funciona sin un recolector de basura, sin asignaciones de memoria automáticas y sin conteo de referencias. El transpilador para Solod está escrito en Go y se distribuye bajo la licencia BSD. Se soporta su funcionamiento en Linux, macOS y Windows.
El lenguaje soporta estructuras, métodos, interfaces, slices, retorno de múltiples valores por funciones (por ejemplo, resultado + código de error), genéricos y llamadas diferidas (defer). Para simplificar, el lenguaje no soporta canales, corutinas ni cierres. En el desarrollo con el lenguaje Solod se pueden utilizar servidores LSP existentes, linters, entornos de desarrollo integrados y editores de código que soporten Go, así como la herramienta 'go test'.
El código escrito en Solod puede integrarse con aplicaciones en C (el lenguaje C puede invocar funciones en Solod y viceversa) y no requiere adjuntar un runtime. Las áreas clave de aplicación incluyen la programación de sistemas con capacidades cercanas a C, pero con una sintaxis al estilo de Go y asegurando la verificación de tipos. Solod también puede ser utilizado para portar bibliotecas de Go para su uso en proyectos en C. Se han portado paquetes de Go como strings, io, bytes, mem, slices, etc. Además del conjunto de bibliotecas de Go portadas, en programas escritos en Solod se pueden utilizar wrappers sobre la biblioteca estándar de C, libc.
Por defecto, toda la memoria se asigna en la pila, pero a través de las funciones Alloc / Free de la biblioteca estándar se puede asignar memoria en el montón. No se utilizan recolección de basura ni conteo de referencias, pero en Solod se proporcionan capacidades para la verificación de tipos y la terminación abrupta al acceder fuera de los límites del array. Sin embargo, no se llevan a cabo comprobaciones para evitar punteros colgantes (dangling pointer) ni falta de liberación de memoria. Se menciona el uso de AddressSanitizer (-fsanitize=address) en los compiladores modernos como el principal método para detectar problemas de manejo de memoria.
En términos de rendimiento, los programas compilados escritos en Solod son, en la mayoría de los casos, más rápidos que los programas en Go. Por ejemplo, el rendimiento de las funciones del paquete Byte es un 50% más rápido con un consumo de memoria idéntico. Trabajar con búferes de bytes es un 1.3 veces más rápido al leer y de 2 a 4 veces más rápido al escribir. En el paquete Map, la selección por clave entera es 3.4 veces más rápida, pero la modificación de claves es 1.6 veces más lenta. La selección por claves de cadena se encuentra al mismo nivel que el lenguaje Go, pero la modificación es un 1.5 veces más lenta. El análisis y formato de números enteros son 2 veces más rápidos, mientras que para números de punto flotante son de 1.5/1.2 veces más rápidos. Las funciones de cadenas son un 1.3 veces más rápidas, y la creación de cadenas es de 2 a 4 veces más rápida con una reducción del consumo de memoria del 10 al 20%.
Fuente: opennet.ru
