我正在考虑设计一种编程语言,我希望它以与CPython或Perl大致相同的速度启动.为了在我的语言中做出正确的设计选择以达到这个要求,我正在研究现有的动态语言,看看他们的设计选择如何影响他们的启动时间.许多基于JVM或CLR的语言实现比CPython或Perl具有更长的启动时间.这表明在JVM和/或CLR的设计中做出了设计选择,这导致了这种情况.那是什么选择,为什么这样做?
这是一个由三部分组成的问题:
请注意,其他SO问题已经处理" 为什么JVM启动缓慢? "以及各种JVM语言启动速度慢的原因.这个问题与那个问题截然不同,因为这个问题与设计权衡有关; 是为了换取那么长的启动时间而获得的收益?
其他SO问题询问用户如何加速各种JVM语言(答案往往是有一些预加载JVM的守护进程),但这不是我在这里要求的; 我问你如何设计一种允许快速启动(没有预加载)的语言(和/或虚拟机),以及为了换取这种情况你会失去什么.
我在我的GNU/Linux机器上的非正式Hello World测试中对CPython和Perl进行了基准测试,发现它们的启动时间不到0.05秒.在这篇文章的其余部分,我会说"快速"意味着"启动时间不会比CPython或Perl更长",而"慢"意味着其他情况.
这是很容易找到的意见的是JVM本身和/或Java是慢启动(3,4,5,6),以及混凝土1秒或更长的数量级上的数字(7,27)和基准(8).但是2个Hello世界JVM基准开始仅为0.04秒(在GNU/Linux)(9,10).
Clojure的有大约0.6-1秒的启动时间(1,2); 这比我0.05秒的目标慢约20倍.ClojureCLR甚至更慢(1).Clojure启动时基准和讨论可以在博客文章Clojure bootstrapping(Kariniemi)中找到,为什么Clojure缓慢(Trojer).
一个创业时间的基准测试人员说,Clojure和JRuby "明显慢于其他所有人"(25); 这些也是仅有的两种基于JVM的动态语言.另一个(非常古老的)基准测试表明,Jython的启动速度也很慢(26).我们在这个问题上专注于动态语言,但是Scala的速度也不是很快(1).有一个名为Kawa的JVM Scheme (23).据报道,Kawa的启动时间约为0.4(24),比Clojure快,但仍比我的目标高出一个数量级.
两个(1 …
为什么用Java编写的代码需要用JVM解释的字节代码编译,但是用JavaScript这样的语言编写的代码不需要编译,可以直接在浏览器中运行?
有没有一种简单的方法来理解这个?
这两种语言的编写方式之间的根本区别是什么,这可能有助于理解这种行为?
我不是CS学生,所以请原谅这个问题的天真.
我想测试在bash脚本和C++程序中写入文件的性能.
这是bash脚本:
#!/bin/bash
while true; do
echo "something" >> bash.txt
done
Run Code Online (Sandbox Code Playgroud)
这每秒向文本文件添加大约2-3 KB.
这是C++代码:
#include <iostream>
#include <fstream>
using namespace std;
int main() {
ofstream myfile;
myfile.open("cpp.txt");
while (true) {
myfile << "Writing this to a file Writing this to a file \n";
}
myfile.close();
}
Run Code Online (Sandbox Code Playgroud)
这在不到10秒的时间内创建了一个~6 GB的文本文件.
是什么让这个C++代码更快,和/或这个bash脚本这么慢?
QML是在编译时翻译成本机代码还是在运行时解释几乎与在Web浏览器中运行JavaScript的方式相同?
我刚与一位同事进行了对话,并谈论了V8 JavaScript引擎.根据维基百科,
V8在执行之前将JavaScript编译为本机机器代码,而不是更传统的技术,例如解释字节码或将整个程序编译为机器代码并从文件系统执行.
where(纠正我,如果我错了)" 解释字节码 "是Java的工作方式," 编译整个程序 "将适用于C或C++等语言.现在我们想知道,辩论并提出关于差异,相似性的错误断言和推定.为了结束这一点,我建议询问SO专家.
那么,谁能够
笔记:
compiler-construction interpreter compilation interpretation
在查看了很多关于编译器和解释器之间差异的帖子后,我仍然无法弄清楚它们的构造和内部机制的区别.
我读到的最常见的区别是编译器生成一个可执行的目标程序{意味着机器代码作为其输出},它可以在系统上运行而不是输入.而解释器只是逐行运行输入{这里究竟发生了什么?}并产生输出.
我的主要疑虑是:
1)编译器由词法分析器,解析器,中间代码生成器和代码生成器组成,但是解释器的哪些部分?
2)谁给出了解释语言的运行时支持,我的意思是谁管理堆和递归函数的堆栈?
3)这是Python语言特有的:
Python包含编译器阶段而不是解释器阶段,编译器也会生成一些字节代码,而且这个字节代码由其虚拟机解释.
如果我只设计Python的编译器(Python - >字节码)
a)我是否必须为它管理内存{编写代码以管理堆栈和堆}?
b)这个编译器将如何与传统编译器或解释器不同?
我知道这里要问的很多,但我真的很想了解这些细节.
我指的是Alfred V. Aho的编译器书
根据反馈和一些进一步的研究,我认为我应该修改我的问题
编译器不需要仅生成机器代码作为其输出
但是有一个问题仍然困扰着我.让我说我想设计一个(Python->字节码)编译器然后字节码将被虚拟机解释..(如果我错了,请纠正我).
然后我将为Python编写一个词法分析器,然后编写一个解析器,它将生成某种抽象语法树..在此之后,我必须生成一些中间代码(龙书中提到的3个地址代码)或直接字节码指令(我想在VM的文档中给出)?
我是否必须编写用于处理堆栈的代码以提供对递归和范围的支持?
def main():
i = 2
sum = 1
while i < 100000:
j = 2
while j < i:
if i%j == 0:
sum += 1
break
j += 1
i += 1
print(sum)
if __name__ == "__main__":
main()
Run Code Online (Sandbox Code Playgroud)
#include<iostream>
using namespace std;
int main() {
int sum = 1;
for (int i=2; i<100000; i++) {
for (int j=2; j<i; j++) {
if (i%j == 0) {
sum++;
break;
}
}
}
cout << sum << endl;
return 0;
} …Run Code Online (Sandbox Code Playgroud) 首先,我希望您在这里查看最佳答案。
正如你所看到的,它说,编译语言更快。但是,我理所当然地知道编译器会获取整个源代码,将其编译为机器代码,然后执行它。解释器一次接受一个语句,将其翻译成机器代码或虚拟机代码,然后立即执行。所以我们在运行时即时获得输出。
那么解释型语言不是比编译型语言快吗?
我是python的新手,我以前从未将python代码编译成可执行文件.我熟悉的语言是C,C++和Java,我从来没有遇到过允许你自己修改代码的语言,比如使用Python的方法exec.
对于以下代码,
a = 500
code = raw_input()
exec (code)
Run Code Online (Sandbox Code Playgroud)
当我输入as时,print (a)程序显示值a.所以这意味着变量a属于代码范围.
我不明白如果我们尝试使用像这样的程序将python代码转换为可执行文件会发生什么py2exe.该方法exec仍然有效吗?如果它确实有效,那么py2exe在编译程序时是否会带上整个Python编译器和解释器?
关于"编译与解释"有很多答案和引文,我确实理解它们之间的差异.
说到C,我不确定.C是编译还是解释或两者兼而有之?如果你加上一些解释,我真的很感激.
只有 C 和 C++ 转换为 exe 在编译级别会发生什么?所有应用程序都必须是exe才能在Windows上运行,那么为什么这些语言不包含编译后生成exe文件的功能呢?
c++ ×5
python ×4
compilation ×3
interpreter ×3
bytecode ×2
c ×2
java ×2
bash ×1
clr ×1
javascript ×1
jvm ×1
linux ×1
performance ×1
py2exe ×1
python-3.x ×1
qml ×1
qt ×1