解决方案

Wolfram语言和Mathematica发布12.1版本:一年之内海量更新(下)

外部连接


我们想要Wolfram语言尽其可能提供一个统一的计算表示。这也就意味着,包括我们刚才讨论过的分子内容在内,我们希望这个语言可以表示所有世界上已经存在的计算系统,并与之无缝交互——无论这些系统是程序、是语言、是数据库或其他。我们能处理的内容可以列很长一个列表——但在12.1版本中,我们有一个重大的新内容。


自1989年以来,Wolfram语言通过WSTP可以调用其他语言的程序,但近年来我们一直在努力让这个过程变得更简单且更自动化。比如说在11.2版本中,我们引入了ExternalEvaluate,这个函数提供了一个可以直接计算外部语言代码的高阶方法,而且只要可能,该函数就可返回一个可无缝用于Wolfram语言中的符号格式。


在12.1版本中我们外部语言合集中加入了Julia、Ruby和R。当然存在一些实践操作的问题。我们必须保证用户可以正确安装这一功能,且在项目中使用的数据类型可以转化为有意义的Wolfram语言。


最后我们开发出了一个很便利的过程。在笔记本中,只要在每一行前打出>,选择你的语言,输入代码,就可以计算了:



这不但可以交互使用,而且以编程方法而言非常便利。比如说,你可以用外部语言创建一个函数,然后用符号把它表示成Wolfram语言中的一个ExternalFunction对象,当调用这个对象时,可以用外部语言运行代码:



当然,对于每一种不同的语言,我们都是在处理一个全新的结构。但由于我们有对于ZeroMQ的内置支持(也可连接到Jupyter笔记本),起码我们有可以处理多种类语言的能力。


但是对于一些语言而言,比如我们有全面内置连接的Python,现在可以实现的一个功能是,让函数像Wolfram语言函数一样工作,但又可以全部或部分在一个完全不同的语言中生效。当然让这个过程无缝衔接需要很多对自动安装、沙箱等的系统支持。比如接下来将会实现的一个功能是,在Wolfram云端调用含有Python代码函数。


不仅仅是外部语言,另一个扩展的领域是各种外部储存系统。我们已经有对比特币和以太坊区块链的支持,在12.1中,我们加入了对ARK区块链的支持。并且我们还引入了两个对外部文件储存系统的支持:IPFS和Dropbox。


只要下面这一个简单操作就能把 Spikey 图像放入全球都可访问的IPFS文件系统中:



这是内容标识符:



现在你就可以得出这个Spikey图像了:



你还可以用Dropbox做同样的事情,在授权后(我们后面会讨论到,可通过浏览器或新的SystemCredential机制进行),你可以放入表达式或上传文件,这些内容会立即在你的Dropbox文件系统中显示。


根据12.1中引入的架构,我们现在可以着手对其他外部文件储存系统添加连接,而这一功能将会在未来的版本中实现。


不仅仅是普通文件,我们还有一个复杂的架构,可以处理关系型数据库。这一功能的大部分内容在12.0中就引入了,但12.1有一些新的内容。比如说,你现在可以直接连接到Oracle数据库。并且还有一些表示关系型设定操作的函数:UnionedEntityClass,IntersectedEntityClass和ComplementedEntityClass。


当然,这些功能不仅能作用于外部数据库,也可以在我们的内置知识库中运用:



这些年我们一直在努力支持尽可能多的文件格式。在12.1版本中,我们加入了现在正流行的HEIF图像格式。我们还更新了DICOM导入器,所以你现在可以直接导入CT扫描和MRI,并用Image3D和三维图像处理功能对它们立即进行分析。


比如说,下图是我们开发团队主管的膝盖的一部分:



在11.3中,我们加入了MailServerConnect函数用于直接连接邮箱服务器。在12.1中,我们还加入了一层缓存和一些其他的功能,使得Wolfram语言有更加强大的邮件处理功能。我们还对从EML和MBOX中导入邮件信息的功能,尤其是对附件的操控功能,进行了提升。


12.1的另一个新功能是对ZIP和TAR文件更强大的支持。可以通过CreateArchive创建文件,并用ExtractArchive进行文件提取,这样你就可以例行处理成千上万个文件或数据。


在连接到外部网站或服务时,通常都会有授权的问题。但有时我们有一个很好的符号方法来表示这些授权,比如,SecuredAuthenticationKey(用来保存OAuth证明文书)。比如在你需要给出一个用户名和密码的情况下,通常都有一个你要把这些信息储存在哪里的问题。最终,这些会成为授权某个选项的值,但你可能不想让这些信息在文本中出现。


12.1对这个问题有一个很好的解决方法:SystemCredential。SystemCredential函数可以嵌入你的系统钥匙串——由你的操作系统提供加密储存,并由你的电脑进行登录保管。


这一过程很简单,类似于在你的系统钥匙串中储存信息:




程序包(Paclet)



在我目前的Wolfram语言系统中,我安装了467个程序包。什么是程序包?这是一个可以安装进Wolfram语言系统的模块化代码或其他资源,用于各种不同的功能。


我们在2006年第一次开始发明这种程序包,然后我们开始尝试让这些程序包一点一点包含更多的Wolfram语言功能。这些程序包也有版本,可以设置让它们自动更新。到现在为止,这些程序包基本都是由我们(或者说官方)在程序包中心服务器中进行创建和分布。


但在12.1版本中,我们开放了程序包系统,现在所有人都可以使用它,并让它成为了Wolfram语言系统的一部分。最终,一个程序包会是一个包含各种资源数据文件结构,会有一个特定的PacletInfo.wl文件定义该程序包应如何整合进Wolfram语言系统。


程序包可以设定让代码在启动时间开始运行。它可以设定自动上传定义的符号,可以安装文件,还可以在菜单中加入新的项目。它还能设定用于部署在Wolfram语言系统的复杂结构中的数据。


一般来说,一个程序包以一个单独的文件档案形式发布,且有多种方式可以获取这样一个程序包文件。Wolfram语言系统使用一个中心程序包服务器进行自动下载。但在不远的将来,我们还会有一个全范围程序包资源库,用户可以通过它来发布程序包。(我们还在尽力让Wolfram企业私人云端有自己的程序包资源库。)


我可能提过我是如何看待Wolfram程序包资源库与Wolfram函数资源库的关系。函数资源库是用于扩展Wolfram语言函数功能的,主要用来保持语言的整体结构和统一性。而程序包资源库让用户可以发布为了某个特殊目的而创建的程序包的完整环境,但这个资源库不一定保持整体语言的结构和统一性。程序包在将来会非常有用,我们也在尽力让用户可以自由使用这个功能。所以尽管函数资源库需要确保一定程度的设计统一性,但程序包资源库基本上是完全开放的。


我们的目标是为了让用户有一个完整的生态系统开发和贡献程序包内容。程序包资源库将会被视作一个Wolfram语言资料的分布渠道。(而且顺便说一句,我认为函数资源库里的函数基于程序包资源库中的代码进行运行是一个非常常见的事情,在这里函数资源库可以看作是函数的流线型与结构化的表示机制。)


在12.1版本中,有一类代码是用于创建和管理程序包的。在Wolfram语言中,PacletObject是程序包的符号表示。下例向大家展示一个程序包可能会是什么样子:



程序包(Paclet)


我已经说了很多了,但还不止这些。FaceAlign,FindImageText,Classify和ListPlot3D中的Around,SubsetCount,GenerateFileSignature,RSA数字签名,更快的MailSearch,可以用于笔记本或单元格的Initialization等等等等。列表还在继续!