Вот мне интересно, как sbcl проводит арифметические и логические операции. Вот как я себе это представляю:
1. Объявляются эти самые «known» функции в compiler/fndb.lisp
2. В compiler/target/float.lisp и compiler/target/arith.lisp определяются эти самые vop'ы для арифметических/логических операций.
3. При компиляции некоей функции, которая что-то, скажем, складывает, подставляется подходящий vop, или если это сделать нельзя, вызывается «generic-» функция, например generic-+ или generic-*. (как этот выбор происходит мне что-то не ясно)
4. В assembly/target/arith.lisp определяется эта «generic-» функция (которая на самом деле некая непонятная мне сущность assembly-routine). В ней происходит проверка (это уже в realtime), является ли аргуметы fixnum'ами. Если да, то операция проходит быстро (буквально в одну инструкцию) + возможный апгрейд до bignum.
5. Если хоть один операнд не fixnum, вызывается «статическая функция» two-arg-whatever, например two-arg-+. Они определены в code/numbers.lisp. В этом же файле определены «лисповые» арифметические функции. В «two-args-» происходит диспетчеризация по типам, что-то вроде внутреннего аналога typecase и непосредственно выполняется операция.
Ну вот вопросы такие:
1. Что же такое assembly-routine и в чём отличие от VOP?
2. Как подбирается нужный VOP и когда подставляется «generic-» функция?
3. А если я захочу ввести другой числовой тип (например, те же упакованные значения в SSE), что мне нужно будет дописать, чтобы их можно было складывать с помощью лиспового #'+? Есть что-то ещё кроме vop'ов и two-arg-'ов. Как правильно объявить тип, чтобы он был числовым? В compiler/generic/primtype.lisp вроде нет задания какой-либо иерархии.
4. И вообще про типы: primitive type похоже тоже на что-то для внутреннего использования. Видимо для того, чтобы определить, что значение этого типа может храниться в таких-то storage class'ах. А как объявляются «лисповые» типы?
Я думаю, тут такие спецы по sbcl, что разберутся в нем лучше авторов. Хорошо бы тут dmitry_vk и ловсана видеть, если они тут есть. А может ещё mv