Inline:

On Saturday, November 11, 2017 at 2:52:30 PM UTC-5, Dave Cheney wrote:
>
> Hi,
>
> Thanks for following up here.
>
>
>
> On Sunday, 12 November 2017 03:35:27 UTC+11, Petar Maymounkov wrote:
>>
>> Consider a chain of functions that call each other:
>>
>>
>>   func f1(x X) { ... f2(y) ... }
>>   func f2(y Y) { ... f3(z) ... }
>>   and so on.
>>
>>
>> Assume also that their arguments and return values are static Go types 
>> (no interfaces).
>>
>>
>> Generally, such a chain of statically-typed invocations will fall within 
>> the domain of the SSA optimizer and will be rewritten (theoretically) 
>> optimally.
>>
>
> What do these functions do? Can how show some working examples? What do 
> you mean by rewritten?
>


We have a system that code-generates a Go simulator for large 
microprocessor circuits (> 1M gates and subsystems).
Both hardware gates and subsystems are represented as Go functions with 
statically-typed arguments and return values.
Subsystems use/call each other (the recursion).

As is, if we want to benefit from code optimization, we need to 
code-generate the whole micro-processor in one package.
This produces millions of functions per package. 
 

>  
>
>>
>> The issue arises when the invocation chain is recursive, e.g.
>>
>>
>>   func f1(x X) { ... f2(y) ... }
>>   func f2(y Y) { ... f3(z) ... }
>>   func f3(z Z) { ... f1(x) ... }
>>
>>
>> and the user desires to implement f1 and f3 in different packages.
>>
>>
>> This is not possible due to the design of the packaging system (as the 
>> packages of f1 and f3 would have to import each other).
>>
>> Consequently, large amounts of recursive code cannot be spread across 
>> packages.
>>
>>
>> This situation has arisen in practice for us at a pretty large scale 
>> (many/long recursive chains).
>>
>>
>> I am wondering a couple of things:
>>
>> (a) Is there any technical consideration prohibiting large-scale SSA,
>>
>
> There are lots of phases in the compiler, SSA occurs relatively late in 
> the process, and the one that's probably more relevant here is inlining. 
> Inlining does work across package boundaries, exported functions from one 
> package aren't supposed to be treated differently from functions in 
> another, although there could always be a bug. This is where a practical 
> example of what problem you're facing would be really helpful.
>

SSA as an algorithmic technology applies to chains of static calls 
regardless of packaging considerations. (Inlining is a special case of SSA.)
Whether Go/LLVM implement/apply SSA to its full potential is something I 
don't know. Hence the question.
 

>  
>
>> (b) Is there any technical consideration prohibiting go packages from 
>> importing each other.
>>
>
> The prohibition on import loops exists because it would significantly 
> complicate the type checking of the compiler and the package import/export 
> mechanism. it's also just not a good idea from a program design point of 
> view as circular imports often denote high coupling which limit isolation 
> and effective code reuse. 
>

I personally disagree with all considerations stated. But to keep my 
question practical:

I am simply wondering whether the Go compiler is designed to handle 
packages with ~10M static functions,
which invoke each other in cyclical ways. 
 

>  
>
>>
>>
>> Thank you.
>>
>>
>>

-- 
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.
For more options, visit https://groups.google.com/d/optout.

Reply via email to