你好,哈布尔! 我向您展示 Stephen Wolfram 帖子的翻译
Wolfram 语言一致性的先决条件
今天我们与编程语言一起站在了伟大成就的门槛上
Wolfram 函数存储库是由于 Wolfram 语言的独特性质而成为可能,它不仅作为一种编程语言,而且作为一种
例如,Wolfram 函数存储库已包含
同样超过
要访问该页面,请复制上述对象(函数 BLOB),将其粘贴到输入行中,然后运行该函数 - 它已内置于 Wolfram 语言中,并且默认支持从
这里需要注意的是,处理时
希望在大家的支持下
存储库中的函数可能包含用 Wolfram 语言编写的小段或大段代码。 例如,这些可能是调用
Wolfram 特征存储库的 shell 和编程结构的设计是为了让每个人都能以最简单、最方便的方式为共同事业做出贡献 - 事实上,只需
这种方法有很多权衡和细节,但我们的目标是优化 Wolfram 功能存储库,既提高用户体验,又确保新的用户功能对语言的开发做出有意义的贡献。 随着我们的成长,我毫不怀疑我们将不得不发明新的方法来处理和验证存储库中内置的函数,尤其是组织大量函数并找到用户需要的函数。 但令人鼓舞的是,我们选择的道路是一个良好的开端。 我个人
提高效率的同时降低成本
甚至在互联网出现之前,就有了共享 Wolfram 语言代码的方法(我们的第一个主要集中式项目是
30 多年来,我们公司一直努力维护 Wolfram 语言结构的完整性,这对于确保 Wolfram 语言不仅成为一种编程语言,而且成为一种
每个函数的实现结构中都会发生各种计算过程。 这里需要注意的是,功能必须具有清晰、统一的外观和用户的视觉可读性。 在这种情况下,Wolfram 语言的内置函数提供了超过 6000 个关于如何正确编程函数的连续示例(这些是我们的
创建一个实际上运行良好的存储库是一项有趣的元编程任务。 例如,程序中过多的限制将无法获得算法所需的统一性和通用性。 正如功能限制数量不足一样,您将无法实现足够正确的算法执行顺序。 之前我们公司实施的几个实施这些方法折衷方案的示例运行得相当稳定 - 这些是:
所有上述示例都有一个基本特征 - 项目中收集的对象和功能具有非常高的流程结构化和分布程度。 当然,演示、神经网络或其他东西的结构细节可能会有很大差异,但任何当前存储库的基本结构始终保持不变。 那么,亲爱的用户,您对创建这样一个为 Wolfram 语言添加扩展的存储库有何看法? Wolfram 语言被设计得极其灵活,因此可以以任何方式扩展和修改。 这种情况对于使用 Wolfram 语言快速创建各种大型软件项目的能力极其重要。 这里需要注意的是,随着语言灵活性的提高,用这种语言实现的项目的成本必然会增加。 这是因为用户使用这种语言越多,他获得的专用功能就越多,但我们不应该忘记,这种方法也可能有负面影响,即无法确保程序模块的一致一致性。
传统编程语言中的库有一个常见问题——例如,如果您使用一个库,代码将正常工作,但如果您尝试使用多个库,则无法保证它们能够正确交互。 此外,在传统的编程语言中 - 与成熟的计算语言不同 - 无法保证除基本结构之外的任何函数或数据类型存在一致的内置表示。 但事实上,问题比乍一看还要严重:如果要构建大规模的垂直功能,那么如果没有我们投入 Wolfram 语言的集中式项目编程的巨大成本,就不可能实现一致性。 因此,所有软件模块始终正确地协同工作非常重要。
因此,Wolfram 功能存储库背后的想法是通过更容易开发为连贯模块的各个功能,以相对较小的代码片段简单地向语言添加扩展,从而避免上述问题。 话虽如此,有些编程功能无法通过单独的函数来方便地实现(我们公司计划在不久的将来发布优化的编程算法,以帮助实现大规模软件包)。 然而,基于 Wolfram 语言中已内置的函数,有许多基于单个函数实现的编程可能性。 这里的想法是,用相对较少的编程工作,就可以创建许多新的且非常有用的函数,这些函数将提供足够的设计一致性,它们将彼此很好地配合,而且除此之外,它们将来能够在该语言中轻松且广泛地使用。
当然,这种方法是一种妥协。 如果实现一个更大的包,可以想象一个全新的功能世界,它将非常强大和有用。 如果需要获得与其他所有内容相适应的新功能,但您不愿意花费大量精力来开发项目,那么不幸的是,这可能会导致项目范围缩小。 Wolfram 功能存储库背后的想法是为项目的定义部分提供功能;这种方法将添加强大的功能,同时更容易在编程项目中保持良好的一致性。
帮助将自定义函数添加到函数存储库
我们的团队一直在努力让用户能够轻松地为 Wolfram 存储库功能做出贡献。 在桌面上(已经在
您需要执行两个主要步骤:首先,实际写下函数的代码,其次,写下说明函数应如何工作的文档。
单击顶部的“打开示例”按钮查看您需要执行的操作的示例:
本质上,您正在尝试创建类似于 Wolfram 语言中的内置函数的东西。 只是它可以做比内置函数更具体的事情。 与此同时,对其完整性和可靠性的期望也会低得多。
您需要为您的函数指定一个遵循 Wolfram 语言的函数命名准则的名称。 此外,您还需要为您的函数开发文档,类似于该语言的内置函数。 稍后我将更详细地讨论这一点。 现在,请注意在定义笔记本文件顶部的按钮行中有一个按钮
当您确定所有内容均已正确填写并且准备就绪后,请单击“检查”按钮。 您还没有弄清楚所有细节是完全正常的。 所以“检查”功能会自动运行并进行大量的样式和一致性检查。 通常,它会立即提示您确认并接受更正(例如:“此行必须以冒号结尾”,并且会提示您输入冒号)。 有时她会要求你自己添加或更改一些东西。 我们将不断向“检查”按钮的自动功能添加新功能,但基本上其目的是确保您提交到功能存储库的所有内容都已严格遵循尽可能多的样式指南
因此,运行“检查”后,您可以使用“预览”。 “预览”创建您为函数定义的文档页面的预览。 您还可以为在您的计算机上创建的文件或位于云存储中的文件创建预览。 如果由于某种原因您对预览中看到的内容不满意,只需返回并进行必要的更正,然后再次单击“预览”按钮即可。
现在您已准备好将函数推送到存储库中。 部署按钮为您提供四个选项:
此步骤中重要的事情是您可以将函数提交到 Wolfram 函数存储库,以便任何人都可以使用它。 同时,您还可以为有限数量的用户放置您的功能。 例如,您可以创建一个托管在您的计算机本地的函数,以便在您使用该特定计算机时可用。 或者您可以将其发布在您的
假设您想要将函数实际提交到 Wolfram 函数知识库。 为此,请单击存储库的“提交”按钮。 那么现在发生了什么? 您的申请将立即排队等待我们专门的策展人团队的审核和批准。
当您的申请通过审批流程(通常需要几天时间)时,您将收到有关其状态的通信以及可能对未来使用的建议。 但是,一旦您的功能获得批准,它将立即发布到 Wolfram 功能存储库,并可供任何人使用。 (这将出现在
存储中应该有什么?
需要指出的是,我们公司对完整性、可靠性和整体质量有非常高的标准,在过去 6000 多年里我们已经内置到 Wolfram 语言中的 30 多个功能中,全部满足上述要求。 Wolfram 函数存储库的目标是使用 Wolfram 语言中已有的所有结构和功能,以便添加尽可能多的轻量级函数(即更高性能的函数)。
当然,Wolfram 函数存储库中的函数必须符合 Wolfram 语言的设计原则 - 以便它们能够与其他函数充分交互以及用户对函数应如何正常工作的期望。 然而,这些功能不必具有同等的完整性或可靠性。
在 Wolfram 语言的内置函数中,我们努力使编程函数尽可能通用。 话虽这么说,当在 Wolfram 函数存储库中包含一个函数来简单地处理一些非常具体但有用的情况时,这并没有什么问题。 例如,函数
与内置功能相关的另一点是,我们公司尽力处理所有非典型情况,正确处理错误的输入等等。 在函数存储库中,有一个特殊函数处理解决问题的主要情况并忽略所有其他情况是完全正常的。
显而易见的一点是,最好拥有做得更多、做得更好的函数,但函数存储库的优化(与 Wolfram 语言的内置函数相反)应该将更多函数与更多函数捆绑在一起,而不是深入研究各个具体功能的实现流程。
现在让我们看一个在存储库中测试函数的示例。 对此类函数的一致性期望自然远低于内置语言函数。 在函数依赖于 API 等外部资源的情况下尤其如此,持续进行一致的测试非常重要,这会在验证算法中自动发生。 在 nb 文件中,您可以显式指定定义(在“附加信息”部分中)并指定由输入和输出字符串或类型的完整字符对象定义的尽可能多的测试
因此,函数存储库将具有许多实现复杂性。 有些只是一行代码,其他的可能涉及数千或数万行,可能使用许多辅助函数。 什么时候值得添加一个需要很少代码来定义的函数? 基本上,如果对于一个函数有
函数存储库(顾名思义)的主要目的是向语言中引入新功能。 如果您想添加新数据或
实际上有两种方法。 您可能想要引入将在函数存储库中的新函数中使用的新对象类型。 在这种情况下,您始终可以写下其符号表示形式,并在函数存储库中输入或输出函数时使用它。
但是,如果您想要表示一个对象,然后通过 Wolfram 语言中的现有函数定义您想要使用的对象,该怎么办? Wolfram 语言始终为此提供一个轻量级机制,称为
那么,函数存储库中的函数代码可能包含哪些内容?
Wolfram 功能存储库的所有代码都应该用 Wolfram 编写吗? 当然,外部API内部的代码不应该用Wolfram语言编写,它甚至不构成语言代码。 事实上,如果您在几乎任何外部语言或库中找到一个函数,您都可以创建一个包装器,允许您在 Wolfram 函数存储库中使用它。 (通常您应该使用内置函数来实现此目的
那么这样做有什么意义呢? 从本质上讲,这允许您使用整个集成的 Wolfram 语言系统及其整套统一的软件功能。 如果您从外部库或语言获得基本实现,则可以使用 Wolfram 语言丰富的符号结构来创建方便的顶级函数,使用户可以轻松使用已实现的任何功能. 至少,在加载库等的所有构建块都存在的理想世界中,这应该是可行的,在这种情况下,它们将由 Wolfram 语言自动处理。 (需要注意的是,实际应用中可能会出现问题
顺便说一句,当您第一次查看典型的外部库时,它们通常看起来太复杂,无法仅用几个函数来涵盖,但在许多情况下,大部分复杂性来自于创建库所需的基础设施以及所有功能。支持一下。 然而,当使用 Wolfram 语言时,基础设施通常已经内置到包中,因此不需要详细公开所有这些支持函数,而只需为库中“最顶层”的应用程序特定函数创建函数。
知识库的“生态系统”
如果您编写了经常使用的函数,请将它们提交到 Wolfram 函数存储库! 如果没有产生更多的东西(语言开发),那么即使这样,您使用这些功能供个人使用也会方便得多。 然而,可以合理地假设,如果您定期使用这些功能,也许其他用户也会发现它们很有用。
当然,您可能会发现自己处于无法或不想共享您的功能或无法访问私人信息资源的情况。 即使在这种情况下,您也可以简单地将功能部署在您自己的云帐户中,
您提交到 Wolfram 函数存储库的函数不必是完美的; 它们必须是有用的。 这有点像经典 Unix 文档中的“错误”部分 - 在“定义部分”中有一个“作者注释”部分,您可以在其中描述您已经了解的函数的限制、问题等。 此外,当您将功能提交到存储库时,您可以添加提交注释,这些注释将由专门的策展人团队阅读。
一旦功能发布,其页面底部总是有两个链接:“
有时您只想使用 Wolfram 函数存储库中的函数,例如内置函数,而不查看其代码。 然而,如果你想看看里面,顶部总是有一个记事本按钮。 单击它,您将获得提交到功能存储库的原始定义笔记本的副本。 有时您可以将其用作您需要的示例。 同时,您也可以自行开发修改此功能。 您可能希望将这些从存储库中找到的函数发布到您的计算机上或您的 aphid 云存储帐户中,也许您希望将它们提交到函数知识库,也许作为原始函数的改进、扩展版本。
将来,我们计划支持 Git 风格的功能存储库分叉,但现在我们试图保持简单,并且我们始终只为语言中内置的每个功能提供一个可接受的版本。 通常情况下(除非开发人员放弃维护他们开发的功能并响应用户提交),该功能的原始作者控制其更新并提交新版本,然后进行审核,如果他们通过了审核流程,以该语言出版。
让我们考虑一下开发功能的“版本控制”如何工作的问题。 现在,当您使用函数存储库中的函数时,其定义将永久存储在您的计算机上(如果您使用云,则存储在您的云帐户中)。 如果某功能有新版本可用,下次使用时您将收到一条消息通知您。 如果您想将该功能更新到新版本,可以使用以下命令来完成
Wolfram 函数存储库的优点之一是任何地方的任何 Wolfram 语言程序都可以使用其中的函数。 如果程序出现在记事本中,则通常可以方便地将存储库函数格式化为易于阅读的“函数二进制对象”函数(可能具有适当的版本集)。
您始终可以使用文本访问函数存储库中的任何函数
它是如何工作的呢?
在 Wolfram 存储库的函数内部,可以使用完全相同的函数
考虑
里面可以看到一些使用函数的信息
如何设置资源功能? 最简单的就是纯粹的本地案例。 下面是一个示例,它采用一个函数(在本例中只是一个纯函数)并将其定义为给定程序会话的资源函数:
定义完成后,就可以使用资源函数:
请注意,该函数 blob 中有一个黑色图标 。 这意味着BLOB函数指的是为当前会话定义的内存资源函数。 永久存储在您的计算机或云帐户上的资源功能具有灰色图标 。 Wolfram 功能存储库中的官方资源功能有一个橙色图标 .
那么当您使用定义笔记本中的展开菜单时会发生什么? 首先,它获取记事本中的所有定义,并从中创建一个符号
使用以下命令从计算机上的存储库本地部署函数
如果单击函数存储库的“提交”按钮,其下方会发生什么
默认情况下,提交是用与您的 Wolfram ID 关联的名称进行的。 但如果您代表开发团队或组织提交申请,您可以
将任何函数提交到函数知识库后,它将排队等待审核。 如果您收到回复评论,它们通常采用文本文件的形式,并添加了额外的“评论单元格”。 您可以随时访问以下网站查看您的申请状态
工作中的一些微妙之处
乍一看,您似乎可以只需要一个定义笔记本并将其逐字放入函数存储库中,但是,实际上涉及很多微妙之处 - 处理它们需要进行一些相当复杂的元编程,处理符号处理作为定义函数的代码,以及记事本本身的定义。 其中大部分发生在内部、幕后,但如果您要为功能知识库做出贡献,它可能会产生一些值得理解的含义。
第一个直接的微妙之处:当您填写定义笔记本时,您可以使用类似的名称在任何地方简单地引用您的函数 我的功能,它看起来像 Wolfram 语言中函数的常规名称,但对于函数存储库文档,它被替换
第二个微妙之处:当您从定义笔记本创建资源函数时,必须捕获并显式包含函数定义中涉及的所有依赖项。 然而,为了确保定义保持模块化,您需要将所有内容放在一个唯一的
通常,您永远不会看到任何用于配置此命名空间的代码的痕迹。 但是,如果由于某种原因您在函数内调用了未执行的符号,那么您将看到该符号位于函数的内部上下文中。 然而,在处理定义记事本时,至少函数本身对应的符号是
函数存储库用于定义新函数。 并且这些功能可能有选项。 通常这些参数(例如,
大多数函数只是在每次调用时执行它们应该执行的操作,但有些函数需要在特定会话中运行之前进行初始化 - 为了解决这个问题,定义部分中有一个“初始化”部分。
存储库中的函数可以使用存储库中已有的其他函数;为了为包含两个(或更多)相互引用的函数的函数存储库设置定义,您必须将它们部署在程序会话中,以便您可以像他们一样参考
发展前景。 当存储库变得非常大时会发生什么?
今天我们刚刚推出 Wolfram 特征存储库,但随着时间的推移,我们预计它的大小和功能可能会急剧增加,并且随着它的发展不断增长,我们已经预计可能会出现各种问题。
第一个问题涉及函数名称及其唯一性。 函数存储库的设计方式与 Wolfram 语言中的内置函数一样,您只需指定函数名称即可引用任何给定函数。 但这不可避免地意味着函数名称在整个存储库中必须是全局唯一的,因此,例如,只能有一个
乍一看,这似乎是一个大问题,但值得注意的是,这基本上与互联网域或社交媒体句柄等问题相同。 事实上,系统只需要一个注册器 - 这是我们公司将为 Wolfram 函数知识库扮演的角色之一。 (对于存储库的私有版本,其注册商可能是管理员。)当然,可以在没有任何内容的情况下注册 Internet 域,但在函数存储库中,只有在存在实际定义的情况下才能注册函数名称。功能。
我们在管理 Wolfram 函数知识库方面的部分职责是确保为函数选择的名称在给定函数定义的情况下是合乎逻辑的,并且它遵循 Wolfram 语言命名约定。 我们在 Wolfram 语言中命名内置函数方面拥有 30 多年的经验,我们的管理者团队也将把这些经验带到函数存储库中。 当然,总有例外。 例如,对某些函数使用简短的名称似乎更可取,但最好使用更长、更具体的名称来“捍卫”,因为您将来不太可能遇到想要创建类似函数名称的人。
(这里应该注意的是,简单地添加一些成员标签来消除函数歧义不会达到预期的效果。因为除非您坚持始终分配标签,否则您将需要为任何给定函数定义默认标签,并分配作者标签,这又需要全球协调。)
随着 Wolfram 函数知识库的增长,可能出现的问题之一是函数的可发现性,系统为此提供了
对于 Wolfram 语言中的内置函数,有一个所谓的检测层,由
Wolfram 函数存储库被配置为持久函数存储库,其中的任何函数都将始终有效。 当然,新版本的功能可能会可用,并且我们预计某些功能当然会随着时间的推移而过时。 如果这些函数在程序中使用,它们就可以工作,但它们的文档页面将链接到新的、更高级的函数。
Wolfram 功能存储库旨在帮助您快速发现新功能并学习使用 Wolfram 语言的新方法。 我们非常乐观地认为,功能存储库中探索的一些内容最终将成为核心 Wolfram 语言的内置部分。 在过去的十年里,我们有过类似的系列
这里最重要的是,函数存储库中的函数现在可供每个用户使用。 原生语言功能可能会更好、性能更高,但功能存储库将允许用户立即访问所有新功能。 而且,最重要的是,这个概念允许每个人添加他们想要的任何新功能。
在 Wolfram 语言历史的早期,这个想法不会像现在这样有效,但在现阶段,人们在该语言上投入了如此多的努力,并且对语言设计原理有了如此深刻的理解,以至于现在看起来相当不错。大型用户社区可以添加保持设计一致性的功能,使其对广泛的用户有用。
Wolfram 语言用户社区中有一种令人难以置信的人才精神(?)。 (当然,这个社区包括许多各个领域领先的研发专家。)我希望 Wolfram Feature Repository 能够为释放和传播这种人才精神提供一个有效的平台。 只有共同努力,我们才能创造出能够显着扩展 Wolfram 语言计算范式的应用领域的东西。
30 多年来,我们在 Wolfram 语言方面取得了长足的进步。 现在,让我们一起走得更远。 我强烈鼓励世界各地所有受人尊敬的 Wolfram 语言用户使用函数存储库作为平台,以及新的软件项目,例如面向开发人员的免费 Wolfram 引擎。
来源: habr.com