是否有任何用标准的、平台无关的 C 或 C++ 编写的可扩展的解释性编程语言?
我希望能够简单地将所有源代码放在一个目录中,使用任何符合标准的 C 或 C++ 编译器编译源代码,并生成一个可执行文件,该文件可以读取和解释指定脚本语言的脚本文件。
似乎许多“用 C 编写”的编程语言通常包含许多依赖于它们所在平台的功能,因此,需要一些配置程序根据您的目标系统(例如 Autoconf)运行,这使事情变得复杂并且限制跨平台兼容性。
问题原因:
我有兴趣学习编程语言设计。在学习了涉及 yacc、lex 和 llvm 的教程之后,我玩过一些玩具编程语言。然而,最近我对研究一种用可移植的 C/C++ 编写的编程语言产生了兴趣,这样一来,我可以在任何支持标准 C 或 C++ 编译器(甚至可能在我的 ipad 上)的机器上研究程序和代码,并且仍然具有相当统一的体验。
因为这只是出于教育目的,脚本语言不需要像 C 那样支持超底层特性,也不需要像 Java 那样具有 GUI(我不认为你可以编写任何类型的 GUI 受限到标准 C/C++)或任何复杂的 io。但是,我希望该语言足够完整,以便用该语言编写一些有用的程序(例如,应该可以使用 C/C++ 扩展该语言,以便您可以像 tty 上的 shell 一样使用它) .
谢谢。
编辑:
@AndréCaron 如果至少该语言的核心是 100% 平台独立的,我会更喜欢它。如果该语言包含一个依赖于其他库以使其“更有用”的大型标准库,那就没问题了,但是,我希望能够剥离标准库并仅使用该语言的核心(可能与自定义手写库)如果我愿意的话。
最佳答案
也许embedded Lua ?
实际上 core Lua本身可能更好。乍一看,虽然eLua号称可以运行在多种不同的系统上意味着它具有很强的可移植性,但实际上它采用核心Lua并添加了一堆硬件驱动程序,这显然不是那么可移植。
Ocaml将是另一个绝佳的选择。它声称 "The bytecoded system currently runs on any POSIX-compliant operating system with an ANSI-compliant C compiler"和 Caml Light特别适合学习。 “运行时系统和字节码解释器是用标准 C 编写的,因此 Caml Light 很容易移植到几乎任何 32 位或 64 位平台。”
关于c++ - 用标准 C 或 C++ 编写的解释器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9041436/
我想用ruby编写一个小的命令行实用程序并将其作为gem分发。我知道安装后,Guard、Sass和Thor等某些gem可以从命令行自行运行。为了让gem像二进制文件一样可用,我需要在我的gemspec中指定什么。 最佳答案 Gem::Specification.newdo|s|...s.executable='name_of_executable'...endhttp://docs.rubygems.org/read/chapter/20 关于ruby-在Ruby中编写命令行实用程序
我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server
我正在阅读SandiMetz的POODR,并且遇到了一个我不太了解的编码原则。这是代码:classBicycleattr_reader:size,:chain,:tire_sizedefinitialize(args={})@size=args[:size]||1@chain=args[:chain]||2@tire_size=args[:tire_size]||3post_initialize(args)endendclassMountainBike此代码将为其各自的属性输出1,2,3,4,5。我不明白的是查找方法。当一辆山地自行车被实例化时,因为它没有自己的initialize方法
我想在Ruby中创建一个用于开发目的的极其简单的Web服务器(不,不想使用现成的解决方案)。代码如下:#!/usr/bin/rubyrequire'socket'server=TCPServer.new('127.0.0.1',8080)whileconnection=server.acceptheaders=[]length=0whileline=connection.getsheaders想法是从命令行运行这个脚本,提供另一个脚本,它将在其标准输入上获取请求,并在其标准输出上返回完整的响应。到目前为止一切顺利,但事实证明这真的很脆弱,因为它在第二个请求上中断并出现错误:/usr/b
我想使用spawn(针对多个并发子进程)在Ruby中执行一个外部进程,并将标准输出或标准错误收集到一个字符串中,其方式类似于使用Python的子进程Popen.communicate()可以完成的操作。我尝试将:out/:err重定向到一个新的StringIO对象,但这会生成一个ArgumentError,并且临时重新定义$stdxxx会混淆子进程的输出。 最佳答案 如果你不喜欢popen,这是我的方法:r,w=IO.pipepid=Process.spawn(command,:out=>w,:err=>[:child,:out])
我正在尝试找到一种方法来规范化字符串以将其作为文件名传递。到目前为止我有这个:my_string.mb_chars.normalize(:kd).gsub(/[^\x00-\x7F]/n,'').downcase.gsub(/[^a-z]/,'_')但第一个问题:-字符。我猜这个方法还有更多问题。我不控制名称,名称字符串可以有重音符、空格和特殊字符。我想删除所有这些,用相应的字母('é'=>'e')替换重音符号,并将其余的替换为'_'字符。名字是这样的:“Prélèvements-常规”“健康证”...我希望它们像一个没有空格/特殊字符的文件名:“prelevements_routin
如何将send与+=一起使用?a=20;a.send"+=",10undefinedmethod`+='for20:Fixnuma=20;a+=10=>30 最佳答案 恐怕你不能。+=不是方法,而是语法糖。参见http://www.ruby-doc.org/docs/ProgrammingRuby/html/tut_expressions.html它说Incommonwithmanyotherlanguages,Rubyhasasyntacticshortcut:a=a+2maybewrittenasa+=2.你能做的最好的事情是:
我对如何计算通过{%assignvar=0%}赋值的变量加一完全感到困惑。这应该是最简单的任务。到目前为止,这是我尝试过的:{%assignamount=0%}{%forvariantinproduct.variants%}{%assignamount=amount+1%}{%endfor%}Amount:{{amount}}结果总是0。也许我忽略了一些明显的东西。也许有更好的方法。我想要存档的只是获取运行的迭代次数。 最佳答案 因为{{incrementamount}}将输出您的变量值并且不会影响{%assign%}定义的变量,我
我使用rails3.1+rspec和factorygirl。我对必填字段(validates_presence_of)的验证工作正常。我如何让测试将该事实用作“成功”而不是“失败”规范是:describe"Addanindustrywithnoname"docontext"Unabletocreatearecordwhenthenameisblank"dosubjectdoind=Factory.create(:industry_name_blank)endit{shouldbe_invalid}endend但是我失败了:Failures:1)Addanindustrywithnona
如thisquestion,当在其自己的赋值中使用未定义的局部变量时,它的计算结果为nil。x=x#=>nil但是当局部变量的名称与现有的方法名称冲突时,就比较棘手了。为什么下面的最后一个示例返回nil?{}.instance_eval{a=keys}#=>[]{}.instance_eval{keys=self.keys}#=>[]{}.instance_eval{keys=keys}#=>nil 最佳答案 在Ruby中,因为可以在没有显式接收器和括号的情况下调用方法,所以在局部变量引用和无接收器无参数方法调用之间存在语法歧义:f