• Naich@lemmings.world
    link
    fedilink
    arrow-up
    76
    ·
    11 days ago

    I have programmed by looking up op codes in a table on a sheet of paper and entering the hex codes into an EPROM programmer.

    • Cethin@lemmy.zip
      link
      fedilink
      English
      arrow-up
      12
      arrow-down
      1
      ·
      10 days ago

      If you want some modern day fun with this, try the Zachtronics programming games; TIS-100, Shenzhen I/O, and Exapunks.

      Or, my personal favorite I only discovered somewhat recently, try Turing Complete. You start by designing all your logic gates from just a negate gate IIRC. You eventually build up an ALU and everything else you need and then create your own computer. Then you define your own assembly language and have to write programs in your assembly language that run on the computer you’ve designed to complete different tasks. It’s a highly underrated game, although it takes a certain type of person to enjoy.

      • Zangoose@lemmy.world
        link
        fedilink
        arrow-up
        2
        ·
        7 days ago

        Another interesting low-level interpreter/emulated system to look into for anyone else trying to get started with this type of thing is the CHIP-8! It’s a pretty basic 8/16-bit instruction set (there are 35 opcodes, the instructions themselves are mostly simple) and there are tons of detailed guides on making one and writing roms for them.

    • notabot@lemm.ee
      link
      fedilink
      arrow-up
      9
      ·
      10 days ago

      Ah, memories. That was me on a Spectrum. It’s all fun and games until you forget to save (to tape) and your code hangs the machine, losing everything.

    • GenosseFlosse@lemmy.nz
      link
      fedilink
      arrow-up
      5
      ·
      10 days ago

      When I was young, we didn’t have hex codes, we only had 1 and 0s. One time we where all out of 1s, and I had to code a whole Database system with only 0s!

    • Cethin@lemmy.zip
      link
      fedilink
      English
      arrow-up
      2
      ·
      10 days ago

      I would argue they don’t know what that means really. Assembly is pretty much a mapping of words to machine code. It’s just a way to make machine code easier to read. It doesn’t actually change how it works.

      A compiler re-arranges and modifies things so what you write isn’t the same as the final program that is created. With assembly it is. It’s not really an abstraction, but a translation. It doesn’t move you further from the machine, it only makes it so you’re speaking the same language.

    • azdle@news.idlestate.org
      link
      fedilink
      English
      arrow-up
      47
      arrow-down
      1
      ·
      10 days ago

      C was originally created as a “high-level” language, being more abstract (aka high-level) than the other languages at the time. But now it’s basically considered very slightly more abstract than machine code when compared to the much higher level high-level languages we have today.

      • Corbin@programming.dev
        link
        fedilink
        English
        arrow-up
        21
        ·
        10 days ago

        Other way around, actually; C was one of several languages proposed to model UNIX without having to write assembly on every line, and has steadily increased in abstraction. Today, C is specified relative to a high-level abstract machine and doesn’t really resemble any modern processing units’ capabilities.

        Incidentally, coming to understand this is precisely what the OP meme is about.

      • Ziglin@lemmy.world
        link
        fedilink
        arrow-up
        4
        ·
        10 days ago

        I’d say much more highly abstracted than necessarily better (I know plenty of people who despise js and wouldn’t call it better).

      • Cethin@lemmy.zip
        link
        fedilink
        English
        arrow-up
        3
        ·
        10 days ago

        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.

        • barsoap@lemm.ee
          link
          fedilink
          arrow-up
          2
          ·
          10 days 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.

          • Cethin@lemmy.zip
            link
            fedilink
            English
            arrow-up
            3
            arrow-down
            1
            ·
            edit-2
            10 days ago

            I don’t think I said assembly is abstracted. It’s pretty much just a translation.

            Hexidecimal isn’t binary. They’re both just ways to represent numbers. A number displayed in hexadecimal and binary are the same number even though they look different. FF(base 16) = 1111 1111(base 2) = 255(base 10). They’re all identical.

  • IsoSpandy@lemm.ee
    link
    fedilink
    arrow-up
    10
    ·
    10 days ago

    When I learnt programming (back in early 2000s) the textbook said C is a high level 3rd generation language with 4th gen languages being something higher (I don’t remember what examples were given specifically). This is back when the java applets and action script for flash were the hot things. How I miss the days without the world being cursed by JS.

    • Lmaydev@programming.dev
      link
      fedilink
      arrow-up
      1
      arrow-down
      1
      ·
      7 days ago

      Java applets and flash were an absolute security nightmare of the highest degree.

      You were just running applications on your computer.

      If you had to download and run an application on your computer to view a website now people would lose their minds (and rightly so)

  • umbraroze@lemmy.world
    link
    fedilink
    arrow-up
    10
    ·
    10 days ago

    I mean, C is a high level language? Now, sure, C isn’t a super expressive language and every C statement compiles to very few assembly instructions comparatively speaking, but it has a whole lot of stuff that assembly doesn’t have. Like nice loops and other control structures and such, and not worry about which processor registers are used.

  • 30p87@feddit.de
    link
    fedilink
    arrow-up
    9
    arrow-down
    10
    ·
    11 days ago

    In the modern world it’s completely subjective.
    The lowest-level language is probably ASM/machine code, as many people at least edit that regularly, and the highest-level would be LLMs. They are the shittiest way to program, yes, but technically you just enter instructions and the LLM outputs eg. Python, which is then compiled to bytecode and run. Similar to how eg. Java works. And that’s the subjective part; many people (me included) don’t use LLMs as the only way to program, or only use them for convenience and some help, therefore the highest level language is probably either some drag-and-drop UI stuff (like scratch), or Python/JS. And the lowest level is either C/C++ (because “no one uses ASM anyway”), or straight up machine code.