Можно ли написать оператор SQL в коде уровня процессора на простом ассемблере? - PullRequest
1 голос
/ 19 июля 2011

Совсем недавно один из друзей предположил, что можно и достижимо (хотя и очень сложно) написать инструкцию SQL в коде сборки, поскольку каждая операция программирования в конечном итоге сводится к выполнению на уровне процессора.

Я сделал немногоисследования поведения SQL, и хотя оно следует теории реляционной алгебры и независимому от платформы выполнению, я все еще считаю, что уровень абстракции и семантики довольно далеки, чтобы даже рассмотреть способ перевода оператора SQL в ассемблерный код (очень операции /специфический для памяти / ресурсов набор инструкций).

Возможно, вы могли бы имитировать результат операций оператора оператора SQL и попытаться воспроизвести его с помощью чистого набора инструкций сборки.Однако вы поймете, что вы все равно не будете писать / переводить операторы SQL.

Взять, к примеру, Справочник SQL страницы MonetDB, в третьем абзаце говорится следующее:

"Архитектура основана на компиляторе, который переводит операторы SQL на язык ассемблера MonetDB (MAL). В этом процессе выполняются общие эвристические методы оптимизации, характерные для реляционной алгебры."

Однако язык SQL даже не позволяет вводить команды грубой сборки, в то время как общие языки, такие как C и C #, допускают такую ​​типизацию / импорт.

Что вы, ребята, думаете?Спасибо, что поделились своими мыслями!

Ответы [ 5 ]

3 голосов
/ 19 июля 2011

Все, что работает на вашем компьютере, может быть закодировано на языке ассемблера.Если база данных SQL может работать на вашем компьютере, то она может быть закодирована в сборке.

Это может быть нелепо сложно сделать.

Пример SQL, который вы упомянули, не так уж далекиз того, что происходит, когда C или другие скомпилированные языки переводятся в машинный код.Современные оптимизирующие компиляторы не переводят ваш код C непосредственно в сборку.Они используют одно (или несколько) промежуточных представлений, которые проще выполнять для оптимизации.Это многоэтапный процесс, и фактический вывод сборки не является основной частью сложности.

Если вы посмотрите на это так, ваш вариант SQL не сильно отличается.Вы можете представить себе препроцессор SQL, который создает собственный код из MAL в достаточно фиксированной среде (в частности, в схеме).Что-то в этом роде может иметь смысл добавить расширения к этому диалекту SQL, чтобы позволить встроенную сборку (например, для агрегатных функций).И делать все это вручную (то есть без самого препроцессора) было бы возможно.

Однако вы теряете всю переносимость и гибкость, которые вы получаете от интерпретатора SQL времени выполнения, придется перекомпилировать каждый раз, когда ваша схема изменяется,оптимизация, зависящая от данных, становится почти невозможной и т. д. Таким образом, ситуации, в которых это было бы полезно, я считаю, очень ограничены.(То же самое относится и к другим языкам, которые обычно запускаются через виртуальную машину или интерпретатор - компиляция их до нативного кода обычно имеет серьезные ограничения.)

1 голос
/ 19 июля 2011

Однако язык 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
0 голосов
/ 28 июля 2011

Если вы заинтересованы в компиляции реляционных запросов / операций для ассемблера, вы можете проверить эту статью: http://www.vldb.org/pvldb/vol4/p539-neumann.pdf. В этой СУБД компоненты LLVM используются для создания инструкций процессора (что, я полагаю, это то, что вы имеете в виду, когда говорите ассемблер) из запроса в СУБД.

Кроме того, хотя я мог бы проповедовать хору, я хочу прояснить, что MAL не имеет ничего общего с ассемблером инструкций процессора. Каждое отдельное MAL-выражение, опирающееся на реализацию в C. MAL используется только (taadaa :) в качестве промежуточного представления, которое легко оптимизировать и интерпретировать.

0 голосов
/ 19 июля 2011

Нет.SQL - это абстракция, которая может интерпретироваться * различными реализациями SQL с различными средами SQL с разными физическими схемами.Возможно, макеты даже меняются со временем, так как вы ALTER TABLE, и теперь у вас есть смесь старых и новых макетов кортежей.Кроме того, с SQL вы можете сделать больше, чем просто запустить .Вы также можете проверить его, проанализировать, чтобы увидеть, какие эффекты он имеет, поместить его в определение представления или хранимую процедуру и т. Д.

Вот еще один способ обозначить это.Можете ли вы «написать» HTML как язык ассемблера?Возможно, вы можете написать программу, которая при запуске будет иметь тот же эффект, что и браузер, отображающий определенную страницу.Но может ли ваша программа обрабатываться AdBlock, NoScript и другими установленными мной фильтрами?Все, что поддерживает все соответствующих операций над HTML, будет изоморфно самому HTML.Аналогично с SQL и любым другим языком.Фактически, любая другая структура данных: изменение представления должно сохранять значение всех соответствующих операций в этой структуре данных.И языки, как правило, имеют много соответствующих операций.

(* Я не имею в виду "интерпретировать", как в "vs compiled"; я имею в виду "данное значение".)

0 голосов
/ 19 июля 2011

Ну, машина выполняет инструкции, которые вы могли бы написать на ассемблере.Однако я бы не стал писать на ассемблере напрямую, выполняя SQL-запрос.SQL можно интерпретировать совсем по-другому ... например, библиотекари, обращающиеся к энциклопедии, в тех случаях, когда необработанная сборка может иметь мало значения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...