usually exuberant ctags is used to create tag files. The tag files are a index files telling editors like Vim or Emacs where functions, classes or other things are defined.
There are plugins which can retag directories automatically. exuberant-ctags can be told by regex about new languages easily.
Probably the most useful vim command is :tjump and you can use :tjump /foo<c-d> to list all names containing foo and the like.
Some languages such as PHP, nix, urweb require tags files for completion.
some languages (such as Haskell) ship their own tagging various tagging tools
:set tags=tags will make Vim search for tag files in the current dir and all parent directories, see :h file-searching