Underscore
477081
223259916
2008-07-03T08:29:17Z
Steve406sbc
7317532
{{For|the type of background music|Underscore (music)}}
{{For|the record labels|Underscore Records}}
{{Punctuation marks|_}}
The '''underscore''' [ _ ], called '''LOW LINE''' in various computer standards, is a character that originally appeared on the [[typewriter]]. Prior to the advent of [[word processing]], the underscore character was the only method of [[underline|underlining]] words. To produce an underlined word, the word was typed, the typewriter carriage was then moved back to the beginning of the word and the word was overtyped with the underscore character.
This character is sometimes used to create visual spacing within a sequence of characters, where a [[white space]] character is not permitted, e.g., in [[computer]] [[filename]]s, [[e-mail address]]es, and in [[World Wide Web]] [[Uniform Resource Locator|URL]]s. Some computer applications will automatically underline text surrounded by underscores: _underlined_ will render <u>underlined</u>. It is also conventionally used in this fashion on [[Usenet]] to indicate emphasis, and can be used in other [[ASCII]]-only media ([[E-mail]], [[IRC]], [[Instant Messaging]]) for this purpose. When the underscore is used for emphasis in this fashion, it is usually interpreted as indicating that the enclosed text is <u>underlined</u> or ''italicised'' (as opposed to '''bold''', which is indicated by *asterisks*).
The underscore is <b>"NOT"</B> the same character as the [[dash (punctuation)|dash]] character, although one convention for text [[news wire]]s is to use an underscore when an [[em-dash]] or [[en-dash]] is desired, or when other non-standard characters such as [[bullet (typography)|bullet]]s would be appropriate. A series of underscores (like _________) may be used to create a blank to be filled in on a form. It is also sometimes used to create a horizontal line, if no other method is available.
The ASCII value of this character is 95. On the standard US or UK 101/102 [[computer keyboard]] it shares a key with the [[hyphen]] on the top row, to the right of the [[0 (number)|0]] key.
==Underscores as diacritic==
{{main|underline}}
The underscore is used as a [[diacritic]] mark, "[[combining low line]]", in some [[African languages|African]] and [[Native American languages]].{{Fact|date=July 2007}}
Not to be confused is the [[combining macron below]].
== Usage in computing ==
<!--This section was removed from [[CamelCase]] since it referes only to underscore usage, not camelcase. It has been temporarily placed here but needs further clean-up. Perhaps it should go into [[combining low line]] or vice-versa. -->
=== Origins of underscores in identifiers ===
In [[computer program|programs]] of any significant size, there is a need for descriptive (hence multi-word) [[identifier]]s, like "<tt>previous balance</tt>" or "<tt>end of file</tt>". However, spaces are not typically permitted inside identifiers, as they are treated as delimiters between tokens. Writing the words together as in "<tt>endoffile</tt>" is not satisfactory because the names often become unreadable. Therefore, the programming language [[COBOL]] allowed a [[hyphen]] ("<tt>-</tt>") to be used between words of compound identifiers, as in "<tt>END-OF-FILE</tt>".
Most programming languages, however, interpret the hyphen as a subtraction operator and do not allow the character in identifier names. The common [[punched card]] character sets of the time had no lower-case letters and no special character that would be adequate as a word separator in identifiers. However, by the late 1960s the [[ASCII]] character set standard had been established, allowing the designers of the C language to adopt the underscore character "<tt>_</tt>" as a word joiner. Underscore-separated compounds like "<tt>end_of_file</tt>" are still prevalent in C programs and libraries.
{{Original research|date=September 2007}}
Programmers working in the tradition of linkage oriented languages, especially the Unix [[C (programming language)|C]] tradition (and later [[C++]]), had many concerns to address. Early [[Unix]] systems (and early personal computers in general) provided [[Linker|linkage]] models where external [[identifier]]s were limited to a short length, often as few as the initial eight characters. Many clashes were possible within the external identifier linkage space which potentially mingles code generated by various high level compilers, [[runtime]] libraries required by each of these compilers, compiler generated helper functions, and program startup code, of which some fraction was inevitably compiled from system [[assembly language]]. Within this [[collision domain]] the underscore character quickly became entrenched as the primary mechanism for differentiating the external linkage space. It was common practice for C compilers to prepend a leading underscore to all external scope program identifiers to avert clashes with contributions from runtime language support. Furthermore, when the C/C++ compiler needed to introduce names into external linkage as part of the translation process, these names were often distinguished with some combination of multiple leading or trailing underscores.
This practice was later codified as part of the C and C++ language standards, in which the use of leading underscores was reserved for the implementation.
A second, independent collision domain was the [[C preprocessor]]. The C language preprocessor is unusual in that it does not respect any language-defined [[Scope (programming)|scoping]] model or reserved [[Namespace (computer science)|namespace]], not even C language [[Keyword (computing)|keywords]]. This problem was generally addressed by writing [[Macro (computer science)|macros]] in macro case which mostly mixes upper case letters with dividing underscores:
#define OPEN_FILE_LIMIT (15)
Once again the implementation must often supply hidden macros, and once again dressing up these "hidden behind the scenes" identifiers with multiple leading or trailing underscores became accepted practice. As this practice became pervasive on both levels, the underscore gained a cognitive association with system level programming, hidden technicalities, and the messy entrails of language support. <!-- tranches was changed to trenches which I just reverted; if you don't like the word choice, rewrite the sentence, but no "trenches" please, that's an awful cliche -->
The C language linkage model further complicated matters by not supporting a strong module-level linkage model. In the C language the concept of [[Module (programming)|''module'']] was initially rather loose. There was no language distinction between function names intended for linkage to other compilation units and function names intended only for use within a single compilation unit to simplify the implementation. The C language provides the ''static'' keyword which makes it possible to hide names from external linkage, but this was rarely employed, as it also obscured these names from most runtime debugging tools.{{Fact|date=February 2007}}
A common early convention was to use names (often prosaic) consisting mostly of lower case letters and underscores for names in external linkage not intended for use by other [[translation unit]]s such as a local function named <code>count_obscure_piddly_flags</code> and [[CamelCase|camel case]] or some variant for primary application calls such as <code>EditSaveFile</code>.{{Fact|date=February 2007}}
[[Ruby (programming language)|Ruby]] and [[Perl]] use $_ as a special variable described as the "default input and pattern matching space" - any output defaults to that variable, and may be omitted.
==See also==
{{Wiktionarypar|underscore}}
*[[underline]]
*[[overline]]
*[[strikethrough]]
<!--categories-->
[[Category:Punctuation]]
[[Category:Typography]]
<!--interwiki-->
[[cs:Podtržítko]]
[[da:Bundstreg]]
[[de:Unterstrich]]
[[eo:Substreko]]
[[fr:Tiret bas]]
[[ko:밑줄 문자]]
[[it:Trattino basso]]
[[he:קו תחתון]]
[[hu:Aláhúzásjel]]
[[nl:Underscore]]
[[ja:アンダースコア]]
[[pt:Underscore]]
[[ro:Underscore]]
[[ru:Подчёркивание]]
[[sv:Understreck]]