是否可以用普通汇编语言处理器级代码编写SQL语句?

时间:2011-07-19 05:43:44

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

就在最近,一位朋友建议在汇编代码中编写SQL语句是可能的,也是可以实现的(虽然非常困难),因为每个编程操作最终都会降低到处理器级执行。

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

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

以MonetDB的SQL Reference页为例,他们在第三段中说明了以下内容:

  

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

然而,SQL语言甚至不允许输入粗暴的汇编指令,而基于C语言和C#的常用语言允许进行此类输入/导入。

你们觉得怎么样?感谢您分享您的想法!

5 个答案:

答案 0 :(得分:3)

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

尽管如此,这可能是非常难的。

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

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

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

答案 1 :(得分:1)

  

然而,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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

没有。 SQL是一种抽象,可以通过具有不同物理布局的不同SQL环境的不同SQL实现来解释。也许布局甚至会随着时间的推移而变化,就像ALTER TABLE一样,现在你可以混合使用旧的和新的元组布局。此外,您可以使用SQL做更多事情而不仅仅是运行它。您还可以对其进行类型检查,分析它以查看它具有哪种效果,将其放在视图定义或存储过程中等。

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

(*我不是说“vs编译”中的“解释”;我的意思是“赋予意义”。)

答案 4 :(得分:0)

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

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