【问题标题】:Is it possible to write a SQL statement in plain assembly language processor-level code?是否可以用普通的汇编语言处理器级代码编写 SQL 语句?
【发布时间】:2023-03-22 00:50:01
【问题描述】:

就在最近,一位朋友建议用汇编代码编写 SQL 语句是可能且可实现的(尽管非常困难),因为每个编程操作最终都会归结为处理器级执行。

我对 SQL 的行为做了一些研究,虽然它遵循关系代数的理论和独立于平台的执行,但我仍然认为抽象和语义的水平相当遥远,甚至无法考虑将 SQL 语句转换为汇编代码(一组非常特定于操作/内存/资源的指令)。

也许您可以模仿 SQL 语句的处理器操作结果,并尝试使用纯汇编指令集来复制它。但您会意识到,您仍然不会编写/翻译 SQL 语句。

以 MonetDB 的 SQL Reference 页面为例,他们在第三段中声明如下:

"该架构基于编译器,它可以翻译 SQL MonetDB 汇编语言 (MAL) 中的语句。在这个过程中 特定于关系代数的常见优化启发式是 执行。”

然而,SQL 语言甚至不允许输入粗暴的汇编指令,而基于 C 和 C# 等常见语言则允许输入/导入。

你们怎么看?感谢您分享您的想法!

【问题讨论】:

    标签: sql programming-languages assembly processor relational-algebra


    【解决方案1】:

    在您的计算机上运行的任何东西都可以使用汇编语言进行编码。如果 SQL 数据库可以在您的机器上运行,那么它可以在汇编中进行编码。

    虽然这可能很难做到。

    您提到的 SQL 示例与将 C 或其他编译语言翻译为机器代码时发生的情况相差不远。现代优化编译器不会将您的 C 代码直接转换为程序集。他们使用一种(或多种)更容易进行优化的中间表示。这是一个多步骤的过程,实际的组装输出并不是复杂性的主要部分。

    如果你这样看,你的 SQL 情况并没有太大的不同。您可以想象一个 SQL 预处理器,它在给定足够固定的环境(特别是模式)的情况下从 MAL 生成本机代码。有了类似的东西,向该 SQL 方言添加扩展以允许内联汇编(例如聚合函数)可能是有意义的。并且手动完成所有这些(即没有预处理器本身)是可能的。

    但是,您失去了从运行时 SQL 解释器获得的所有可移植性和灵活性,每次架构更改时都必须重新编译,数据相关的优化变得几乎不可能等等。所以这很有用的情况是,我相信,非常有限。 (对于通常通过 VM 或解释器运行的其他语言也是如此 - 将它们编译为本机代码通常会受到严格限制。)

    【讨论】:

    • 我不能完全同意在计算机上运行的任何东西都是用汇编编码的,而汇编语言中的 SQL 操作和指令是我还没有看到过的样本,即使只是尝试一下。例如,编写汇编代码来处理视频;在汇编指令的范围之外,这也是值得考虑的事情。
    • 你的 CPU 唯一能执行的是汇编指令。 没有别的了。 如果你有一个程序在上面运行(即使在 VM 中),那么该程序只是一组汇编指令(和一些数据)。 CPU没有SQL的概念。它不知道什么是“视频”或“音频”(但它可以有针对这些类型媒体的指令)。如果它在您的 PC 上运行,则可以用汇编语言编写。
    • 我同意你的观点,并且每个 CPU 指令都是汇编指令,并且由于每个程序都依赖于这样的操作,因此假设每个与语言无关的操作都将通过组装过程。但是,主要的限制是每种高级语言都允许直接汇编指令的可能性。感谢您的意见。
    【解决方案2】:

    然而,SQL 语言甚至不允许输入粗暴的汇编指令,而基于 C 和 C# 等常见语言则允许输入/导入。

    不,SQL 不允许这样做,因为它是比 C(或 C#)更高级别的语言。在 SQL 中,代码描述了应该做什么而不是如何做,也没有关于如何做的任何细节。实现必须解析代码并将其编译为一组或低级指令,这些指令执行 SQL 代码所描述的操作。

    例如,对于 SELECT,我们无法保证访问表的计划是什么,访问的顺序是什么,将使用哪些(如果有)索引,将使用什么类型的操作连接,是否将使用临时表或在内存中进行排序等...

    因此,允许这样的事情是不明确的并且极其危险:

    SELECT *
    FROM a_table AS a
      JOIN another_table AS b
        ON b.aid = a.id
    WHERE b_data LIKE 'Alex%'
              ( .CODE
                    getRSP PROC
                    mov rax, rsp
                    add rax, 8
                    ret
                    getRSP ENDP
                END
              ) 
      AND a_date BETWEEN '2000-01-01'
                     AND '2099-12-31'
    ORDER BY b_year
    

    【讨论】:

    • 谢谢,这里的这个例子确实增加了尝试编写(或混入)汇编指令以完成 SQL 语句结果的复杂含义。
    • @Javier:问题之一是如果查询执行两次,即使使用相同的服务器、相同的表结构、相同的数据(不是添加或更改的行)。
    【解决方案3】:

    如果您对将关系查询/操作编译到汇编器感兴趣,您可能需要查看这篇论文:http://www.vldb.org/pvldb/vol4/p539-neumann.pdf。在这个 DBMS 中,LLVM 的组件用于从 DBMS 中的查询生成 CPU 指令(我假设您所说的汇编程序就是这个意思)。

    此外,尽管我可能是在向合唱团讲道,但我想明确指出,MAL 与 CPU 指令汇编器无关。每个单独的 MAL 语句都由 C 中的实现支持。MAL 仅用作 (taadaa:) 作为易于优化和解释的中间表示。

    【讨论】:

      【解决方案4】:

      嗯,机器会执行你可以用汇编语言编写的指令。但是,我不会调用直接编写汇编语言来执行 SQL 查询。 SQL 可以有非常不同的解释......例如由图书馆员查阅百科全书,在原始汇编可能没有什么意义的情况下。

      【讨论】:

      • 您的示例正是我所说的语义和 SQL 指令的上下文。它们的解释方式超出了装配操作的范围。
      【解决方案5】:

      没有。 SQL 是一种抽象,可以由具有不同物理布局的不同 SQL 环境的不同 SQL 实现来解释*。也许布局甚至会随着时间而改变,就像您 ALTER TABLE 一样,现在您拥有新旧元组布局的混合体。此外,除了 run 之外,您还可以使用 SQL 做更多的事情。你也可以对它进行类型检查,分析它,看看它有什么样的效果,把它放在视图定义或存储过程中等等。

      这是另一种说法。你能把 HTML 写成汇编语言吗?也许您可以编写一个程序,该程序在执行时与呈现特定页面的浏览器具有相同的效果。但是你的程序可以被 AdBlock、NoScript 和我安装的任何其他过滤器处理吗?任何支持所有 HTML 相关操作的东西都将与 HTML 本身同构。与 SQL 和任何其他语言类似。事实上,任何其他数据结构:表示形式的变化必须保留对该数据结构的所有相关操作的含义。而且语言往往有很多相关的操作。

      (* 我的意思不是“解释”,就像“与编译”一样;我的意思是“给定的含义”。)

      【讨论】:

      • 感谢您的回复,我发现 HTML 示例很有趣,因为它展示了如何模拟特定行为,以及考虑在操作方面保留含义的重要性。我完全同意您的反馈。感谢分享。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多