Pourquoi les fichiers .scpt de Script Editor ne sont-ils pas enregistrés en tant que fichiers texte brut?

16

L'éditeur de script (anciennement AppleScript Editor pré-Yosemite 10.10) enregistre les .scptfichiers sous forme de fichiers binaires, pas de fichiers de texte brut.

Cela rend le travail avec eux dans les systèmes de contrôle de code source quelque peu fastidieux.

Est-ce que quelqu'un sait pourquoi c'est le cas? Y a-t-il un historique de longue date qui a exigé que ce format de fichier soit autre chose que des fichiers en texte brut?

Ian C.
la source
Je ne sais pas pourquoi, mais comme commenté ici , vous pouvez écrire une macro de raccourci clavier / script pour enregistrer en tant que texte à la place. C'est une douleur mais faisable ...
Vic
2
Dans le panneau Enregistrer, vous pouvez enregistrer des scripts dans plusieurs formats différents, y compris du texte brut.
Chris Page
"Obtenir le script sous forme de texte à partir de fichiers scpt?": Lists.apple.com/archives/applescript-users/2007/Mar/…
pkamb

Réponses:

20

L'article de William R. Cook contient une excellente histoire et un aperçu de ceux impliqués dans AppleScript en 1989.

Ce qui suit est amusant et spéculatif.

Conservation de l'espace et traitement

AppleScript a été écrit à une époque où chaque octet et chaque bit étaient précieux. L'encodage paresseux d'OS X en tant que formats de liste de propriétés serait un gaspillage aux yeux de ces premiers développeurs.

Le format binaire fournit une forme pré-analysée qui évite de dupliquer le processus d'analyse complexe, sujet aux erreurs et qui prend du temps à chaque chargement à partir du disque. Mieux vaut charger directement en mémoire et exécuter.

Adaptatif

L'enregistrement dans un format binaire a permis à AppleScripts d'être lié aux codes AppleEvent sous-jacents plutôt qu'à leur dictionnaire de terminologie longue.

Cela permettrait à un AppleScript écrit et enregistré sur une version d'une application de se mettre automatiquement à jour en fonction des changements de terminologie entre les versions des applications ciblées.

Un objet entier peut être appelé 'entier' dans le script mais enregistré en tant que code à quatre caractères ' int ' dans la représentation binaire. Le code à quatre caractères provenant du dictionnaire AppleScript fourni par le système d'exploitation.

Si une future terminologie AppleScript décidait de modifier le mot face à l'utilisateur pour un entier, la représentation binaire pourrait correspondre au nom le plus récent.

Un revers à cela est possible de voir aujourd'hui. Écrivez un AppleScript par rapport au dictionnaire d'une application. Supprimez ensuite l'application entièrement de votre Mac. Que voyez-vous dans l'Éditeur de script à l'ouverture du script?

Au moins dans les versions récentes, AppleScript Editor montrait des chevrons entourant le code à quatre caractères . Le code a été mémorisé et mis en évidence. Pas l'utilisateur face à la terminologie.

Ce n'est probablement pas le principal avantage mais un avantage possible.

Biais moderne

Il convient de reconnaître notre parti pris moderne pour les documents texte. L'expérience a enseigné à beaucoup d'entre nous que le stockage de contenu précieux dans un format binaire comporte des risques. Les formats binaires sont souvent mal documentés, opaques pour l'utilisateur final et difficiles à ouvrir lorsque le logiciel propriétaire n'est pas maintenu.

Lorsque AppleScript et son format binaire ont été créés, ce biais n'était pas encore formé. Les limites de stockage et de calcul étaient très réelles et chaque kilo-octet ou milliers de cycles économisés en valait la peine.

Histoire et origines

Les histoires d'origine d'AppleScript sont merveilleuses mais difficiles à retracer ces jours-ci. AppleScript a essayé d'être une langue conviviale, comme l'anglais, et était à couper le souffle dans sa vision; la mise en œuvre réelle était plus difficile à réaliser!

Graham Miln
la source
16

En bref, .scptpermet une compatibilité descendante. De plus, applescript / javascript (etc) peut être enregistré avec la même extension, étant donné qu'il Script Editorprend désormais en charge javascript.

Pour décompiler .scpten shell:

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

La partie la plus pertinente:

osadecompile

Textmate est un éditeur tiers qui peut lire .scpt:

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

La partie la plus pertinente:

[[OSAScript alloc] initWithCompiledData:];

Cette fonction est issue OSAScript.hdu SDK OS X. Dans OSAScript.h, il y a ce long commentaire:

Étant donné une URL qui localise un script compilé, une application de script ou une source de script, créez et renvoyez un descripteur de données de script publié automatiquement avec son contenu. Vous pouvez utiliser le descripteur pour créer un script avec - [OSAScript initWithScriptDataDescriptor: ...]. Cela vous permet de créer un script avec une OSALanguageInstance spécifique. Vous pouvez utiliser + [OSALanguage languageForScriptDataDescriptor:] pour obtenir la langue des données de script, qui peut ensuite être utilisée pour créer ou sélectionner une instance de langue appropriée pour un OSAScript. Les données de source de script peuvent être compilées par - [OSAScript initWithScriptDataDescriptor: ...], ou vous pouvez contraindre le descripteur à une chaîne (à l'aide des méthodes NSAppleEventDescriptor) et créer explicitement un OSAScript avec la source. + (NSAppleEventDescriptor *) scriptDataDescriptorWithContentsOfURL:

Fondamentalement, une fois enregistré .scpt, un OSALanguageInstancedescripteur est également enregistré dans le fichier.

Si un fichier est enregistré sous .applescript/ text, le système le compilera avec la dernière version du langage applescript. Un script, par exemple, écrit pour une ancienne version d'OS X peut ne pas fonctionner sur une nouvelle version car certaines fonctions sont devenues obsolètes. Avec .scpt, le système / l'application a choisi pour quelle version de applescipt il est destiné.

Depuis 10.10, javascript peut être enregistré .scptet exécuté correctement.

plus loin
la source
Vous avez `errOSASourceNotAvailable (-1756) .` Qu'est-ce que cela signifie?
TCB13
1
+1 pour le lien de décompilation. @ TCB13 qui se produit lorsque votre fichier .scpt n'est pas binaire et cela devrait l'être afin que l'éditeur ait du mal à contourner la question de fermer la fenêtre qui vous demandera de faire une copie. La copie conservera ensuite les informations dans un format compilé. Cependant, tout cela sera résolu dans la réponse que je suis sur le point de publier et que j'ai apprise de cette réponse lointaine contenant la commande de décompilation.
Michael Dimmitt
Juste pour ajouter à cela, il est également asprintdisponible à partir de < hasseg.org/asprint > qui vous permettra de "joli imprimer" les fichiers .scpt. Le seul inconvénient est qu'il ne fonctionne pas sur les fichiers JavaScript .scpt, uniquement sur les fichiers AppleScript.
TJ Luoma
1

Après avoir vu la commande de décompilation partagée par Fartheraway, j'ai découvert la solution. Si vous souhaitez que le fichier applescript (.scpt) ne soit pas binaire.

@fartheraway le mentionne également au bas de sa réponse.

faites simplement tout le développement avec l'extension .applescript.

L'éditeur de script pourra exécuter le code et ne l'enregistrera pas dans un format compilé.

Michael Dimmitt
la source