stringtranslate.com

Expresiones S canónicas

Una expresión S canónica (o csexp ) es una forma de codificación binaria de un subconjunto de una expresión S general (o sexp). Fue diseñada para su uso en SPKI con el fin de conservar la potencia de las expresiones S y garantizar la forma canónica para aplicaciones como firmas digitales , al tiempo que se logra la compacidad de una forma binaria y se maximiza la velocidad de análisis.

El subconjunto particular de expresiones S generales que se aplica aquí está compuesto por átomos , que son cadenas de bytes, y paréntesis utilizados para delimitar listas o sublistas. Estas expresiones S son completamente recursivas.

Si bien las expresiones S se codifican normalmente como texto, con espacios que delimitan los átomos y comillas para rodear los átomos que contienen espacios, cuando se utiliza la codificación canónica, cada átomo se codifica como una cadena de bytes con prefijo de longitud. No se permiten espacios en blanco que separen elementos adyacentes en una lista. La longitud de un átomo se expresa como un número decimal ASCII seguido de :.

Ejemplo

El sexo

(Esta "S-expresión canónica" tiene 5 átomos)

se convierte en csexp

(4:esta22:expresión S canónica3:tiene1:55:átomos)

No se requieren comillas para escapar el carácter de espacio interno del átomo "Canonical S-expression", porque el prefijo de longitud claramente apunta al final del átomo. No hay espacios en blanco que separen un átomo del siguiente elemento en la lista.

Propiedades

Interpretación y restricciones

Si bien los csexps generalmente permiten listas vacías, átomos vacíos, etc., ciertos usos de los csexps imponen restricciones adicionales. Por ejemplo, los csexps que se usan en SPKI tienen una limitación en comparación con los csexps en general: cada lista debe comenzar con un átomo y, por lo tanto, no puede haber listas vacías.

Normalmente, el primer átomo de una lista se trata como se trata un nombre de elemento en XML .

Comparaciones con otras codificaciones

Existen otras codificaciones de uso común:

  1. XML
  2. ASN.1
  3. JSON (y YAML que incluye "JSON como un subconjunto oficial", con el superconjunto, pensado para ser más legible para humanos ).

En general, csexp tiene un analizador que es uno o dos órdenes decimales de magnitud más pequeño que el de XML o ASN.1. [ cita requerida ] Este pequeño tamaño y la velocidad correspondiente [ cita requerida ] le dan a csexp su principal ventaja. Además de la ventaja del análisis, existen otras diferencias.

csexp frente a XML

csexp y XML se diferencian en que csexp es un formato de representación de datos, mientras que XML incluye un formato de representación de datos y también un mecanismo de esquema. Por lo tanto, XML se puede "configurar" para tipos particulares de datos, que se ajustan a alguna gramática (por ejemplo, HTML , ATOM , SVG , MathML o nuevas según sea necesario). Tiene lenguajes para definir gramáticas de documentos: DTD está definido por el propio estándar XML, mientras que XSD , RelaxNG y Schematron se usan comúnmente con XML para funciones adicionales, y XML también puede funcionar sin esquema. Por supuesto, los datos de csexp se pueden manipular mediante esquemas implementados a un nivel superior, pero no proporciona dicho mecanismo en sí.

En términos de caracteres y bytes, una "cadena" csexp puede tener cualquier secuencia de bytes (debido al prefijo de longitud en cada átomo), mientras que XML (como las expresiones S de Lisp regulares, JSON y los literales en lenguajes de programación) requiere representaciones alternativas para algunos caracteres (como "<" y la mayoría de los caracteres de control). Sin embargo, esto no tiene efecto en el rango de estructuras y semánticas que se pueden representar. XML también proporciona mecanismos para especificar cómo se pretende interpretar una secuencia de bytes dada: digamos, como una cadena Unicode UTF-8 , un archivo JPEG o un entero; csexp deja tales distinciones a mecanismos externos.

En el nivel más básico, tanto csexp como XML representan árboles (como lo hacen la mayoría de las demás representaciones externas). Esto no es sorprendente, ya que XML puede describirse como una forma con diferente puntuación para expresiones S similares a LISP, o viceversa. [1]

Sin embargo, XML incluye semántica adicional, que se logra comúnmente en csexp mediante diversas convenciones en lugar de como parte del lenguaje. En primer lugar, cada elemento XML tiene un nombre (las aplicaciones csexp suelen utilizar el primer elemento secundario de cada expresión para esto). En segundo lugar, XML proporciona tipificación de datos, en primer lugar a través de la gramática del esquema. Sin embargo, un esquema también puede distinguir números enteros, cadenas, objetos de datos con tipos (por ejemplo, JPEG) y (especialmente con XSD ) otros tipos).

Un elemento XML también puede tener atributos , una construcción que csexp no comparte. Para representar datos XML en csexp, se debe elegir una representación para dichos atributos; una obvia es reservar el segundo elemento en cada expresión S para una lista de pares (nombre-valor), análoga a la lista de asociaciones de LISP . Los atributos XML ID e IDREF no tienen equivalente en csexp, pero se pueden implementar fácilmente mediante un programa de aplicación csexp.

Por último, un elemento XML puede contener comentarios y/o instrucciones de procesamiento. csexp no tiene equivalentes específicos, pero son fáciles de representar, simplemente reservando un nombre para cada uno. Por ejemplo, nómbrelos "*COM" y "*PI" (el "*" evita que entren en conflicto con los nombres de los tipos de elementos XML):

(4:*COM15:Texto del comentario)(3:*PI6:target11:font="helv")

Tanto csexp como XML son completamente recursivos.

El primer átomo de una lista csexp, por convención, corresponde aproximadamente a un nombre de tipo de elemento XML para identificar el "tipo" de la lista. Sin embargo, en csexp puede ser cualquier átomo en cualquier codificación (por ejemplo, un JPEG, una cadena Unicode, un archivo WAV , etc.), mientras que los nombres de elementos XML son identificadores, restringidos a ciertos caracteres, como los identificadores de lenguaje de programación. El método de csexp es obviamente más general; por otro lado, la identificación de la codificación en la que se encuentra dicho elemento y, por lo tanto, la forma de interpretarlo, está determinada únicamente por las convenciones de un usuario en particular, lo que significa que una aplicación csexp debe crear dichas convenciones por sí misma, en código, documentación, etc.

De manera similar, los átomos de csexp son binarios (consisten en un prefijo de longitud seguido de bytes totalmente arbitrarios ), mientras que XML está diseñado para ser legible por humanos (aunque podría decirse que menos que JSON o YAML ), por lo que los bytes arbitrarios en XML deben codificarse de alguna manera (por ejemplo, una imagen de mapa de bits se puede incluir usando base64 ). Esto significa que almacenar grandes cantidades de información no legible en XML sin comprimir requiere más espacio; por otro lado, sobrevivirá a la traducción entre conjuntos de caracteres alternativos (incluida la transmisión a través de hosts de red que pueden aplicar diferentes conjuntos de caracteres, convenciones de final de línea, etc.).

Se ha sugerido que XML "fusiona" una secuencia de cadenas dentro de un elemento en una sola cadena, mientras que csexp permite una secuencia de átomos dentro de una lista y esos átomos permanecen separados unos de otros; pero esto es incorrecto. [2] Exactamente como las S-expresiones y csexp, XML tiene una noción de una "secuencia de cadenas" solo si las "cadenas" están separadas de alguna manera:

<s> Cadena  A </s><s> Cadena  B </s>  versus <s> Cadena A  Cadena  B </s>
("Cadena A" "Cadena B") versus("Cadena ACadena B")
(8: Cuerda A8: Cuerda B) versus(16:Cadena ACadena B)

Comparación entre csexp y ASN.1

ASN.1 es una forma popular de codificación binaria. Sin embargo, expresa solo sintaxis (tipos de datos), no semántica. Dos estructuras diferentes (cada una de ellas una SECUENCIA de dos ENTEROS) tienen representaciones idénticas en la red (salvo que se elijan etiquetas especiales para distinguirlas). Para analizar una estructura ASN.1, se debe indicar al analizador qué conjunto de estructuras se espera y el analizador debe hacer coincidir el tipo de datos que se analiza con las opciones de estructura. Esto aumenta la complejidad de un analizador ASN.1.

Una estructura csexp lleva consigo alguna indicación de su propia semántica (codificada en los nombres de los elementos), y al analizador de una estructura csexp no le importa qué estructura se está analizando. Una vez que una expresión de formato de cable se ha analizado en forma de árbol interno (similar al DOM de XML), el consumidor de esa estructura puede examinarla para comprobar si cumple con lo esperado. Un documento XML sin un esquema funciona igual que csexp en este sentido, mientras que un documento XML con ellos puede funcionar más como ASN.1.

Enlaces externos

Notas y referencias

  1. ^ Los creadores de XML conocían esta similitud . Por ejemplo, Steven DeRose la analizó en The SGML FAQ Book: Understanding the Relationship of SGML and XML , Kluwer Academic Publishers, 1997. ISBN 978-0-7923-9943-8 . 
  2. ^ La interfaz SAX para XML permite que un analizador XML divida cadenas de texto (individuales) de la forma que desee. Algunas implementaciones [ cita requerida ] devuelven (incorrectamente) varias líneas como nodos de texto individuales, lo que puede haber dado lugar a este malentendido tan común.