标签: language-implementation

如何用同一种语言实现一种语言比语言更快?

例如,如果我用Java创建JVM,是否有可能使我实现的实现比我用于构建此实现的原始实现更快,即使我的实现是基于原始实现构建的,甚至可能依赖于在那个实现?

(令人困惑......)

看看PyPy.它是用Python制作的Python的JIT编译器.这没关系,但是它如何声称比它正在使用并依赖于Python的原始实现更快

python performance jvm pypy language-implementation

5
推荐指数
2
解决办法
352
查看次数

C#中的C指针

这是C#中的函数声明:

void foo(string mystring)
Run Code Online (Sandbox Code Playgroud)

与C中的这个相同:

void foo(char *)
Run Code Online (Sandbox Code Playgroud)

即在C#中,被调用函数是否在幕后接收指针?

c c# string pointers language-implementation

4
推荐指数
3
解决办法
3700
查看次数

@private是如何实现的?

在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)

但我真的不知道.谁知道这是怎么做到的?

code-generation private language-implementation objective-c

4
推荐指数
1
解决办法
125
查看次数

Matlab:如何实现动态矢量

我正在引用一个这样的例子我有一个函数来分析向量的元素'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)

问题是,如果我之前没有"声明"'输出',我会收到错误.我不喜欢在输出到输出之前"声明"'输出',因为它存储了我不感兴趣的输入值,我应该想办法删除我存储它的所有值与我有关.有没有人对这个问题有所启发?谢谢.

matlab language-implementation vector dynamic

4
推荐指数
1
解决办法
1万
查看次数

在Lisp和其他函数式语言中,为什么长度不是O(1)

Lisp中的列表原语的opperator长度定义如下:

(define (length lst)
  (if (null? lst) 0 (+ 1 (length (cdr lst)))))
Run Code Online (Sandbox Code Playgroud)

为什么一些Lisp的实现者不能使长度成为在恒定时间内计算的原语?

谢谢

lisp language-implementation

4
推荐指数
2
解决办法
404
查看次数

haskell实施问题

Haskell是一门非常棒的语言.我喜欢它.但作为一名C++程序员并且具有一些关于计算机体系结构的基本知识,我真的想知道有关Haskell的实现细节.

我的意思是,例如,map功能.我知道语法,结果.但是,我想知道这个函数在RAM中是如何工作的.因为C族语言非常清楚语法和计算机行为之间的映射.

那么有没有人对功能程序语法背后的计算机行为有所了解?或者关于这个的任何书籍都像"在C++对象模型中"?

haskell behavior language-implementation

4
推荐指数
1
解决办法
212
查看次数

虚拟函数和虚函数表如何工作?

虽然 C++ 标准将虚拟调度的实现留给了编译器,但目前只有 3 个主要编译器(gcc、clang 和 msvc)。

当您通过指向抽象基类的指针调用抽象基类上的方法时,它们如何实现虚拟调度?构建期间如何设置 vtable?

一个简单的“好像”示例会很有用。

c++ polymorphism language-implementation vtable dynamic-dispatch

4
推荐指数
1
解决办法
266
查看次数

C/C++控制结构限制?

我听说过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)

c c++ language-implementation

3
推荐指数
2
解决办法
5303
查看次数

为什么 Racket 实现比 MIT Scheme 快这么多?

下面的代码使用欧几里得算法计算 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

3
推荐指数
1
解决办法
569
查看次数

Ada 83 例外情况是否包括资源清理?

Ada 83 是最早有例外的语言之一。(我想说“第一个”,但我从研究技术史中学到的一件事是,几乎总是有一个更早的X。)

从实现的角度来看,实现异常最复杂的部分是它们与资源清理的交互(C++中的析构函数,Java中的try-finally等);当引发异常时,需要在退出每个动态嵌套范围时运行资源清理代码。

Ada 83 是否具有通过异常以这种方式调用的任何资源清理功能?或者实现可以直接执行 longjmp 吗?

destructor language-implementation exception ada try-finally

3
推荐指数
1
解决办法
126
查看次数