He leído ¿Dónde son útiles los octales? y parece que los octales son algo que alguna vez fueron útiles.
Muchos idiomas tratan los números que preceden con un 0 como octal, por lo que el literal 010
es en realidad 8. Algunos de estos son JavaScript, Python (2.7) y Ruby.
Pero realmente no veo por qué estos lenguajes necesitan octal, especialmente cuando el uso más probable de la notación es denotar un número decimal con un 0 superfluo.
JavaScript es un lenguaje del lado del cliente, octal parece bastante inútil. Los tres son bastante modernos en otro sentido, y no creo que haya mucho código usando la notación octal que se rompería al eliminar esta "característica".
Entonces, mis preguntas son:
- ¿Hay algún punto de estos lenguajes que admitan literales octales?
- Si los literales octales son necesarios, ¿por qué no usar algo como
0o10
? ¿Por qué copiar una notación antigua que anula un caso de uso más útil?
javascript
python
ruby
octal
Manishearth
fuente
fuente
chmod
con 0666 o 0777 para grupos de 3 bits para usuario, grupo y otros: lectura, escritura, ejecutable.parseInt('010')
hecho, devolvió 8, de ahí todos los consejos para usar siempreparseInt(foo, 10)
(y todavía es un hábito para mí)Respuestas:
Copia a ciegas de C, tal como dijo el monstruo de trinquete en su comentario
La gran mayoría de los "diseñadores de lenguaje" en estos días nunca han visto nada más que C y sus copias (C ++, Java, Javascript, PHP, y probablemente unas pocas docenas más de las que nunca he oído hablar). Nunca han tocado FORTRAN, COBOL, LISP, PASCAL, Oberon, FORTH, APL, BLISS, SNOBOL, por nombrar algunos.
Érase una vez, la exposición a múltiples lenguajes de programación era OBLIGATORIA en el plan de estudios de informática, y eso no incluía contar C, C ++ y Java como tres lenguajes separados.
Octal se usó en los días anteriores porque facilitaba la lectura de valores de instrucciones binarias. El PDP-11, por ejemplo, BÁSICAMENTE tenía un código de operación de 4 bits, 2 números de registro de 3 bits y 2 campos de mecanismo de acceso de 3 bits. Expresar la palabra en octal hizo que todo fuera obvio.
Debido a la asociación temprana de C con el PDP-11, se incluyó la notación octal, ya que era muy común en los PDP-11 en ese momento.
Otras máquinas tenían conjuntos de instrucciones que no se asignaban bien al hexadecimal. El CDC 6600 tenía una palabra de 60 bits, y cada palabra contenía típicamente de 2 a 4 instrucciones. Cada instrucción fue de 15 o 30 bits.
En cuanto a los valores de lectura y escritura, este es un problema resuelto, con una mejor práctica conocida en la industria, al menos en la industria de defensa. DOCUMENTAS tus formatos de archivo. No hay ambigüedad cuando se documenta el formato, porque el documento le DICE si está mirando un número decimal, un número hexadecimal o un número octal.
También tenga en cuenta: si su sistema de E / S se establece de manera predeterminada en el 0 inicial que significa octal, debe usar alguna otra convención en su salida para denotar valores hexadecimales. Esto no es necesariamente una victoria.
En mi opinión personal, Ada lo hizo mejor: 2 # 10010010 #, 8 # 222 #, 16 # 92 # y 146 representan el mismo valor. (Eso probablemente me llevará al menos tres votos negativos allí mismo, solo por mencionar a Ada).
fuente
Lo obtienen de C. ¿Por qué copiar? Debido a que la implementación base de los 3 está en C. La implementación predeterminada de Python es CPython . Ruby fue originalmente construido en C también. Javascript es el caso más interesante aquí. Se ejecuta en el navegador. ¿Te gustaría adivinar en qué se escribió el primer navegador web ?
Entonces, ¿por qué estos tres lenguajes se implementarían en C? Porque todos se originan en sistemas UNIX. Por lo tanto, es un caso de convención impulsada por el ecosistema. Perl hace esto también. Lua probablemente lo haría si usara enteros en lugar de dobles .
Entonces, se trata del entorno de estos lenguajes que se escriben en C para que tomen sus convenciones de C. Un buen corolario de soporte es Visual Basic, que utiliza & O en su lugar. En lo que respecta a su necesidad, parece ser más una abstracción permeable convertida en convención que cualquier otra cosa.
fuente
Hay un valor para la consistencia. Si no puede determinar de manera confiable cómo se traducirá un número, tendrá problemas reales al usar un valor en diferentes contextos.
También significa que no tiene que escribir su propio analizador. Hay un gran valor en el uso de rutinas de biblioteca bien probadas.
Además, si no admite la sintaxis inicial de 0, no tiene una forma sencilla de escribir valores octales.
Si bien no dependemos tanto de los números octales como una vez lo hicimos, todavía son valiosos. Si bien se pueden obtener los mismos resultados con números hexadecimales, en algunos contextos, octal es más fácil de entender.
Hasta ahora solo he visto un uso para los ceros a la izquierda en números decimales. Eso está en la visualización y entrada de campos decimales de longitud fija como números de identificación. Han pasado años desde que vi campos como ese con un cero a la izquierda. Si bien esto reduce los valores disponibles en un 10%, elimina el problema de que los usuarios a menudo omiten los ceros iniciales al ingresarlos.
fuente
chmod 438 ./myfile
Terrible!0o10
sintaxis? Creo que Python lo admite. Siempre puede hacer una manera simple de escribir valores octales que no hagan que el número ya no sea un número normal. He visto a personas tratar de usar ceros finales en el código para alineación y manipulación fácil, y son mordidos en el pie por notación octal031
como Halloween (31 de octubre) en lugar de Navidad (25 de diciembre) podría presentar algunos riesgos si los programadores copian en un código escrito en un lenguaje que utiliza la última implementación. Sin embargo, no veo ninguna razón por la cual un lenguaje no pueda lograr lo mejor de ambos mundos al admitir0q31
como notación cuando se desea octal, o0t025
para que la base diez permita valores de macropegado con ceros a la izquierda, y simplemente prohibir los ceros a la izquierda sin especificadores de base .