Nedostatků formálních jazyků je habaděj. Např.: z definice jsou vymyšlené tak, aby měly přesnou sémantiku, čili (1) ta sémantika je nějak "ořezaná" (odstraní se nejednoznačnosti apod.) a tím jazyk získává přesnost na úkor expresivnosti. Typicky je taky formální jazyk (2) ušitý na míru nějaké doméně - opět ztrácí obecnou expresivnost. Prakticky vždycky je taky (3) formální jazyk konstruovaný tak, že některé koncepty, které v přirozeném jazyce vyjádřit umíme, v něm vyjádřit nejdou (záměrně - protože jejich vyjádření by jazyk neúměrně zkomplikovalo a buď by bylo složité s ním pracovat strojově, nebo by byl těžko srozumitelný pro lidi).
Pokud by nebyl programovací jazyk míň expresivní než přirozený, komentáře by nebyly potřeba, protože sám program by vyjadřoval všechno, včetně záměru autora, kontextu volby algoritmu apod. Tak to ale není, komentáře potřeba jsou, abych tam třeba dovysvětlil, že "toto řešení se mi zdá rozumnější, protože je sice míň efektivní, ale je líp čitelné a nejsme v kritické sekci programu" (případ (1)), "tohle je quick&dirty, protože zákazník je ve finanční tísni a potřebujeme to rychle dotáhnout, není čas na hrdinství" (2) nebo "tento kód je teď jenom placeholder pro kontroller, plnou implementaci dodělám, až bude čas" (případ (3) - vyjádření časově závislé individuové role je docela obtížně formalizovatelné).
Vidím to poněkud jinak. Program může obsahovat v zásadě čtyři skupiny informací:
CO se má stát. (Nutné, proto tu ten program je).
JAK se to má stát. (V ideálním světě si to překladač nějak odvodí z deklarace, ale v tom reálném se mu musí pomáhat).
PROČ se to má stát. (Zasazení kusu kódu do kontextu, aby se v tom programátor lépe orientoval).
A PROČ SE TO DĚLÁ ZROVNA TAKHLE. (Vysvětlení konkrétního rozhodnutí pro danou implementaci).
První dvě skupiny jsou "mezi počítačem a člověkem" a zde je myslím obecně přijímáno, že formální jazyk je ideální prostředek, protože je úsporný a jednoznačný. Zbylé dvě skupiny informací jsou jednak volitelné (program bez nich funguje dobře) a jednak slouží pouze pro referenci, když programátor potřebuje. V ostatních případech je to šum, který pouze odvádí pozornost a kdyby se i nakrásně povedlo formalizovat komentář, stroji by to nepomohlo (informace pro něj není určena) a lidem by to překáželo, protože TLDR, že ano.
Jinými slovy, programovací jazyk výborně slouží účelu, ke kterému je navržen a komentář slouží dobře ostatním účelům. To není známka nedokonalosti formálních jazyků. V obecném slova smyslu jistě platí, že formalizovaná komunikace mezi lidmi není efektivní, ale v rámci naší původní debaty to myslím nehraje roli.