小编hoh*_*ern的帖子

如何通过Rust宏将表达式中的一个标识符替换为另一个标识符?

我正在尝试建立一个进行一些代码转换的宏,并且应该能够解析其自身的语法。这是我能想到的最简单的例子:

replace!(x, y, x * 100 + z) ~> y * 100 + z
Run Code Online (Sandbox Code Playgroud)

此宏应该能够用作为第三参数提供的表达式中的第二个标识符替换第一个标识符。宏应该对第三个参数的语言有所了解(在我的特定情况下,与示例相反,它不会在Rust中解析),并对其进行递归应用。

在Rust中构建此类宏的最有效方法是什么?我知道这种proc_macro方法和macro_rules!一种方法。但是我不确定是否macro_rules!足够强大来处理此问题,并且找不到如何使用来构建自己的转换的文档proc_macro。谁能指出我正确的方向?

rust rust-macros

10
推荐指数
1
解决办法
332
查看次数

编程语言中的堆栈性能

只是为了好玩,我试图比较使用朴素递归算法计算Fibonacci系列的几种编程语言的堆栈性能.代码在所有语言中都是相同的,我将发布一个java版本:

public class Fib {
 public static int fib(int n) {
  if (n < 2) return 1;
  return fib(n-1) + fib(n-2);
 }

 public static void main(String[] args) {
  System.out.println(fib(Integer.valueOf(args[0])));
 }
}
Run Code Online (Sandbox Code Playgroud)

好的,重点是使用此算法输入40我得到了这些时间:

C: 2.796s
Ocaml: 2.372s
Python: 106.407s
Java: 1.336s
C#(mono): 2.956s
Run Code Online (Sandbox Code Playgroud)

它们是在Ubuntu 10.04机器中使用官方存储库中提供的每种语言的版本,在双核英特尔机器上.

我知道像ocaml这样的函数式语言会因为将函数视为一阶公民而减速,并且解释CPython的运行时没有问题,因为它是这个测试中唯一的解释语言,但我对java运行印象深刻时间是同一算法的c的一半!你会把它归结为JIT编译吗?

你会如何解释这些结果?

编辑:谢谢你的回复!我认识到这不是一个合适的基准(从来没有说过它是P),也许我可以做一个更好的基准并在下次发给你,根据我们讨论的内容:)

编辑2:我使用优化编译器ocamlopt更新了ocaml实现的运行时.我还在https://github.com/hoheinzollern/fib-test上发布了测试平台.如果你想要随意添加它:)

c python java performance ocaml

8
推荐指数
3
解决办法
1406
查看次数

C++与Java构造函数

根据John C. Mitchell的说法 - 编程语言中的概念,

[...] Java保证在创建对象时调用构造函数.[...]

这被指向Java的特性,使其在行为上与C++不同.所以我必须争辩说,在某些情况下,即使创建了该类的对象,C++也不会为类调用任何构造函数.

我认为这种情况发生在继承发生时,但我无法找出这种情况的例子.

你知道任何一个例子吗?

c++ java inheritance programming-languages

6
推荐指数
3
解决办法
2901
查看次数

Java MIDI Sequencer的替代品

我试图使用结合到JVM中的MIDI音序器(如此处所述,如果有人有答案,它仍然受欢迎)并发现这个音序器实现有几个限制,范围从卡住Java MIDI合成器(我想要使用未来的Steinberg VST)以明智的延迟.

所以我想知道Java是否有众所周知的,公认的和有效的音序器实现,因为重新发明轮子很少是一个好主意:)

任何的想法?

java midi

6
推荐指数
1
解决办法
2133
查看次数

最适合计算和内存昂贵算法的语言

假设您必须实现一个有效解决NP难问题的工具,不可避免的内存使用量爆炸(输出大小在某些情况下指数输入大小)并且您特别关注此工具在运行时的性能时间.一旦知道了基础理论,源代码也必须是可读和可理解的,并且这个要求与工具本身的效率同样重要.

我个人认为3种语言可能适合这三个要求:c ++,scala,java.它们都提供了对数据类型的正确抽象,使得可以比较不同的结构或将相同的算法(这也很重要)应用于不同的数据类型.

C++具有静态编译和优化的优点,并且通过函数内联(如果数据结构和算法经过精心设计)和其他优化技术,可以在保持相当好的可读性的同时实现接近纯C的性能.如果您在数据表示中也非常谨慎,则可以优化缓存性能,当缓存未命中率较低时,缓存性能可以获得数量级的速度.

Java是JIT编译的,它允许在运行时应用优化,并且在这类算法中可能在不同的运行之间具有不同的行为,这可能是一个加号.我担心这样的方法可能会受到垃圾收集器的影响,但是在这种算法的情况下,通常连续分配内存并且Java堆性能比C/C++好得多,如果你在语言中实现自己的内存管理器,你可以甚至达到很好的效率.相反,这种方法无法内联方法调用(这会导致巨大的性能损失)并且无法控制缓存性能.在专业人士中,语法比C++更好,更清晰.

我对scala的担忧与Java大致相同,而且我无法控制语言的优化程度,除非我对编译器和标准库有深入的了解.但是好吧:我得到一个非常干净的语法:)

你对这个问题有什么看法?你有没有必须处理这个?您是否会使用这些语言中的任何一种语言实现具有此类属性和要求的算法,或者您会建议其他什么?你会如何比较它们?

algorithm programming-languages np data-structures

4
推荐指数
1
解决办法
388
查看次数