Mac OS X 中的脚本语言应用

http://www.applesupport.com.cn/newshow.asp?id=2442&cid=7 如你所见,Mac OS X 是一套广受程序员喜爱的操作系统,他们之所以如此喜欢这个系统的原因之一便是他们可以按照自己的偏好选择熟悉的工具来完成工作。更详细的说,是由下面这三个方面决定的: 1. Mac OS X 在安装时就自带的开发工具,从最受欢迎的全能语言 Python, Ruby 和 Perl,到小巧精悍的 Bash 和 Awk,再到 Mac 所独有的 AppleScript,可以说是应有尽有。 2. Mac OS X 吸收了 BSD 和 Linux 操作系统中优良的软件包管理系统,有 MacPorts 和 Fink 两大包装来提供其他 Unix 世界中出现的脚本语言,进一步延展了系统的开发能力。 3. OSA 脚本架构与 Scripting Bridge 技术提供了用脚本来控制和创建图形界面的丰富功能,脚本语言也能成为用于开发的“First-class citizen”。 下面我们就来仔细看看这三个方面。 系统自备 先让我们看看系统自带的这些语言和它们的版本,以最新发布的 Mac OS X 10.5 为例,他们包括最常用的三大脚本语言: 一系列的 shell 可以按用户喜好选择 * bash: 3.2 "Bourne-again" shell,来自 GNU,迄今最常用的 shell,也是 Mac OS X 系统的默认 shell。 * zsh: 4.3.4 Korn Shell 的改进,吸收了 bash 和 csh 的一些特性。 * tcsh: 6.14.00 来自 FreeBSD 软件库,C Shell 的改进。 此外,还有 ksh 和 tclsh。 以及常用的文本工具: * sed: 来自 FreeBSD 的 2005/05/10 版本 * awk: 来自 Bell Labs 的 20040207 版本 awk 的小巧轻便适合完成一些文本处理的工作,尤其是与流编辑器 sed 配合起来更是威力强大。 * PHP: 5.2.4 PHP 是常用的 Web 编程语言,Mac OS X 自带了包括 Apache 在内的大量 Web 开发工具,除了 PHP 以外,还包括了流行的 Ruby on Rails 套件。 为什么系统自带是一件很好的事情?因为这意味着从系统安装完毕开始,它就给你的所有用户提供了一个一致的分发环境,一个程序员开发的应用可以任意使用上述这些语言而不必担心用户是否已经安装。 那么,这些语言和工具是从何而来的呢?在 Mac OS X 的每个主要版本 (Major Version) 更新之前,Apple 的开发者就会与负责维护这些语言的上游来源进行同步,选用尽可能新的稳定版本,然后作出针对 Mac 系统集成的一些添加和改进 (其实这些语言大都已经有很好的 Mac OS / Darwin 平台支持了),以 Python 为例,在 Mac OS X 10.4 系统中提供的是 Python 2.3,在 Mac OS X 10.5 中就更新到了 Python 的最新稳定版本 2.5.1,同时 Apple 还提供了与系统开发框架,如 Quartz 2D 图形绘制、Scripting Bridge 脚本框架、Cocoa 框架等的额外模块。 需要说明的是,Mac OS X 中大量的文本处理工具都来自 FreeBSD 软件库,构成了整个“BSD 子系统”的一部分,所以,和 Linux 用户习惯的 GNU 版本的同名工具使用习惯上可能会有不同,虽然它们严格来说都不算脚本语言,但因为经常配合脚本一起使用,所以我们会在后面讨论如何安装 GNU 的版本。 而且,所有这些语言,只要它们原来是按照 open source 协议分发的,就仍然可以在 Apple 的[开发者网站](http://www.opensource.apple.com/darwinsource/) 上看到实际随系统提供版本的完整代码。 如果你对这些语言还不太熟悉,在 Apple 开发者网站上有一篇较为详细的概览性教程值得一读:[Introduction to Open Source Scripting in Mac OS X](http://developer.apple.com/internet/opensource/opensourcescripting.html)。 那么让我们与另外两个常用的系统 Windows 和 Linux 作一比较:Windows 有一套 Active Scripting 架构,所以可以在系统中提供 VBScript 和 JScript 这样的语言供用户使用,然而可惜的是这两套语言远非用户所爱用的脚本语言,所以应用也往往局限于少量软件中的脚本工具,并没有像类 Unix 系统那样成为日常工作的瑞士军刀。事实上大部分“高级”用户还在使用 Batch file (bat 脚本) 编程这种比 bash 简陋得多的脚本工具,而 Windows PowerShell 这种强大的 shell 却没有集成进系统里,是甚为可惜的。 相比起来,虽然大部分 Linux 系统都用 Python, Ruby 和 Perl 这些脚本语言武装到了牙齿,然而由于 Linux 内核本身对这些语言不存在依赖,所以建构一个基本的 Linux 系统其实完全是可以不依赖这些语言的,不像 Mac OS X 只有唯一的官方发行,各种各样的发行版按自己的需求对软件包做任意裁剪,有的发行版完全可能安装后只有 Python 没有 Perl,有的则有 Perl 没有 Ruby…… 总结起来仍然为软件开发者造成了不小的困扰,因为他们在选择开发语言时仍然要考虑会不会给用户增加太多安装上的负担,不过好处是现代的 Linux 发行版大都拥有非常健全的软件包管理工具,如 apt, pacman 等等,所以手动安装起来并不困难。 第三方开发环境安装 看完上面这部分,一个显然的问题是:如果我需要安装系统没有安装的语言,或者我需要已有语言的其他版本,该怎么办呢?首先,Mac OS X 允许你以 UNIX 习惯的方式来安装这些软件:手工下载压缩包、编译 (configure, make)、安装 (make install)。其次,和常见 Linux / BSD 系统一样,Mac OS X 也有完善的软件包管理系统,最为常用的两套是 [macports](http://www.macports.org) 和 fink (http://www.finkproject.org)。 MacPorts 是一套吸收了 FreeBSD 的 ports 习惯建立起来的软件发行机制,它使用 Portfile 来描述每个软件,以源代码方式安装软件,也就是说每个安装者通过脚本辅助来下载源代码并编译。假 设我希望安装 lua 脚本语言,首先当然是到 MacPorts 官方网站下载安装包装上,然后将 MacPorts 的软件目录 /opt/local/bin 加入 PATH 中,以后就可以用类似下面的命令: $ port search lua lua-glut devel/lua-glut 0.5 OpenGL and GLUT bindings for the Lua programming language. lua-luasocket devel/lua-luasocket 2.0.1 The luasocket library extends lua with tcp, udp, and dns lua-lunit devel/lua-lunit 0.3 The lunit library extends lua with a simple unit testing framework lua-numlua devel/lua-numlua 0.2 Numerical package for the Lua programming language. wxLua graphics/wxLua 2.8.7.0 Lua bindings for wxWidgets lua lang/lua 5.1.3 powerful, lightweight programming language 可以看到,最后一个搜索结果就是我们需要的,让我们再确认一下: $ port info lua lua 5.1.3, lang/lua (Variants: universal, darwin_7) http://www.lua.org Lua is a powerful, light-weight programming language designed for extending applications. Lua is also frequently used as a general-purpose, standalone language. Library Dependencies: readline Platforms: darwin Maintainers: pmq@macports.org openmaintainer@macports.org 说明 lua 除了 readline 库以外没有其他依赖,所以我们现在开始安装: $ sudo port install lua ---> Fetching lua ---> Attempting to fetch lua-5.1.3.tar.gz from http://www.lua.org/ftp/ ---> Verifying checksum(s) for lua ---> Extracting lua ---> Configuring lua ---> Building lua with target macosx ---> Staging lua into destroot ---> Installing lua 5.1.3_0 ---> Activating lua 5.1.3_0 ---> Cleaning lua 这样便得到了一套完整安装的 lua 系统,全部存放在以 /opt/local 为根目录的路径树下,只要你已经将 /opt/local/bin 加入 PATH,就可以立即执行来试试: $ lua Lua 5.1.3 Copyright (C) 1994-2008 Lua.org, PUC-Rio > print ’Hello, world!’ Hello, world! 看来它工作得不错。 对其他语言也是如此,MacPorts 还维护了系统自带语言的许多版本,例如 Python 2.1 到 3.0a,Ruby 1.8 等等。 相比 MacPorts,fink 则是一个采用了 Debian Linux 的 [apt](http://www.debian.org/doc/manuals/apt-howto) 版本管理系统,主要以二进制包安装为主的发行方式,用户不需要自己编译软件,只需要通过 fink 提供的命令行 (apt-get, aptitude) 来下载安装即可,其使用与 MacPorts 类似,这里不赘述。 此外,NetBSD 的开发者也维护一套称为 [pkgsrc](http://www.netbsd.org/docs/pkgsrc/) 的软件发行方式,它也支持 Mac OS X 系统,pkgsrc 也是一套基于源代码的组织,但有一些 MacPorts 所不及的灵活性,适合老练的 BSD 用户使用。 不管是 MacPorts 还是 Fink 或者 pkgsrc,这些由第三方开发者维护的软件包管理系统都大大扩展了系统的功能,它们对包括大量脚本语言在内的开放源代码软件进行了细致的测试和打包,所以,只要是在它们的软件库内的程序,就不必担心它们和 Mac OS X 有什么兼容性的问题。看看你关心的语言有哪些在 MacPorts 中: $ ls /opt/local/var/macports/sources/rsync.macports.org/release/ports/lang/ * [Io](http://www.iolanguage.com/) - 一套简洁的脚本语言,受 Smalltalk 影响 * [clisp](http://clisp.cons.org) - 函数式语言 Common Lisp 的一个实现 * [erlang](http://www.erlang.org) - 并发处理的功能使之称为新近最为热门的语言 * [guile](http://www.gnu.org/software/guile) - 基于 Scheme 的一套脚本语言,适合嵌入程序 * [parrot](http://www.parrotcode.org) - Perl 6 的虚拟机 * [Perl 5.10](http://dev.perl.org/perl5/) - 新近发布的 Perl 版本 * [spidermonkey](http://www.mozilla.org/js/spidermonkey) - Mozilla 的官方 JavaScript 解释器 ... 这还只是其中的一小部分。 Mac 特有 怎样将脚本技术结合 Mac OS X 丰富的图形界面功能和强大的应用程序框架发挥作用?Apple 设计了 AppleScript 语言和 Scripting Bridge 架构。 [AppleScript](http://www.apple.com/applescript/) 语言是一套给普通人设计的语言,学起来相当容易,它的语法就像英语会话一样自然,设计它的主要目的,就是用来进行日常操作的自动化,想象一下,你可以用 AppleScript 以一套统一的接口来操纵所有图形界面的程序,将繁琐的鼠标点击、键盘输入都以脚本自动智能的完成,而且它的效果和直接操作图形界面还是一样的。 从一方面看,AppleScript 通过系统提供的 Apple Event 消息机制与每个应用程序通讯 (Mac OS X 自带的应用程序大都支持,你自己开发的应用程序也可以选择性地支持),这是一套开放的脚本集成架构,每个应用程序都可以定义一系列的操作 (action) 让 AppleScript 来调用,也可以提供 (expose) 一系列的数据结构让 AppleScript 来读取,以下面的一个脚本为例: tell application "Finder" if folder "Applications" of startup disk exists then return count files in folder "Applications" of startup disk else return 0 end if end tell 它就通过 Mac OS X 下的文件管理器 Finder 得到了用户的 Applications 目录中一共有多少个文件。 而每个程序提供的操作接口都可以通过 Script Editor 读取它们的 sdef 定义文件来得到,如图: http://developer.apple.com/documentation/AppleScript/Conceptual/AppleScriptX/Art/finder_dictionary.jpg 从另一方面看,Apple 定义了一套标准脚本架构,这样你在设计自己的应用程序时,就不必重新发明轮子,只要沿用现有的 Apple Event 处理框架,你开发的应用程序就能很好的和熟悉 AppleScript 的 Mac 用户交互了。参考 [Scriptable Applications](http://developer.apple.com/documentation/AppleScript/Conceptual/AppleScriptX/Concepts/scriptable_apps.html#//apple_ref/doc/uid/TP40001569) 就可以了解到怎样令你的应用程序“Scriptable”的细节。 从 Mac OS X 10.5 开始,提供了一套称为 Scripting Bridge 的工具,可以自动给你的应用程序创建 Objective-C 的脚本调用接口,这样开发者不必处理繁琐的 Apple Event 事件,只需要像调用 Objective-C 类和方法那样调用脚本接口就可以了。而像 Ruby, Python 和 Perl 这样的语言,也可以利用 Scripting Bridge 的标准接口来编写程序,例如下面的 Python 程序: from Foundation import * from ScriptingBridge import * iTunes = SBApplication.applicationWithBundleIdentifier_("com.apple.iTunes") p = {’name’:’Testing’} playlist = iTunes.classForScriptingClass_("playlist").alloc().initWithProperties_(p) iTunes.sources()[0].playlists().insertObject_atIndex_(playlist, 0) 其作用就是给你的 iTunes 新增一个叫做“Testing”的播放列表,其作用和通过 AppleScript 来调用是完全一致的。细节可以阅读 [Using Scripting Bridge in PyObjC and RubyCocoa](http://developer.apple.com/documentation/Cocoa/Conceptual/RubyPythonCocoa/Articles/UsingScriptingBridge.html#//apple_ref/doc/uid/TP40005424)。 值得一提的是,除了官方支持的的 Scripting Bridge 方式,第三方开发者们还提供了 [py-appscript](http://appscript.sourceforge.net/) 这样的方式在 Python 中调用 Apple Event,与 AppleScript 等效,相比起来它的语法要更为清晰简洁。 而最令 Ruby/Python 开发者感到高兴的,恐怕是 Apple 官方支持了从 Ruby/Python 语言到 Objective-C 的 Cocoa 运行时环境的桥梁: RubyCocoa 和 PyObjC,它们都具有在各自语言中直接开发 Cocoa 应用程序的能力,这样,你就可以用自己喜欢的脚本语言开发 Mac OS X 原生风格的应用程序。Xcode 集成开发环境中更提供了完整的模板,可以迅速创建出一个立即可以运行的 RubyCocoa/PyObjC 应用程序来。 比如这样一段 Objective-C 代码: NSButton *button = [[NSButton alloc] initWithFrame:rect]; [button setTarget:self]; [button setAction:@selector(doGoodThings:)]; [button setEnabled:YES]; [view addSubview:button]; [button release]; 就是创建一个指定大小 (rect) 的按钮 (button),将它添加到视图 view 的给定位置上。对应的 Python 代码就是这样: button = NSButton.alloc().initWithFrame_(rect) button.setTarget_(self) button.setAction_(’doGoodThings:’) button.setEnabled_(True) view.addSubView_(button) 将 RubyCocoa/PyObjC 的功能完整地与现有的 Cocoa 开发工具 (Xcode, Interface Builder)整合起来,就能得到下面这样一个 RSS 照片浏览器 (用 RubyCocoa 开发): http://developer.apple.com/documentation/Cocoa/Conceptual/RubyPythonCocoa/Art/rssphotoviewer.jpg [Building a RubyCocoa Application: A Tutorial](http://developer.apple.com/documentation/Cocoa/Conceptual/RubyPythonCocoa/Articles/BuildingRubyCocoaAppl.html#//apple_ref/doc/uid/TP40005425) 是一套用 RubyCocoa 开发 Cocoa 应用的完整教程。对应 Python 则可以阅读 [Using PyObjC for Developing Cocoa Applications with Python](http://developer.apple.com/cocoa/pyobjc.html) 这份指南。 对 Ruby 爱好者,则不可错过最近刚刚发布的 [MacRuby](http://trac.macosforge.org/projects/ruby/wiki/MacRuby),它和 RubyCocoa 的区别在于,不是在现有 Ruby 环境中去桥接 Cocoa 运行时,而是干脆就把整个 Ruby 的核心环境——虚拟机——搭建在了 Objective-C 运行时上,这样每个 Ruby 类的实质都是一个 Objective-C 类,像字符串、数组等更对应了 NSFoundation 中的 NSString, NSArray 类型,这样等于所有的 Cocoa 资源都可以完全自由地供 MacRuby 调用,调用的性能也比桥接方式有大的提高。所以虽然它还在早期开发阶段,但毫无疑问的是一个非常有希望的项目,值得一试。 小结 篇幅所限,也为了避免新接触 Mac OS X 开发的朋友选择太多而无所适从,本文还有许多未尽之处,例如用 AppleScript 构建图形界面、CocoaDialog 辅助程序等等。但总结起来,Mac OS X 相比 Windows 和 Linux,能在脚本语言上很好的发挥图形界面的优势,又能保持开发框架间良好的一致性,对脚本语言开发者来说实在是一个理想的操作系统,尤其 AppleScript、Ruby 和 Python 这三套语言各有特色,也是在这个系统下最受欢迎的脚本语言
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值