Jaq, un clon de jq centrado en la precisión, la velocidad y la simplicidad
(github.com/01mf02)Introducción a jaq
- jaq es un clon de jq, la herramienta para procesar datos JSON, y busca ser compatible con gran parte de la sintaxis y las operaciones de jq.
- Los tres objetivos principales de jaq son la precisión, el rendimiento y la simplicidad.
- Busca mantener la compatibilidad con jq mientras ofrece una implementación más precisa y predecible.
- Algunos ejemplos de comportamientos inesperados de jq son que
nan > nanes falso ynan < nanes verdadero, y que ejecutarjqcon[[[]] | implodeprovoca un fallo. - Fue desarrollado como respuesta al largo tiempo de arranque de jq, y presume un inicio unas 30 veces más rápido que jq 1.6.
- jaq apunta a tener una implementación simple y pequeña para reducir la posibilidad de errores y facilitar las contribuciones.
Cómo instalarlo
Instalar desde el código fuente
- Se necesita la toolchain de Rust para compilar jaq.
- El compilador de Rust incluido en distribuciones de Linux puede ser demasiado antiguo y no adecuado para compilar jaq.
- Se puede instalar jaq con los comandos
cargo install --locked jaqocargo install --locked --git https://github.com/01mf02/jaq. - jaq debería funcionar en todos los sistemas compatibles con Rust; si no es así, se debe reportar un issue.
Instalar binarios
- En macOS o Linux se puede instalar jaq usando Homebrew.
Ejemplos
- Los siguientes ejemplos muestran lo que jaq puede hacer actualmente.
- Si se ejecuta
echo '{"a": 1, "b": 2}' | jaq '.a', la salida es1. - Si se ejecuta
echo '{"a": 1, "b": 2}' | jaq 'add', la salida es3. - Si se ejecuta
echo '[0, 1, 2, 3]' | jaq 'map(.*2) | [.[] | select(. < 5)]', la salida es[0, 2, 4].
Rendimiento
- Se compara el rendimiento de jaq, jq y gojq mediante varios benchmarks.
- El benchmark
emptyse usa para medir el tiempo de arranque. - El benchmark
bf-fibejecuta un intérprete de Brainfuck escrito en jq sobre un script de Brainfuck que genera números de Fibonacci. - Los otros benchmarks evalúan varios filtros con un valor de entrada
n. - Los resultados muestran que jaq-1.2 fue el más rápido en 16 benchmarks, jq-1.7 en 2 y gojq-0.12.13 en 1.
Funciones
Funciones básicas
- Soporta varias funciones básicas, incluidos tipos de datos fundamentales, condicionales, acceso, operadores, manejo de errores, interpolación de cadenas y cadenas de formato.
Rutas
- Soporta indexación de arreglos/objetos, iteración, indexación/iteración opcional, slices de arreglos y slices de cadenas.
Operadores
- Soporta operadores de composición, binding, concatenación, asignación, actualización con asignación, alternativa, lógica, igualdad y comparación, aritmética, negación y supresión de errores.
Definiciones
- Soporta definiciones básicas y definiciones recursivas.
Filtros principales
- Soporta varios filtros principales.
Filtros estándar
- Los filtros estándar se definen a través de filtros más básicos.
Filtros numéricos
- Soporta muchos filtros tomados de libm.
Funciones avanzadas
- Algunas funciones de jq no están soportadas, como módulos, operadores estilo SQL y streaming.
Diferencias entre jq y jaq
Números
- Mientras jq usa todos los números como punto flotante de 64 bits, jaq distingue entre enteros y punto flotante.
NaN e infinito
- jaq ofrece un comportamiento más cercano al estándar IEEE 754 de aritmética de punto flotante.
Preservación de números fraccionarios
- jaq preserva perfectamente los números fraccionarios que provienen de datos JSON.
Asignación
- jaq interpreta la asignación de manera distinta a jq.
Definiciones
- jaq permite definiciones de filtros y, al igual que jq, puede pasar argumentos por valor.
Argumentos
- jaq puede definir argumentos a través de la línea de comandos.
Reducción
- jaq ofrece los filtros
reduceyforeach, con una interpretación distinta a la de jq.
Manejo de errores
- jaq usa un mecanismo de manejo de errores distinto al de jq.
Otros
- jq y jaq muestran comportamientos diferentes en slurping, producto cartesiano, actualización de listas, lectura de entrada, joins y otros casos.
Contribuciones
- Las contribuciones a jaq son bienvenidas, y después de hacer cambios se debe comprobar que
cargo testse ejecute correctamente.
Agradecimientos
- jaq se ha beneficiado enormemente de varias librerías y de la biblioteca estándar de Rust.
Opinión de GN⁺
Lo más importante de este texto es que jaq busca soportar la mayor parte de la funcionalidad de jq mientras mejora el rendimiento y la precisión. En particular, su tiempo de arranque marcadamente más rápido frente a jq y su intención de reducir comportamientos inesperados pueden resultar muy atractivos para muchos usuarios. Además, al estar desarrollado sobre Rust, también ofrece ventajas en seguridad de memoria y rendimiento. Se espera que estas mejoras lo conviertan en una herramienta útil para ingenieros de software que necesiten procesar datos JSON.
1 comentarios
Comentarios de Hacker News
nan > nansea falso ynan < nansea verdadero sigue fielmente el estándar de punto flotante IEEE 754 o si se trata de un bug.