Is a transaction a type of a message? Is message call a call? And which of these results in any state change?
Good question. Both "message" and "call" are, arguably, overloaded terms. This question connects similar-sounding practical concerns and internal formal concerns making it challenging to address.
See Eth's answer for formal definitions of terms. I suspect the intent of the question is of a more practical nature. That is, how to work with the protocol as a developer more than how the protocol itself is defined.
First thing, understand the two modes of interacting with the chain. This can be read-only or with network verification. Adding to confusion, the Web3 method for forcing read-only mode is
message can be a transaction signed by an Externally Owned Account, or from a contract to another account. The latter are deterministic and can be considered instantanious. The former are subject to mining delays.
Hope it helps.
There's "practical" answers to these questions, and "formal" ones.
First, for practicality (and to avoid duplication) an important thing to understand is What is the difference between a transaction and a call?
To answer the questions formally, see Appendix A from the Yellow Paper (YP)
- Is a transaction a type of a message?
No, a transaction that creates a contract is not a message.
Transaction: A piece of data, signed by an External Actor. It represents either a Message or a new Autonomous Object. Transactions are recorded into each block of the blockchain.
To understand a transaction formally, see what a message is:
Message: Data (as a set of bytes) and Value (specified as Ether) that is passed between two Accounts, either through the deterministic operation of an Autonomous Object or the cryptographically secure signature of the Transaction.
In simpler terms, a transaction is either a message or a contract creation. The latter is not a message. (Note also that a message is between two accounts, not necessarily between two contracts.)
- Is message call a call?
Yes. Formally, the Yellow Paper only has message call.
Message Call: The act of passing a message from one Account to another. If the destination account is associated with non-empty EVM Code, then the VM will be started with the state of said Object and the Message acted upon. If the message sender is an Autonomous Object, then the Call passes any data returned from the VM operation operation.
Presumably "call" is a shorthand for "message call" (or simply an omission of the word "message").
Practically, by "call" you are probably referring to eth_call / web3.eth.call which simulates a transaction. Interfaces are outside of the protocol that's why you won't find anything in the YP about these "calls". Since "call" is an overloaded term, there is a proposal for eth_simulateTransaction.
- Which of these results in any state change?
A transaction. From Section 2 of YP:
Transactions thus represent a valid arc between two states; the ‘valid’ part is important—there exist far more invalid state changes than valid state changes. Invalid state changes might, e.g. be things such as reducing an account balance without an equal and opposite increase elsewhere. A valid state transition is one which comes about through a transaction.