Warning: mysqli::__construct(): (HY000/1203): User howardkn already has more than 'max_user_connections' active connections in D:\Inetpub\vhosts\howardknight.net\al.howardknight.net\includes\artfuncs.php on line 21
Failed to connect to MySQL: (1203) User howardkn already has more than 'max_user_connections' active connections
Warning: mysqli::query(): Couldn't fetch mysqli in D:\Inetpub\vhosts\howardknight.net\al.howardknight.net\index.php on line 66
Article <vbekut$1kd24$1@paganini.bofh.team>
Deutsch   English   Français   Italiano  
<vbekut$1kd24$1@paganini.bofh.team>

View for Bookmarking (what is this?)
Look up another Usenet article

Path: ...!3.eu.feeder.erje.net!2.eu.feeder.erje.net!feeder.erje.net!newsfeed.bofh.team!paganini.bofh.team!not-for-mail
From: Waldek Hebisch <antispam@fricas.org>
Newsgroups: comp.lang.c
Subject: Re: Top 10 most common hard skills listed on resumes...
Date: Fri, 6 Sep 2024 10:19:11 -0000 (UTC)
Organization: To protect and to server
Message-ID: <vbekut$1kd24$1@paganini.bofh.team>
References: <vab101$3er$1@reader1.panix.com>   <valrj7$367a8$2@dont-email.me> <87mskwy9t1.fsf@bsb.me.uk> <vanq4h$3iieb$1@dont-email.me> <875xrkxlgo.fsf@bsb.me.uk> <vapitn$3u1ub$1@dont-email.me> <87o75bwlp8.fsf@bsb.me.uk> <vaps06$3vg8l$1@dont-email.me> <871q27weeh.fsf@bsb.me.uk> <20240829083200.195@kylheku.com> <87v7zjuyd8.fsf@bsb.me.uk> <20240829084851.962@kylheku.com> <87mskvuxe9.fsf@bsb.me.uk> <vaq9tu$1te8$1@dont-email.me> <vbci8r$1c9e8$1@paganini.bofh.team> <vbcs65$eabn$1@dont-email.me>
Injection-Date: Fri, 6 Sep 2024 10:19:11 -0000 (UTC)
Injection-Info: paganini.bofh.team; logging-data="1717316"; posting-host="WwiNTD3IIceGeoS5hCc4+A.user.paganini.bofh.team"; mail-complaints-to="usenet@bofh.team"; posting-account="9dIQLXBM7WM9KzA+yjdR4A";
User-Agent: tin/2.6.2-20221225 ("Pittyvaich") (Linux/6.1.0-9-amd64 (x86_64))
X-Notice: Filtered by postfilter v. 0.9.3
Bytes: 8365
Lines: 174

Bart <bc@freeuk.com> wrote:
> On 05/09/2024 16:21, Waldek Hebisch wrote:
>> Bart <bc@freeuk.com> wrote:
>>>
>>> So what exactly is different about the LHS and RHS here:
>>>
>>>     A = A;
>>>
>>> (In BLISS, doing the same thing requires 'A = .A' AIUI; while 'A = A' is
>>> also valid, there is a hidden mismatch in indirection levels between
>>> left and right. It is asymmetric while in C it is symmetric, although
>>> seem to disagree on that latter point.)
>> 
>> You seem to miss the point that assigment operator is fundamentally
>> assymetic.
> 
> If you've followed the subthread then you will know that nobody disputes 
> that assignment reads from side of '=' and writes to the other.

I dispute this and I think that to same degree several other folks too.
Assgmenet _does not read_, it "only" writes.  Assigment get two
parameters which are treated in different way.  Imagine that you
are programming in a language like C, but are forbidden to use
assignment operator.  But fortunately you have C "function"
'assign' with prototype:

void assign(int * p, int v);

Instead of writing

    A = B

you need to write

    assign(&A, B)

Of course, in real life nobody is going to force you to anything,
but except for fact that in C assignment has value the 'assign'
function is doing the same thing as '=' operator.  And you can
see that it is asymetric: first agrument is an addres and right
is a value.

> The symmetry is to do with syntax when the same term appears on both 
> sides of '=', the type associated with each side, and, typically, the 
> internal representations too.

Simple compiler after parsing does not need "operators" at all.
You have parse tree where instead of "operators" are function
calls (of course you still need control structures).  Code
generator has table and if function to be called is in the table,
than it emits corresponding instruction(s), otherwise it emits
real call.  For assignment table simply will contain store
instruction.

> Clearly the '=' operation is not reversible (or cummutative), as binary 
> '+' might be, but not binary '-'. That is not what I'm claiming.
> 
>>  This is quite visible at low level, where typical
>> machine has 'store' instruction.  Store takes address (memory location)
>> as left argument, but a _value_ as right argument.  Your example
>> introdices fake symmetry, you ealuate right hand side using
>> a load ant this may look symmetric with store.
> 
> Low level can reveal symmetry too. If 'A' is stored in a register 'Ra', 
> then copying A to itself can be done like this on x64:
> 
>     mov Ra, Ra
> 
> (Whether data movement is RTL or LTR depends on the assembly syntax, but 
> in this example it doesn't matter.)

That is _very_ special case and for this reason misleading.

> If A is in memory then it could be the same on 2-address architectures:
> 
>     mov [A], [A]
> 
> but more typically it needs two instructions (here using RTL):
> 
>    mov R, [A]
>    mov [A], R
> 
> Here, [A] appears in both instructions, it means the same thing, and 
> refers to the same location. Only the position (left vs. right operand, 
> exactly the same as in A = A) tells you if it's reading or writing.
 
You somewhat miss fact that "A = B" has 3 parts, that is "A", "=", and "B".
The second 'mov' instruction came from "=", the first 'mov' is extra.
So instructions look symmetric, but clearly assigment part is asumetric.

> 
>>  But even here
>> there is asymetry, which is better visible with naive compiler.
>> You may get code like
>> 
>>     compute addres of A
>>     load
>>     compute address of A
>>     store
>> 
>> The last step implement '=', the second 'compute address' corresponds
>> to A on the left had side.  First 'compute address' corresponds to
>> A on the right hand side.  Now you see that beside address computation
>> there is also load corresponding to A on the right hand side.
> 
> 
>> So clearly in most languages treatment of sides is assymetric:
>> extra loads are inserted due to 'lvalue convertion'.
> 
> There is a Load on one operand and a balancing Store on the other. Two 
> loads or two stores would not make sense here.

Again: only store comes from assignment.  This is clearly visible
if instead of misleading "A = A" you take "A = B" and replace
'B' by various things.  Assigment part (store instruction) stays
the same, compution of value changes.  In

A = c  + d

you get two load (for c and d) and then addition.  To put it
differently, you have

compute value of B
compute address of A
store

the "compute value of B" may be as trivial as putting constant
as part of store instruction, it may be load as in your case,
it may be compute value of some complex expression.  Similarly,
"compute address of A" part can trivialize when 'A' is in
machine register, sligtly less trivial address of 'A' may be
constant put into store instruction, 'A' may a local variable
at some offset from stack, then again many machine can do this
as part of address calculation in store instruction.  But 'A'
may be more compilcated and then you need real computaion and
extra instructions.

Anyway, only store instruction corresponds to assigment operator
proper, 'A' and 'B' just compute parameters for assigment.

> If you want to go to a lower level, look at how a simple microprocessor 
> works. It will generate a /WR signal on memory accesses that tells a RAM 
> device whether to use the data bus as input or output.
> 
> Note that Load and Store can also be considered symmetric: each Load 
> reads data from somewhere and writes it somewhere else. Just like Store 
> does. So some instruction sets use the same mnemonic for both.

Concerning instruction, sure.  But load is not an assignment.
It may look so in simple misleading cases.  But even if 'A' is
allocated to register and you translate whole "A = B" to single
load, the load computes value of 'B' and if the result is in
correct register the assigment proper can be optimised to no
operation.

>> 
>> To put in more general context: early success of C was related
>> to exposing address computations, so that programmers could
>> do optimization by hand (and consequently non-optimizing compiler
>> could produce reasonably fast object code).  This has a cost:
>> need for explicit point dereferences not needed in other langiages.
>> Bliss went slightly further and requires explicit derefernces
>> to get values of variables.  My point is that this is logical
>> regardless if you like it or not.
> 
> And /my/ point was that in virtually every HLL, that dereference to turn 
> a variable's address, denoted by its name, into either a read or write 
> access of its value, is implicit.

I partially agree.  Normal case is that write access is explicit
(for example via '=' in C) and it simly takes variable address.  Only
read access in implicit.

-- 
                              Waldek Hebisch