脚本编辑器(以前是Yosemite 10.10之前的AppleScript编辑器)将.scpt
文件另存为二进制文件,而不是纯文本文件。
这使得在源代码控制系统中使用它们有些麻烦。
有谁知道为什么会这样吗?是否有一些长期的历史记录要求这种文件格式不是纯文本文件?
脚本编辑器(以前是Yosemite 10.10之前的AppleScript编辑器)将.scpt
文件另存为二进制文件,而不是纯文本文件。
这使得在源代码控制系统中使用它们有些麻烦。
有谁知道为什么会这样吗?是否有一些长期的历史记录要求这种文件格式不是纯文本文件?
Answers:
威廉·R·库克(William R. Cook)的论文包含了 1989年与AppleScript相关的优秀历史和见解。
接下来是有趣和投机。
AppleScript是在每个字节和每一位都很宝贵的时候编写的。在那些早期开发人员的眼中,OS X的惰性编码作为属性列表格式是浪费的。
二进制格式提供了一种预先解析的形式,避免了磁盘上的每次加载都重复复杂,容易出错且耗时的解析过程。最好直接加载到内存中并运行。
以二进制格式保存可以将AppleScripts绑定到底层AppleEvent代码,而不是它们的长格式术语词典。
这将允许针对一个应用程序版本编写和保存的AppleScript自动更新为目标应用程序版本之间的术语更改。
整数对象在脚本中可能称为“整数”,但int
在二进制表示形式中另存为四个字符代码“ ”。四个字符代码来自操作系统提供的AppleScript词典。
如果将来的AppleScript术语决定将面向用户的单词更改为整数,则二进制表示形式可以映射到较新的名称。
今天有可能看到另一面。针对应用程序的字典编写AppleScript。然后从您的Mac中完全删除该应用程序。打开脚本后,您会在脚本编辑器中看到什么?
至少在最新版本中,AppleScript编辑器显示了围绕四个字符代码的V形符号。该代码已被记住并突出显示。用户不是面对术语。
这可能不是主要的好处,而是可能的好处。
值得承认我们对文本文档的现代偏见。经验告诉我们许多人以二进制格式存储有价值的内容会带来风险。二进制格式的文档通常收录不好,对于最终用户而言是不透明的,并且在不维护拥有软件的情况下很难打开。
当创建AppleScript及其二进制格式时,这种偏见尚未形成。存储和计算限制非常真实,每节省千字节或数千个周期是值得的。
AppleScript的起源故事很精彩,但如今很难追踪。AppleScript试图成为一种友好的英语语言,并且在其愿景中叹为观止。实际的实现更难实现!
简而言之,.scpt
允许向后兼容。另外,鉴于Script Editor
现在支持javascript ,applescript / javascript(等)可以使用相同的扩展名保存。
要.scpt
在shell中反编译:
https://github.com/rupa/applescript/blob/master/decompile.sh
最相关的部分:
osadecompile
Textmate是可以读取.scpt
以下内容的第三方编辑器:
https://github.com/textmate/textmate/blob/master/Applications/decompile_as/src/decompile_as.mm
最相关的部分:
[[OSAScript alloc] initWithCompiledData:];
此功能来自OSAScript.h
OS X SDK之外的。在中OSAScript.h
,有一个冗长的注释:
给定一个用于定位已编译脚本,脚本应用程序或脚本源的URL,创建并返回一个自动发布的脚本数据描述符及其内容。您可以使用描述符使用-[OSAScript initWithScriptDataDescriptor:...]创建脚本。这使您可以使用特定的OSALanguageInstance创建脚本。您可以使用+ [OSALanguage languageForScriptDataDescriptor:]获取脚本数据的语言,然后可以使用该语言为OSAScript创建或选择适当的语言实例。脚本源数据可以通过-[OSAScript initWithScriptDataDescriptor:...]进行编译,也可以将描述符强制为字符串(使用NSAppleEventDescriptor方法),并使用源显式创建OSAScript。+(NSAppleEventDescriptor *)scriptDataDescriptorWithContentsOfURL:
基本上,保存时.scpt
,OSALanguageInstance
描述符也会保存在文件中。
如果文件另存为.applescript
/ text,则系统将使用最新版本的applescript语言对其进行编译。例如,为旧版本的OS X编写的脚本可能无法在新版本上使用,因为某些功能已过时。使用.scpt
,系统/应用程序将选择它打算使用的版本的applescipt。
从10.10开始,可以将javascript保存.scpt
并正确执行。
asprint
,< hasseg.org/asprint > 也提供了该功能,可让您“漂亮地打印” .scpt文件。唯一的缺点是,它不适用于JavaScript .scpt文件,仅适用于AppleScript文件。
看到Fartheraway共享的反编译命令后,我找到了解决方案。如果您希望applescript(.scpt)文件不是二进制文件。
@fartheraway在回答的底部也提到了它。
只需使用.applescript扩展名进行所有开发。
脚本编辑器将能够运行代码,并且不会将其保存为编译格式。