2010-12-15 8 views
5

Perl ha sido durante mucho tiempo mi lenguaje de scripting preferido, pero me he encontrado con un problema horrible. Por defecto no hay soporte para enteros largos (64 bits). La mayoría de las veces un entero es solo una cadena y funcionan para buscar en archivos grandes, pero hay muchos lugares donde no funcionan, como el binario &, printf, pack, unpack, <<, >>.¿Qué lenguajes de scripting son compatibles con los enteros largos (64 bits)?

Ahora estos funcionan en versiones más nuevas de Perl pero solo si están construidos con soporte entero de 64 bits, lo que no ayuda si quiero hacer código portátil para ejecutar en Perls construido sin esta opción. Y no siempre tienes control sobre Perl en un sistema en el que se ejecuta tu código.

Mi pregunta es: ¿Python, PHP y Ruby sufren de tal problema, o también dependen de las opciones de versión y compilación?

+7

Por curiosidad, cualquier razón por la que use bigint; no es suficiente? – Hugmeir

+0

@Hugmeir: Solo que es lento. Estoy procesando archivos de volcado de MediaWiki que pueden tener varios terabytes de tamaño. – hippietrail

+1

@hippietrail, ¿estás seguro de que los números de 64 bits son los culpables? –

Respuesta

14

El tamaño de los enteros de hardware de alta velocidad (suponiendo que el lenguaje los tenga) siempre dependerá de los enteros de cualquier tamaño que estén disponibles para el compilador que compiló el intérprete de lenguaje (normalmente C).

Si necesita soporte de enteros grandes multiplataforma/entre versiones, el Perl pragma use bigint; hará el truco. Si necesita más control, bigint es un contenedor alrededor del módulo Math::BigInt.

En el ámbito en el que se carga use bigint;, todos los números enteros en ese ámbito se actualizarán de forma transparente a números Math::BigInt. Por último, al utilizar cualquier tipo de biblioteca de números grandes, asegúrese de no utilizar trucos como 9**9**9 para obtener infinito, porque es posible que esté esperando un momento :)

+0

He aceptado que el uso de Math :: BigInt/bigint es la mejor solución en Perl por ahora, pero aún estoy un poco decepcionado, especialmente ese paquete/desempaquetar con "Q" solo funciona con una compilación de 64 bits . – hippietrail

1

Disculpe señor, bigint y Math::BigInt son parte de los módulos principales. Sólo friggin 'use uno de ellos, funcionará en cualquier plataforma.

+2

bigint es la mejor solución que he encontrado hasta ahora pero ralentiza mucho mi script. Math :: Int64 parece mucho mejor, pero no es un módulo básico. – hippietrail

+2

No hay magia. El gran número de crujidos en la plataforma que no es de 64 bits es lento. No puedes tener tu pastel y comértelo. – wazoox

+0

Las plataformas de 32 bits siempre han sido compatibles con los enteros de 64 bits utilizando métodos más simples que los "grandes números" al igual que las plataformas de 16 bits tenían tipos de 32 bits y las plataformas de 8 bits tenían tipos de 16 bits. Por supuesto, estos son más lentos que los tipos nativos, pero son más rápidos que los bigints. La magia no es requerida. En mi caso, sé que nunca necesitaré los 64 bits completos. – hippietrail

2

El soporte entero largo de Tcl 8.5 es bastante bueno desde la perspectiva del usuario. Internamente, representa enteros, cualquiera que sea el tipo que sea necesario para contenerlos (hasta biginks e inclusive) y las cosas que consumen enteros tomarán cualquiera de ellos (aunque podrían imponer sus propios límites, no querrás usar un número que lo haga). solo se ajusta en una letra grande como un modo de archivo Unix ...)

La única vez que realmente necesita pensar en ello es cuando va a/desde un formato binario de ancho fijo. Sin embargo, eso es bastante obvio (es ancho fijo después de todo).

+0

de hecho los estoy usando con un formato binario de ancho fijo. Estoy haciendo un índice binario de compensaciones de bytes en archivos de texto extremadamente grandes. Los índices deben tener un ancho fijo para permitir una búsqueda binaria rápida. – hippietrail

+0

@hippietrail: Bueno, en ese caso usa valores de 64 bits. Nunca he escuchado que alguien tenga un archivo de datos que no cabe en 8 exabytes, pero si lo hace, tenga dos archivos. Y '$ env (DEITY)' te bendigo. :-) –

3

En Python, nunca se producen desbordamientos. En cambio, python cambia la implementación de los números que usa automáticamente. La implementación básica usa los datos nativos en la plataforma, pero los enteros largos usan una implementación de número infinito de longitud. Como resultado, nunca tendrás que preocuparte de que tus números se vuelvan demasiado grandes, Python solo lo maneja de forma natural.

+2

Así que nunca se sabe por qué su script es lento en una máquina frente a otra. Inteligente :) – wazoox

+1

@wazoox, mejor que dar resultados incorrectos en algunas máquinas en lugar de otros. –

+0

Parece que la distribución estándar de Python 3 en Windows admite enteros de 64 bits que la distribución estándar de Perl en WIndows no hace, aunque es posible construir Perl con soporte integer de 64 bits en una plataforma de 32 bits con parámetros de compilación adicionales . – hippietrail

Cuestiones relacionadas