小编Tho*_*yer的帖子

Java编译器如何解析类型转换?

一个简单的表达式

(x) - y
Run Code Online (Sandbox Code Playgroud)

根据是否x是类型名称进行不同的解释.如果x不是一个类型的名字,(x) - y只是减去yx.但如果x是类型名称,则(x) - y计算负数y并将结果值转换为类型x.

在典型的C或C++编译器中,是否x是类型的问题是可回答的,因为解析器在处理了typedef或struct声明后立即将这些信息传递给词法分析器.(我认为这种必要的违反水平是C设计中最糟糕的部分.)

但是在Java中,x可能直到后面的源代码才定义.Java编译器如何消除这种表达式的歧义?

很明显,Java编译器需要多次传递,因为Java不需要在使用前声明.但这似乎意味着第一遍必须在解析表达式时做一个非常草率的工作,然后在稍后的传递中做另一个更准确的表达式解析.这似乎很浪费.

有没有更好的办法?

java compiler-construction parsing casting

11
推荐指数
1
解决办法
722
查看次数

制作邪恶的快速编译器的关键设计选择是什么?

我想知道如何设计一个非常快速编译的编译器.

首先,让我对我的问题有一些明显的误解:

  1. 不是在谈论编译器生成的代码的速度.已有许多资源可用于学习如何优化生成的代码.我遇到的问题是有关快速编译编译器的信息.

  2. 我也不讨论为什么C++编译器通常比Java编译器慢(例如).我感兴趣的是可以使用哪些技术来加速任何给定语言的编译器.

  3. 我也不想听到像Microsoft的Incredibuild或Unix的distcc这样的分布式编译系统.这些系统不会为您提供更快的编译器,它们只会为您提供更多的编译器.这当然有用,但这不是我要问的问题.我想知道如何为单个CPU设计快速编译器.

  4. ccache也不是我正在寻找的答案.这是一个允许您完全避免使用编译器的系统,但它不会使编译器更快.再说一次,这很有用; 再说一遍,那不是我要问的问题.

我希望我的问题现在非常明确.但也许一些历史会使它更加清晰.

C编译器过去非常慢.然后,在1986年,THINK Technologies推出了Lightspeed C for Macintosh,它几乎可以即时编译程序.光速C为这样超过了其他所有的C编译器,有几乎没有任何比较快的多.(也许Lightspeed C不是新一代闪电般快速编译器中的第一个,但它是我体验中的第一个.Turbo Pascal早于[1983],但我没有经验,所以我不知道如何它在速度方面进行了比较.)

从那时起,许多快速编译器已经可用.似乎有某种在1980年的编译器技术的飞跃,而尤其是什么,我试图理解.突破是什么?

答案可能很简单:使用Lightspeed和Turbo等IDE,集成编辑器已经在RAM中有源代码.如果编译器对该数据进行操作,则会消除磁盘I/O,这是任何编译器中最慢的部分.如果源代码大小相对于内存大小较小,那么这可能是提高速度的一个非常重要的因素.(在那些日子里,RAM大小要小得多,但是典型的程序大小也是如此.)

是吗?还是涉及其他重要的创新?从那以后,编译器速度有了重大改进吗?

performance design-patterns compiler-theory

9
推荐指数
1
解决办法
557
查看次数

如何以编程方式将参数传递给Blaze组件?

流星反应教程指示您通过调用Blaze.render创建Meteor登录按钮:

this.view = Blaze.render(Template.loginButtons,
  React.findDOMNode(this.refs.container));
Run Code Online (Sandbox Code Playgroud)

account-ui包文档说如果你想在屏幕的右边缘对齐登录下拉列表,你应该使用

{{> loginButtons align="right"}}'
Run Code Online (Sandbox Code Playgroud)

不幸的是,该Blaze.render()函数的文档并未指出我的JavaScript可用于传递等效的任何参数align="right".

如何告诉Blaze渲染模板align="right"

javascript reactive-programming meteor meteor-blaze

7
推荐指数
1
解决办法
586
查看次数