in realtà che il computer sia una macchina... è una immagine pittorica (valida, ma è meglio chiarire): non ci sono parti meccaniche (a parte l'hard disk e il cd-rom, che in un certo senso sono accessori rispetto al computer vero e proprio...); il suo funzionamento è basato sull'elettronica digitale, che usa due livelli di tensione per "funzionare", dunque due "simboli", da cui l'idea che i computer funzionino / capiscano i "codici binari".
i linguaggi C, java ecc. non sono "linguaggi macchina". il linguaggio macchina è 1 (*uno*), ed è determinato dalla "central processing unit", che è il cuore "attivo" del calcolatore, quello che "capisce" i "codici binari" e "fa accadere" delle cose (interagendo con le periferiche, comprese nel novero altre "processing unit")
l'assembly è un linguaggi che si traduce facilmente (leggi: direttamente) nel "linguaggio macchina" di cui sopra, dunque è quanto di più vicino e umanamente abbordabile ci sia alla "macchina".
i linguaggi si dividono grossolanamente in due categorie: compilati e interpretati (oggi la distinzione sfuma... i "compilati" hanno "runtime" che possono considerarsi una sorta di interpreti, e gli interpreti usano delle tecniche di compilazione JIT...)...
i linguaggi compilati vengono "tradotti" da un programma in "linguaggio macchina" (che viene "incapsulato" in un file eseguibile); per gli interpretati, c'è un programma che legge passo passo il "codice sorgente" e "agisce" di conseguenza (come detto è una semplificazione estremista e che non racconta tutta la verità)
ci sono mille altri modi di categorizzare i linguaggi, in base a diverse loro caratteristiche; per esempio ci sono linguaggi procedurali, funzionali, orientati agli oggetti... e miscugli di questi e altri paradigmi.
un'altra categorizzazione possibile è quella dello "scopo" dle linguaggio, cioè se esiste un campo per cui il linguaggi si rivela più adatto degli altri.
meno il linguaggio è astratto e lontano dall'effettivo funzionamento della "macchina" (attraverso il "linguaggio macchina"), più è evidente che le sue potenzialità sono *tutte* quelle del computer; al contrario, linguaggi più astratti (o di alto livello) tendono a specializzarsi più facilmente e rendere facili alcuni compiti, ma impossibili altri...
il C è il linguaggio "general purpose" per eccellenza: cioè ci puoi fare tutto, da scriverci un sistema operativo o un driver per un S.O., fino ai giochi o applicazioni di sistema.
il Java è a metà tra un "compilato" e un "interpretato": in effetti viene "compilato" in un "codice macchina virtuale", che necessità di una "macchina virtuale" per funzionare; di fatto questa "macchina virtuale" è un interprete (che potrebbe anche compilare in "codice macchina nativo" parti del "linguaggio macchina virtuale"). grazie a ciò, la sua portabilità è migliore (lo stesso "esguibile" gira ovunque ci sia la java virtual machine). questa idea non è originale ed è usata anche in altri linguaggi, come i linguaggi "sharp" (p.es. C#).
in java, come in C#, come in python, come in perl come in... è più immediato per esempio fare interfacce grafiche... ma non ci puoi scrivere invece driver, e inoltre non sono tanto efficienti quanto i linguaggi compilati come il C...
quanto sia facile fare una certa cosa in un certo linguaggio dipende poi dal "contorno": cioè l'insieme di librerie di funzioni o classi che "contengono" codice già pronto all'uso per fare certe cose; alcuni linguaggi sono più ricchi di altri in tal senso, ... ma in ogni caso molti linguaggi sono "estensibili", e dunque a *quasi* nessuno è preclusa alcuna possibilità (posto di trovare librerie/classi già scritte che facciano facilmente quella cosa... qui il discorso si dovrebbe aprire su come un linguaggio permette di essere "esteso", magari facendo dei "binding" con del codice scritto in un altro linguaggio... ... ... ..)
alcuni linguaggi sono nati per servire bene uno scopo, come p.es. la ricerca nell'I.A. (lisp, prolog...) e dunque risulta molto difficile fare con questi cose che in C sarebbero banali... ma è vero anche il viceversa: avanzare nello studio dell'I.A. con il C sarebbe estremamente difficile e complicato.
l'html non è esattamente un ling. di programmazione; appartiene alla categoria "linguaggi di marcatura (?... markup)"; in pratica sono linguaggi che "descrivono" qualcosa; ma con essi è impossibile "programmarci" nel vero senso della parole (non sono turing completi ....)