¿Qué es el tipo de datos “átomo”?

6 minutos de lectura

Avatar de usuario de Jesse Good
Jesse bueno

me he encontrado con el ATOM escriba en el Win32api y también en la API de Acrobat hay ASAtomo.

Por lo que puedo decir, los átomos son claves para una tabla hash, generalmente de cadenas, para permitir una búsqueda rápida y compartir datos entre aplicaciones. ¿Es esto correcto y cuál es la etimología del tipo de átomo?

EDITAR

Después de una búsqueda exhaustiva me di cuenta Prólogo usa átomos, por lo que debe haber algún origen para esta palabra. Parece que solía referirse a una sola pieza de datos.

  • Sí, hay un origen para la palabra. Viene de la palabra griega ἄτομος (átomos), sentido “indivisible”. (lengua en la mejilla…)

    – usuario541686

    10 de mayo de 2012 a las 0:44


  • Creo que X11 también tenía el concepto Atom: permitir que la aplicación del cliente almacene una parte de los datos en el servidor X.

    – Juan3136

    10 de mayo de 2012 a las 0:59

  • @Mehrdad: Eso ayudó mucho, explicaría por qué un ATOM Se define como typedef WORD ATOM porque una palabra es la unidad direccionable por la CPU (es decir, no divisible).

    – Jesse Bueno

    10 de mayo de 2012 a las 1:00

  • @JesseGood: Jaja, sí… excepto que probablemente debería ser un tipo más grande como UINT_PTR, ya que las CPU hoy en día se ocupan de fragmentos de 32 y 64 bits. 🙂

    – usuario541686

    10 de mayo de 2012 a las 1:01

  • @Mehrdad: en Windows se define como unsigned short (probablemente porque se originó en Windows de 16 bits, pero la API de Acrobat lo define como unsigned long.

    – Jesse bueno

    10 de mayo de 2012 a las 1:03

ATOM es un primitivo similar a un identificador de Windows de 16 bits. Su valor es completamente opaco para el modo de usuario. No es un puntero o un índice.

typedef ATOM corto sin firmar;

  • ¿Supongo que se generan usando alguna función hash interna?

    – Jesse Bueno

    10 mayo 2012 a las 21:21

  • No. Son índices en una tabla de identificadores en modo kernel. Son deliberadamente opacos porque filtrar los punteros del modo kernel al modo usuario es una violación de seguridad.

    – SecurityMatt

    11 de mayo de 2012 a las 3:46

  • Gracias eso fue útil. Parece que Windows usa átomos internamente para almacenar y recuperar cadenas de manera eficiente.

    – Jesse bueno

    11 de mayo de 2012 a las 3:57

  • (Enlacé al mismo sitio en mi pregunta)

    – Jesse bueno

    11 de mayo de 2012 a las 4:23

  • @SecurityMatt: no debería quitar la referencia a un puntero de modo de núcleo desencadenar STATUS_ACCESS_VIOLATION.

    – usuario877329

    24 de marzo de 2014 a las 16:44

En cuanto a la etimología del nombre ATOMsé que una vez lo vi en alguna documentación antigua de la API de Microsoft Win32 que es un acrónimo de “Aacceso a METROemory” o algo así. Es un término usado para identificadores numéricos simples (otro nombre es “handles”) que representan algunas estructuras de datos internas en el sistema.

Por razones obvias, no sería inteligente dar al usuario punteros directos a estas estructuras. Primero, porque residen en el espacio del kernel y segundo, porque viola la encapsulación. El usuario podría simplemente liberar la memoria que no le pertenece, o sobrescribirla, o algunas otras ideas estúpidas. Entonces, el sistema operativo simplemente le da una etiqueta de número de reemplazo (ese es el ÁTOMO), que luego podría usarse para solicitar los datos del sistema. También es más rápido para el usuario pasar el número pequeño en lugar de toda la enorme estructura de datos. Los usuarios no necesitan preocuparse por las asignaciones de memoria y otras cosas, o acceder a algunos datos a través de punteros que ya no son válidos, lo que simplemente podría bloquear sus programas.

  • Los usuarios no necesitan preocuparse por las asignaciones de memoria… Usted sabe que también las tablas ATOM tienen límites, esto es especialmente cierto para la tabla atómica global.

    – Lobo

    23 de febrero de 2015 a las 14:06

  • Me has entendido mal. No estaba hablando de asignación. espaciopero sobre la asignación método. Es decir, los usuarios no tienen que preocuparse por cómo asignar memoria para estos objetos y dónde, no necesitan lidiar con todo el alboroto de asignar, liberar y verificar punteros no válidos. Pero, por supuesto, aún deben preocuparse por la cantidad de memoria que asignan a sus recursos. Pero pensé que esto es obvio.

    – SasQ

    24 de febrero de 2015 a las 14:38

  • Sí, eso está claro para los dos. Su respuesta todavía parece demasiado optimista. ¿Por qué no menciona simplemente la reducción de los aspectos más molestos de la gestión de la memoria (fugas de recursos, punteros peligrosos)? los la asignación en sí misma puede fallary esto por supuesto tiene que ser comprobado.

    – Lobo

    24 de febrero de 2015 a las 15:07

  • Claro, pero como dije, esos son los detalles sin importancia que son irrelevantes para la pregunta original. ¿Por qué molestarse en afirmar lo obvio? Si el cartel original no preguntó por ellos, supongo que es inteligente y está al tanto de estos detalles. Solo pregunta qué es ATOM. Pero si piensas lo contrario, ¿por qué no agregas tu propia respuesta?

    – SasQ

    25 de febrero de 2015 a las 18:09

  • La etimología es casi con certeza una formación posterior. Proviene de Lisp. Los símbolos son “átomos” en Lisp. Cuando el lector Lisp lee un token de símbolo, se convierte en una cadena de caracteres que se “interna” inmediatamente: se convierte en un símbolo. Los símbolos se pueden comparar como punteros: si un símbolo A es igual a B, sabemos que son el mismo átomo; no tenemos que hacer una comparación carácter por carácter de sus nombres de cadena. En el sistema X Windows, convertir una cadena en un XAtom se llama XInternAtom utilizando la terminología “interno” de Lisp. Windows probablemente lo copió “átomo” desde allí.

    – Kaz

    1 de julio de 2017 a las 23:19


Avatar de usuario de Jesse Good
Jesse bueno

Lo más antiguo que puedo encontrar sobre el término “átomo” es del lenguaje de programación Lisp (fuente). Sin embargo, probablemente provino originalmente de lógica matemática. En programación también se les llama simbolos y en su forma más simple son enteros de nombre (un tipo enumerado en C sería un ejemplo). Sin embargo, se utilizan ampliamente en muchos lenguajes de programación y en la API de Win32 y la API de Acrobat son identificadores de cadenas en una tabla.

Además, como señala Mehrdad, el significado original en griego es “indivisible”, por lo que implican un tipo de datos primitivo que no se puede desglosar más.

  • Es por eso que el nombre de un átomo (la cosa de física / química) es posiblemente incorrecto.

    – Mahmud Al-Qudsi

    10 de mayo de 2012 a las 2:59

los RegistroClase / RegistrClassEx (y algunas otras) devuelven un ÁTOMO tipo de datos.

El ATOM identifica de forma única la clase que se está registrando, pero si la función falla, devuelve cero, por lo que puede probar si la función ha fallado así.

ATOM a=0;
.
.
a = RegisterClassEx(your_window);
if (0==a)
  {
    //code for function failed
  }

¿Ha sido útil esta solución?