例如,如果我用Java创建JVM,是否有可能使我实现的实现比我用于构建此实现的原始实现更快,即使我的实现是基于原始实现构建的,甚至可能依赖于在那个实现?
(令人困惑......)
看看PyPy.它是用Python制作的Python的JIT编译器.这没关系,但是它如何声称比它正在使用并依赖于Python的原始实现更快?
这是C#中的函数声明:
void foo(string mystring)
Run Code Online (Sandbox Code Playgroud)
与C中的这个相同:
void foo(char *)
Run Code Online (Sandbox Code Playgroud)
即在C#中,被调用函数是否在幕后接收指针?
在Objective-C,我很好奇如何实例变量,如访问控制@private,@protected等来实现.
我曾经考虑过以某种方式生成单独的结构:
@interface Foo {
int bar;
@private
int baz;
@public
int qux;
}
Run Code Online (Sandbox Code Playgroud)
=> 一些东西
struct Class_Foo_Protected {
int bar;
};
struct Class_Foo_Private {
int baz;
};
struct Class_Foo_Public {
int qux;
};
Run Code Online (Sandbox Code Playgroud)
但我真的不知道.谁知道这是怎么做到的?
我正在引用一个这样的例子我有一个函数来分析向量的元素'input'.如果这些元素具有特殊属性,我将它们的值存储在矢量'output'中.问题是,在乞讨时我不知道它需要存储在'输出'中的元素数量,所以我不知道它的大小.我有一个循环,在里面我绕着向量,通过索引"输入".当我考虑特殊时,这个向量的一些元素捕获'input'的值,并通过如下句子存储在向量'ouput'中:
For i=1:N %Where N denotes the number of elements of 'input'
...
output(j) = input(i);
...
end
Run Code Online (Sandbox Code Playgroud)
问题是,如果我之前没有"声明"'输出',我会收到错误.我不喜欢在输出到输出之前"声明"'输出',因为它存储了我不感兴趣的输入值,我应该想办法删除我存储它的所有值与我有关.有没有人对这个问题有所启发?谢谢.
Lisp中的列表原语的opperator长度定义如下:
(define (length lst)
(if (null? lst) 0 (+ 1 (length (cdr lst)))))
Run Code Online (Sandbox Code Playgroud)
为什么一些Lisp的实现者不能使长度成为在恒定时间内计算的原语?
谢谢
Haskell是一门非常棒的语言.我喜欢它.但作为一名C++程序员并且具有一些关于计算机体系结构的基本知识,我真的想知道有关Haskell的实现细节.
我的意思是,例如,map功能.我知道语法,结果.但是,我想知道这个函数在RAM中是如何工作的.因为C族语言非常清楚语法和计算机行为之间的映射.
那么有没有人对功能程序语法背后的计算机行为有所了解?或者关于这个的任何书籍都像"在C++对象模型中"?
虽然 C++ 标准将虚拟调度的实现留给了编译器,但目前只有 3 个主要编译器(gcc、clang 和 msvc)。
当您通过指向抽象基类的指针调用抽象基类上的方法时,它们如何实现虚拟调度?构建期间如何设置 vtable?
一个简单的“好像”示例会很有用。
c++ polymorphism language-implementation vtable dynamic-dispatch
我听说过VC++中的限制(不确定哪个版本)嵌套if语句的数量(在300的大概中).代码的形式如下:
if (a) ...
else if (b) ...
else if (c) ...
...
Run Code Online (Sandbox Code Playgroud)
我很惊讶地发现这种事情是有限制的,并且限制是如此之小.我不是在寻找关于编码实践的评论以及为什么要完全避免这种事情.
以下是我认为可能有一些限制的事项列表:
还有哪些其他控制结构/语言功能有这样的限制?语言标准是否说明了这些限制(可能是实现的最低要求)?有没有人遇到特定编译器/实现的特定语言限制?
编辑:请注意,上述形式的if陈述确实是"嵌套的".它相当于:
if (a) { //...
}
else {
if (b) { //...
}
else {
if (c) { //...
}
else { //...
}
}
}
Run Code Online (Sandbox Code Playgroud) 下面的代码使用欧几里得算法计算 gcd(a,b) 和整数 s, t 使得 sa+tb=gcd(a,b)(对于离散数学课程)。我用 C 编写了它,也许这会清楚地说明算法。
gcd.c :
#include <stdio.h>
int gcd_st(int m, int n, int *s, int *t) {
int a, b, res, tmp;
a = m>n?m:n;
b = m>n?n:m;
if(!b) {
*s = 1;
*t = 0;
return a;
}
res = gcd_st(b, a%b, s, t);
tmp = *t;
*t = *s - *t*(a/b);
*s = tmp;
return res;
}
int main() {
int st[2];
for(int i=0; i<100000000; i++)
gcd_st(42, 56, st, st+1);
for(int i=0; …Run Code Online (Sandbox Code Playgroud) performance scheme language-implementation racket mit-scheme
Ada 83 是最早有例外的语言之一。(我想说“第一个”,但我从研究技术史中学到的一件事是,几乎总是有一个更早的X。)
从实现的角度来看,实现异常最复杂的部分是它们与资源清理的交互(C++中的析构函数,Java中的try-finally等);当引发异常时,需要在退出每个动态嵌套范围时运行资源清理代码。
Ada 83 是否具有通过异常以这种方式调用的任何资源清理功能?或者实现可以直接执行 longjmp 吗?
destructor language-implementation exception ada try-finally
c ×2
c++ ×2
performance ×2
ada ×1
behavior ×1
c# ×1
destructor ×1
dynamic ×1
exception ×1
haskell ×1
jvm ×1
lisp ×1
matlab ×1
mit-scheme ×1
objective-c ×1
pointers ×1
polymorphism ×1
private ×1
pypy ×1
python ×1
racket ×1
scheme ×1
string ×1
try-finally ×1
vector ×1
vtable ×1