Por que os arquivos .scpt do Editor de scripts não são salvos como arquivos de texto sem formatação?

15

O Editor de scripts (anteriormente AppleScript Editor anterior ao Yosemite 10.10) salva .scptarquivos como arquivos binários, não como arquivos de texto sem formatação.

Isso torna o trabalho com eles em sistemas de controle de código-fonte um tanto complicado.

Alguém sabe por que esse é o caso? Existe algum histórico de longa data que exigia que esse formato de arquivo fosse algo diferente de arquivos de texto sem formatação?

Ian C.
fonte
Eu não sei o porquê disso, mas como comentado aqui , você pode escrever uma macro de teclas de atalho / script para salvar como texto. É uma dor, mas factível ...
Vic
2
No painel Salvar, você pode salvar scripts em vários formatos diferentes, incluindo texto sem formatação.
Chris Page
"Obter script como texto a partir de arquivos scpt?": Lists.apple.com/archives/applescript-users/2007/Mar/…
pkamb

Respostas:

19

O artigo de William R. Cook contém uma excelente história e insights dos envolvidos com o AppleScript em 1989.

O que se segue é divertido e especulativo.

Conservação de espaço e processamento

O AppleScript foi escrito em um momento em que cada byte e bit era valioso. A codificação preguiçosa do OS X como formatos de lista de propriedades seria um desperdício aos olhos dos primeiros desenvolvedores.

O formato binário fornecia um formulário pré-analisado que evitava duplicar o processo de análise complexo, propenso a erros e demorado, com cada carregamento do disco. Melhor carregar diretamente na memória e executar.

Adaptativo

Salvar em formato binário permitiu que os AppleScripts fossem vinculados aos códigos AppleEvent subjacentes, em vez do dicionário de terminologia longa.

Isso permitiria que um AppleScript gravado e salvo em uma versão de um aplicativo fosse atualizado automaticamente para alterações de terminologia entre as versões dos aplicativos de destino.

Um objeto inteiro pode ser chamado de 'número inteiro' no script, mas salvo como o código de quatro caracteres ' int ' na representação binária. O código de quatro caracteres proveniente do dicionário AppleScript fornecido pelo sistema operacional.

Se uma terminologia AppleScript futura decidir alterar a palavra voltada ao usuário para inteiro, a representação binária poderá mapear para o nome mais recente.

Um outro lado disso é possível ver hoje. Escreva um AppleScript no dicionário de um aplicativo. Em seguida, remova o aplicativo totalmente do seu Mac. O que você vê no Editor de scripts ao abrir o script?

Pelo menos nas versões recentes, o AppleScript Editor mostrou divisas ao redor do código de quatro caracteres . O código foi lembrado e destacado. Não é o usuário que enfrenta a terminologia.

Provavelmente, esse não é o principal benefício, mas um possível benefício.

Viés moderno

Vale a pena reconhecer nosso viés moderno para documentos de texto. A experiência ensinou muitos de nós que armazenar conteúdo valioso em formato binário traz riscos. Os formatos binários costumam ser pouco documentados, opacos ao usuário final e difíceis de abrir quando o software proprietário não é mantido.

Quando AppleScript e seu formato binário foram criados, esse viés ainda não foi formado. Os limites computacionais e de armazenamento eram muito reais e cada kilobyte ou milhares de ciclos salvos valia a pena.

História e Origens

As histórias da origem do AppleScript são maravilhosas, mas difíceis de rastrear nos dias de hoje. O AppleScript tentou ser um idioma amigável, como o inglês, e era de tirar o fôlego em sua visão; a implementação real foi mais difícil de acertar!

Graham Miln
fonte
16

Em resumo, .scptpermite compatibilidade com versões anteriores. Além disso, o AppleScript / javascript (etc) pode ser salvo com a mesma extensão, já que Script Editoragora suporta javascript.

Para descompilar .scptno shell:

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

A parte mais relevante:

osadecompile

O Textmate é um editor de terceiros que pode ler .scpt:

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

A parte mais relevante:

[[OSAScript alloc] initWithCompiledData:];

Essa função vem OSAScript.h, além do OS X SDK. Em OSAScript.h, há este longo comentário:

Dado um URL que localiza um script compilado, aplicativo de script ou fonte de script, crie e retorne um descritor de dados de script liberado automaticamente com seu conteúdo. Você pode usar o descritor para criar um script com - [OSAScript initWithScriptDataDescriptor: ...]. Isso permite criar um script com uma OSALanguageInstance específica. Você pode usar + [OSALanguage languageForScriptDataDescriptor:] para obter o idioma dos dados do script, que podem ser usados ​​para criar ou selecionar uma instância de idioma apropriada para um OSAScript. Os dados de origem do script podem ser compilados por - [OSAScript initWithScriptDataDescriptor: ...], ou você pode coagir o descritor a uma cadeia de caracteres (usando os métodos NSAppleEventDescriptor) e criar explicitamente um OSAScript com a fonte. + (NSAppleEventDescriptor *) scriptDataDescriptorWithContentsOfURL:

Basicamente, quando salvo .scpt, um OSALanguageInstancedescritor também é salvo no arquivo.

Se um arquivo for salvo como .applescript/ texto, o sistema o compilará com a versão mais recente da linguagem AppleScript. Um script, por exemplo, escrito para uma versão mais antiga do OS X pode não funcionar em uma nova versão porque algumas funções se tornaram obsoletas. Com .scpt, o sistema / aplicativo selecionou para qual versão do applescipt se destina.

A partir da 10.10, o javascript pode ser salvo .scpte executado corretamente.

ainda mais longe
fonte
Got `errOSASourceNotAvailable (-1756) .` o que isso significa?
precisa saber é o seguinte
11
+1 para descompilar o link. @ TCB13 que acontece quando o seu arquivo .scpt não é binário e deve ocorrer, para que o editor tenha problemas, a solução é fechar a janela que solicitará que você faça uma cópia. A cópia terá as informações salvas em um formato compilado daqui para frente. No entanto, tudo isso será resolvido na resposta que estou prestes a postar, que aprendi com essa resposta que contém o comando decompile.
Michael Dimmitt
Só para adicionar isso, também está asprintdisponível em < hasseg.org/asprint >, que permite 'imprimir' arquivos .scpt. A única desvantagem é que ele não funciona em arquivos .scpt JavaScript, apenas em arquivos AppleScript.
TJ Luoma #
1

Depois de ver o comando decompile compartilhado por Fartheraway, descobri a solução. Se você deseja que o arquivo AppleScript (.scpt) não seja binário.

@fartheraway também menciona isso na parte inferior de sua resposta.

basta fazer todo o desenvolvimento com a extensão .applescript.

O Editor de scripts poderá executar o código e não o salvará em um formato compilado.

Michael Dimmitt
fonte