函数调用通过堆栈数据结构处理.这足以支持递归吗?
compiler-construction recursion stack language-design language-implementation
与问题几乎相同的本地,全局,静态,自动,寄存器,外部,常量,易失性变量存储在哪里?,不同之处在于该线程询问 Python 语言如何实现这一点。
希望这不是重复.
在此之前,我知道ArrayList不是最好的选择,但这只是好奇心.
简单地说,我想知道ArrayList的实现.我查看并想通了它使用数组存储.
对于数组,当你有:
int [] arr;
Run Code Online (Sandbox Code Playgroud)
arr指向数组的第一个元素,因为它被输入为整数,编译器知道跳转的位置:
arr[2] => arr value + 2 * typeof(int) = address of arr[2]
Run Code Online (Sandbox Code Playgroud)
现在,由于ArrayList是无类型的,我想知道编译器如何能够找出下一个项目的位置.我猜想有一个开销告诉数据是什么,以便编译器可以执行指针算术.
因此,ArrayList应该比任何其他类型的集合慢,因为它不能只是跳转到数据,因为它需要知道之前的内容.这与LinkedList非常相似.
我正在努力学习命令式和函数式语言之间的差异.
而且,我想了解闭包以及如何实现垃圾收集器.所以我决定尝试为函数式语言实现解释器.
由于我不熟悉函数式语言,因此我很难设计它.是否有一些关于简单函数语言的语法和语义的资源?有关如何执行此操作的教程将非常有用.
functional-programming language-design language-implementation
假设我已经实现了一种编程语言(我们现在将其称为A )。A与C非常相似。
我希望我的用户能够访问现有 C 库中的函数和数据结构。这可能吗?如果是的话,一个幼稚的实现会是什么样子?
A
是否有一种简单的方法,比如一个命令,可以让我找到我正在使用的Python实现(CPython,JPython等)?
我知道它将(begin expr1 expr2 ...)评估所有表达式并返回最后评估的表达式。
我发现在 Chez Scheme 中允许使用begin不带表达式的形式,如下所示:(begin)。我正在使用 Chez Scheme 作为我学习的一部分。当我在控制台中写入时,(begin)它不会发送语法错误,它只是显示任何内容,就好像我收到了void.
我的问题是,那么会返回什么?
我以为这是你可以通过运行获得的 void 对象(void)。然而,当我测试它时,我意识到事实并非如此。
我正在学习 Chez Scheme 作为我正在学习的编译器课程的一部分,我需要实现可以处理特殊单词 的编译器的一部分begin。所以我需要知道为什么这是可能的以及这个函数返回什么。
编辑:
我正在添加有关此主题的链接。我无法完全理解答案。另外,他没有提到返回类型。
compiler-construction scheme language-implementation expression-evaluation chez-scheme
我目前正在更详细地了解 C++ 标准库,我想知道它的实现是如何std::is_union工作的。在 libcxx (LLVM) 中,除了直接使用可能内置的 之外__is_union,它还定义为
template <class _Tp> struct __libcpp_union : public false_type {};
template <class _Tp> struct _LIBCPP_TEMPLATE_VIS is_union
: public __libcpp_union<typename remove_cv<_Tp>::type> {};
Run Code Online (Sandbox Code Playgroud)
同样,STLPort 虽然很老,但它的实现更加简约:
template <class T>
struct is_union
{ };
Run Code Online (Sandbox Code Playgroud)
这似乎总是解析为std::false_type一个空结构,或者更糟糕的是,一个空结构,但事实并非如此;这是如何实现的?在另一个问题中,一个答案指出,如果is_union没有编译器钩子就无法实现,但这是否意味着 libcxx、STLPort 以及可能所有主要实现都不能移植到任何不能自动使其工作的编译器?
在下面的代码中,为什么地图大小始终为 1,它没有保存root->val地图中以前的值,正如我在标准输出中看到的那样。我期望它应该记住地图中放入的所有值。
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class FindElements {
public:
unordered_map<int,int>mp;
FindElements(TreeNode* root) {
if(!root) return;
if(root->val==-1){
root->val=0;
}
mp[root->val]=1;
// output
cout<<root->val<<" "<<mp[root->val]<<" "<<mp.size()<<endl;
if(root->left){
root->left->val=2*(root->val)+1;
FindElements(root->left);
}
if(root->right){
root->right->val=2*(root->val)+2; …Run Code Online (Sandbox Code Playgroud) 用C语言编写代码时,使用-1和EOF交替使用是否很好?标准保证EOF是这样的-1吗?或者是定义了价值实施?
例如,如果函数EOF在某些情况下返回,那么测试函数是否返回是否是一种好的样式-1?
如果函数-1在某些情况下返回,那么测试函数是否返回是否是好的样式EOF?