标签: programming-languages

编程语言理念:避免vtable查找

我一直在想一个编程语言的想法:它本质上是C++和类似Java的语法,用于系统编程(或者实际上任何需要高性能的编程),但在我看来,比C++更令人愉快的语法.我在考虑如何处理分层类结构中的虚方法(我的语言不包括多重继承),以及避免vtable查找的方法.我的问题是双重的:

  1. 根据我的理解,vtable查找是如此受性能影响的原因(至少在游戏开发等时间关键场景中)是因为它需要引用对象vtable指针,而这个vtable通常是缓存未命中.这是正确的,还是我错过了部分问题?
  2. 我对部分解决方案的想法是:如果编译器可以完全确定对象的类型(即,它不能是从它认为的类型派生的类型),并且该对象作为参数传递给函数,其类型是对象类型的超类,然后函数中调用的虚方法的位置可以作为一种"隐藏"参数传递,该参数在编译时添加.也许一个例子会有所帮助:

考虑以下类层次结构的伪代码:

class Animal {
    public void talk() { /* Generic animal noise... */ }
    // ...
}

class Dog extends Animal {
    public void talk() { /* Override of Animal::talk(). */ }
    // ...
}

void main() {
    Dog d = new Dog();
    doSomethingWithAnimal(d);
}

void doSomethingWithAnimal(Animal a) {
    // ...
    a.talk();
    // ....
}
Run Code Online (Sandbox Code Playgroud)

请记住,这是伪代码,而不是C++或Java或类似代码.另外,假设Animal参数通过引用隐式传递,而不是值.因为编译器可以看到它d绝对是类型Dog,它可以将doSomethingWithAnimal定义转换为如下所示:

void doSomethingWithAnimal(Animal a, methodptr talk = NULL) {
    // ...
    if ( talk != NULL …
Run Code Online (Sandbox Code Playgroud)

c++ compiler-construction programming-languages vtable compiler-optimization

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

创建编译器:学习OCaml或坚持使用Java/C/C++

我必须为本学期的课程创建一种新语言和该语言的编译器 - 这意味着截止日期约为3.5个月.我已经读过OCaml是编写编译器的更好的语言之一,但我以前没有经验.我的问题如下:对我来说,尝试使用我已经熟悉的语言(Java,C,C++)创建编译器,或者花些时间学习OCaml并使用它来更好吗?

compiler-construction ocaml programming-languages

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

处理大数(50000+位)的最佳编码语言

您能推荐好的语言来进行大量数学运算吗?

到目前为止,我已经使用了Actionscript 2和Objective-c,甚至在使用Objective-c时NSDecimalNumbers,我在计算中都被限制为32位……我至少需要能够计算出5万位数字。

math programming-languages largenumber calculator

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

Small:中的":="和二进制消息优先级

我试图通过Dolphin Smalltalk X6附带的教程学习Smalltalk.

我的问题涉及对具有多个消息的表达式的评估.

我的理解是首先评估简单消息,然后评估二进制消息,最后评估关键字消息(括号中的代码除外).但是,我无法将这种理解应用到以下示例中的第二行(在Dolphin Smalltalk教程中找到).

    playground := Playground new.
    teresa := playground add: Triangle new.       "Misunderstood code"
    teresa class.                                 "Evaluates to 'Triangle'"
Run Code Online (Sandbox Code Playgroud)

如果我的理解是正确的,那么第二行将被评估:

    1. Simple message 'new' sent to Triangle, triangle object as response
    2. Binary message ':=' with parameter 'playground' sent to 'teresa'.
    3. Keyword message 'add:' with parameter 'triangle object' sent to 'teresa'.
    4. teresa class. "evaluates to 'Playground'".
Run Code Online (Sandbox Code Playgroud)

我的误解是'teresa'如何引用匿名Triangle对象而不是'playground'引用的Playground对象.

我已经查阅了Smalltalk评估的第二个解释,提到:=或添加:是特殊情况没有成功,我能想到的唯一其他解释是一个根本的误解.

任何帮助拉直我的帮助?

programming-languages smalltalk squeak seaside

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

这个python全球范围魔术背后的逻辑是什么?

我正在弄乱Python中的范围,并发现了一些我觉得很奇怪的东西:

g = 5

def foo(a):
    if a:
        global g
        g = 10
    else:
        g = 20


print("global g: ",g)

foo(False)
print("global g: ",g) # 20?! What?

foo(True)
print("global g: ",g)
Run Code Online (Sandbox Code Playgroud)

我相信第二次打印应该是"5",因为全局声明从未执行过,但很明显,输出为20(!).

这背后的逻辑是什么?

python scope programming-languages lexical-scope

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

是否有任何带有隐式乘法的编程语言?

是否存在以下任何一种编程语言:

  • 变量旁边的数字文字3x-0.5y
  • 带括号的表达式旁边的数字文字或数字变量 a(b+c+d) 2(x-y)
  • 两个相邻的带括号的表达式 (1+x)(1-x) (4a-5b)(1+4c)

被解释为乘法?

我可以看到这会引起语法上的问题,但是我很好奇是否有任何一种语言已经成功地做到了。

syntax programming-languages

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

创建基本的编程语言 - 资源?

我不知道这是否是这个问题的正确的SE网站,如果没有,我会感谢任何能指出我正确方向的人.

对于我的大学项目(英国大学〜高中),我想设计一种基本的编程语言.它不具备所有必要的功能,但足以在控制台上编写一些基本程序.我想把它解释为我听说过复杂的编译语言是多么复杂; 面向对象,因为我只懂VB.NET,对OOP最熟悉; 我的目标是创建一种非程序员很容易学习的简单语言.

我一直在四处寻找,但很难找到有用的资源来解释如何以任何细节创建编程语言.我真的很感激你可以建议的任何在线资源 - 它们必须是免费的 - 如果有类似我错过的StackOverflow问题,深入的在线文章或教程,免费在线教科书的摘录......你认为可能有用的任何东西.

language-agnostic programming-languages

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

如何作为程序员思考?

很难找到一个似乎符合我的问题的标签,但我希望这能完成这项工作.

无论如何,我想学习编程,我目前正在参加一个超过10周的python编程课程.我现在已经进入第五周了,我觉得我学到的语法并不多.

我已经尝试过学习编程,因为我现在还不知道10年了,而且我总是在一两周内学习语法,但之后我就会陷入困境并放弃.好吧,这次我不想放弃所以我会问这里.

我如何学习作为程序员思考?无论我阅读了多少教程,他们所教授的只是语法,语法是最简单的部分.如果有一件事我已经学会了,你不能单独用语法编程.

编程语言并不重要,因为正如我所说,我非常快速地学习语法,而且我几乎使用过大多数编程语言.

那么,是否有任何教程或文章,甚至书籍都经历了制作程序的思维过程?

我认为最能教会我的是你完成制作程序的过程.不像那些你制作了一千个小程序的书,而是对制作一个程序的深入了解.///编辑谢谢你们,你们是一个真正的帮助,我想我可以从这里继续!

programming-languages

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

这是什么旧语言?

我的一个朋友为我制作了一堆代码来构建一个软件.但是,我不认识语言,我的朋友也没有编码器.但有一件事我很确定.代码就像20-40岁.

Code最初用于电气工程.

每行字符数限制似乎是20个字符.

有人能认出这种语言吗?如果可能的话,我也在寻找这种语言的手册.

10:"K": PAUSE "IK": 
   CLEAR
15:P=1: INPUT "ETR=PRIN
   T, 0=NO? ";P
20:DIM L(20),R(20),X(20
   ),B(1),G(1),Q(1),O$(
   1)*24
22:IF P=1 INPUT "K. /DA
   TE? ";O$(0)
24:IF P=0 GOTO 30
26:INPUT "N:0 AND NAME?
   "; O$(1)
28:LPRINT O$(1): LPRINT 
   "KKS/";OS(0)
30:INPUT "(KVA)? ";S
35:IF P=1 LPRINT "KVA",
   S
40:R=3.31 :Z=4
...
Run Code Online (Sandbox Code Playgroud)

我搜索了这种语言,PowerBasic似乎接近它,但它包含许多其他功能,这些代码缺乏.任何猜测?

编辑1

似乎有错别字.难怪"P =!" 或"0 $(0)没有任何意义.

编辑2

我接受了Gaby的回答,因为代码似乎与GW-Basic非常接近.还找到了完美的语言手册:http://www.antonis.de/qbebooks/gwbasman/

谢谢您的帮助!

编辑3

得到了一些新信息.语言实际上可能是1975年的"Nova Basic".我无法找到该语言的手册,但至少这给了我一个新的方向.

programming-languages

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

注释会使运行程序变慢吗?

通常认为评论源代码是一种很好的做法.但有没有机会在程序的源代码中发表评论,使程序执行缓慢?提前致谢!

java performance comments programming-languages

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