Arquitecturas exóticas que preocupan a los comités de estándares
Sé que los estándares C y C++ dejan definidos muchos aspectos de la implementación del lenguaje solo porque si hubiera una arquitectura con otras características, un compilador de confirmación estándar para esa arquitectura necesitaría emular esas partes del lenguaje, lo que resultaría en un código de máquina ineficiente. .
Seguramente hace 40 años cada computadora tenía su propia especificación única. Sin embargo, no conozco ninguna arquitectura utilizada hoy en día donde:
CHAR_BIT != 8
signed
no es complemento a dos (escuché que Java tuvo problemas con este).- El punto flotante no es compatible con IEEE 754 (Editar: quise decir "no en codificación binaria IEEE 754").
La razón por la que pregunto es que a menudo le explico a la gente que es bueno que C++ no exija ningún otro aspecto de bajo nivel como tipos de tamaño fijo † . Es bueno porque, a diferencia de 'otros lenguajes', hace que su código sea portátil cuando se usa correctamente (Editar: porque se puede portar a más arquitecturas sin requerir emulación de aspectos de bajo nivel de la máquina, como por ejemplo, aritmética en complemento a dos en arquitectura de signo+magnitud) . Pero me siento mal por no poder señalar ninguna arquitectura específica.
Entonces la pregunta es: ¿qué arquitecturas exhiben las propiedades anteriores?
† uint*_t
son opcionales.
Echa un vistazo a este
Servidores Unisys ClearPath Dorado
ofreciendo compatibilidad con versiones anteriores para personas que aún no han migrado todo su software Univac.
Puntos clave:
- palabras de 36 bits
CHAR_BIT == 9
- complemento de uno
- Punto flotante no IEEE de 72 bits
- espacio de direcciones separado para código y datos
- palabra dirigida
- sin puntero de pila dedicado
No sé si ofrecen un compilador de C++, pero podrían hacerlo .
Y ahora ha aparecido un enlace a una edición reciente de su manual en C:
Manual de referencia de programación del compilador Unisys C
La sección 4.5 tiene una tabla de tipos de datos con 9, 18, 36 y 72 bits.
Ninguna de sus suposiciones es válida para los mainframes. Para empezar, no conozco ningún mainframe que use IEEE 754: IBM usa punto flotante base 16, y ambos mainframes Unisys usan base 8. Las máquinas Unisys son un poco especiales en muchos otros aspectos: Bo ha mencionado el 2200 arquitectura, pero la arquitectura MPS es aún más extraña: palabras etiquetadas de 48 bits. (Si la palabra es un puntero o no depende de un bit de la palabra). Y las representaciones numéricas están diseñadas para que no haya una distinción real entre coma flotante y aritmética integral: la coma flotante es de base 8; no requiere normalización y, a diferencia de cualquier otro punto flotante que he visto, coloca el decimal a la derecha de la mantisa, en lugar de a la izquierda, y usa magnitud con signo para el exponente (además de la mantisa). Con el resultado de que un valor integral de punto flotante tiene (o puede tener) exactamente la misma representación de bits que un entero de magnitud con signo. Y no hay instrucciones aritméticas de punto flotante: si los exponentes de los dos valores son ambos 0, la instrucción hace aritmética integral; de lo contrario, hace aritmética de punto flotante. (Una continuación de la filosofía de etiquetado en la arquitectura). Lo que significa que, si bien int
pueden ocupar 48 bits, 8 de ellos deben ser 0 o el valor no se tratará como un número entero.
Encontré este enlace que enumera algunos sistemas donde CHAR_BIT != 8
. Incluyen
algunos TI DSP tienen
CHAR_BIT == 16
Chip BlueCore-5 (un chip Bluetooth de Cambridge Silicon Radio) que tiene
CHAR_BIT == 16
.
Y, por supuesto, hay una pregunta sobre Stack Overflow: ¿ Qué plataformas tienen algo más que caracteres de 8 bits?
En cuanto a los sistemas que no son complemento a dos, hay una lectura interesante en comp.lang.c++.moderated . Resumido: existen plataformas que tienen representación en complemento a uno o signo y magnitud.