I can think of only two languages, Visual Basic and SQL, where a lone equals sign (without a prefix :, as in Pascal and its illegitimate child Structured Text) does double duty as both binary comparator and assignment operators. Also, I think := and = can do assignment in ST, but the effect is different somehow; does it have summat to do with persistence?
I am pretty sure that in VB it will be interpreted correctly based on context i.e. [IF (A = B) ...] will not assign the value of A to B.
PHP has the double-=, and even a triple-=, comparator.
Lord knows what perl does.
FORTRAN has .EQ. for a comparator.
Python has == for a comparator and will throw an error if summat like [if a=b ...] is attempted.
C will assign a value if a single = is found in an otherwise logical expression i.e. [if (a=b)...] will be true if b is non-0 and will assign the value of b to a; [if (a==b)...] will be true if a equals b and will not change the value of a. Because of this I have gotten in the habit of doing things like [if (1==b)...] instead of [if (b==1)...] so that, if I forget the second =, the compiler will throw an error. The other thing in C is that it is sometimes useful to have that single equals in the if express i.e. [if (status=test_summat(a,b))...] will be true if the result of test_summat(a,b) is non-zero, and it will also put that result into the variable [status], which I can then test to find out what the non-zero status was (C-based functions usually return 0 for success and non-zero for failure). C: all the power of assembler with all the convenience of assembler.
@gatenuator: what was the question; and what was the language being referred to?
Railing against the syntax choices of any language seems like commanding the tide not to come in: pretty pointless.