Device independence
Device independence is the process of making a software application able to function on a wide variety of devices regardless of the local hardware on which the software is used.

Mainframes and minicomputers
High Level Languages, both those with and without an explicit OPEN command, to open a file, often had the ability to abstractly refer to a data file:
 READ(11,21,END=9900) NAME21 FORMAT(A20)
in FORTRAN said to use "unit" 11 – without naming the file.
 READ CUSTFILE, AT END GO TO DONE-FOR-NOW.
in COBOL accomplishes something similar.

Desktop computing
In the early days of computer design and development up until about 1980, software was typically specifically written to operate on the specific hardware where the software was used. The software was intimately linked to the hardware, and could not function independent of it. As computers became less expensive generalized personal computers, the concept of peripheral devices was introduced, where the base hardware could have a variety of different accessory devices from different manufacturers.

At first, software which was to use this accessory hardware was required to be specifically designed to support it. In the time of MS-DOS, game programmers typically had to write custom control software for each type of sound card or video card that might be installed in the user's computer. The need to provide custom support for so many devices consumed a considerable amount of time for software development.

Eventually hardware abstraction layers (HAL) such as DirectX were developed which separate application software from the underlying hardware. The application software does not need to know anything about the hardware on which it was to be used. Instead it discovers the capabilities of the hardware through the standardized abstraction layer, and then use abstracted commands to control the hardware. It is up to the HAL to be able to translate these commands into the specific format required for each device, using device drivers typically provided by the hardware manufacturer.

Virtualization and emulation 
As computing power has continued to increase, there is sufficient processing capacity available for entire hardware devices to be simulated in software. This has brought about the development of the hypervisor and device virtualization and emulation, allowing software written for one specific type of hardware to be reused on completely different hardware, or for seemingly independent operating systems to be made to share a single device.

World Wide Web usage
The web accessible by any device under any circumstance and by all people. The World Wide Web Consortium (W3C) has initiated the Device Independence Working Group, which aims to unify the web, making it accessible from many types of Internet appliances. Its mission is to avoid the breaking up of the web into spaces which only subsets of devices can access.

One key publication of the Device Independence Working Group is the Composite Capability/Preference Profiles recommendation.

WURFL, the Wireless Universal Resource File, is an open-source product that addresses Device Detection and the ability to serve multiple user-experiences to different classes of browsers and devices, based on the capabilities of the requesting HTTP client.

See also
Content adaptation
Multimodal interaction
Web accessibility

External links
Device Independence activity at W3C
Device Independence Principles
Device Independence, Accessibility and Multimodal Interaction
Composite Capability/Preference Profiles (CC/PP): A user side framework for content negotiation describing related, earlier work by W3C

World Wide Web
World Wide Web Consortium