libera/#sicl - IRC Chatlog
Search
6:56:20
spiaggia
I changed the specification for how to handle LOAD-TIME-VALUE a little, and I updated the specification at http://metamodular.com/SICL/sicl-specification.pdf section 23.4 I think.
6:56:45
spiaggia
And I successfully implemented the specification as much as is possible without code generation.
6:58:03
spiaggia
Today, I'll continue with more simplifications of the code, made possible by this new way of doing literals and in particular LOAD-TIME-VALUE.
7:00:12
spiaggia
When I decided to make the global heap handled by a non-moving collector, I didn't quite understand all the positive implications of that decision. I am saying that because, for literals, it means that they do not change, so they can appear directly in the instruction stream.
7:01:05
spiaggia
And, again, what some Common Lisp implementations must do in order to make NIL a constant, we get for free with all literals.
7:09:45
hayley
Looks good. Is it possible to put a full absolute address in one place when compiling for a RISC (which is suggested by PATCH-LITERAL taking one index into the code vector)? I guess there is always instruction pointer relative addressing.
7:11:30
beach
It is not possible in general. But a single address is enough to find each partial address to patch in two separate instructions in the instruction stream.
7:11:53
moon-child
on arm and riscv at least, certain literals can be loaded directly, but not all; and there are complex encoding rules
7:12:14
moon-child
however, because of that I would not be surprised if the processor optimised code which loaded a constant from memory
7:13:25
beach
I see. Well, it is not urgent to decide what to do for RISC-V. The important thing is that literals are constant values.
7:25:45
hayley
Sure, just a thought. The comma in "an index into the vector of literals where the immediate that the load-time action generates, must be stored for the benefit of the garbage collector" looks odd too.
7:27:38
hayley
The way I read it was "the immediate that the load-time action generates" is the subject, but it is separated from the verb part by a comma.
7:28:24
hayley
Maybe just moving the comma to "an index into the vector of literals, where the immediate that the load-time action generates must be stored for the benefit of the garbage collector" would work better.
7:30:20
beach
Well, if it looks strange to you both, it is likely to look strange to others as well.
12:35:54
beach
For our bootstrapping technique to work, we need to execute SICL code in the host. The AST evaluator does this by translating the AST to host Common Lisp code, taking advantage of host scoping rules for things like shared variables.
12:37:44
beach
Because, SICL code executed in the host must be able to create static environments for closures that it creates. And the static environment for a closure must be identical to the one used by the native instructions when that closure is converted to native code.
12:38:32
beach
That's where the HIR evaluator comes in. It works on a notation where closure conversion and inlining has already been accomplished.
12:39:32
beach
But what if we could come up with an intermediate representation that looks like AST but where inlining and closure conversion can be accomplished?
12:40:23
beach
Then, each closure-converted function could be translated to host code in a way that uses and produces static environments just like HIR does.
12:40:51
beach
And each function could be translated to native code independently of every other function, via HIR, MIR, LIR, etc.
12:41:24
beach
Then, we would only need a single evaluator for that representation, and not both an AST evaluator and a HIR evaluator the way we do now.
12:41:45
beach
Well, technically, we don't need the AST evaluator, because we could always convert to HIR and use only the HIR evaluator.
12:42:34
beach
And the AST is easier to work with in many ways, so the more we could do at the AST level, the better.
12:43:28
beach
To determine whether inlining is allowed, we at least need to know whether the "inlinee" creates a closure that can escape arbitrarily.
12:44:10
beach
So the question is, can this situation be detected at the AST level, perhaps with some slightly modified AST version?
12:44:54
beach
Next question, can we do closure conversion at the AST level, again possibly introducing some more AST node types.
12:46:29
beach
Some of the techniques described in the literature are source transformations, but source transformations have the disadvantage that source information is lost.
12:46:56
beach
But the AST is almost like source, so such transformations could also be expressed on the AST level.
16:42:51
Bike
i'm thinking about how to do more involved type operations for ctype. sbcl has a lot of examples of these; one is integer-type-length which determines the max number of bits an integer of a given type could need
16:43:09
Bike
the way it's written, it works fine on (integer ...) types, but on (and (integer ...) anything) it gives up
16:44:11
Bike
currently i'm thinking i can define "projection" functions that will get parts of a type of a given kind. so for this function you'd project your given type into range kinds, meaning you'd just get a disjunction of ranges, which you can deal with
16:44:24
Bike
and that will give you a result that's at least as good as if you just got an integer type to begin with
16:51:46
beach
Uh oh! My (admittedly small) family just announced that dinner is served, so I need to vanish. I'll be back tomorrow.