On Wed, Sep 23, 2020 at 1:10 AM cs.ali...@gmail.com
<cs.alikoyu...@gmail.com> wrote:
>
> I am not actually questioning the current design, as you both said it is not 
> a good practice to call a return statement as I wrote above, I am trying to 
> understand the relation between memory, interface and order of evaluation. It 
> is clear that the compiler takes account of whether a return statement is an 
> interface or a struct and  the memory size of the returned value, If I return 
> a struct rather than an interface, it changes the order, If I add fields to 
> the structs it changes the order. Is there a paper that I can find why the 
> compiler considers them for ordering, why it is important for performance or 
> anything else?

I'm not aware of any paper specific to the Go compiler.

I find it most useful to consider a compiler as creating a set of
constraints derived from the input based on the language semantics.
These are constraints like in "a = b; b = c" the read of b in the
first assignment must be completed before the store to b in the second
assignment.  Once the set of constraints is created, the compiler must
solve those constraints given an instruction architecture including a
set of registers.  The goal is to optimize execution time while
minimizing compilation time without violating any constraints.
Because compilation time matters, compilers do not fully analyze all
possible solutions; instead, when it comes to things like memory
load/store order, instruction selection, and register allocation, they
are full of heuristics that tend to give good results in practice.

When you view a compiler in that way, a question like "why does adding
fields to a struct change the order of memory loads and stores"
becomes uninteresting.  The reason has to do with the details of all
the constraints that applied while compiling that particular package.
There is no rule that says "if the struct has more fields, do this."
It's just that the set of heuristics happened to produce a particular
result.  Changing some other piece of code in some other part of the
package might produce a different result.  Or a different version of
the compiler might apply different heuristics and get different
results.

Ian

-- 
You received this message because you are subscribed to the Google Groups 
"golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to golang-nuts+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/golang-nuts/CAOyqgcX__%2BKDDnzQ2LjuYm-1gMdrQy%3DLoNB0MmMj%3DaTGJPAF1A%40mail.gmail.com.

Reply via email to