首选语言:C/C++,Java和Ruby.
我正在寻找一些有用的书籍/教程,如何编写自己的编译器只是为了教育目的.我最熟悉C/C++,Java和Ruby,所以我更喜欢涉及这三者之一的资源,但任何好的资源都是可以接受的.
与非JIT编译器相比,JIT编译器具体做什么?有人可以给出一个简洁易懂的描述吗?
我从未明白ABI是什么.请不要指向维基百科的文章.如果我能理解它,我就不会在这里张贴这么长的帖子.
这是我对不同界面的看法:
电视遥控器是用户和电视之间的接口.它是一个现有实体,但本身无用(不提供任何功能).遥控器上每个按钮的所有功能都在电视机中实现.
接口:它是间"现有实体"层
functionality和consumer的该功能.接口本身不起作用.它只是调用后面的功能.现在取决于用户是谁,有不同类型的接口.
命令行界面(CLI)命令是现有实体,消费者是用户和功能所在.
functionality:我的软件功能解决了我们描述这个界面的一些目的.
existing entities:命令
consumer:用户图形用户界面(GUI)窗口,按钮等是现有实体,消费者再次是用户和功能所在.
functionality:我的软件功能解决了我们描述这个界面的一些问题.
existing entities:窗口,按钮等..
consumer:用户应用程序编程接口(API)函数(或更正确的)接口(在基于接口的编程中)是现有实体,这里的消费者是另一个程序而不是用户,并且该层后面的功能也是如此.
functionality:我的软件功能解决了我们描述这个界面的一些问题.
existing entities:函数,接口(函数数组).
consumer:另一个程序/应用程序应用程序二进制接口(ABI)这是我的问题开始的地方.
functionality:???
existing entities:???
consumer:???
ABI涵盖了诸如此类的详细信息
- 数据类型,大小和对齐方式;
- 调用约定,它控制函数参数的传递方式并返回检索的值;
- 系统调用号码以及应用程序应如何向操作系统进行系统调用;
其他ABI标准化细节,如
- C++名称错误,
- 异常传播,和
- 在同一平台上调用编译器之间的约定,但不需要跨平台兼容性.
谁需要这些细节?请不要说操作系统.我知道汇编编程.我知道链接和加载是如何工作的.我确切地知道里面发生了什么.
为什么C++名称输入?我以为我们正在谈二进制.语言为什么会进来?
无论如何,我已经下载了[PDF] System V Application Binary Interface Edition 4.1(1997-03-18),看看它究竟包含了什么.好吧,大部分都没有任何意义.
为什么它包含两章(第4和第5章)来描述ELF文件格式?实际上,这些是该规范中仅有的两个重要章节.其余章节是"处理器特定的".无论如何,我认为这是一个完全不同的话题.请不要说ELF文件格式规范是 ABI.根据定义,它不符合接口的条件.
我知道,因为我们谈论的水平很低,所以必须非常具体.但我不确定它是如何"指令集架构(ISA)"具体的?
我在哪里可以找到Microsoft Windows的ABI?
所以,这些是困扰我的主要问题.
编译和链接过程如何工作?
(注意:这是Stack Overflow的C++常见问题解答的一个条目.如果你想批评在这种形式下提供常见问题解答的想法,那么发布所有这些的元数据的发布将是这样做的地方.这个问题在C++聊天室中受到监控,其中FAQ的想法一开始就出现了,所以你的答案很可能被那些提出想法的人阅读.)
我正在研究一些需要高度优化的Java代码,因为它将在我的主程序逻辑中的许多点调用的热函数中运行.此代码的一部分涉及将double变量乘以10凸起到任意非负int exponents.一个快速的方式(编辑:但不是最快的,见下面的更新2)获得相乘的值是switch在exponent:
double multiplyByPowerOfTen(final double d, final int exponent) {
switch (exponent) {
case 0:
return d;
case 1:
return d*10;
case 2:
return d*100;
// ... same pattern
case 9:
return d*1000000000;
case 10:
return d*10000000000L;
// ... same pattern with long literals
case 18:
return d*1000000000000000000L;
default:
throw new ParseException("Unhandled power of ten " + power, 0);
}
}
Run Code Online (Sandbox Code Playgroud)
上面注释的省略号表示case int常量继续递增1,因此case上面的代码片段中确实有19 秒.因为我不知道我是否真的需要10一切权力,并case声明 …
java compiler-construction performance assembly switch-statement
我正在努力更好地理解这种差异.我在网上找到了很多解释,但它们倾向于抽象的差异而不是实际的含义.
我的大部分编程经验都是CPython(动态,解释)和Java(静态,编译).但是,据我所知,还有其他类型的解释和编译语言.除了可执行文件可以从编译语言编写的程序中分发之外,每种类型都有任何优点/缺点吗?通常,我听到有人认为解释性语言可以交互使用,但我相信编译语言也可以有交互式实现,对吗?
python java compiler-construction interpreter programming-languages
这个问题是使用TypeScript直接类比检查Class类型
我需要在运行时找出类型为any的变量实现接口.这是我的代码:
interface A{
member:string;
}
var a:any={member:"foobar"};
if(a instanceof A) alert(a.member);
Run Code Online (Sandbox Code Playgroud)
如果您在typescript playground中输入此代码,则最后一行将被标记为错误,"当前范围中不存在名称A".但事实并非如此,该名称确实存在于当前范围内.我甚至可以在var a:A={member:"foobar"};没有编辑投诉的情况下将变量声明更改为.浏览网页并在SO上找到另一个问题后,我将界面更改为类,但后来我无法使用对象文字来创建实例.
我想知道A类型是如何消失的,但是看看生成的javascript解释了这个问题:
var a = {
member: "foobar"
};
if(a instanceof A) {
alert(a.member);
}
Run Code Online (Sandbox Code Playgroud)
A没有表示作为接口,因此不可能进行运行时类型检查.
我知道javascript作为一种动态语言没有接口的概念.有没有办法输入接口检查?
打字稿操场的自动完成显示打字稿甚至提供了一种方法implements.我怎么用呢?
我该如何解决此警告?
[WARN]警告:没有规则处理架构i386的源代码.objj.h类型的'$(PROJECT_DIR)/MyApp/MessageCell.h'文件
我目前正在使用GCC,但最近我发现了Clang而且我正在考虑切换.但是有一个决定性的因素 - 它产生的二进制文件的质量(速度,内存占用,可靠性) - 如果gcc -O3能够生成运行速度快1%或内存减少1%的二进制文件,那么它就是一个交易破坏者.
Clang拥有比GCC更好的编译速度和更低的编译时内存占用,但我真的对基准测试/比较结果编译软件感兴趣 - 你能指点我一些或描述你的经历吗?
我用Google搜索并在Go网站上搜索,但我似乎无法找到Go的非凡构建时间的解释.它们是语言功能(或缺少),高度优化的编译器或其他东西的产品吗?我不是想推广Go; 我只是好奇.
java ×2
performance ×2
abi ×1
api ×1
assembly ×1
benchmarking ×1
binary ×1
c++ ×1
c++-faq ×1
clang ×1
cocoa-touch ×1
compilation ×1
gcc ×1
go ×1
interface ×1
interpreter ×1
javascript ×1
jit ×1
linker ×1
objective-c ×1
optimization ×1
python ×1
typescript ×1
web ×1
xcode ×1