问题标签 [interpreted-language]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - 编译在运行时引用当前程序类的 java 代码
我正在尝试编写一个允许用户创建“插件”的程序。有点像 Linux bash shell 如何通过将文件放入目录来添加命令,我试图允许用户将他们的代码放入目录中,并让我的程序执行它。
我想到了几种方法来做到这一点:
- 不知何故设法创建了我自己的脚本语言并让用户使用它来编写他们的插件
- 找到一种 Java 支持的现有脚本语言,并使用它供用户编写他们的插件
- 让用户用 Java 编写他们的插件,并在我的程序运行时编译它们。
尽管所有 3 个选项看起来都很糟糕,但这是我能想到的,选项 3 似乎是三个选项中最好的。所以,我做了一些研究,发现 Java 1.6 以后支持文件的运行时编译。但是,如果用户编写的代码引用了我在基本程序中的某些特定类,我不确定编译器是否会失败。通常它会,但由于我的程序正在编译它,我不知道编译器是否允许他们使用基础程序中的类。
理想情况下,我希望这对用户来说尽可能简单。我的主要问题是编译器是否会在我的基础程序中引用类时出现问题。我不想在我的所有类中都包含一个 .jar,并让用户在开发时将其用作库。正如我所说,我希望这对用户来说很容易,理想情况下,它应该尽可能接近解释语言。这就是为什么我想在我的程序运行时这样做,这样用户就不必为编译而烦恼。他们只需要将 .java 文件放在一个目录中并运行我的程序。
如果有人知道编译器是否会对类有问题,或者如果他们知道更好的方法来解决这个问题,那就太好了!
谢谢!
javascript - 动态代码生成选项
我有一个(假设的)问题,我认为解决方案是动态生成代码。
我想快速评估用户输入的任意数学函数,比如找到i^3+2i^2+6i+1 的总和 i=1 到N。N是任意的,而 i^3+2i^2+6i+1 也是任意的(它不必是多项式,它也可能包含三角函数和其他函数)。假设 N 可以很大。我想知道如何快速评估答案,假设我已经将用户输入解析为某些字节码或我的程序可以理解的其他内容。
如果可能的话,我还希望我的代码能够轻松编译并在不同的操作系统(包括移动设备)上运行。
我想了几个办法:
1)编写一个解释器来解释和执行我的字节码中的每个命令。这使我可以自由使用任何语言,但速度很慢。
2) 用Java/C# 编写并使用动态代码生成(例如是否可以动态编译和执行C# 代码片段?)。这将像我直接在我的源代码中编写函数一样快地执行,因为 C#/Java 都是 JIT 编译为机器代码的,所以速度会稍微慢一些。限制是 Java 在移动设备上不受广泛支持,而 C# 仅适用于 Windows。
3) 为我使用的任何编译语言嵌入一个汇编器/C++ 编译器/编译器。限制是它也不能在移动设备上运行——它不会让我执行数据文件。
4) 编写 HTML/Javascript,然后将其嵌入 Web 浏览器控件并将其放入应用程序中(我认为这是一些人用来制作可以在任何地方运行的通用应用程序的方式)。但它也很慢,用 Javascript 编写真正的应用程序很痛苦。
你认为哪个选项最合适?或者也许我应该混合使用,也许我的应用程序代码将创建并执行生成的 Javascript 函数?
interpreted-language - 为什么要使用解释语言来使编译后的语言“即时”可调?
我读过某些程序,例如文明视频游戏系列,使用解释组件(在本例中为 Lua)与编译组件(我假设为 C++)接口,以允许用户通过 mod 等进行扩展。为什么以这种方式调用虚拟机,当我假设您可以编写和烘焙自己的编译语言扩展时,会有所帮助?
java - 解释器如何解释代码?
为简单起见,想象一下这种情况,我们有一台 2 位计算机,它有一对 2 位寄存器,分别称为 r1 和 r2,并且只适用于立即寻址。
假设位序列00意味着添加到我们的 cpu。还01表示将数据移动到 r1,10将数据移动到r2。
因此,这台计算机有一个汇编语言和一个汇编器,其中的示例代码可以这样编写
简单地说,当我将此代码组装成本机语言时,文件将类似于:
上面的 12 位是本机代码:
所以这基本上就是编译代码的工作方式,对吧?
假设有人为此架构实现了 JVM。在 Java 中,我将编写如下代码:
JVM 将如何准确地解释这段代码?我的意思是最终必须将相同的位模式传递给 cpu,不是吗?所有cpu都有许多可以理解和执行的指令,它们毕竟只是一些位。假设编译后的 Java 字节码看起来像这样:
或其他什么..这是否意味着解释在执行时将此代码更改为 0101 1010 0001?如果是,它已经在 Native Code 中了,那为什么说 JIT 只在多次后才生效呢?如果它没有将它完全转换为 0101 1010 0001,那么它会做什么?它是如何让cpu做加法的?
也许我的假设有一些错误。
我知道解释很慢,编译的代码更快但不可移植,并且虚拟机“解释”代码,但是如何?我正在寻找“如何准确/技术解释”。欢迎任何指针(例如书籍或网页)而不是答案。
ruby-on-rails - Ruby 变量定义
我偶然发现了 ruby 中关于变量定义的一个奇怪行为(并且在途中丢失了一盒甜甜圈):
为什么不a.nil?
扔undefined local variable
?例如,看一下 python(只是想将其与解释语言进行比较):
在编译语言中,这甚至无法编译。
- 这是否意味着 ruby 会保留对该变量的引用,即使它没有通过那段代码?
- 如果是这样,变量定义考虑的 ifs/else 有多深?
我真的不敢相信这是 ruby 的预期行为。而且它不是特定于 irb 的,在 ruby/rails 代码块中运行它会得到相同的结果。
c# - 如何在 C# 中制作类 C 解释脚本语言
问题: 我正在寻找开发像 Lua 这样的脚本语言,但你使用
而不是
但还没有在互联网上找到一个很好的教程。
参数:我想让它被解释,我也想用C#来做,这样它就最容易集成了。
python - 循环数很重要效率(解释语言还是编译语言?)
假设您必须使用 2 个甚至 3 个循环来执行计算。直观地说,使用单个循环执行此操作可能会更有效。我尝试了一个简单的 Python 示例:
此代码运行:
因此,有效地 1 循环似乎更有效。然而,我的问题有一个稍微不同的场景,因为我需要使用数组中的值(在下面的示例中,我使用该函数range
进行简化)。也就是说,如果我将所有内容折叠到一个循环中,我将不得不从另一个数组的值创建一个扩展数组,该数组的大小在 2 到 10 个元素之间。
在我的计算机中,此代码运行在:
所以看起来 3 个嵌套循环更有效,因为我花了一些时间b
在case1
. 所以我不确定我是否以最有效的方式创建这个数组,但撇开它不谈,它真的可以将循环折叠成一个循环吗?我在这里使用 Python,但是像 C++ 这样的编译语言呢?在这种情况下,编译器是否会做一些事情来优化单循环?或者另一方面,当您有多个嵌套循环时,编译器是否会进行一些优化?
compilation - 编译代码真的比解释代码快吗?
首先,我希望您在这里查看最佳答案。
如您所见,它说,编译语言更快。但是,我理所当然地知道编译器获取整个源代码,将其编译为机器代码,然后执行它。解释器一次获取一条语句,将其转换为机器代码或虚拟机代码,然后立即执行。因此,我们在运行时即时获得输出。
那么解释语言不比编译语言快吗?
scripting - 所有脚本语言都被解释了吗?
所有脚本语言都被解释了吗?我还没有遇到编译+脚本语言。以下语言既是解释语言又是脚本语言。解释语言和脚本语言之间有什么联系。
例如 JavaScript、python、perl
反过来呢?
bash - Bash 是解释型语言吗?
从我目前所读到的内容来看,bash 似乎符合解释语言的定义:
- 它没有被编译成较低的格式
- 每条语句最终都会调用一个子程序/一组已经翻译成机器代码的子程序(即
echo foo
调用一个预编译的可执行文件) - 解释器本身 ,
bash
已经被编译
但是,我在Wikipedia 的解释语言页面上或在 Google 上的广泛搜索中找不到对 bash 的引用。我还在 Programmers Stack Exchange 上找到了一个页面,该页面似乎暗示 bash 不是一种解释性语言——如果不是,那它是什么?