¿Por qué los archivos .scpt de Script Editor no se guardan como archivos de texto sin formato?

16

El Editor de secuencias de comandos (anteriormente Editor de AppleScript anterior a Yosemite 10.10) guarda los .scptarchivos como archivos binarios, no como archivos de texto sin formato.

Hace que trabajar con ellos en sistemas de control de código fuente sea algo engorroso.

¿Alguien sabe por qué este es el caso? ¿Existe alguna historia de larga data que requirió que este formato de archivo fuera algo más que archivos de texto sin formato?

Ian C.
fuente
No sé por qué, pero como se comentó aquí , podría escribir una macro de teclas de acceso rápido / script para guardar como texto. Es un dolor pero factible ...
Vic
2
En el panel Guardar puede guardar scripts en varios formatos diferentes, incluido el texto sin formato.
Chris Page
"¿Obtener script como texto de archivos scpt?": Lists.apple.com/archives/applescript-users/2007/Mar/…
pkamb

Respuestas:

20

El artículo de William R. Cook contiene una excelente historia y conocimiento de aquellos involucrados con AppleScript en 1989.

Lo que sigue es divertido y especulativo.

Conservación del espacio y procesamiento

AppleScript se escribió en un momento en que cada byte y bit era valioso. La codificación diferida de OS X como formatos de lista de propiedades sería un desperdicio a los ojos de los primeros desarrolladores.

El formato binario proporcionaba una forma analizada previamente que evitaba duplicar el proceso de análisis complejo, propenso a errores y que consume mucho tiempo con cada carga desde el disco. Es mejor cargar directamente en la memoria y ejecutar.

Adaptado

Guardar en un formato binario permitió que AppleScripts estuviera vinculado a los códigos subyacentes de AppleEvent en lugar de a su diccionario de terminología de forma larga.

Esto permitiría que un AppleScript escrito y guardado en una versión de una aplicación se actualice automáticamente a los cambios de terminología entre las versiones de las aplicaciones de destino.

Un objeto entero podría llamarse 'entero' en el script pero guardarse como el código de cuatro caracteres ' int ' en la representación binaria. El código de cuatro caracteres que proviene del diccionario AppleScript proporcionado por el sistema operativo.

Si una futura terminología de AppleScript decidiera alterar la palabra de usuario para entero, la representación binaria podría correlacionarse con el nombre más nuevo.

Un lado negativo de esto es posible ver hoy. Escriba un AppleScript contra el diccionario de una aplicación. Luego, elimine la aplicación por completo de su Mac. ¿Qué ves en Script Editor al abrir el script?

Al menos en versiones recientes, el Editor AppleScript mostró los galones que rodean el código de cuatro caracteres . El código ha sido recordado y resaltado. No el usuario enfrenta terminología.

Probablemente este no sea el beneficio principal, sino un posible beneficio.

Sesgo moderno

Vale la pena reconocer nuestro sesgo moderno para los documentos de texto. La experiencia nos ha enseñado a muchos que almacenar contenido valioso en formato binario conlleva riesgos. Los formatos binarios a menudo están poco documentados, son opacos para el usuario final y difíciles de abrir cuando no se mantiene el software propietario.

Cuando se creó AppleScript y su formato binario, este sesgo aún no se había formado. Los límites de almacenamiento y de cálculo eran muy reales y valía la pena cada kilobyte o miles de ciclos guardados.

Historia y origenes

Las historias del origen de AppleScript son maravillosas pero difíciles de rastrear en estos días. AppleScript trató de ser un lenguaje amigable, similar al inglés, y fue impresionante en su visión; ¡la implementación real fue más difícil de acertar!

Graham Miln
fuente
16

En resumen, .scptpermite la compatibilidad con versiones anteriores. Además, AppleScript / JavaScript (etc.) se puede guardar con la misma extensión, dado que Script Editorahora es compatible con JavaScript.

Para descompilar .scpten shell:

https://github.com/rupa/applescript/blob/master/decompile.sh

La parte más relevante:

osadecompile

Textmate es un editor externo que puede leer .scpt:

https://github.com/textmate/textmate/blob/master/Applications/decompile_as/src/decompile_as.mm

La parte más relevante:

[[OSAScript alloc] initWithCompiledData:];

Esta función proviene OSAScript.h, además de OS X SDK. En OSAScript.h, hay este largo comentario:

Dada una URL que localiza un script compilado, una aplicación de script o una fuente de script, crea y devuelve un descriptor de datos de script publicado automáticamente con su contenido. Puede usar el descriptor para crear un script con - [OSAScript initWithScriptDataDescriptor: ...]. Esto le permite crear un script con un OSALanguageInstance específico. Puede usar + [OSALanguage languageForScriptDataDescriptor:] para obtener el idioma para los datos del script, que luego se pueden usar para crear o seleccionar una instancia de idioma apropiada para un OSAScript. Los datos de origen del script pueden compilarse mediante: [OSAScript initWithScriptDataDescriptor: ...], o puede forzar el descriptor a una cadena (utilizando los métodos NSAppleEventDescriptor) y crear explícitamente un OSAScript con el origen. + (NSAppleEventDescriptor *) scriptDataDescriptorWithContentsOfURL:

Básicamente, cuando se guarda .scpt, OSALanguageInstancetambién se guarda un descriptor en el archivo.

Si un archivo se guarda como .applescript/ texto, el sistema lo compilará con la última versión del lenguaje AppleScript. Un script, por ejemplo, escrito para una versión anterior de OS X puede no funcionar en una nueva versión porque algunas funciones se han vuelto obsoletas. Con .scpt, el sistema / aplicación ha elegido para qué versión de applecipt está destinado.

Desde 10.10, javascript se puede guardar .scpty ejecutar correctamente.

más lejos
fuente
Tengo `errOSASourceNotAvailable (-1756) .` ¿qué significa eso?
TCB13
1
+1 para descompilar enlace. @ TCB13 que ocurre cuando su archivo .scpt no es binario y debería ser así, por lo que el editor tiene problemas para evitar que cierre la ventana que le pedirá que haga una copia. La copia tendrá la información guardada en un formato compilado en el futuro. Sin embargo, todo esto se resolverá en la respuesta que estoy a punto de publicar, que aprendí de esta respuesta lejana que contiene el comando descompilar.
Michael Dimmitt
Solo para agregar a esto, también está asprintdisponible en < hasseg.org/asprint > que le permitirá 'imprimir bastante' archivos .scpt. El único inconveniente es que no funciona en archivos .scpt de JavaScript, solo en AppleScript.
TJ Luoma
1

Después de ver el comando de descompilación compartido por Fartheraway descubrí la solución. Si desea que el archivo AppleScript (.scpt) no sea binario.

@fartheraway también lo menciona al final de su respuesta.

simplemente haga todo el desarrollo con la extensión .applescript.

El Editor de secuencias de comandos podrá ejecutar el código y no lo guardará en un formato compilado.

Michael Dimmitt
fuente