问题标签 [coreerlang]
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.
javascript - 通过 Core Erlang 将 Erlang 编译为 Javascript
所以开始在 LuvvieScript 上取得进展,然后一切都在 Twitter 上开始了...... https://twitter.com/gordonguthrie/status/389659700741943296
Anthony Ramine https://twitter.com/nokusu指出我做错了,我应该通过 Core Erlang 而不是 Erlang AST 从 Erlang 编译到 JavaScript。这对我来说既是一个引人注目但又不吸引人的选择...... Twitter 不是该讨论的正确媒介,我想我会在这里写下来并获得一些建议。
战略概述
LuvvieScript 具有三个核心要求:
- Erlang 的有效子集,可编译为相同且高性能的 Javascript
- 一个完整的 Source Map,以便可以在浏览器中使用 LuvvieScript 而不是 Javascript 进行调试
- 一个“运行时”客户端 javascript 环境(带有服务器端通信),用于执行 LuvvieScript 模块(一种页内主管......)
这些选项中的第三个有点超出了本次辩论的范围,但前两个是核心。
有一个惰性 gits 推论——我想尽可能多地使用 Erlang 和 Javascript 语法工具(词法分析器、解析器、标记器、AST 转换等)并编写最少的代码。
目前的想法
代码的方式目前写成如下结构:
- 将代码编译为 Erlang AST(具有行号)
- 标记代码(保留注释和空白)并使用这些标记来构建将行/列信息映射到标记的字典
- 合并字典和 AST 以给出 line/col AST(有些人想要将不同的 arities 的 fns 分组)
- 将这个新的 Erlang AST 转换为在 SpiderMonkey Parser API https://developer.mozilla.org/en-US/docs/SpiderMonkey/Parser_API中实现的 Javascript AST
- 使用像brushtail这样的Javascript实用程序来改变Javascript AST中的尾调用https://github.com/puffnfresh/brushtail
- 使用像 ESCodeGen 这样的 Javascript 工具来发出 javascript https://github.com/Constellation/escodegen
基本上我得到一个看起来像这样的 Erlang AST:
然后我将它转换成一个 Javascript JSON AST,如下所示:
问题
Anthony 的观点说得很好——Core Erlang 是一种比 Erlang 更简单且更常规的语言,并且应该比普通的 Erlang 更容易转译为 Javascript,但它的文档记录不是很好。
我可以很容易地获得类似 AST 的 Core Erlang 表示:
但没有行列/编号。所以我可以得到一个可以生成 JS 的 AST——但关键不是 SourceMaps。
问题 1如何获取我需要的行信息 - (我已经可以从“普通”Erlang 令牌中获取列信息......)
Erlang Core 在生产过程中与普通 Erlang 略有不同,因为它开始将函数调用中的变量名替换为自己的内部变量名,这也会导致一些 Source Map 问题。一个例子是这个 Erlang 子句:
Erlang AST 很好地保留了名称:
Core Erlang 已经改变了函数中调用的参数的名称:
问题 2我可以在 Core Erlang 中保留或映射变量名吗?
问题 3我很欣赏 Core Erlang 的明确设计是为了让编译成Erlang 和编写改变 Erlang 代码的工具变得容易——但问题真的会让从Erlang编译出来更容易吗?
选项
我可以分叉核心 erlang 代码并添加源映射选项,但我在这里玩Lazy Man卡......
更新
作为对 Eric 的回应,我应该澄清我是如何生成 Core Erlang cerl 记录的。我首先使用以下方法将我的普通 Erlang 编译为核心 Erlang:
然后我在这个函数中使用core_scan
和从:core_parse
compiler.erl
问题是我如何/我可以让该工具链发出带注释的 AST。我怀疑我需要自己添加这些选项:(
erlang - 将 Core Erlang 表单转换为 Erlang 源代码字符串
我有带有cerl
模块的 Core Erlang 表单结构。我希望将它“反编译”成 Erlang 源代码字符串。
我虽然可以做这样的事情:
但是erl_syntax:form_list/1
返回一个空列表。
erlang - 选择 AST 来为 Elixir 开发静态代码分析器?核心 Erlang 还是扩展 Elixir AST?
我们希望static code analyser
为 Elixir 开发一个以检测并发问题(主要是死锁和竞争条件)。我们对分析器的结构有一些基本的想法,但我们的问题是哪种 AST 更适合这项任务。正如我们所了解的,Elixir 编译过程创建了 Expanded Elixir AST、Abstract Erlang Format 和 Core Erlang。
我的问题是扩展 Elixir AST 或 Core Erlang 是否更适合创建调用图和控制流图。如果我们使用 Core Erlang,是否有可能从 Core Erlang 向后工作,以在 Elixir 代码中找到分析器识别的问题的源代码?
如果有人对此有所了解,我们将非常感谢您的帮助。:)