this post was submitted on 22 Jun 2024
543 points (96.4% liked)

Programmer Humor

19623 readers
64 users here now

Welcome to Programmer Humor!

This is a place where you can post jokes, memes, humor, etc. related to programming!

For sharing awful code theres also Programming Horror.

Rules

founded 1 year ago
MODERATORS
 
you are viewing a single comment's thread
view the rest of the comments
[–] [email protected] 30 points 5 months ago* (last edited 5 months ago) (1 children)

To add on to @[email protected] 's comment, "High Level" in terms of programming languages means further away from how the computer processes things and "Low Level" means very similar to how machines process things. For example, binary and hexadecimal (16 bit) machine code such as "assembly language" are both low level.

Imagine if program interpreters were building blocks, then 6 layers of abstraction would be very tall or higher level.

[–] [email protected] 5 points 5 months ago (2 children)

This is pedantic, but assembly languages get "assembled" to machine code. This is somewhat similar to higher level languages being "compiled," which eventually becomes assembly which gets assembled. The major reason why these are different is because a compiler changes the structure of the code. Assembly is a direct mapping to instructions. It just converts the text into machine code directly, which is why it's easy to go from machine code to assembly but decompiling doesn't give you identical results to the original source code.

Also, binary and hexadecimal are just different ways to view the same binary data and aren't different things. There is only "machine code" which is a type of binary data but you can view binary with any arbitrary base, though obviously powers of 2 work better.

[–] [email protected] 4 points 5 months ago

Assembly is a direct mapping to instructions. It just converts the text into machine code directly,

Kinda... yes and no? At least with x86 there's still things like encoding selection going on, there's not a 1:1 mapping between assembly syntax and opcodes.

Also assemblers, at least those meant for human consumption (mostly nasm nowadays) tend to have powerful macro systems. That's not assembly as such, of course.

But I think your "a compiler changes the structure of the code" thing is spot-on, an assembler will not reorder instructions, it won't do dead code elimination, but I think it's not really out of scope of an assembler to be able to do those things -- compilers weren't doing them for the longest time, either.

I think a clearer division would be that compilers deal with two sets of semantics: That of the source language, and that of the CPU. The CPU semantics don't say things like "result after overflow is undefined", that's C speaking, and compilers can use those differences to do all kind of shennanigans. With assemblers there's no such translation between different language semantics, it's always the CPU semantics.