问题标签 [runtime-environment]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
74 浏览

c - C 编译器使用的数据布局(对齐概念)

以下是红龙书的节选。

例 7.3。图 7.9 是 C 编译器对我们称为Machine 1和的两台机器使用的数据布局的简化图Machine 2

Machine 1: 的内存Machine 1被组织成字节,每个字节由 8 位组成。即使每个字节都有一个地址,指令集也倾向于将short整数定位在地址为偶数的字节上,而将整数定位在可被4. 编译器将短整数放置在偶数地址,即使它必须在进程中跳过一个字节作为填充。因此,由32位组成的四个字节可以分配给后跟一个短整数的字符。

Machine 2每个字由64位组成,字24的地址允许位。64单词中的各个位存在可能性,因此6需要额外的位来区分它们。按照设计,指向字符的指针Machine 2占用30位 —24查找单词以及6字符在单词中的位置。指令集的强字定向Machine 2导致编译器一次分配一个完整的字,即使更少的位足以表示该类型的所有可能值;例如,只8需要位来表示一个字符。因此,在对齐下,图 7.9 显示64每种类型的位。在每个字中,每种基本类型的位都在指定的位置。由位组成的两个字128将分配给后跟一个短整数的字符,字符仅使用8第一个字中的位,而短整数仅使用24第二个字中的位。□</p>

图

我在这里这里这里发现了对齐的概念。我可以从中了解到如下: 在字可寻址 CPU(大小超过一个字节)中,在数据对象中引入了某些填充,以便 CPU 可以以最少的数量有效地从内存中检索数据。的记忆周期。

现在Machine 1这里实际上是一个字节地址一。并且规范中的条件可能比具有说字节Machine 1字长的简单字可寻址机器更困难。4在这样的64位机中,我们需要确保我们的数据项只是字对齐,没有更多的困难。但是如何在像Machine 1(如上表中给出的)这样的系统中找到对齐,其中字对齐的简单概念不起作用,因为它是字节可寻址的并且具有更困难的规范。

此外,我发现在行中double类型的大小比对齐字段中给出的要多,这很奇怪。不应该alignment(in bits) ≥ size (in bits)吗?因为对齐是指实际为数据对象分配的内存(?)。

“每个字由64位组成,字的地址允许位。字中的各个位24有可能,因此需要额外的位来区分它们。根据设计,指向字符的指针占用位——找到单词和单词中字符的位置。” 646Machine 230246- 此外,这个关于指针概念的陈述应该如何可视化,基于对齐(2^6 = 64,很好,但是这 6 位与对齐概念有什么关系)

0 投票
1 回答
98 浏览

arrays - 了解处理可变长度数据,特别关注 C(99) 中的可变长度数组

以下是红龙书的节选。它处理过程激活记录中可变长度数据项的处理。

Pascal在语言中几乎是独一无二的,它要求过程本地的数组具有可以在编译时确定的长度。更常见的是,本地数组的大小可能取决于传递给过程的参数值。在这种情况下,在调用过程之前,无法确定过程本地的所有数据的大小。

图 7.15 建议了处理可变长度数据的常用策略,其中过程p具有三个局部数组。这些数组的存储不是 ; 的激活记录的一部分p。只有一个指向每个数组开头的指针出现在激活记录中。这些指针的相对地址在编译时是已知的,因此目标代码可以通过指针访问数组元素。

数字

图 7.15 还显示了一个q由 调用的过程p。的激活记录q在 的数组之后开始p,而可变长度的数组在此之后q开始。

在上面摘录的第一部分中,文本讨论了Pascal编程语言的特性,然后他们讨论了相同的可能实现。现在我不熟悉Pascal并想了解这种情况的处理方式C

我知道可以C使用malloc及其姊妹函数动态创建数组,这会导致在堆上分配内存,并将指向第一个字节的指针返回给我们。根本不是问题。

如果我们创建数组,C其中数组的大小是一个常量,如下所示:

然后将该数组放置在local data如下所示的激活记录部分中:

激活记录

在上面的例子中,数组的大小a在编译时就知道了。没有问题。

现在的情况:“更多时候,本地数组的大小可能取决于传递给过程的参数值。在这种情况下,直到调用过程才能确定过程本地的所有数据的大小。 "

情况1:

现在让我们考虑下面的代码:

现在在上面的情况下,参数的大小n可以function在编译时知道,因此数组的大小a虽然变量可以在编译时知道。有了这个逻辑C,上面的数组是不是按照龙书a里的方式分配?fig 7.15

案例二:

现在在上面的情况下,参数的大小n只能function在运行时知道(?)还是仍然是上面的情况,即在编译时知道?现在在这段代码中,数组a分配在哪里。堆还是栈?

我去了这里这里这里,但没有找到我正在寻找的解释......


这里我说的是C99

0 投票
0 回答
143 浏览

java - 违反 Java 运行时(Java 运行时环境检测到致命错误)

我目前正在尝试打开一个串行端口以将一些数据发送到芯片,但是我收到错误致命错误已被 java 运行时环境检测到。这是控制台日志。

导致错误的功能应该为后端/板通信打开一个端口。这是功能

任何有关如何解决此问题的想法将不胜感激!

ps 这是我的第一篇文章,所以如果你有时间,也将不胜感激对帖子格式的反馈

谢谢马布尔

0 投票
0 回答
15 浏览

compiler-construction - 使用访问链接的“显示”的简单安排

我下面的疑惑是根据红龙书。

使用d指向激活记录的指针数组(称为display. 我们维护显示,以便a嵌套深度的非本地存储在idisplay element 指向的激活记录中d[i]

假设控制p在嵌套深度处激活过程j。然后,j - 1显示的第一个元素指向在词汇上包含 procedure 的过程的最近激活p,并d[j]指向 的激活p使用显示通常比跟随访问链接更快,因为保存非本地的激活记录是通过访问 d 的元素然后仅跟随一个指针来找到的。

除了显示之外,维护显示的简单安排还使用访问链接。作为调用和返回序列的一部分,显示通过访问链接链更新。n跟随到嵌套深度的激活记录的链接时,显示元素d[n]被设置为指向该激活记录。实际上,显示复制了访问链接链中的信息。

上面开头的摘录(第一段和第二段的开头)说明了 adisplay是什么以及如何初始化它。

在第二段的末尾,摘录说使用displays 优于使用access-links。但话又说回来了一个实现,它使用access-links 来维护display值。我不太明白为什么。我们不是没有破坏我们本来可以通过使用access-links来获得的好处维护displays。此外,他们所说的关于这种维护的方法对我来说不是很清楚。(我的意思是步骤。)

然而,在本文后面,他们提出了一种维护displays 的简单方法:

当为嵌套深度的过程i设置新的激活记录时,我们:

  1. 将 的值保存d[i]在新的激活记录中,然后
  2. 设置d[i]为指向新的激活记录。

就在激活结束之前,d[i]将重置为保存的值。

我很困惑。请帮我。

0 投票
0 回答
80 浏览

java - 在 Java 中为非模块化和模块化项目在运行时添加本机库的路径

我有两个项目使用来自 AdoptOpenJDK 的 Java 11 和 ant 用于构建目的。除了命名之外,两者都使用相同的代码库。

第一个是非模块化项目,代码在未命名的模块中。这个运行没有异常并按预期添加库。

这是主类的代码:

第二个是模块化项目,其代码位于命名模块中。这个抛出一个异常。添加库失败。

这是模块信息的代码:

这是主类的代码:

stackoverflow 上的这两个其他很棒的帖子导致了这种方法。
在 Java 运行时为本地库添加新路径
如何使用 java 13+ 动态设置 java.library.path?

这篇文章也有很大帮助。
http://fahdshariff.blogspot.de/2011/08/changeing-java-library-path-at-runtime.html

在模块化项目中,调用 baseModule.addOpens("java.lang", namedModule) 会引发 IllegalCallerException,而在非模块化项目中,一切正常。

这是异常堆栈跟踪:

模块化项目有什么问题?

0 投票
1 回答
59 浏览

c - Autosar 经典架构中 SWC 中实现的任务

我正在使用 autosar 4.3 进行项目。我指的是项目的旧版本,我可以在 SW_C 中找到它创建了一个任务并在其上使用一些操作系统原语!

在 autosar SW 应用程序组件中是否安全或允许在此级别定义 /configure 任务?任务不应该在 RTE 级别定义吗?例子:

感谢您的解释

0 投票
3 回答
125 浏览

javascript - 运行时环境和编译器/解释器是否相同?

我刚刚开始使用 Node.js,并且我在 Python 和 C++ 方面有相当多的背景知识。我知道 Node.js 是一个运行时环境,但我很难理解它对代码的实际作用,使其不同于编译器。如果有人能解释运行时环境与典型编译器和解释器的具体区别,那就更好了。