2

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

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

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

以 MonetDB 的SQL 参考页面为例,他们在第三段中陈述了以下内容:

“该架构基于编译器,它将 SQL 语句转换为 MonetDB 汇编语言 (MAL)。在此过程中,执行特定于关系代数的常见优化启发式。”

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

你们有什么感想?感谢您分享您的想法!

4

5 回答 5

4

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

不过,这可能很难做到。

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

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

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

于 2011-07-19T05:46:47.323 回答
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
于 2011-07-19T06:47:19.733 回答
1

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

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

于 2011-07-28T16:36:29.790 回答
0

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

于 2011-07-19T05:49:34.290 回答
0

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

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

(* 我的意思不是“解释”如“vs 编译”;我的意思是“给定的含义”。)

于 2011-07-19T06:46:25.370 回答