14得票2回答
编译语言中垃圾回收的实现

当实现精确垃圾回收时,总是需要解决如何确定堆栈上的哪些单词是指针,哪些是其他类型的数据,例如整数或浮点数的问题。解释性语言通常通过将所有内容都设为指针来解决这个问题;而对于一些语言(例如Lisp),编译器则通常使用标记位来区分指针和整数。但对于支持完全未装箱机器字长整数和浮点数的Java和C#...

14得票1回答
为什么`vector`的实现有多种情况?

这是Clojure对vector的定义:(defn vector "Creates a new vector containing the args." {:added "1.0" :static true} ([] []) ([a] [a]) ([a b] [a b...

14得票2回答
理解memcpy()的实现方式

我在查看memcpy.c的实现时,发现了一段不同的memcpy代码。我不理解为什么要执行 (((ADDRESS) s) | ((ADDRESS) d) | c) & (sizeof(UINT) - 1)。#if !defined(__MACHDEP_MEMFUNC) #ifdef _...

13得票4回答
有没有一个能够并行化的Scheme实现?

是否有支持R5RS或更高版本的Scheme实现可以进行并行化?例如,如果我让它执行:(map (lambda (x) (pure-functional-stuff x)) '(1 3 5 7 11 13)) 如果机器可以处理,它会同时处理1、3、5和7吗?这应该是函...

12得票5回答
为共享数组子范围设计的智能垃圾收集器?

在这个关于为什么C#中子字符串需要O(n)时间复杂度的流行问题中,一个主要提供的答案认为,如果分配了一个大数组并且通过让新字符串只引用小数组片段来计算子字符串,则即使原始字符串不再被引用,垃圾收集器也无法回收包含较大字符串的字符数组。 这似乎是一个完全有效的答案,但从理论上讲,似乎可以构建一...

11得票4回答
Haskell:为什么模式匹配中不允许使用++?

假设我们想在Haskell中编写自己的sum函数:sum' :: (Num a) => [a] -> a sum' [] = 0 sum' (x:xs) = x + sum' xs 为什么我们不能做这样的事情:sum' :: (Num a) => [a] -> a su...

11得票2回答
将函数式编程语言编译成C语言

假设您正在将一种函数式语言编译成可移植的C代码,并且出于各种原因,您希望进行精确而不是保守的垃圾收集。在C堆栈上,垃圾收集器无法找出什么是指针。我认为有两种解决这个问题的方法: 阴影栈。使每个C函数维护关于什么是指针的簿记信息。例如LLVM建议采用这种方法。 利用编译函数式语言的特点,意味...

11得票6回答
一个启用宏的语言如何跟踪源代码以进行调试?

这是一个关于宏(我认为是)更为理论的问题。我知道宏接受源代码并生成对象代码而不对其进行评估,使程序员能够创建更多样化的语法结构。如果我必须对这两个宏系统进行分类,我会说有“C风格”的宏和“Lisp风格”的宏。 由于运行时实际运行的代码不同于源代码,因此调试宏可能有些棘手。 调试器如何跟踪以...

10得票1回答
JavaScript 内部方法实现的源代码

有没有一种方法可以查看JavaScript方法背后的代码?不是来自网站的.html或.js文件中的JavaScript方法,而是JavaScript内部的方法。 例如: 我如何查看JavaScript计算元素offsetTop的方式?

10得票5回答
如何实现一个实用的纤程调度器?

我只知道关于使用协程作为基础并实现玩具调度程序的基本知识。但我认为这是一种过于简化的异步调度程序整体视图。在我的想法中,有许多问题没有得到解决。 如何防止CPU运行空闲/等待的调度器?有些纤维只是休眠,而其他纤维则等待来自操作系统的输入。