Optical Computing: An Introduction