Programming languages are (designed to be) easily used by machines, but not people.
Natural languages (like English) are easily used by humans, but not machines.
Programming languages are unambiguous, while natural languages are often multiply ambiguous and require interpretation in context to be fully understood (also why it’s so hard to get machines to understand them). Natural languages are also creative and allow poetry, metaphor and other interpretations. Programming does allow some variation in style, but the meaning is not flexible.
Lojban (Wikipedia) is an artificial language designed to try to bridge the gap between these two types of languages. It is specifically unambiguous yet something that a human can pronounce and even speak meaningfully. It can be considered a somewhat successful experiment yet limited in functionality in some ways in both domains (and not a real substitute for a normal programming language, but perhaps useful as an interface).
Natural languages consist of sentences, usually declarative sentences expressing information in a sequence. Programming languages typically are not declarative but procedural, giving instructions to the machine to do something (like commands in natural languages). Rarely, programming languages are declarative, such as Prolog, where statements are given to the computer, then the evaluation consists of finding possible solutions that match those statements (generate a list of words based on possible combinations of letters as defined just by letter-combining rules, for example).
The vocabulary of natural languages is filled with conceptual terms. The vocabulary of programming languages is generally only ‘grammatical’/functional ‘words’ like basic comments, plus various custom-named things like variables and functions. There are no words like you’d look up in a dictionary to express something like ‘love’ or ‘happy’ or ‘sing’.
The grammatical structures vary in more ways than are easy to list here. But some of the most obvious factors are that words don’t have separable parts in programming languages (like English cat-s to form a plural) [=no morphology], and that via brackets, line breaks or other markers, embedding tends to be overtly and clearly marked on both sides for the parser in programming languages, whereas spoken languages usually only have one word (like “that”) linking embedded sentences, and sometimes no word at all. This is another reason that parsing human languages is so hard on a computer.
You could also look at Hockett’s design features and see which apply to programming languages: What is the difference between human and animal language?
In a very general sense, programming languages aren’t used for bidirectional communication and may not properly be considered “languages” in the same sense as natural languages. Just looking at Hockett’s features, they’re completely distinct in being written only, do not involve interchangeability between the speaker and hearer, do not have ‘duality of patterning’ meaning multiple layers of structure as sounds vs. phrases (phonology vs. syntax), and are not transmitted culturally (well, maybe). It’s just very hard to even try to make the comparison.
Most fundamentally, it is worth asking if programming languages even have meaning, or if they are just instructions. This is similar to the Chinese room thought experiment— given a book of instructions for how to translate Chinese, but without actually understanding it, would a human (or computer) with that book be considered to “know” Chinese? Probably not. A computer doesn’t “know” anything, it just does what the instructions tell it to. Therefore, programming languages have no semantics/meaning. They just are instructions, which translate into electronic signals, nothing more.