相关疑难解决方法(0)

设计选择的原因导致JVM/CLR语言长期启动?

我正在考虑设计一种编程语言,我希望它以与CPython或Perl大致相同的速度启动.为了在我的语言中做出正确的设计选择以达到这个要求,我正在研究现有的动态语言,看看他们的设计选择如何影响他们的启动时间.许多基于JVM或CLR的语言实现比CPython或Perl具有更长的启动时间.这表明在JVM和/或CLR的设计中做出了设计选择,这导致了这种情况.那是什么选择,为什么这样做?

这是一个由三部分组成的问题:

  1. 动态JVM/CLR语言实现的缓慢启动是一个基本的设计问题,还是只是一个可以通过改进语言实现来纠正的小问题?
  2. 如果这是一个设计问题,那么JVM的哪些设计选择以及这些语言的设计选择会导致这些语言的启动延迟比CPython和Perl更长?
  3. 为了缓慢开始,获得了什么?也就是说,由于(2)所描述的设计选择,JVM/CLR动态语言对CPython和Perl缺乏什么好处?

请注意,其他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 …

compiler-construction clr jvm language-design

20
推荐指数
1
解决办法
598
查看次数

为什么需要编译Java代码,但JavaScript代码不需要编译

为什么用Java编写的代码需要用JVM解释的字节代码编译,但是用JavaScript这样的语言编写的代码不需要编译,可以直接在浏览器中运行?

有没有一种简单的方法来理解这个?

这两种语言的编写方式之间的根本区别是什么,这可能有助于理解这种行为?

我不是CS学生,所以请原谅这个问题的天真.

javascript java bytecode compilation

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

C++比写入文本文件的Bash脚本快得多

我想测试在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脚本这么慢?

c++ linux bash

17
推荐指数
2
解决办法
3195
查看次数

QML是在编译时翻译成本机代码还是在运行时按照在Web浏览器中运行JavaScript的方式进行解释?

QML是在编译时翻译成本机代码还是在运行时解释几乎与在Web浏览器中运行JavaScript的方式相同?

c++ qt qml

16
推荐指数
3
解决办法
4700
查看次数

编译和解释有什么区别?

我刚与一位同事进行了对话,并谈论了V8 JavaScript引擎.根据维基百科,

V8在执行之前将JavaScript编译为本机机器代码,而不是更传统的技术,例如解释字节码或将整个程序编译为机器代码并从文件系统执行.

where(纠正我,如果我错了)" 解释字节码 "是Java的工作方式," 编译整个程序 "将适用于C或C++等语言.现在我们想知道,辩论并提出关于差异,相似性的错误断言和推定.为了结束这一点,我建议询问SO专家.

那么,谁能够

  1. 命名,解释和/或引用所有主要方法(例如预编译与运行时解释)
  2. 可视化或提供关于来源,汇编和解释之间关系的方案
  3. 为#1的主要方法提供示例(名称编程语言).

笔记:

  • 我不是在寻找关于不同范式的长篇文章,而是一个视觉上支持的快速概述.
  • 我知道Stackoverflow并不打算成为程序员的百科全书(而是针对更具体问题的Q&A平台).但是既然我可以找到很多流行的问题,那种提供某些主题的百科全书式的观点(例如[1],[2],[3],[4],[5]),我就开始提出这个问题.
  • 如果这个问题更适合任何其他StackExchange网站(例如,cstheory),请告诉我或标记这个问题以便审核.

compiler-construction interpreter compilation interpretation

13
推荐指数
1
解决办法
5263
查看次数

8
推荐指数
2
解决办法
2万
查看次数

编译器与解释器(基于结构和设计)

在查看了很多关于编译器和解释器之间差异的帖子后,我仍然无法弄清楚它们的构造和内部机制的区别.

我读到的最常见的区别是编译器生成一个可执行的目标程序{意味着机器代码作为其输出},它可以在系统上运行而不是输入.而解释器只是逐行运行输入{这里究竟发生了什么?}并产生输出.

我的主要疑虑是:

1)编译器由词法分析器,解析器,中间代码生成器和代码生成器组成,但是解释器的哪些部分?

2)谁给出了解释语言的运行时支持,我的意思是谁管理堆和递归函数的堆栈?

3)这是Python语言特有的:
Python包含编译器阶段而不是解释器阶段,编译器也会生成一些字节代码,而且这个字节代码由其虚拟机解释.
如果我只设计Python的编译器(Python - >字节码)

a)我是否必须为它管理内存{编写代码以管理堆栈和堆}?

b)这个编译器将如何与传统编译器或解释器不同?

我知道这里要问的很多,但我真的很想了解这些细节.

我指的是Alfred V. Aho的编译器书


根据反馈和一些进一步的研究,我认为我应该修改我的问题

编译器不需要仅生成机器代码作为其输出

但是有一个问题仍然困扰着我.让我说我想设计一个(Python->字节码)编译器然后字节码将被虚拟机解释..(如果我错了,请纠正我).
然后我将为Python编写一个词法分析器,然后编写一个解析器,它将生成某种抽象语法树..在此之后,我必须生成一些中间代码(龙书中提到的3个地址代码)或直接字节码指令(我想在VM的文档中给出)?

我是否必须编写用于处理堆栈的代码以提供对递归和范围的支持?

python compiler-construction interpreter bytecode

6
推荐指数
1
解决办法
2105
查看次数

Python vs CPP: Why is the difference in speed so huge?

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)

c++ python performance

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

编译代码真的比解释代码快吗?

首先,我希望您在这里查看最佳答案。

编译语言与解释语言

正如你所看到的,它说,编译语言更快。但是,我理所当然地知道编译器会获取整个源代码,将其编译为机器代码,然后执行它。解释器一次接受一个语句,将其翻译成机器代码或虚拟机代码,然后立即执行。所以我们在运行时即时获得输出。

那么解释型语言不是比编译型语言快吗?

interpreter interpreted-language compilation

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

带有函数exec的python代码是否被编译为可执行文件?

我是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编译器和解释器?

python dynamic-languages py2exe python-3.x

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

C编译或/和解释?

关于"编译与解释"有很多答案和引文,我确实理解它们之间的差异.

说到C,我不确定.C是编译还是解释或两者兼而有之?如果你加上一些解释,我真的很感激.

c c++

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

为什么只有 C 和 C++ 代码会直接转换为 exe,而 Python 和 Java 需要外部转换器才能在编译后执行此操作?

只有 C 和 C++ 转换为 exe 在编译级别会发生什么?所有应用程序都必须是exe才能在Windows上运行,那么为什么这些语言不包含编译后生成exe文件的功能呢?

c c++ python java

-5
推荐指数
1
解决办法
1049
查看次数