“在更好的基础上比较编程语言是完全愚蠢的职业。”



免责声明 :是的,周一我们发布了一篇habrapost,其中包含了这种语言的比较。 不,我们并不疯狂。 一切都按计划进行。

Vitaly Bragilevsky结合了理论计算机科学知识和当前的编程实践。 他教授与理论计算机科学相关的学科,是Haskell标准化委员会的成员,并且是HHCell编译器GHC开发的监督委员会的成员。

这个哈布拉斯塔蒂亚(Habrastatya)是Vitaly在以下主题上的精彩采访:

  • 教学和了解JavaScript;
  • 为什么选择Haskell;
  • 功能语言在程序员生活中的地位;
  • JavaScript有什么用?它是如何发展的?
  • 在接下来的10-15年中,编程语言中将出现什么;
  • 哪种编程语言是可信的,为什么?
  • 科学会议和开发人员会议之间有什么区别? 老师为什么还要去找他们呢?
  • 向程序员阅读是否重要,书籍已经过时以及必须阅读哪些书籍。

采访由HolyJS 2019莫斯科会议程序委员会成员Alexei Zolotikh和Artyom Kobzar进行。 如果面试还不够,那么很快,在下一个HolyJS上,Vitaliy会举例说明并展示如何将JavaScript与算法理论联系起来。

关于教学和认识JavaScript


Artyom :在我们的听众中,尤其是在JavaScript社区中,您并不广为人知,请向我们介绍一下您自己,您的工作,您的爱好-工人,专业人士,甚至是非工作人士。

Vitaliy :我主要在圣彼得堡国立大学任教,教授课程,并定期参加其他工作。 由于我是一名老师,所以我必须学习很多不同的主题。 正如在大学中通常发生的那样,有必要阅读一门特定的课程,为此您需要了解所有这些内容。

碰巧我教了很多东西。 例如,在我很小的第一年就分配给我的第一门特别课程中的一门就叫做“ Web XML技术”。 这些都是热门话题,Ajax刚出现在JavaScript中,实际上没有文献。 我解释了如何使用所有这些。

从那时起,没有人真正理解过如何使用它,所以一切都仅限于这样的示例:有两个下拉列表,用户在其中一个列表中选择一个项目,一个请求被发送到服务器,然后您接收到数据以填写第二个下拉列表。 这是一种新颖;站点上很少有这样的站点。 然后只有Google搜索以beta模式出现,当您开始键入某种查询时,他告诉您继续。 Ajax的东西是新的,我教了他们。

在那之后我没有教过的东西:数学和程序员的东西。 很久以前,我遇到过Haskell,从那时起,它便成为了吸引我的主要景点。 除了教学之外,我一般还学习计算机科学的所有知识,为了教学,我开始与出版社“ DMK-press”合作,为他们翻译了几本书(与其他人一起,我自己编辑了一些东西)。 Haskell周围也有。 也许这两种活动-教学以及与将书籍翻译成俄语相关的活动-这是我所做的主要工作。

Artyom :也就是说,我们直接叫我们JavaScript的资深人士。 我找到了Ajax,甚至还有PHP。

Vitaliy :是的,我早年甚至用PHP编程,写过几个站点。

关于选择Haskell的原因



Artyom :您在Haskell社区中最有名。 您为什么在Haskell和这个生态系统停留?

维塔利(Vitaliy) :由于我从没考虑过自己是一名程序员,所以我自由自在。 我不需要对他们支付的价格感兴趣。 当我发现Haskell时,我真的很喜欢它。 谈论的内容不是很好,我甚至以某种方式允许自己说些类似的话:“ Haskell是英语社区中聪明人的语言,而该社区平均来说更聪明。” 美国人为此击败了我,他们是对的。 但这正是我感兴趣的。

也就是说,有一次,当我还在大学学习时,我从事相当严格的数学工作,因此切换到一个相对苛刻的编程主题对我来说很自然。 总的来说,很明显,在生产中使用的编程语言中,Haskell是科学程度最高或资源最密集的语言之一。 那里所有的抽象都是最接近数学的。 因此,对我来说,这是自然的选择。

关于函数式语言及其在程序员领域中的地位


Alexei :您对动态和功能性语言有何看法? 像Lisp一样的东西呢?

Vitaliy :我不希望自己定位为Haskellist,而是定位为对编程语言的狂热爱好者。 首先,很明显,所有语言都有权存在。 我认为,以“更好”的方式比较编程语言是完全白痴的职业。 不幸的是,这通常不仅在社交网络中完成,而且没有任何意义。

我喜欢学习编程语言的功能,并通过这些功能对编程语言进行分类。 但是认为这是一个好功能,而这又不好是愚蠢的。 因此,很明显,具有动态类型的语言当然有权存在。 例如,我现在在我的新生课程中,以Julia编程语言为基础。 这是一种动态语言,有一个类型系统。 对我来说教他很有趣,同时看到了这一领域的适用性。

通常,我遇到的第一种功能语言是Lisp。 当然,很多年前,当我读《计算机程序的结构和解释》一书时,这一切给人留下了深刻的印象。 因此,我对所有这些都非常感兴趣。 例如,我也非常喜欢JavaScript,因为我非常了解它的历史。

我知道它初次出现时应该像Lisp,因为起初最初的语法类似于Scheme。 然后,由于某种营销原因,它被替换为类似C的语言,但是,当然,Lisp语言位于其中,给我留下了深刻的印象。

总的来说,我感觉很多JavaScript爱好者都不知道这一点,他们很好,但是我知道,所以我会更好。 因此,所有语言都是不错的,对我来说学习它们很有趣,研究适用性领域很有趣,看到使它变得更容易和更方便的东西也很有趣。 通常,针对各个任务的语言比较也是我要处理的一个单独的有趣领域。

JavaScript有什么好处


Artyom :在准备报告时,您正在与新版本的JavaScript以及其中嵌入的内容联系。 从编程语言理论的角度来看,您能挑出什么好,坏的,也许有趣的解决方案?

重要 :从各种编程语言的角度进行评估,当然,JavaScript中最有趣的是它的对象模型。 从一开始就是这样。 原型模型的历史非常悠久,非常有趣,因为现在几乎没有其他现代语言可以使用它。

在诸如C#之类的语言中,它们使用扩展方法来解决向现有对象添加方法的问题。 这就是JavaScript从一开始就是的样子,在那里看起来更加自然。 也就是说,我们有一个原型,可以向其中添加方法,然后基于该原型创建新对象。 在我看来,在像C#这样的语言中,这是更人为的。

我很想知道如何将模块添加到JS。 在JavaScript中,很长一段时间以来一直存在与模块相关的问题,您可以说几十年来,我不知道他们是如何开始做所有这些事情的。 由于模块是一个深层的理论主题,因此有许多不同的实现方法。 没错,我不能说我已经彻底研究了这一点,但是在我看来,这是编程语言开发领域中的一个有趣案例。 也就是说,如何向现有语言添加以前不存在的功能。

这仍然很有趣,因为几年前在Haskell中曾尝试添加例如更正确的模块。 现在我们可以说这一尝试失败了,没有人开始使用它。 这就是所谓的背包项目,也就是说,它似乎已经实现了,但是使用的意义微乎其微,以至于他们很清楚地提出了一个好的模块化系统,但是效果并不理想。

与不同的从事JavaScript的人交谈时,我感到JS中的模块效果更好。 是的,我很肤浅。 我认为,关于JavaScript的意见很大程度上受您可以在其中编写非常糟糕的代码这一事实的影响。 而且,如果您可以编写非常糟糕的代码,则必须有人大量编写它。 这会对语言的评估产生负面影响。 从编程语言理论的角度来看,这当然不是很好。

Alexey :您是否可以查看最新的JavaScript版本? 除了模块系统,还有什么惊喜?

Vitaliy :我不能说我成功了。 我翻阅了一些内容,但不是很深入。 我无法列出。

不久的将来会在编程语言中出现什么



Artyom :编程语言的理论是一个相当学术的环境,原则上是有趣的。 10-15年内将出现的语言新功能是什么? 目前在这方面正在进行什么研究?

Vitaliy :我要说的是,目前最热门的话题是逐步打字。 这是程序中同时有既定零件又没有定型零件的时候。 它适用于Python,JavaScript和玩具语言。 就是说,我们可以首先合并键入的部分和未键入的部分,其次,我们有一种扩展键入的简单方法。

也就是说,我们正在做某种东西的原型实现,因为它总是以动态语言完成而没有任何类型,然后我们开始将类型越来越多地挂在单个组件上。 理想情况下,我们将获得具有所有好处的类型化程序。 运行时的错误更少,依此类推。

这也许是最重要的发展之一。 一些元素已经以库的形式出现,但是到目前为止,这仍然是一个研究领域。 如果我们观看有关编程语言的领先会议,那么肯定会有几个部分专门介绍渐进式打字。 几乎可以肯定,这是大多数动态语言都将包含的内容,因为它非常方便。 事实证明,这是两个世界的结合。

十年来,当类型依赖于值时,一直在研究依赖类型。 最大的问题是,它消除了编译阶段和执行阶段之间的界限,因为在编译阶段尚不知道特定的值,但是需要检查类型。 也就是说,特定值会在运行时出现,但是类型应该已经正确。

在那里,您已经需要编写一个函数,其中根据传递的值改变结果的类型。 运行时和编译时间之间的边界模糊是非常有趣的事情,它在理论上也已经被积极研究了10-15年,并且几乎可以肯定会落入许多语言中,主要是静态类型的语言,因为由于这种发展而导致的表现型类型系统得到了显着增加。

没错,这是有缺点的。 事实证明,编写程序可能太复杂了。 类型似乎控制了一切,但是编写非常困难,因此有时您会以为使用这些依赖类型会陷入困境,请对任何类型进行编程。

Artyom :他们在这里做。

生命力 :有时也无处可去,这也可以实现很高的愿望。 当您从服务器获取信息时,不知道会发生什么,直到启动程序,您才知道,仍然需要使用这些东西,即使在Haskell中也无处可去。

Vitaly如何发展Haskell



Artyom :这很有趣。 回到Haskell。 您是Haskell 2020委员会的成员。在Podlodka,您说自己什么都没做,但是在一次采访中,您提到您仍在研究简单的,功能有限的产品系列。 您还实施,监督或参与新的Haskell标准的实施的其他哪些具体事项?

重要 :这是两个不同的委员会。 我有两个委员会。 一个是Haskell 2020,其中什么都没有发生,这是一个已死的委员会。 其目的是编写语言标准,并且肯定不会编写。 听起来更好-“语言标准开发委员会”,但没有用。

第二个委员会称为“ GHC编译器监督委员会”-格拉斯哥Haskell编译器。 我已经参加了一年多,他的任务远没有那么雄心勃勃。 该委员会考虑功能,更改编译器的建议以及此编译器中实现的语言版本。 有一个标准的Haskell,但是有一个由特定编译器实现的Haskell。 这是这种语言扩展的示例:“简单类型族”。 这是通过添加其他控件来促进类型级编程的尝试。

没错,我必须说有一个相当自由的环境,也就是说,我可能整个夏天都没有参加任何道具,并且由于我的很多时间都在这个委员会上,我打算回到这个委员会。

我的任务是-搁置它:有一个描述好的建议,我需要看一下,也许建议作者完成一些工作,最后向委员会提出建议,要么建议将其纳入编译器,要么拒绝。 我提交此提案后,委员会讨论并做出决定-一切都在那儿集体决定。

我欠的一句话与标准注释中的下划线有关。 当您不能完全指定类型时,即在那里存在漏洞,并且有一个建议对该系统进行改革,以便以某种方式统一分析所有内容。 在功能的实现中,孔可以位于标准注释中。 提出了一种统一的方法。

该委员会认为编译器的细微变化。

Artyom :我们还有一个标准化委员会-TC39。 首先,某个人来了,他正在寻找冠军。 冠军是来自委员会的人,准备好监督此站点。 然后,据我所知,我们分阶段毕业。 该功能有四个阶段。 零表示只有一个建议,一个表示找到冠军并描述了高级API,依此类推。 第四个已经输入了该语言。 主持人和策展人参加了该委员会的会议,并促进了这一提议。 你最近怎么样 只是一个委员会然后由内部决定吗?

重要 :我们所有的活动都是开放的,在GitHub上进行,部分在开放的邮件列表中进行。 提案的作者进来了-在我们考虑提案时,实施对我们不太感兴趣。 可能是,也可能不是,我们不以任何方式对其进行分析,没有任何依赖于它。 首先,广大社区进行了讨论,每个人都可以对此提案发表评论。

然后,当他安顿下来时,提交人将其提交给委员会,即要求委员会进行审议。 委员会秘书任命了一位牧羊人来监督他。 他看起来,分析,也许提供改进,或者相反地,试图证明为什么它没有生存权,之后他提出了拒绝或也许发送修改或接受的建议。 委员会讨论,作出决定。

当委员会决定我们同意该前提条件,并且原则上转变为已接受状态时,任何人都可以执行它。 到现在为止,可能还没有实现,我们只是做一个决定-是的,在语言或编译器中拥有这样的功能会很好,并且我们有这样一个接受但未实现的子节点列表。

此外,这不再是委员会的任务,然后任何人都向编译器的源代码发出拉取请求,有工程师,团队与委员会部分相交,那些人将已经决定是否接受此拉取请求。

由于委员会同意接受此原则,也就是说,原则上必须接受合并请求,但是存在工程问题,因此没有进行编码,因此直接开发编译器的团队解决了一些性能问题。 这不再是我们的工作。

Alexei :事实证明,Haskell现在有相当老的标准。 我看到有Haskell 2010。

维塔利 :是的,2010年,很老。 已经进行了几次尝试编写新的尝试。 每年都有一个发布标准的想法,但不幸的是,所有这些都失败了。 在2016年,一个2020年委员会召开了会议,但他也没有采取任何行动。 难度不同的原因有很多,为什么这项工作没有持续进行。 是的,2010年的最新标准没有新标准,也看不到它会出现。

关于课程和新项目


Artyom :让我们回到您的主要活动,教学上来。 我非常喜欢在类别理论课程中认识您。 你说你不喜欢他。 您还有什么其他课程可以令您感到自豪,以及您认为可以满足的课程? 例如,课程可能是侧门课程,但原则上讲,叙事程序本身非常好。

维塔利 :首先, 我在YouTube上发布了我所拥有的所有课程。 那里有一门关于Idris的课程-这是一种具有依赖类型的编程语言,甚至有两个版本,我也读过两次。 我在那里也有一些有关Haskell语言编译器的课程。 其中一个专门讨论模型理论问题。 我不记得确切的名称了,但是它涉及类型理论如何直接在Haskell编译器中工作。

这个想法很简单:所有Haskell代码都被编译成一些相当简单的λ微积分,即具有小扩展名的F系统。 这实际上是在编译器代码中,并且该课程着重于如何在编译器中直接使用类型理论的这些元素。

我通常会讲一门课程,讲解类型推断的历史以及类型推断的最初安排方式(最初是60年代发明的),在使用Haskell语言进行类型推断之前的困难之处。一切如何运作。

我在暑期数学学校教了一门短期课程。 有人告诉我,他们不时在那里上计算机科学课程,以便孩子们休息。 , , , , : . — — . , , , .

, , . - , , , , , , - . , - , . , , - - . .

. -, , , , , . , . , - , -, - , , . - , , - , . . , , .

, , , . , , , , , , .

: - ? , , . , , , , - .

: Computer Science Club. , , , . , .

10 . « GHC Haskell: ». GHC, , 40 , 10 . : .

, Haskell, , . , , . .

, 1-2 . . , , . , : , — , - , . , .

, , , . , , . , .

, , , , , . , .

: , JetBrains - , . ? , - ?

: JetBrains , Haskell , JetBrains Haskell- , .

: Haskell JetBrains?

: Haskell c JetBrains, . , .

: Haskell JetBrains?

: - Haskell JetBrains? , .

: , . ()

: . , Java, Haskell.

: , JetBrains?

: JetBrains Education. JetBrains Research — , Education — .

JavaScript-



: , , , JavaScript? , , , Elm, Haskell.

: -, . GHCJS , , , . Elm , Haskell, . , , - .

, , , . JavaScript .

, Idris — Idris PHP, JavaScript, . . , , JavaScript Haskell .

, - , — , — , .

— , , , , . , . , HolyJS , , , , , . — , .

, λ- , — λ-, , , . , λ-, , .

1936 , — . , .



: , ? Swift, , enum , Union, ?

: , , . : , , . , , Python , , .

, , Python, . , , , .

, , , , , . C#. C# : -, Microsoft Java, , , , Delphi, #, C# , Haskell, .

, . , JetBrains, Kotlin, . Kotlin, C#, Swift Apple, . , .

++ - , , , - , , , . , , , JavaScript , . , , .

, , .

: -, , , Mozilla Rust.

: , Mozilla — , , - open source-, . . , Rust , . , Rust , - , .

, Twitter — - Microsoft, , , C++ Microsoft Rust. , . , Rust. , , , , . , .

Rust , - , .



: ! , , , , , — , . , , , - , ?

: , , . , . -, , . . , , — . — , , . .

— , , -, , . , .

, , , . , , . . , , , , . - . . .

: ? , , , , , ?

: , . , , , , . , - , , , , . , . , — . , , .

, — .



: HolyJS ? , - ? , .

: , , , , , . , , . , .

, , AppsConf. . . , .

, , , . : « , ?». - , , : , , Twitter , Google . , .

. , , , , , , , .

, , , . — , .

程序员需要书籍吗



Artyom :还有一个问题,也许是混乱的。 您是否写过有关Haskell的书,叫做《 深度的Haskell》

维塔利(Vitaliy) :不幸的是,这本书并未在编写过程中写成。 这称为“早期访问程序”。 不幸的是,她的速度变慢了,我正在慢慢地回去工作。 它的大约一半写在这里,而后半部分则被延迟,对此我为那些获得这种早期访问权限的人感到very愧。

Artyom :这是一个有趣的事实:社区中有一种观点认为,有关编程的书籍(尤其是那些与基础知识无关的书籍)不是很好,因为信息很快就会过时。 作为这本书的作者,您如何经历? 您是否考虑过这样一个问题,您在书中提供的信息很快就会过时?

维塔利(Vitaliy) :当然,我不理解书籍是如何用JavaScript编写的-我认为这根本是不可能的任务。 使用Haskell,从这个意义上讲要容易一些。 但是,这就是我能说的。

当我们在学校学习数学时,这种数学通常也非常过时。 这些是几千年前毕达哥拉斯定理提出的。 也许它仍在实施中,但是要说有人用毕达哥拉斯定理来测量金字塔的高度就是这样,他们通常会使用激光轮盘或类似的方式。

这里差不多。 当然,如果一个人在某方面是出色的专业人士,并且已经使用某种技术很长时间了,那么他就不需要一本书了。 好吧,这本书不是给他写的,是为了进入某种技术而需要的,以便开始理解这一点。 当您已经进入时,您还有其他开发资源。

因此,在我看来,这些书不会随处可见。 当您开始学习某些东西时,当然可以按文章学习编程语言,但是在大多数情况下,效果不会很好。 通常,这是将他们对另一种编程语言的想法转移到一种新的语言。 您无法识别该语言的惯用构造,也不知道如何正确使用它。

因此,一开始最好把书拿出来,整理一下,拿出来扎根。 让它描述的不是库的最新版本,而是向语言添加一些内容,一切都有可能赶上。 在我看来,要获得基础,您还需要一本书。 这适用于所有编程语言,甚至适用于JavaScript。 无论如何,我们需要某种稳定性,例如您可以参考的参考点。

顺便说一句,这是编写Haskell语言标准的目标之一,目的是在您编写语言的语言历史上创造一个稳定的点。 此外,语言可以发展,但是有一种标准,任何学生都可以专注于它。

有趣的是,书籍如何扮演许多编程语言的标准角色。 例如,Straustrup编写了有关C ++的书,这一点您可以随时参考。 C ++已经取得了长足的进步,但是在学习该语言时,很有可能专注于Straustrup所描述的这个版本。

Artyom :您提出了一个有趣的话题,涉及人们需要的资源,这些人不是学习语言,而是想深入学习并继续前进。 您可以建议您用于学习的一些资源,以及对于工程师来说,使自己沉浸于理论中的学习资源是有益的。 计算机科学,进入类型理论,还是如您所说,消除了工程师的某种无知?

Vitaliy :我很难举一个例子,我完全不能说我有任何常规信息来源。 也许对我来说最重要的来源是Twitter。 事实证明,一切都通过Twitter传给我。 我看到了一些有趣的链接,我留给自己听,并定期阅读它们。 我有一种感觉,至少在Haskell中没有这样的消息来源,但是有许多受人尊敬的人写着明智的话。

我出于某种目的试图定期使用Reddit,但由于某种原因它对我不起作用,我只是没有足够的时间来遵循它。 但是无论如何,在Twitter上,迟早会出现的一切都传给我。 有趣地快速浏览-保存,然后阅读。

因此,总的来说,要推荐计算机科学或IT领域的知识,我还没准备好,我不知道这样的网站或资源。 对于那些参与编程语言的人来说,一个重要的来源是网站http://lambda-the-ultimate.org 。 所有最有趣的东西都出现在这里,正在进行讨论。 对于那些对编程语言理论感兴趣的人来说,这是必须阅读的内容。

给程序员看什么



阿列克谢 :你说书不会过期。 是否有需要阅读的清单,或者只是您最喜欢的书推荐? 我说的是编程理论,有关一般的工程知识。

Vitaliy :我会定期被要求列出一个清单,但我不从事此类工作,这是一项非常艰巨的任务。

根据编程语言的理论,Pierce “编程语言的类型”开始进入这一领域 通常这是入门的入门。 它的前三分之一可能对所有程序员都有用。

我和我的同事正在翻译一本书,名为“编程语言理论导论” 。 它很小,从编译中解释了形式语义,类型推断和理论。 对编程语言的如此有用的介绍。

查尔斯·皮佐德(Charles Petzold)有一本书“注释图灵” 。 这是一个令人惊奇的类型:作者撰写了1936年的Turing文章,其中Turing描述了后来称为Turing的机器,并写了一本厚实的书来解释这篇文章。 文章本身是第15页。此外,还有一个图灵本人的生平故事,该任务的背景以及如何发生的故事。 他逐节给出了本文的一部分,并解释了其中的含义。

如果我们现在阅读这篇文章,对我们来说将是非常困难的。 但是Petzold的这本书令人惊叹,它重新创建了整个上下文并描述了文章本身。 我向所有人推荐此书,这是一个非常有趣的阅读,开阔了思路。 也有关于λ微积分的知识,因为它很近,并且提出了与计算有关的哲学问题。

另外,当然,从技术角度来看,我是McConnell的《 Perfect Code》的忠实拥护者 。 在我看来,这也是一本重要的读物。 您不能连续阅读所有内容,而只能在随机页面上打开它,阅读几页然后关闭它。 这是关于如何编写代码。

没错,我最近与几位移动办公人员进行了交谈,他们说这是一本愚蠢的书,没有什么用处。 但是,这是关于如何编写这样的代码以使其能够长期存在,以便可以对其进行支持和更改的问题。 也许他们真的没有这种需求。

是的,那里没有Swift,没有Kotlin,那里没有某种Java,不同语言的不同示例,现代程序员不再真正谈论任何东西。 这本书开始于千分之二。 但是我认为对于任何程序员来说,这种阅读都是非常有用的。 麦康奈尔(McConnell)仍然很擅长,他通过研究证实了一切,他说:“所以,我们进行了如此多的研究,但是如此而又如此,这就是结果。 让我们一起讨论如何编写代码使其变得更好。”

在这里,也许足够阅读。

Artyom :对于更专业的应用程序,我会问:您推荐了“现代编译器实现”,该版本有JavaCML三种版本。

Vitaliy :是的,这是一本有关编译器的书。 我不知道每个人是否都需要阅读它,对于那些对编译器感兴趣的人来说,可能性更大。 但是,是的,我喜欢它-它很小,并且可以使用它编写自己的编译器。 我不确定所有程序员都需要编写自己的编译器,但是如果您突然感到好奇,Appel的书确实很有趣,但是已经有些狭窄了。

现在我已经记不清一切了。 有时候,有些东西突然浮出水面,因为一次我读了很多东西。 例如, “计算机程序的结构和解释”也是经典,对阅读和练习很有帮助。 即使我不太同意,但阅读本身还是很有用的。

Vitaly Bragilevsky将出席2019年11月8日至9日在莫斯科举行的HolyJS 2019莫斯科会议,并发表题为“ JavaScript在理论信息学中的服务”的报告可以在官方网站上购买门票。

Source: https://habr.com/ru/post/zh-CN469531/


All Articles