Lambda 表达式和 DEP 一起工作吗?
Do Lambda Expressions and DEP work together?
我正在尝试了解动态分配的代码如何 运行 与 dep.
我们以编译好的Scheme程序为例。
据我了解,
当需要评估 lambda 表达式时,运行 时间必须分配内存以存储代码(实际上存储一个也有代码的闭包)。
由于它无法事先知道代码的大小,因此它必须是动态的。因此,它必须为此使用堆。
为什么从堆中执行这段代码时,DEP机制没有运行次异常?
更一般地说,当 DEP 出现时,整个 "Code is data and data is code" 想法如何运作?
不,返回 lambda 不需要内存用于代码,仅用于 data/arguments。考虑闭包在 OOP 中是普通对象,并且创建在 Java 中作为 "new" 工作,c#...
Lambda 表达式,或者更一般地说,"functions that are generated and returned by other functions",看似需要动态代码生成,但实际上它们不需要:相反,此类函数通常由称为 函数闭包的数据结构表示.
一个函数闭包是一对
- 一个指向一个(静态编译)函数的指针,并且
- 其自由变量的值,即在函数外部定义的变量。
例如,考虑以下类似 JavaScript 的代码:
function make_adder(x) {
function adder(y) {
return x + y;
}
return adder;
// equivalent to "return function(y) { return x + y; };"
}
var add42 = make_adder(42);
add42(3); // 45
当使用参数 42
调用 make_adder
时,它的实现 returns 闭包 <adder, 42>
是 对 (指向)函数 adder
和 整数 42
。当此闭包应用于 3
时,除了可见参数 3
.[=24= 之外,函数部分还应用于其自由变量 x
的值 42
]
概念上,你可以认为上面的代码是这样实现的:
function make_adder(x) {
function adder(x, y) {
return x + y;
}
return { func : adder, free : x };
}
var add42 = make_adder(42);
add42.func(add42.free, 3); // 45
在Scheme中,第一个代码是
(define (make_adder x)
(lambda (y) (+ x y)))
(define add42 (make_adder 42))
(add42 3) ; 45
第二个是:
(define (make_adder x)
(define (adder x y)
(+ x y))
(cons adder x))
(define add42 (make_adder 42))
((car add42) (cdr add42) 3) ; 45
更多详情,请参阅:https://en.wikipedia.org/wiki/Closure_(computer_programming)
我正在尝试了解动态分配的代码如何 运行 与 dep.
我们以编译好的Scheme程序为例。 据我了解, 当需要评估 lambda 表达式时,运行 时间必须分配内存以存储代码(实际上存储一个也有代码的闭包)。 由于它无法事先知道代码的大小,因此它必须是动态的。因此,它必须为此使用堆。
为什么从堆中执行这段代码时,DEP机制没有运行次异常?
更一般地说,当 DEP 出现时,整个 "Code is data and data is code" 想法如何运作?
不,返回 lambda 不需要内存用于代码,仅用于 data/arguments。考虑闭包在 OOP 中是普通对象,并且创建在 Java 中作为 "new" 工作,c#...
Lambda 表达式,或者更一般地说,"functions that are generated and returned by other functions",看似需要动态代码生成,但实际上它们不需要:相反,此类函数通常由称为 函数闭包的数据结构表示.
一个函数闭包是一对
- 一个指向一个(静态编译)函数的指针,并且
- 其自由变量的值,即在函数外部定义的变量。
例如,考虑以下类似 JavaScript 的代码:
function make_adder(x) {
function adder(y) {
return x + y;
}
return adder;
// equivalent to "return function(y) { return x + y; };"
}
var add42 = make_adder(42);
add42(3); // 45
当使用参数 42
调用 make_adder
时,它的实现 returns 闭包 <adder, 42>
是 对 (指向)函数 adder
和 整数 42
。当此闭包应用于 3
时,除了可见参数 3
.[=24= 之外,函数部分还应用于其自由变量 x
的值 42
]
概念上,你可以认为上面的代码是这样实现的:
function make_adder(x) {
function adder(x, y) {
return x + y;
}
return { func : adder, free : x };
}
var add42 = make_adder(42);
add42.func(add42.free, 3); // 45
在Scheme中,第一个代码是
(define (make_adder x)
(lambda (y) (+ x y)))
(define add42 (make_adder 42))
(add42 3) ; 45
第二个是:
(define (make_adder x)
(define (adder x y)
(+ x y))
(cons adder x))
(define add42 (make_adder 42))
((car add42) (cdr add42) 3) ; 45
更多详情,请参阅:https://en.wikipedia.org/wiki/Closure_(computer_programming)