Программный код для описания всяких вещей обычно слишком конкретен. К тому же, для правильного понимания ваших идей человеку придётся изучить именно тот язык, на котором вы написали; кроме того, вы можете сами нечайно, забыв о каких-нибудь деталях, сделать описание неправильным.
Математический язык легко дополняется, достаточно посмотреть какие-нибудь книги по, например, Haskell.
Что может математическая нотация чего не может код? Так как я не очень разбираюсь в математике, соответственно самостоятельно ответит на этот вопрос не смогу.
Кошмарно много. Конечно, есть языки достаточно высокого уровня, в которых описание почти не будет замутнено деталями реализации, но всё равно оно будет нести «отпечаток» данного языка.
И опять, для понимания кода на конкретном языке программирования надо его знать очень хорошо и писателю кода, и читателю. Нельзя надеяться на какие-то общие места разных языков. Используя математический язык, придётся все нетривиальные вещи определить явно.
(Хотя, конечно, любым языком можно пользоваться неправильно, в частности, чрезмерно конкретизируя. Часто встречал неуместные индексы в примерно таких выражениях: «пусть
; бла-бла от
и
» (это, кстати, и не совсем корректно — неравенство индексов не гарантирует неравенства, для этого придётся дописывать ещё), когда можно было бы написать «пусть
; бла-бла от
и
» и не загрязнять текст потом носимыми туда-сюда бессмысленными индексами.)