大家好!
最近,下一届C ++ Siberia 2019在新西伯利亚举行,会议气氛舒畅,报道很多。 我借此机会与我们的两位发言人交谈,您很快就会在莫斯科与他们见面。
Ivan Chukic是KDE的开发人员之一,他是贝尔格莱德大学编程语言设计的老师和研究员。
Alexander Granin ( graninas )是著名的演讲者和开发人员,专门研究FP,这是新西伯利亚FP社区LambdaNsk的组织者。

Sergey:大家好,让我们结识。 亚历山大(Alexander)是此C ++ Siberia的主旨发言人,伊万(Ivan)去年是主旨发言人。 让我们谈谈函数式编程。 据我所知,C ++中的FP是您上次主题演讲的主题,伊万(Ivan)...
伊万:不是全部,而是部分-是的。
谢尔盖:亚历山大的报告主题是关于函数式编程的。 因此,我准备了几个问题,第一个-您如何确定自动对焦?
亚历山大:我认为FP并没有一个“正确的”定义,但就我个人而言,FP是具有功能组成和一流功能的东西。
伊万:我同意,但是我还要添加高阶函数-那些可以将其他函数作为参数并返回的函数。
Sergey :链接到C中的函数-是否考虑?
伊万:不,C不是函数式编程语言:-)
谢尔盖:告诉我为什么?
伊万:由于您无法通过函数指针的组合来创建新函数,因此只能指向现有函数。 当然,如果不使用某些汇编程序。
谢尔盖:太好了,现在我有一个正式答案! 人们经常问这个问题,为什么C不是函数式编程语言,因为那里有成熟的函数。 这就是为什么C ++是一种功能性语言,更易于理解...
亚历山大:我不会说C ++是一种真正的函数式编程语言,它支持涌入一种语言的大量范例。
Sergey:我的意思是-C ++当然支持功能范例。 顺便问一下,为什么? 他支持它,因为您可以操纵高阶函数吗?
伊万:恩,在我看来,他一直都是这样,因为即使在C ++ 98中,甚至在STL中也已经存在高阶函数。 这不是最方便的功能语言-有些语言可以实现FP甚至更好。 但是对于我的需求,它一直都非常有用。
谢尔盖:但是从这个地方来更详细。 您有什么样的需求?
伊凡:这很复杂。 来吧,讲一个故事。 当我上大学时,我们经历了LISP,每个人都讨厌这个LISP,因为它很丑。 但是我从中了解到的是如何直接在LISP代码中模拟C结构。 然后有一天,一个新版本的Java发布了,它针对诸如内置的foreach
类的东西发布了,我想:哇,您需要一个新的编译器,一个新的语言版本以及所有新功能,以实现我在LISP上大学所做的工作,通常甚至不支持循环。 那时,我意识到FP对于构建高级抽象是一件非常不错的事情,这就是为什么我在2019年使用函数C ++的原因。
Sergey:实际上,您使用FP进行高级设计。
伊万:是的 。
亚历山大:现在我不使用C ++,但是我不会拒绝使用它来处理数据,这比命令式方法更令人愉快。 与之相比,即使与OOP相比,此处仅接受转换,这很方便。
Sergey:好吧,您不仅可以将FP与C ++一起使用,对吗? 好的,接下来的问题是:您使用的是C ++的哪一部分? 如果仅设计问题很重要,则只能选择与FP完全匹配的零件,即您真正使用的零件。
伊万:这些绝对是lambda函数。 甚至更重要的是-模板,因为它们允许您将其他函数作为参数以及其他所有参数传递,而lambda只是编写功能对象的一种不错的语法。
Sergey:是的,我们已经意识到您真的很喜欢lambdas :-)
伊万:并不是他们真的喜欢它们,但这显然是我们在C ++ 98中拥有的最好的东西,与他们合作更方便。
亚历山大:是的,我也喜欢lambdas-此功能非常通用,您只能单独在它们上编写。 这有点像通用组合器,它使您可以构造任何逻辑-可能不如其他语言那么漂亮,但同样有用。
Sergey: Ivan,您在这里提到的是C ++ 11之前的标准,例如C ++ 03,这很常见,并且那里已经有功能。 新标准中还有更多的功能特性...可以说C ++正在向FP迈进吗? 这种运动会继续还是停止? 然后会导致什么?
伊万: 西蒙·佩顿·琼斯 ( Simon Peython Jones)撰写了一份有关编程语言的报告,其中他绘制了一张图表,显示了许多安全语言和所使用的语言。 Haskell的故事是从一种完全安全的语言开始的,该语言无法执行任何操作-因为没有I / O,也没有任何内容。 SPJ将C语言和汇编语言归类为非常有用,但同时又极不安全的语言。 从那时起,Haskell已开始朝着更高的安全性迈进。 另一方面,那些出现在C ++中的功能主要是为了提高安全性,以便您可以更简单地编写正确的程序。 碰巧的是,这些东西大多数都来自功能编程语言。
谢尔盖:你为什么这么认为? 由于AF的性质?
伊万:是的,也许是天生的……但我不确定。
亚历山大:我认为自动对焦让每个人都着迷,仅仅是因为我们厌倦了模板的争用,字节的重新排列以及某种低级的残渣-我们想要一些值得我们运用自己的智慧的东西。
谢尔盖:对您来说,这是一种智力锻炼吗?
亚历山大:是的,那样。
谢尔盖:我明白。 对于开发人员而言,考虑高层抽象比实现愚蠢的标准功能要有趣得多-这是令人不愉快的。 这就是问题C:您在FP在C ++中的实际应用方面有任何经验吗? 有生产项目吗?
伊万:当然可以。 世界上最大的项目之一,KDE,其中有几个部分都在大量使用功能样式。 当然,这可以说是更传统的面向对象的C ++与一组功能概念的混合。 我永远不会成为一个纯粹主义者或类似的人。 我总是尽力结合不同世界的精华。
Sergey: Haskell或Scala呢? 毕竟,它们被广泛用于生产中。 您如何看待Haskell现在被视为功能语言的标准的想法? 纯粹主义者尤其注意这一点。
伊万:是的,我同意今天的Haskell是FP的代名词。 实际上,人们已经将Haskell的任何功能视为与FP相关的功能。 这不一定是正确的,但我认为Haskell已真正成为最受欢迎的学术函数式编程语言。 我知道伦敦和北欧的几家银行都在广泛使用Haskell,但Scala现在仍然很受欢迎。
亚历山大:我同意Scala更为流行,但是Haskell似乎是一种功能更强的语言,其大多数功能都可以更正确地实现。 也就是说,当您进行简单的计算时,只要有一种简单的制作方法,编程就变得简单而简单,就像在树林里漫步并欣赏美景一样。
伊凡:但是有时候森林里有熊。 如果您在俄罗斯。
Sergey:您认为C ++的主要灵感来自Haskell吗? 值得吗?
伊凡:您暗示任何具体的委员会成员吗? :-)有人暗示,概念的出现是理解类的结果,但是Björn停止了这些谣言,甚至写了一些有关概念与类的区别的文档。 从我的角度来看,它们在所有方面都各有不同,但仅出于一种目的。 只是不同的方法。
Sergey:未来/承诺与FI有任何关系吗? 巴托什似乎在争辩说这些是实施不良的单子。
伊凡:好,是的,它们被实现为单子,传输续集,但是我不确定在这件事上最重要的是什么。
Sergey:我们需要在C ++中改进对monad的支持吗?
亚历山大:当然,这是最重要的功能,可以将C ++变成一种非常好的语言。
伊万:顺便说一句,既然我们正在参加会议,谢尔盖,我也要问你一个问题。 您说会议是一项令人兴奋的工作。 分享它的有趣之处,您会建议我或格兰宁同志在世界其他地方独立组织会议吗?
谢尔盖(Sergey):会议的组织真的很棒,您遇到很多有趣的人,但这只是冰山一角。 在那儿-大量的工作,大厅的所有准备工作,为参与者提供食物,更不用说寻找演讲者了。 C ++俄罗斯仍然不是世界上最著名的会议,演讲者必须解释我们是一个新的会议,有趣的事情正在这里发生。 您需要说服演讲者,尤其是著名的明星演讲者,他们对飞往俄罗斯并不特别感兴趣,只是想看看一个新国家。 组织工作很辛苦,尤其是当您从事主要工作时。 但是,通过与这些出色的人沟通,一切都会有所收获。 尽管如此,我现在已经达到了这样的地步:我宁愿参加别人的会议,也不愿自己做。
伊万:也就是说,您建议参加会议,而不是参加会议。
谢尔盖(Sergey):是的,如果您可以避免组织会议,则应该抓住机会。 当组织时,巨大的负担将落在您身上,这是另外8个小时的工作。 就个人而言,在会议开始前约三个月,我开始每天额外工作8个小时。 这样做很有趣...但是我希望我的家人也一样有趣。 感谢您的询问!
现在,回到主题。 我们谈到函数式编程,就您的报告说服了我,您几乎说服了我。 有人怀疑,当我需要同步不同的事物时,C ++中的函数方法会帮助我实现多线程。 真的有帮助吗?
伊万:当然可以。
亚历山大:尽管我对使用C ++进行功能多线程的经验有限,但我不得不说,当您拥有纯函数世界时,在多线程环境中谈论它们要容易得多。 例如,如果您编写具有竞争性的逻辑,则不必考虑同步所有这些东西,互斥量,关键部分或任何事情。 所有这些都消失了,因为您将代码视为常规的顺序代码,并且所有多线程和同步都隐藏在内部的某个位置。 有很多方法可以实现多线程编程和功能。 我不确定这是否会发生在所有方法中,但是例如,软件事务存储是降低竞争性应用程序复杂性的好方法。 不幸的是,这是选择正确折衷方案的问题。
伊万:当编译器为您完成所有工作时,您必须高效地付出代价。
亚历山大:嗯,有不同的问题。 首先,您需要了解所有这些知识,例如STM,然后将这些秘密知识传递给您的同事。 然后,在特定的实现中以及在使用手动线程控制时可以更好地工作的地方会出现错误。 但是您可以比手动控制更快,更轻松地编写代码。 它执行起来较慢,但是代码中的错误更少。 顺便说一句,伊凡(Ivan),您如何看待会议对这个问题的重视程度?
伊万:这个话题很兴隆。 近年来,所有主要会议-CPPConf,C ++俄罗斯,Meeting C ++等。 -直接在FP或代数数据结构等上收到的报告。 有时,演讲者甚至都不怀疑他们在报告中谈论了FP的某些概念。 在C ++中,事物来自许多不同的地方……人们通常不会只用一种语言编写。 想象一下Ivan Ivanov正在研究用Erlang和C ++编写的项目。 然后Tatyana Petrovna到达,她已经在Haskell工作,具有干净的功能,所有这些功能都采用了他们最喜欢的机制并将其移植到C ++,结果,来自不同社区的大量人为C ++带来了越来越多的东西。 这一切发生在我们眼前。 至少在C ++开发人员社区中会发生这种情况,但是对于C ++公司而言,我不确定。 但是,C ++社区中的许多人现在都在研究功能概念。
亚历山大:我正确地了解到,许多顶级C ++开发人员只是为了了解C ++的发展情况而学习Haskell?
伊万:由于这个原因,我不确定他们是否教Haskell。 我认为C ++开发人员非常自私。 他们学习C ++非常好,只是因为它很复杂。 而且,如果您想学习一些真正的新知识,那么您的道路显然就不会落在任何Java上,Java是专门为简单而创建的。 您需要查看不寻常和奇怪的语言领域,即最奇怪的语言,Haskell将自动成为最受欢迎的答案之一。 一个人看到它,明白:哦,这比C ++更复杂,您需要学习。 当我学习Haskell时,情况和我一样,而且我的朋友也遵循完全相同的推理方法。
亚历山大:当埃里克·尼布勒(Eric Nibler)在西伯利亚与我们一起参观并展示其范围库时,经常有人问他灵感的来源是什么。 他回答说是哈斯克尔。 也许不应该连续使用所有功能,但是社区中显然需要其中的一些功能。
伊凡:这有点演变。 遗传物质。 Haskell也可以通过使用C ++进行改进。 大多数语言都在经历这样的演变。 Java试图使C#的LINQ适应自身,而C#的LINQ创建者则从Haskell等人那里得到了启发。 事实证明,不同语言之间相互影响的美丽纠结网络。
亚历山大:但是,C ++仍然是一种低级语言吗?
伊万:大多数人都这么认为。
谢尔盖:你在说什么“低级”?
Ivan:编译为低级代码。 但这适用于高级抽象。 整个观点和目的是,这种抽象不会导致性能方面的不必要开销。 C ++应该从其抽象中生成代码,而这些代码不会比手写代码差。 至少在理论上。
亚历山大:如果有人违反此规则会怎样? 例如,范围。
伊万:编译性能会受到影响-是的。 所有新功能,尤其是库中提供的功能,都会增加编译时间。 但是没有理由为什么范围应该变慢。 如果范围变慢,那么您唯一可以指责的是未针对此特定情况进行优化的编译器。
谢尔盖:范围本身不是刹车,而是处于调试模式的范围-这是整个讨论的本质。 在发布模式下,它们可以正常工作。
伊凡:这很正常。
谢尔盖:并非每个人都同意这一点:-)
伊万:是的,我在实践中知道。 在一家公司中,在其最常用的库中...我不会说它是一家什么样的公司和库...在调试模式下,渐近地算法明显变慢。 谁又会抱怨这些范围在做同样的事情?
Sergey:在我们正在讨论的文章中,重点不在于本身,对于一位发怒于这种情况正在成为趋势以及调试模式下的低生产率的作者来说,它们只是一个例子。 在游戏引擎的主题领域,这是完全不能接受的。
亚历山大:这些人根本不喜欢STL,因为它的工作速度比他们所需的慢。 范围只是沿相同的方向扩展库,对于它们来说,它看起来像是另一个无法使用的无用功能。
谢尔盖:讨厌者会讨厌。
伊万:是的 。 例如,每个人都使用排序。 试想一下,标准库中不再有排序。 您将如何实施?
谢尔盖:我通常在面试中问这样一个问题:-)这是一个非常常见的问题。
伊万:是的,常见的问题是如何实施排序。 然后,您讨论快速排序的一些基本版本,实际上在世界上任何地方都没有使用过,因为在某些情况下它可能非常慢。 标准库不允许使用它,因为它需要保证的N log N,并且不能进行快速排序。 在大多数情况下,它可以,但是此处的标准非常严格,并不意味着累积N log N,它应该是纯N log N,您将如何实现这种算法? 您需要进行研究,找到许多不同的优化方法以进行快速排序,然后将它们合并到一个至少由三种不同算法组成的算法中,就像在libstdc ++中所做的那样。 这就是标准库的含义-您无需了解所有这些知识即可进行编程。 无需弄清楚如何以最有效的方式实施所有操作,其他人已经为您解决了这一问题。 因此,当人们说:“ STL非常复杂,请不要使用它并手动从头开始编写所有内容”时,我不喜欢这种方法。
谢尔盖(Sergey):采访即将结束,所以最后一个问题:您在俄罗斯的情况如何?
亚历山大:天气变冷了。
谢尔盖:即使是你呢? 你是本地人!
伊凡:但对我来说,这里的气温比预期的要温暖得多。
谢尔盖:现在是-16,我们告诉过你它将是-40。
伊万:是的,你答应了! 我特别准备了零下四十。 然后我看着温度计,那里的一切都越来越热。
Sergey:好吧,现在我们只会在C ++ Russia 2019上见面,它将在莫斯科举行,并且会有一个高温。 感谢您的采访,很快再见!
分钟的广告。 4月19日至20日,将举行C ++俄罗斯会议,Ivan将在该会议上作题“仅移动C ++设计”的演讲,亚历山大将谈论单子语法分析器。 此外,Ivan将举办三场大型培训之一 - “ C ++应用程序编程” 。 会议还剩下一个月的时间,并且该程序将继续完善。 在官方网站上,您可以查看哪些报告已进入计划并购买了票证 。 请注意,门票类型不同,选择合适的门票可以节省很多。