2024 Clojure 状态调查! 中分享您的想法。

欢迎!请访问 关于 页面以了解更多关于如何使用本站的信息。

0
ClojureScript
在生成源映射时,我们排放了许多不必要的额外数据,这些数据对于映射堆栈跟踪是不必要的。

Planck 修剪了这些信息中的许多,同时仍然能够成功地映射堆栈跟踪,并带来了巨大的性能提升:Planck 可以立即加载较小的源映射文件,而不是需要数秒。这已经实施了一年,没有收到任何问题的报告。

我认为我们可能在 ClojureScript 中按照正确的方式做同样的操作,当编写源映射时。值得尝试一个实验,即使用为 Planck 开发并在此作为参考包含的功能,可选地删除这些信息


(defn- strip-source-map
  "将源映射修剪到映射堆栈跟踪所需的最小表示形式"
  。这意味着我们只需要 :line 和 :col 字段,我们只需要
  每个此类映射向量中的最后一个元素,并且我们可以消除
  重复项,为每个独特的值取最小的 col 号码。
  [sm]
  (into {}
    (map (fn [[row cols]]
           [row (->> cols
                  (map (fn [[col frames]]
                         [col [(select-keys (peek frames) [:line :col])]]))
                  (sort-by first)
                  (distinct-by second)
                  (into {}))]))
    sm))

4 答案

0

评论由:mfikes发布

我们目前正在为每个 AST 发射源映射的行/列信息,无论操作类型如何。这保证了我们有全面的源映射信息,但它可能比许多常见用途所需的信息集大得多。

一些操作类型可能可以明确省略,例如 {{:no-op}}。通过一些实验,您可以看到,仅使用二到三个操作类型,就能够在仅限于映射堆栈跟踪的有限范围内实现源映射。Dirac DevTools 通过更广泛地使用源映射信息,以正确地识别源代码中的局部变量、绑定形式等。

所附补丁限制了源映射行/列的排放,仅限于那些用于堆栈跟踪映射的标签,以及Dirac(它是堆栈跟踪映射所需标签的超集)的一些简单应用。这种策略的根本问题是确定正确的操作子集,以便我们生成带有行/列信息的操作。

但如果可以成功识别一个满足一般需求的最低限度集合,这可能值得尝试。根据所附补丁,使用非并行模式编译 Coal Mine 相对于当前主分支,可以获得12%的性能提升。

使用此补丁,写入磁盘的源映射大小更小:对于{{cljs.core}},它为432567字节,而不是640411字节。

附上此补丁以供反馈。如果我们能找到一个合适的子集,这可能行得通。如果这证明过于困难,也许可以引入一个编译器选项来控制是否生成足够用于堆栈跟踪映射的小子集,或者用于调试(Dirac)的略大的子集,或者所有操作。

0

by

评论者:darwin

Dirac 依赖于源映射的两种方式:
1) 间接:标准Chrome DevTools(或V8)的代码在各个地方使用源映射(例如,将控制台消息的行/列信息映射回原始源,或在调试器中显示适当行,映射调试器中局部变量的名称等)
2) 直接:Dirac 使用 DevTools 中的源映射信息为其 REPL 提示提供代码补全(它依赖于源映射规范中定义的“名称”列表(链接:1)

我对 #2 有相当好的测试覆盖率,因此我会注意到代码补全中的任何回归。但对我来说,剪辑的源映射会如何影响 DevTools/V8 本身尚不清楚。

请注意,DevTools 与 ClojureScript(或其他转译语言)相关联的源映射存在已知问题。Dirac 尝试进行修补,但仍可能存在一些未解决的错误。
https://github.com/binaryage/dirac/issues/53

您知道 https://github.com/sokra/source-map-visualization 吗?当我在调试 Dirac 中的源映射问题时,这个工具非常有用。我认为这有助于确定如何生成包含相关信息的最小源映射。

(链接:1) https://sourcemaps.info/spec.html

0

by

评论者:darwin

仅作为记录。CLJS-2993 与之相关。Mike,如果您使用 ClojureScript 主分支进行 Dirac 实验,您可能受到影响。

0
by
...