Scala宏和C++模板的相似之处和不同之处

9
Scala的宏和C++的模板都提供了对编译时元编程的访问。您能详细说明一下它们的相似之处和区别吗?在表达能力方面,它们是否相等?

2
请仔细阅读并思考后再点击关闭,这并不难理解被问的是什么。 - Kim Stebel
2个回答

10

它们之间的一个重要区别在于,Scala 宏是用 Scala 编写的,而 C++ 模板是它们自己的编程语言,与 C++ 完全不同。C++ 是一种命令式面向对象的严格不纯语言,而 C++ 模板是一种声明式混合逻辑/函数式非严格纯语言,它从未被设计成一个完整的编程语言,因此缺少许多大规模编程所必需的特性。


1
我同意大部分的回答,除了面向对象的那一点。C++是多范式的,它从OO中吸取了一些东西,但如果它是OO模型,Alan Kay会感到不适,另一方面,它提供了比传统OO更多的功能。 - Matthieu M.

4
他们都提供编译时元编程,并且都是图灵完备的,但这就是它们共同之处。我不是 C ++ 的专家,但据我所知,C++ 模板是图灵完备的事实很少被利用,而且在实际编程中使用它们很困难。通常,模板只用于提供参数多态性(又称泛型),而 Scala 宏是用 Scala 编写的,并可以在编译时使用语言的全部功能。

1
C++模板确实在实际编程中有一定难度——像计算阶乘这样的显而易见的例子很容易,但并不是非常有用。Boost和C++11使一些事情变得更容易,例如增加了一堆内置类型特性以及像enable_if这样的工具。C++11还引入了constexpr,它是一个完全独立的用于编译时计算的工具。我认为C++中模板的常见用途是对类型进行编译时计算。除此之外的任何用途都是罕见/困难/深奥的。 - Steve Jessop
它们是图灵完备的事实很少被利用,但模板本身经常被利用。另一方面,即使有decltypeconstexpr的出现,可在编译时使用的工具也相当有限。我不知道Scala中的限制是什么,你能打印(至少在屏幕上)吗? - Matthieu M.
@MatthieuM.: Scala宏是用Scala编写的。在编译时,您可以做任何运行时可以做的事情。没有限制。(嗯,编译器有一些超时和内存限制,旨在阻止运行失控的宏,但这就是全部。) - Jörg W Mittag
在Scala中没有限制。甚至有宏可以在编译时访问数据库。 - Kim Stebel
@SteveJessop:注释不是用来提问的。而且不行。 - Kim Stebel
@JörgWMittag:哇,这对编译器提出了一些限制! - Matthieu M.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接