跳转到主要内容
Chinese, Simplified

Charles Humble与首席设计师James Clark讨论了芭蕾舞编程语言的设计。他们讨论了该语言的目标如何告知许多设计选择,包括:类型系统、错误处理、并发模型,以及该语言对程序流可视化的内置支持。

关键点

  • Ballerina旨在用于实际的云原生应用程序,最初的重点是企业集成。它旨在生成易于维护的程序,这比初始创建的速度更有利。
  • 语言不是面向对象的。它使用结构类型系统而不是名义类型系统,并在不使用异常的情况下进行显式错误处理。
  • 它旨在使处理网络交互、数据和并发变得简单。
  • 并发模型包括对轻量级虚拟线程和命名工作线程的支持。它支持序列图形式的Ballerina语法树的图形表示,这意味着可视化和平台上运行的代码之间没有抽象。

介绍

您好,欢迎收看InfoQ播客。我是Charles Humble,该节目的共同主持人之一,也是云计算本土咨询公司Container Solutions的主编。我这周的客人是詹姆斯·克拉克。James为开源社区贡献了近20年,最著名的可能是作为SGML和XML的先驱。最近,他一直在WSO2工作,WSO2是一家成立于2005年的开源技术提供商,他是芭蕾舞语言的首席设计师。Ballerina是一种面向云的开源编程语言,它使使用、组合和创建网络服务变得更加容易。我认为,这是一种非常有趣的语言,它与其他语言(如Go、Rust和Dart)结合在一起,成为为这个云计算时代开发的语言。因此,Ballerin将成为本播客的焦点。詹姆斯,欢迎收看InfoQ播客。

詹姆斯·克拉克:你好,谢谢你邀请我。我想实际上我已经做了将近30年了,事实上,我一直在做这类事情。我现在有点进步了。

查尔斯·亨伯:是30岁吗?

詹姆斯·克拉克:是的,我想现在快30了。

向云的转变如何改变了编程?

查尔斯·亨伯:将近30年了,很好。好了,我们到了。所以,我在介绍中说,芭蕾舞演员是在这个新的云计算时代孕育出来的。那么,在您看来,向云的转变如何改变了编程?

詹姆斯·克拉克:我认为它在很大程度上改变了,一个程序的主要任务是什么?我在前云时代开始编程,你会想到在那个时代程序是如何完成事情的,你有Perl,你读文件,你写文件,你有API,但API是对库的调用。它们可能被调用到共享库或C库,它们都在同一台机器上。所以,API是库API,您基本上通过编写文件来完成工作。而在云计算领域,您通过消费和提供网络服务来完成工作,重要的API主要是网络API。所以,他们发送网络消息,通常是HTTP,通常是JSON。因此,什么是API和我们程序的主要业务是非常不同的。

我想另一个方面是在传统的C世界中的并发性,如果您愿意,大多数应用程序实际上不需要担心它。操作系统可以,但应用程序可以忘记它。而在云端,这是非常普遍的。你真得好好想想。您不能对应用程序程序员完全隐藏并发性。

你对芭蕾舞演员的具体目标是什么?

查尔斯·亨伯:那么在这样的背景下,你对芭蕾舞演员的具体目标是什么?你想用这种语言完成什么?

詹姆斯·克拉克:这不是学术活动。所以,它被设计成一种实用的语言,而不是被设计成。。。我们不希望它成为一种利基语言。我们有雄心勃勃的目标。我们希望它能够成为一种主流语言。所以,我想最初的目标是我们希望它是一种很好的企业集成方式,你可以从一个狭隘的目标开始,这就是我们希望它是一种很好的企业集成方式。与传统方式(ESB加上一些Java)相比,这很好。因此,基本上,基本概念是可以的,而不是DSL,通常是DSL,它的XML语法具有网络功能,所有这些功能都是关于提供端点、消息和路由的。与其使用Java,不如使用一种统一的语言来完成这一切。您不必使用这两种语言,也不必进行拆分,您只需以一种统一的方式完成这一切,并且以一种有效的方式,非常适合云计算的需要。

它感觉非常像一种语言,其设计目的是为了易于维护,而不是为了提高初始实现的速度。

查尔斯·亨伯:当我第一次开始研究语言时,我被其中一件事打动了,那就是一切都非常明确。例如,整数和浮点值之间没有隐式转换。整数溢出会导致运行时异常等。它感觉非常像一种语言,它被设计成更易于维护,而不是初始实现和初始键入的速度。你同意吗?这是一个公平的评估吗?

詹姆斯·克拉克:当然。这是一种,我的意思是,如果我说企业精神,不是每个人都会以积极的方式理解这一点。我的意思是,程序被阅读,我的意思是,真正的程序,商业依赖于严肃的程序,它们有很长的寿命。你已经有了20或30年的狡猾的COBOL代码。它们已经被阅读了很多年甚至几十年,能够阅读并理解它远比在你打字的时候能省去几次按键更重要。

所以,芭蕾舞演员的一个基本设计目标就是支持可维护性,支持明确性,避免意外,以及利用熟悉度和人们所知道的东西。知道java、C、Java、C++的程序员的百分比很高。所以我们想利用这一点,如果你知道这些语言中的一种,并且你看了一段芭蕾舞代码,你应该对正在发生的事情有一个很好的了解。我可能不知道语言语义的每一个细节,但你可以看看它,甚至知道零芭蕾舞演员,你应该对正在发生的事情有一个合理的感觉。它不应该是神秘的。

 

你不使用异常吗?

Charles Humble:是的,这表明,例如,在错误处理的方式中,没有使用异常方法,这在Java等语言中很常见。

James Clark:我认为现代程序语言中有一个重要的趋势,从异常转向更明确的错误处理,即返回错误值。所以,在Go和Rust中,显式错误处理是显式的。您确实有异常流,这是恐慌,但这些都是针对真正的异常情况,但是有一个常规的错误处理,然后有错误是网络编程的一个正常部分,这是显式处理的。您可以在程序中明确地看到控制流,就像常规控制流一样。这同样是一个有点不方便编写的东西,但是前来查看它的可怜的老维护程序员可以看到可能的控制流,并且当他们尝试修复bug时,将更容易避免出错,

查尔斯:对,是的。我发现这非常有趣,因为我的大部分专业编程都是用Java完成的。显然,Java有其检查异常的概念,我认为我们试图解决同样的问题,但是因为它们允许您抛出运行时异常,所以大多数人都这样做。所以检查过的异常并没有很好地工作,但我认为它正在尝试做同样的工作。

詹姆斯·克拉克:是的,支票例外情况也不完全一样。它显示了哪些是可能的异常,但仍然是,你不知道什么时候调用函数,当你在那里看到函数调用时,你在调用中没有看到它抛出异常的可能性。您可以看到有可能出现选中的异常,但语法不明确。所以每次你看到一个函数调用,你都会问,“哦,可能抛出的异常是什么,这将如何影响函数中的控制流?”这会让你很难弄清楚到底发生了什么。

是什么使芭蕾舞演员与众不同?

查尔斯·亨伯:现在你已经说过,芭蕾舞演员不是一种研究语言,它的目的是在工业中用于现实世界的应用。从语言的角度来看,你还没有发明任何特别新的想法,那么是什么让它与众不同呢?

詹姆斯·克拉克:我的意思是,有几个不同的维度,但我们从一个命题开始,我们想做的是让程序今天必须做的事情变得简单。因此,我们提供网络服务,处理数据,我们想让这些变得简单。

这是一维的。另一个方面是,我们试图提供DSL和Java组合的替代方案。使用DSL可以做的一件事是,您可以拥有一个图形视图,您从DSL获得的图形视图不仅是语法视图,也不仅仅是语法视图,它实际上向您展示了有关应用程序中可能出现的消息流的有意义的事情。

詹姆斯·克拉克:所以,其中一个目标是,你应该能够接受一个芭蕾舞节目,并从中获得一个不仅仅是语法的图形视图,它不仅仅是给你提供类或函数。它实际上让您真正了解应用程序是如何与网络交互的。它通过利用序列图来实现这一点。

我认为WSO2从事企业集成15年的部分经验是,当你与客户交谈时,他们想解释这个应用程序应该如何工作?他们所做的就是坐下来,写一个小序列图,画一个小序列轨迹,让每个人都在同一页上。

所以,Ballerina的一个关键特性是,你可以点击它,你可以把每个函数看作一个序列图,你可以看到该函数中的消息流。这会深刻地影响语法,也会深刻地影响并发模型,这是您无法移植到任何其他程序上的。所以,当你得到这个,它是一个双向模型,所以你可以编辑序列图,或者你可以编辑代码,它们是同一事物的两个视图。您可以将其视为语言高层的一种替代语法。

 

图形表示是实际的Ballerina语法树

查尔斯:对,是的。我认为,这真的很有趣,我认为这是独一无二的。因此,图形表示是实际Ballerina语法树的图形表示,这意味着可视化和平台上运行的代码之间没有抽象,也没有转换。如果您编辑图表,则您正在编辑代码,反之亦然。所以,您可以在低代码和正常代码之间进行真正的往返。

詹姆斯·克拉克:没错。他们不可能像我们现在这样失去同步。

对于听众来说,我们在不同的大陆上,所以有一点滞后。但这两种观点是不可能不同步的,因为我们已经考虑过了。你不能仅仅通过在另一种语言上绘制一个漂亮的图层来实现这一点。它是在中设计的,并且被设计到并发模型中。我们处理并发的方式是它有点有限,我们知道我们需要更高级的东西来处理这些情况,但它无法处理。对于它确实能处理的情况,它提供了一个更可控的环境,您可以真正看到正在发生的事情,并且有一种更简单的方法来做事情。

网络API与传统的面向对象API有何不同?

詹姆斯·克拉克:所以,这可能是一件独特的事情,但我认为还有更深层次的东西,可以追溯到API。什么是云时代语言中的API?这是一种云时代的语言,是一种网络API。那么,网络API与传统的面向对象API有何不同?

嗯,我认为其中一个最大的区别是,你想在每次网络往返中做更多的事情,往返是昂贵的。因此,通常情况下,网络API的参数通常是复杂的结构。所以,你在发送数据,而你的面向对象,也许我可以设置这个,设置那个,它是一个面向肉汤的东西。您不需要这样做网络API,而是希望发送每个API调用,这是一个复杂的结构。通常是JSON,它有一个深嵌套,通常是一个树结构。这是一件事。

另一件事是,您服务的不同部分将使用不同的语言。微服务的一个优点是,您不必为所有事情使用一种语言。您不必有一个通用的API或任何东西。系统的每一位都可以用最适合该位的任何语言编写。但这意味着,您的消息、数据、参数(如果您喜欢API),您希望这些都是数据。您希望它们是纯数据。您不希望它们成为对象。您希望发送JSON块,这些块可以被每个微服务使用的任何语言解释。所以,这意味着在集成语言中要做的很多事情就是处理这些数据。这不是对象,只是数据。你想把你从一个人那里得到的信息转换一下,然后把它发送到其他地方,或者你想把两个信息组合成另一个信息发送给几个不同的人。但它不是面向对象的。

面向对象的方法是将代码和数据组合到对象中,并将数据隐藏在对象中。与处理网络API时的操作相反,您希望公开数据。嗯,它可能隐藏在您的服务器中,但是您在发送的消息中公开了数据,这是非常公开的。

 

什么是纯数据?

查尔斯:对,是的。我的意思是,你在《芭蕾舞女演员》中有这种简单数据的概念。我试着想,我不太确定这个术语的来源,但是你能让你试着给我们一个简单的定义,在Ballerina中什么是纯数据吗?

James Clark:这是一个术语,我认为它是一个C++术语,POD,普通的旧数据。只是数据没有附加任何方法。它没有对如何处理它做出任何假设。它独立于编程语言,因此具有固有的可移动性。你可以序列化它,你可以复制它。这只是数据。如果您要尝试发送函数,那就不那么容易了。

Charles Humble:一旦你有了普通数据,你大概可以做一些事情,比如深度复制、深度相等、序列化、反序列化等等,对吗?

詹姆斯·克拉克:所有这些都是免费的。您也可以将其序列化为JSON,您不需要预先同意。。。我的意思是,如果您尝试开始序列化对象,那么您需要与收件人就您要发送的对象达成一致。你必须同意你要叫他们什么,诸如此类的东西。但是,普通数据更灵活,耦合更少,并且允许您的服务更松散地耦合。不会在服务之间创建耦合。

它是一种静态类型的语言,但类型系统主要是结构化的,有别于名词性的,对吗?[13:34]

查尔斯·亨伯:我认为这也反映在你的打字系统中。因此,它是一种静态类型的语言,但与其他一些静态类型的语言相比,它具有更松散的耦合,包括人们可能熟悉的Java之类的语言。您拥有对JSON和XML的内置支持。但正如我所说,类型系统是,它主要是结构性的,有别于名义上的,对吗?

 

它是一种静态类型的语言,但类型系统主要是结构化的,有别于名词性的,对吗?

查尔斯·亨伯:我认为这也反映在你的打字系统中。因此,它是一种静态类型的语言,但与其他一些静态类型的语言相比,它具有更松散的耦合,包括人们可能熟悉的Java之类的语言。您拥有对JSON和XML的内置支持。但正如我所说,类型系统是,它主要是结构性的,有别于名义上的,对吗?

詹姆斯·克拉克:是的,这是一个结构型系统。它在某些方面更像一种模式语言。你几乎可以想到类型系统,它实际上是双重任务,类型系统。我们都使用它来约束或检查程序中的操作是如何完成的。但我们也用它来描述程序的网络接口。因此,当您编写Ballerina类型时,也可以使用这些类型为网络接口生成模式。因此,您可以生成图形钻取模式,或从类型中打开API。您只需编写一次类型,这些类型就可以用来生成该模式并进行操作,就像程序中的常规类型系统一样。

我认为对于一个现代程序员来说,生活非常困难的一件事就是你必须不断地在不同的世界之间切换。他们必须是一点HTML,一点SQL,他们有所有这些不同的东西,他们必须手动切换齿轮,“好的,这就是它在GraphQL中的工作方式,这就是它在SQL中的工作方式。这就是它在我的语言类型系统中的工作方式,并处理它们之间的各种无限匹配。而在Ballerina中,只需在Ballerina类型中表达一次,因为它几乎像一个模式,所以可以将它映射到GraphQL类型,并像常规类型系统一样使用。它还有一种叫做语义子类型的东西,这意味着你可以把一个类型看作是一组值,你可以把子类型关系看作是对应于类型之间的子集关系,这是你在一些Cchema语言中看到的。

所以,你可以用芭蕾舞演员的类型来基本描述电线上的内容。因此,您可以有一些特性,比如说,特定字段是可选的。这种情况在JSON中经常发生,对象中可能有也可能没有这个字段,但大多数类型系统都没有。你有默认值,但那不是一回事。你可以描述那里有什么。或者你可以说,“你可以有这个或这个。”同样,当你把它看作一个模式时,这是一个绝对基本的东西,但大多数语言都不这样做。你不能说,“要么是这个,要么是这个。”你必须说,“你必须有某种类型的层次结构或其他东西。”我的意思是,TypeScript可以做到这一点,就类型系统的工作方式而言,TypeScript可能是最接近主流语言的。因为同样,TypeScript所做的是描述JavaScript值,JavaScript值与JSON非常接近,所以您可以认为TypeScript基本上描述JSON值。

所以在某种程度上,它和打字脚本有些相似。TypeScript与JavaScript有着紧密的联系,JavaScript提供了一种随遇而安、轻松自如、非常动态的世界视图。而芭蕾舞演员则试图抓住你的错误。最终,我们希望能够将内容编译成一个好的摘录。目前,当前的实现是基于Java的,但这不是语言的一部分。这只是当前的实现,我们计划有一个原生实现,其中所有内容都是静态编译的。

你能描述一下对轻量级线程的支持吗。它们是运行时管理的逻辑控制线程,对吗?

Charles Humble:我想简单地回到并发模型。我们在序列图的上下文中讨论了它,视觉方面,但是我想更多地讨论一下并发模型。所以,有一点是,您支持轻量级线程。你把它们称为股线,我认为,它们类似于Java的ProjectLoom中的虚拟线程,我们在上一集的播客上与Ron Pressler讨论过,所以我将在节目说明中链接到这一点。但基本上,这些链是运行时管理的,逻辑控制线程,对吗?

詹姆斯·克拉克:没错。它们是逻辑线程。我的意思是,现在用异步编程做任何事情都很流行,但我认为这让程序员的生活变得非常艰难,整个异步的事情,承诺,以及诸如此类的事情,对于可怜的应用程序程序员来说只是一层复杂性。我认为这是一个线程模型,您只需向程序员提供一个非常简单的逻辑模型,由实现将其转化为高效的模型。我认为这对程序员来说是一个更好的模型。从根本上说,我觉得线程是一个更好的程序模型。

股如何实现协作多任务?

Charles Humble:股线如何实现协作多任务?

詹姆斯·克拉克:嗯,就像你说的,这是一条逻辑线。因此,这些东西在逻辑上是并发运行的。它们是否真的在两个线程上运行,取决于编译器是否能够确定这样做是安全的。所以,如果我们有锁定结构,而你没有使用锁定结构,那么编译器会发现,“好吧,我们不能并行运行这些东西。”所以,它会在它们之间切换,所以你永远不会在两个不同的线程上运行两个东西。因此,第一次数据竞争不可能发生。

所以在最坏的情况下,它将只在一个线程上运行。通常,当您执行某些IO时,该逻辑串将阻止等待执行IO,另一个逻辑线程将开始运行。因为在网络编程的许多情况下,真正重要的是IO。所以,只要你能。。。如果你要出去,我不知道,去五个不同的web服务,从它们那里得到结果,然后计算结果,重要的是你不做一个,等等,然后做另一个,等等。你想同时等待。你是否真的在使用多核并不是什么大问题,更多的是让IO并行工作。

 

一个函数可以由多个命名的辅助函数定义。你能描述一下它是如何工作的吗?

Charles Humble:那么,为了回到视觉方面,一个函数中的并发操作可以由多个命名工作者定义。你能描述一下这一点,以及它对我们的作用吗?

James Clark:是的,在函数中,这要回到序列图模型,但是在函数的顶层,你可以让块被命名为worker,这些块并行运行,它们可以互相交换消息,消息在编译时匹配,以确保每个人。。。所以,如果你想一个序列图,你的箭头是匹配的。所以,序列图中的箭头,在一个块中有一个发送,在另一个块中有一个接收。为了能够构建序列图,您将检查每个块中的发送和接收是否匹配。

拍张照片可能更容易些。我的意思是,一个序列图,你有一个发送和接收,如果一个块在发送,一个块在接收,为了能够画一个从一个到另一个箭头的图,你必须有一个发送在一个,另一个接收在另一个,反之亦然。所以,这是语言语义的一部分,您可以匹配这些行。静态检查所做的是检查您的发送和接收是否匹配,这样您就可以实现每条线路都有一个发送和接收。

这是一个有点限制的模型,但当它应用于您的问题时,您会在编译时检测到许多本来无法检测到的问题。您还可以得到一个图表,它实际上可以让您真正了解您的程序在网络交互方面所做的工作。

芭蕾舞演员的下一步是什么?

查尔斯·亨伯:芭蕾舞演员的下一步是什么?你目前在做什么?

詹姆斯·克拉克:目前,我们正在努力获得Java版本。我们正在完成主要版本的测试版,我们有这个相当。。。我们称之为天鹅湖,这是第一个-

查尔斯·亨伯:哦,我喜欢这个。

詹姆斯·克拉克:是的,下一个是胡桃夹子。

查尔斯·哈姆伯:太好了,所以你一直在练习柴可夫斯基的芭蕾舞。我想你需要一个睡美人和一个罗密欧与朱丽叶。

詹姆斯·克拉克:不管怎样,我们从天鹅湖开始。这个想法将真正代表语言的成熟,而不是语言的完美,我们可以做很多事情,但我们有一套相当全面的语言特性,我们对此感到满意。我们想做的事情很多,但这是一个坚实的基础,我们将有一个基于Java的实现,它是这些特性的坚实实现。我们就要结束了。

我想有几件事是并行的,但我认为下一件事是,我正在做的是,做一个本机实现。因此,以LLVM为目标,能够使用对Java没有任何依赖性的本机可执行文件。有趣的是,我们还在芭蕾舞剧中表演。所以,我们正在尝试用Ballerina编写一个Ballerina编译器。

这不是芭蕾舞演员的设计目的。显然,Ballerina是为编写相对较小的企业集成程序而设计的。因此,使用它来编写编译器将其推向极限,但我认为这是好的,因为它推动了当前的实现,也推动了语言。我认为芭蕾舞演员的目标之一就是你不应该撞到墙上。你应该能够从小处做起,随着你的节目的发展,芭蕾舞演员也会和你一起成长。我认为,如果我们能用Ballerina编写一个编译器,然后添加您需要解决的任何集成问题,您就可以确信Ballerina将有足够的马力来完成这项工作。

 

如果听众想了解更多关于这门语言的知识,从哪里开始学习最好?

查尔斯·亨伯:如果听众想了解更多关于这门语言的知识,也许可以玩一玩,看看他们的想法,那么对他们来说,从哪里开始学习最好呢?

詹姆斯·克拉克:ballerina.io网站。

查尔斯·亨伯:回答得好,简单。

詹姆斯·克拉克:回答得好,简单。一切都与此相关。

查尔斯:太好了。好吧我将在节目讲稿中加入一个链接,詹姆斯,非常感谢你今天加入我的InfoQ播客。

詹姆斯·克拉克:谢谢你邀请我,我喜欢我们的谈话。

提到

 

原文:https://www.infoq.com/podcasts/james-clark-ballerina-language-network-d…

本文:http://jiagoushi.pro/node/1527

 

Tags
 
Article
知识星球
 
微信公众号
 
视频号