Do most good compilers generate assembly code first or do they go directly to machine code?
Do most good compilers generate assembly code first or do they go directly to machine code?
A good compiler will do a correct translation between the source code and whatever target language it is built for. Depending on the programming language, what constitutes the build process and the target system of the compiler, a compiler may not even translate source code into assembly or machine code.
Originally Posted by brewbuck:
Reimplementing a large system in another language to get a 25% performance boost is nonsense. It would be cheaper to just get a computer which is 25% faster.
I agree with Mario's explanation, but I'd like to clarify:
C and C++ compilers most often do not produce assembler code, but goes directly to the machine code in an object file. Most, however, have an option to produce assembler code instead of object code.
--
Mats
Compilers can produce warnings - make the compiler programmers happy: Use them!
Please don't PM me for help - and no, I don't do help over instant messengers.
GCC is an important exception, in that nearly all backends go through assembly code and don't even have machine code emitters. GCC relies on the system assembler (GNU as on Linux) for generating machine code.
All the buzzt!
CornedBee
"There is not now, nor has there ever been, nor will there ever be, any programming language in which it is the least bit difficult to write bad code."
- Flon's Law
I was asking this because I was really interested in programming language development and wanted to know whether to learn asm or machine code. Since it seems machine code might be a safer bet, any tutorials or good books to start with?
P.S I tried google for tutorials but couldn't find any.
Asm and machine code are almost the same thing. One is with letters and numbers, the other is in binary or hex. Learn assembly first, because it's more accessible.
For most compilers - machine code first. Outputting assembly code from machine code is relatively easy compared to assembling the assembly code into machine code.
>>Asm and machine code are almost the same thing. One is with letters and numbers, the other is in binary or hex. Learn assembly first, because it's more accessible.
That seems a little unreasonable in my head. Why would you want to do that? This seems to me like a learn C before C++ kind've thing.
Because
mov ax, bx
is more readable than
DF541231234324FDEABAA etc.
And because there are tutorials for learning assembly, but the resources for learning machine code assume that you already know assembly.
I'm not even sure if it makes sense to learn machine code if the hardware manufacturer provided an assembly language.
Originally Posted by brewbuck:
Reimplementing a large system in another language to get a 25% performance boost is nonsense. It would be cheaper to just get a computer which is 25% faster.
Most assemblers tell you the next values of the opcodes. Once you understand assembler a bit you will realize that machine code and assembler are quite interchangeable if you read the hex values of the opcodes. Unless you are writing something that needs to produce the machine code, however, I do not see why one would want to use it (I hate to even use the word learn because there isn't technically anything to learn.... Its more an issue of what values represent what opcode).
Typically in programs that I have written that are capable of altering machine code I will use macros such as
Example:
Thus eliminating the need to look at something nasty and in a binary form.Code:#define LDIV (0x0138) #define LMUL (0x013C)
Is machine code more or less portable than asm? I would imagine asm is more portable among operating systems but machine code is more portable among hardware.
Assembler is not portable at all. It just gives easy to read names to all the opcodes which are just hexidecimal values otherwise. It is nothing more, and nothing less. It would make little sense to not learn assembler. Once you know and understand assembler, you could theoretically write machine code. But to be honest, its hard to read machine code.
NASM is portable among operating systems isn't it?
Across operating systems, yes sure. But to an assembler there is no such thing as an operating system
Originally Posted by brewbuck:
Reimplementing a large system in another language to get a 25% performance boost is nonsense. It would be cheaper to just get a computer which is 25% faster.