当我编码时,我总是写一些小单元,并经常编译它。这有助于我确保一切正常运行,但它耗费时间。 是否有任何编程语言可以支持我们同时进行编码和运行? 我的意思是一旦按键导致有效代码,编辑的效果被纳入执行程序。
答案 0 :(得分:4)
只要按键导致有效代码,编辑的效果就会合并到执行程序中?
如上所述,许多语言都提供交互式阅读/编辑/评估/打印循环,但您需要更多内容。 20世纪80年代的Symbolics Lisp machines提供的功能几乎与你描述的一样;你必须按一个键来更新正在运行的系统。您甚至可以替换函数,而不会干扰调用堆栈上以前版本的旧激活。
20世纪70年代和80年代是互动发展环境的黄金时代,从那时起,这个领域已经衰落。如今人们认为Visual Studio是一个高度交互式的编程环境 - 它是,但不那么有活力。
我认为今天能够复制这种动态体验的最接近的是Squeak Smalltalk,它有一个复杂的IDE,它基于Xerox PARC(以及同一个人)的Smalltalk-80环境构建。
答案 1 :(得分:3)
LISP,Scheme,Haskell,Perl,Python,Ruby,Maple,Mathematica,MATLAB等。大多数解释语言都可以做到这一点。完成输入后,您的代码就会被解释并运行。
哎呀,甚至命令shell计数,真的。
引自Wikipedia: Command line interpreter:
虽然大多数用户认为shell是一个交互式命令解释器,但它实际上是一种编程语言,其中每个语句都运行一个命令。因为它必须同时满足命令执行的交互和编程方面,所以它是一种奇怪的语言,由历史和设计塑造。
- Brian Kernighan& Rob Pike
对于视频演示,请观看Conway's Game of Life in APL。
答案 2 :(得分:3)
答案 3 :(得分:1)
我认为这不一定是语言问题,因为它是IDE等问题。即使像C这样的编译语言也为它们提供了解释器。
如果您认为它对您有所帮助,您可以找到任何编程解释器。
答案 4 :(得分:1)
Erlang允许您修改正在运行的程序,基本上能够在程序永不停止运行时动态更新方法。
答案 5 :(得分:0)
嗯,我正在研究这样一个业余爱好的业余时间项目。它使用名为Eiffel的静态类型编译语言。
与传统编译器的不同之处在于编译器作为服务器而不是命令行程序。它将所有数据保存在内存中,并真正对它们进行渐进式编译。与全内存增量链接器一起构思 编译/链接/运行周期少于2秒。
但是仍然存在一个问题,你只能使用像Lisp或Smalltalk这样的基于图像的语言来解决。代码始终以Adam& Eve开头,并且必须在程序中定义到已定义的情况。
但如果您需要一种非常快速的可执行语言,目前这似乎是最好的折衷方案。生动性需要浪费大量性能,因为必须以某种方式保留现有的对象结构,理论上它可能但实现非常复杂。
答案 6 :(得分:-2)
嗯,你真的想要这样的东西吗?!
让我们假设您为C语言环境设置了这样一个系统。因此,您的编辑器已配置为在每个按键时检查它是否“导致有效代码”......如何?除非编辑器在解析代码时冗余地包含与编译器/解释器相同的逻辑,否则您将不得不调用编译器。 (让我们忽略将文件保存到磁盘的开销,并想象你的编译器可以直接读取编辑器缓冲区的内容。)因此,在每个按键时,它都会编译代码。你可能会在99%的时间内得到错误,只是因为你还没有完成输入变量或关键字的名称。您的系统如何知道错误是由于该错误还是由于“实际”错误?
另外,如何在程序执行时将编辑内容合并到程序中?假设您的程序位于深度为五个堆栈的点,并且您更改传递给第一个函数的变量的值。如果没有再次开始执行第一个函数,就无法神奇地传播更改。但如果不改变这种变化,它是否真的纳入了该计划?当然,调试器将允许您修改正在执行的程序中的现有变量,但是您不能执行诸如创建新变量或函数调用或控制结构之类的事情,以及您可能在您的方案中执行的所有操作。
大多数解释语言都有一个读取 - 评估 - 打印循环(REPL),您可以在其中定义函数,然后将这些函数存储在解释器的环境中,您可以按名称调用这些函数,甚至可以重新定义以前定义的函数。然后调用它们将执行新版本。但即使在这种情况下,您的程序也不会在您有提示时执行,因此能够为其提供新的解释。