为什么我们需要编译4GL进度程序?

时间:2018-12-31 14:24:22

标签: openedge progress-4gl

我想知道为什么我们需要编译4GL进度程序?真的在那里后面发生了什么?为什么我们在编译程序后得到.r文件?当我们检查语法是否正确时,我们将得到一个消息框``语法正确'',它如何查找错误并显示消息。欢迎任何解释。

2 个答案:

答案 0 :(得分:5)

已编译的r代码的优点包括:

  1. 语法检查
  2. 执行速度更快(r代码执行速度更快)
  3. 安全性(r代码不是“人类可读的”,并且可能会对其进行篡改)
  4. 许可(r代码运行时许可便宜得多)

对于“如何查找错误并显示消息”-总体而言,它就像任何编译器一样。它根据语法树评估提供的源,并在您违反规则时通知您。编译器的设计和构建是一个相当高级的主题,可能不会适合一个简单的SO问题-但是,如果您有更具体的内容可以作为一个问题独立存在,那么有人可能可以提供帮助。

答案 1 :(得分:3)

简而言之,就是在编译时,您正在将程序翻译成机器可以理解的语言。您在这里问两个不同的问题,所以让我对第一个给出一个简单的答案:例如,如果您是唯一使用该程序的人,则不需要编译。但是为了优化您的程序(由于它已经处于机器语言级别)并确保没有人弄乱您的逻辑,我们会编译代码,并且通常不允许常规用户访问源代码。

第二个问题,语法检查器如何工作,我相信这对您来说对Google更好,并选择一些文章来阅读有关编译器的信息。它们很复杂,但是简而言之,它们要做的就是将Progress期望的内容作为完整的可操作命令,并与您所做的进行比较。例如,如果您进行

services.AddDbContext<ModelContext>(builder =>
{
    builder.ReplaceService<ILazyLoader, MyLazyLoader>();
    // ...
});

Progress将检查customer是否是一个表,customer.active是该表中的字段,是否为逻辑类型,因为您正在过滤,如果是,则进行过滤,并且可以将整个条件转换为一个true或错误的布尔值。它将继续检查您是否指定了锁(如果没有,则默认为共享,例如在我的示例中,这是一个不行,顺便说一句),如果有多个记录会发生什么情况(因为我先说过) ,然后只获取第一个),最后,如果失败了该怎么办。如果您检查find语句,则有更多选项可以对其进行自定义,并且编译器会简单地将您对该语句的使用与Progress可以提供的功能进行比较。并收集所有错误(如果不能)。这就是为什么有时编译器会向您提供通用消息的原因。由于他们不知道您要做什么,所以他们所能做的就是告诉您您编写的内容基本上有什么毛病。

希望这可以帮助您理解。