2

つい最近、すべてのプログラミング操作が最終的にプロセッサ レベルの実行になるため、SQL ステートメントをアセンブリ コードで記述することは (非常に困難ではありますが) 可能で達成可能であると友人が示唆しました。

私は SQL の動作について少し調査しました。それはリレーショナル代数の理論とプラットフォームに依存しない実行に従いますが、抽象化とセマンティクスのレベルは、SQL ステートメントをアセンブリ コードに変換する方法を検討することさえ、かなり遠いと考えています (非常に操作/メモリ/リソース固有の命令セット)。

おそらく、SQL ステートメントのプロセッサ操作の結果を模倣し、純粋なアセンブリ命令セットを使用して複製を試みることができます。ただし、まだ SQL ステートメントを作成/翻訳していないことに気付くでしょう。

たとえば、MonetDB のSQL リファレンスページでは、3 番目の段落に次のように記載されています。

「このアーキテクチャは、SQL ステートメントを MonetDB アセンブリ言語 (MAL) に変換するコンパイラに基づいています。このプロセスでは、リレーショナル代数に固有の一般的な最適化ヒューリスティックが実行されます。」

ただし、SQL 言語ではブルート アセンブリ命令を入力することさえできませんが、C ベースや C# などの一般的な言語ではそのような入力/インポートが許可されます。

皆さんはどう思いますか?あなたの考えを共有してくれてありがとう!

4

5 に答える 5

4

コンピューター上で実行されるものはすべて、アセンブリ言語を使用してコーディングできます。お使いのマシンで SQL データベースを実行できる場合は、アセンブリでコーディングできます。

しかし、それはばかげて難しいかもしれません。

あなたが言及したSQLの例は、Cまたは他のコンパイル済み言語が機械語に翻訳されたときに起こることからそれほど離れていません。最新の最適化コンパイラは、C コードをアセンブリに直接変換しません。最適化を実行しやすい 1 つ (または複数) の中間表現を使用します。これは複数のステップからなるプロセスであり、実際のアセンブリの出力は、複雑さの点で主要な部分ではありません。

そのように見ると、SQL のケースはそれほど違いはありません。十分に固定された環境 (特にスキーマ) が与えられた場合、MAL からネイティブ コードを生成する SQL プリプロセッサを想像することができます。そのようなもので、その SQL ダイアレクトに拡張機能を追加して、インライン アセンブリ (たとえば、集計関数) を許可することは理にかなっている可能性があります。そして、そのすべてを手動で (つまり、プリプロセッサ自体なしで) 行うことは可能です。

ただし、ランタイム SQL インタープリターから得られるすべての移植性と柔軟性が失われ、スキーマが変更されるたびに再コンパイルする必要があり、データ依存の最適化がほぼ不可能になるなどです。限定。(通常、VM またはインタープリターを介して実行される他の言語についても同じことが言えます。それらをネイティブ コードにコンパイルするには、通常、厳しい制限があります。)

于 2011-07-19T05:46:47.323 に答える
2

The SQL language however does not even allow for brute assembly instructions to be typed, whereas common languages such as C-based, and C# do allow for such typing/imports.

No, SQL does not allow this because it is a higher level language than C (or C#). In SQL, the code describes what should be done and not how, nor any details on how to do it. The implementation has to parse the code and compile it into a set or low-level instructions that do what SQL code describes.

For example, for a SELECT we have no guarantee on what the plan to access the tables will be, in what order they will be accessed, which (if any) indices will be used, what type of operations will be used for joins, if temporary tables will be used or the sorting is done in memory, etc...

So, something like this would be ill-defined and extremely dangerous to be allowed:

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

No. SQL is an abstraction that can be interpreted* by different SQL implementations with different SQL environments with different physical layouts. Maybe the layouts even change over time, as you ALTER TABLE and now you have a mixture of old and new tuple layouts. Also, there's more you can do with SQL than just run it. You can also type-check it, analyze it to see what kind of effects it has, put it in a view definition or stored procedure, etc.

Here's another way to put it. Can you "write" HTML as assembly language? Maybe you can write a program that, when executed, has the same effect as a browser rendering a particular page. But can your program be processed by AdBlock, NoScript, and whatever other filters I have installed? Anything that supports all of the relevant operations on HTML is going to be isomorphic to HTML itself. Similarly with SQL, and any other language. Any other data structure, in fact: a change in representation must preserve the meaning of all the relevant operations on that data structure. And languages tend to have lots of relevant operations.

(* I don't mean "interpreted" as in "vs compiled"; I mean "given meaning".)

于 2011-07-19T06:46:25.370 に答える
0

マシンは、アセンブリで記述できる命令を実行します。ただし、SQL クエリを実行してアセンブリ言語を直接記述することを、私は呼びません。SQL は非常に異なって解釈される可能性があります... たとえば、生のアセンブリがほとんど意味を持たないコンテキストでは、百科事典を参照する司書によって。

于 2011-07-19T05:49:34.290 に答える