A **terminal** or a **console** is a piece of hardware, using which a user can interact with a host. Basically a keyboard coupled with a text screen. 
Nowadays nearly all terminals and consoles represent "virtual" ones.

The file that represents a terminal is, traditionally, called a **tty** file. If you look under the "/dev" directory of a UNIX system, you'll find a lot of **tty** files connected to virtual consoles (e.g. tty1 on linux), virtual terminals (e.g. pts/0) or physically connected hardware (e.g. ttyS0 is the physical serial terminal, if any, attached on first serial port of the host).

A **console** must be a piece of hardware physically connected to (or part of) the host. It has a special role in the system: it is the main point to access a system for maintenance and some special operation can be done only from a console (e.g. see `single user mode`). A **terminal** can be, and usually is, a remote piece of hardware.

Last, but not the least, a **shell** is a special program that interacts with a user through a **controlling tty** and offers, to the user, the way of launching other programs (e.g. bash, csh, tcsh).

A **terminal emulator** is a program that emulates a physical terminal (e.g. xterm, gnome-terminal, minicom).

So when you look to a "text window" on your linux system (under X11) you are looking to: a *terminal emulator*, connected to a *virtual terminal*, identified by a *tty* file, inside which runs a *shell*.