小编Kel*_*nch的帖子

编译器有什么简单的解释吗?

在尝试为关于" C++编译的应用程序 " 的帖子提供一个简单的答案时,我很惊讶没有关于这个基本主题的任何问题或答案.甚至对Meta的搜索都没有找到任何帮助,无论是解释编译器还是开始编译器问题.

我们希望Stackoverflow成为查找编程答案的好地方.我们不应该为维基百科留下如此重要的东西.一个简单的比喻就是向一位木匠大师询问一个10便士的钉子是什么并且被刷掉了.当然这是一个简单的问题,但是一个木匠认为解释一些如此简单的东西在他/她之下只是在最好的情况下,礼貌地,或者如果不是这样的混蛋.

至少,这个问题提供了一个收集Stackoverflow内部或外部与编译器相关的解释的链接的地方.

[Id制作此CW,但没有看到复选框,是否已移动或删除?]

本着这种精神,我提供了维基百科关于编译器的链接.请编辑此帖子,其中包含指向编译器说明的更多链接.

维基百科关于编译器的条目.

compiler-construction terminology

2
推荐指数
1
解决办法
1479
查看次数

语法分析问题

在学校,我们被分配设计一种语言,然后实施它,(我实现它很有趣=)).我的老师告诉我们使用yacc/lex,但我决定使用java + regex API,这就是我设计的语言的样子:

Program "my program"
var yourName = read()
if { equals("guy1" to yourName) }
  print("hello my friend")
else
 print("hello extranger")
end
Program End
Run Code Online (Sandbox Code Playgroud)

好吧,正如你所看到的,它是一种非常基本的语言=).

我以为我可以以一种非常OOP的方式实现它,比如创建一个抽象类Sentence然后有子类等VariableAssignment,IfSentence并且有一个Program只有一堆句子的类吧?然后eval在所有Sentences 上调用一个抽象方法,所以我最初编译语言的方法只包括两个阶段:

  1. 确定seach行的语法
  2. 为每一行创建对应类

当然,如果在任何阶段出现问题,Ii都可能引发错误.

我的问题是,我做错了吗?我应该像理论一样(词汇,句法,语义)来讨论所有阶段吗?我应该继续使用我天真的两阶段编译器吗?

java code-analysis compiler-theory

1
推荐指数
2
解决办法
1536
查看次数

这两种方法是否与Java中最小的Double值相当?

替代措辞:何时将Double.MIN_VALUE添加到Java中的double 不会导致不同的Double值?(见Jon Skeet的评论如下)

关于Java中最小Double值的这个问题有一些答案在我看来是等价的. Jon Skeet回答无疑是有效的,但他的解释并没有让我相信它与理查德的 答案有什么不同.

Jon的回答使用以下内容:

double d = // your existing value;
long bits = Double.doubleToLongBits(d);
bits++;
d = Double.longBitsToDouble();
Run Code Online (Sandbox Code Playgroud)

理查兹回答提到了JavaDoc Double.MIN_VALUE

保持double类型的最小正非零值的常量,2-1074.它等于十六进制浮点字面值0x0.0000000000001P-1022并且也等于Double.longBitsToDouble(0x1L).

我的问题是,Double.logBitsToDouble(0x1L)与Jon的不同之处bits++;有何不同?

Jon的评论侧重于基本的浮点问题.

将Double.MIN_VALUE添加到double值和增加表示double的位模式之间存在差异.由于存储浮点数的方式,它们是完全不同的操作.如果您尝试将一个非常小的数字添加到一个非常大的数字,差异可能很小,以至于最接近的结果与原始数字相同.但是,在当前位模式中添加1将始终将相应的浮点值更改为在该比例下可见的最小可能值.

我没有看到Jon添加Double.MIN_VALUE增加长"bit ++"的方法有什么不同.他们何时会产生不同的结果?

我编写了以下代码来测试差异.也许有人可以提供更多/更好的样本双数或使用循环来找到存在差异的数字.

    double d = 3.14159269123456789; // sample double
    long bits = Double.doubleToLongBits(d);
    long bitsBefore = bits;
    bits++;
    long bitsAfter = bits;
    long bitsDiff = bitsAfter - bitsBefore;
    long bitsMinValue = Double.doubleToLongBits(Double.MIN_VALUE);
    long bitsSmallValue = …
Run Code Online (Sandbox Code Playgroud)

java floating-point

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

我可以在 IF 语句中将比较链接在一起吗?

我目前正在为大学制定一个零和交叉的计划。我已经完成了这项任务的基本内容,但是我在创建获胜条件来结束游戏时遇到了一些麻烦。以下是我迄今为止使用过的所有代码:

#include <iostream>
#include <string>

using namespace std;

class Player
{
private:
    char NorX;

public:

    char Choose(char InitialValue)
    {
        NorX = InitialValue;
        return InitialValue;
    }

    char GetNorX()
    {
        return NorX;
    }
};

int main()
{
    Player Player1;
    Player Player2;

    Player1.Choose('O');
    Player2.Choose('X'); 

    cout << "The board is being drawn please wait..." << endl;

    const int Rows = 4;
    const int Columns = 4;
    char Board[Rows][Columns] = { {' ', ' ', ' ', ' ' },
                                  {' ', '_', '_', '_' …
Run Code Online (Sandbox Code Playgroud)

c++ syntax

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