¿Por qué tantos idiomas tratan los números que comienzan con 0 como octales?

21

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 010es 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?
Manishearth
fuente
24
¿Aceptará "confundir a los jóvenes durante una entrevista" como respuesta?
Yannis
11
conforme a la sintaxis C + copia ciega
fanático del trinquete
1
@Manishearth C lo heredó de sus antepasados. Java lo tiene, porque C lo tiene. La mayoría de los otros lo tienen, porque C y Java lo tienen.
Ingo
2
Todavía se ven cambios en el archivo octal de Unix: chmodcon 0666 o 0777 para grupos de 3 bits para usuario, grupo y otros: lectura, escritura, ejecutable.
Joop Eggen
3
@Llepwryd En navegadores antiguos, de parseInt('010')hecho, devolvió 8, de ahí todos los consejos para usar siempre parseInt(foo, 10)(y todavía es un hábito para mí)
Izkata

Respuestas:

34

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).

John R. Strohm
fuente
11
Te voté en contra por mencionar a Ada ... es broma
kufi
12
Tengo curiosidad por saber cómo llegaste a la cifra de que más del 50% de los "diseñadores de idiomas" - ¿por qué las citas de miedo? - No tengo experiencia con nada excepto los descendientes C. Pasé unos dieciséis años de mi vida hablando con diseñadores profesionales de idiomas todos los días y ninguno de ellos coincide con su descripción.
Eric Lippert
Javascript fue descrito como "queremos hacer un ceceo en el navegador" para que su diseñador se interese, si recuerdo esa entrevista correctamente ...
Izkata
2
@Izkata: De hecho, Waldemar Horwat me dijo una vez que veía a JavaScript como esencialmente Common Lisp con una sintaxis tipo C. De hecho, Waldemar definió un metalenguaje, escribió un intérprete para su metalenguaje en Common Lisp y luego escribió la especificación de JavaScript en su metalenguaje, lo que le permitió ejecutar realmente la especificación. Fue una técnica inteligente.
Eric Lippert
¿Por qué se usó 0? ¿No tendría sentido usar un carácter no numérico? ¿El estándar ANSI simplemente no tenía la previsión de errores causados ​​por números que pretenden ser de base diez?
Old Badman Gray
6

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.

Ingeniero mundial
fuente
¿Mosaic soportó JavaScript? Si no, ¿cómo es relevante mencionarlo?
svick
2
@svick Es la línea de base para Netscape Navigator que lo hizo.
Ingeniero mundial el
2

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.

BillThor
fuente
3
Los campos con ceros a la izquierda son cadenas, representaciones visuales con su propio significado, no números.
Pieter B
1
+1 considera chmod 438 ./myfileTerrible!
Ingo
2
¿Por qué no permitir una 0o10sintaxis? 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 octal
Manishearth
Puedo entender el deseo de tener un medio para escribir valores octales, además de binario y hexadecimal. También puedo entender que tener un compilador interprete 031como 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 admitir 0q31como notación cuando se desea octal, o 0t025para 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 .
supercat
@supercat Uso del 0 inicial para representar retrocesos de fecha octal al menos para su juventud. Los casos en los que se usa con frecuencia son los casos en que los bits tienen importancia, y la interpretación del número como un número decimal solo es correcta para valores inferiores a 8. Agregar caracteres adicionales (incluidos ceros a la izquierda en números decimales) puede ser más confuso que útil. . Ciertamente preguntaría por qué se escribió una fecha 012 031, 010 031 o 012 025.
BillThor