(Semiotica) Icon Index Symbol and Denotation Connotation Metasign
(Semiotica) Icon Index Symbol and Denotation Connotation Metasign
connotation, metasign
Abstract
1. Introduction
Semiotics has long had two sign models: the dyadic model proposed by
Saussure and the triadic model proposed by Peirce. However, the cor-
respondence between these models has always been controversial. Tra-
ditionally, it has been thought that Peirce’s interpretant corresponds to
Saussure’s signified and that Saussure’s model lacks Peirce’s object (Eco
1988; Noth 1990). In Tanaka-Ishii (2006), we raised a di¤erent hypothesis
based on semiotic analysis of the two most widely used computer pro-
gramming paradigms. We showed that Peirce’s object formally corre-
sponds to Saussure’s signified and that Saussure’s sign model is obtained
when Peirce’s interpretant is located outside of his model in the language
system. One of the major conclusions drawn from our analysis is that the
two models are compatible.
Our discussion regarding the correspondence of these two frameworks
considered only the basic level of sign models. In this paper, we go further
by trying to establish correspondence between two theories, each raised
within either the dyadic or the triadic framework.
Historically, dyadic and triadic sign models form di¤erent cultures, and
they are applied to semiotic targets independently. Discussion of any
correspondence, other than that of the sign models themselves, has been
rare. One exception is Parret, who compares Hjelmslev’s and Peirce’s
theories (Parret 1983: ch. 2). However, Parret thoroughly compares these
theories only from a philosophical viewpoint without showing any actual
correspondence between the theories.
Our belief is that if theories in either the dyadic or the triadic tradition
are genuinely relevant, then such theories should appear in some form in
both frameworks. If so, what does Peirce’s sign categorization, which is a
major result of Peirce’s work, correspond to within the dyadic frame-
work? Contrarily, which framework within the triadic model corresponds
to Hjelmslev’s connotative and metasemiotics?
Given that dyadic and triadic semiotic frameworks look totally unre-
lated, one way to tackle this problem is to find a common semiotic target
to which theories of both dyadic and triadic tradition seem to apply. As
in our previous paper, where we found a target in programming lan-
guage, we take a programming language issue as our analysis target
and see how the dyadic and triadic models apply to it. Through such
applications, we see how dyadic and triadic theories correspond to one
another.
The semiotic problem handled in this paper is as follows. In the pro-
gramming language domain, a controversial expression is often used:
x ¼ x þ 1.
First, ‘¼’ here means the action of assignment to set a value to the sign
x, not an equality in the mathematical sense. This expression is an in-
struction to update the value of x by one. For example, if x had a value
of 3 before this expression, its value will become 4 after the execution of
this expression. This kind of value updating is widely used, especially in
the imperative programming paradigm.
This simple programming expression has led to an enormous amount
of discussion among programming language designers because the sign
x on the left side does not signify the same content as the same sign
on the right side; this is not only so in terms of the value, but also
from a more semiotic aspect. Precisely, x on the right side means the
value of x (such as 3 or 4), whereas x on the left side means the refer-
ence, the memory address where the value of x is stored. Thus, this ex-
pression is executed as follows: 1. get the value stored at the memory
address labelled x; 2. add one to that value; 3. re-store the result at
the memory address labelled x. The point here is that the sign x has
di¤erent meanings within one expression: it can be either a value or a
reference.
This program does nothing special: it just allocates one word memory
space named var and then stores its value 1234 or reference into ax, the
register i.e., special memory space used for calculation inside the CPU.
Here, mov and lea show CPU operations, and var is an identifier that rep-
resents an address of the computer memory. In addition, dw and o¤set are
pseudo-operations, which indicate to the assembler software how the pro-
gram should be translated into binary machine language (so they are not
related to our discussion here).
Note that in this example, var represents two di¤erent values at the
same time:
In line 2, for example, var means the value stored at the memory space
represented as var, whereas in lines 3 and 4 var means the address of the
place. Thus, since all values are stored in memory and each memory
space has an address, a memory address can mean the address itself or
the value.
Such ambiguity cannot be resolved by looking at only the sign. It re-
quires contextual information just as with natural language. Here, the
context is
For example, lines 2 and 3 share the operation even though var means the
value in line 2 and the reference in 3, so the existence of o¤set signifies
that line 2 means the reference.
This confusion between reference and value at the machine language
level cannot be resolved in higher-level languages, and often appears as
in the example given in the previous section.
In the expression x ¼ x þ 1, x is the identifier, just as var is in the as-
sembly language example. An identifier in programs is translated into a
memory address by the compiler software, so the same ambiguity prob-
lem arises as to whether it should be denoted as a value or a reference.
The ambiguity is resolved through the context. In the x case, the context
means the side of the assignment operation indicated by ‘¼’. The x on
the left side is called the l-value meaning that x denotes a reference,
and that on the right side is called the r-value meaning that x denotes a
value.
The same confusion occurs every time an identifier is referred to. A sig-
nificant example of this within programming languages is the contrast be-
tween call-by-reference and call-by-value, which is an important concept
that any programmer should understand. Here, we consider the following
sample program in Java (Arnold et al. 2000).
1: void noset(int b) {
2: b ¼ 123;
3: }
4:
5: void set(int[ ] a, int i) {
6: a[i] ¼ 123;
7: }
8:
9: void test( ) {
10: int[ ] v ¼ new int[100];
11: v[0] ¼ 789; //v[0] is set to 789
12: set(v, 0); //v[0] is set to 123
13: int x ¼ 456; //x is set to 456
14: noset(x); //x is not set to 123
15: }
There are three functions: noset, set, and test. The noset function receives
b as input and sets its value to 123. This is called from line 14 of the pro-
gram, where x is handed to noset as input after its value is set as 456 in
line 13. The same action is done for the function set, which receives an
array a and sets the i th element of the array to 123. set is called at line
12, with the argument being array v whose 0 th element is previously set
to 789 in line 11. Basically, set and noset perform similar actions: both
just assign 123 to the input value.
When these functions are called, though, the result appears to be to-
tally di¤erent: v[0]’s value is set to 123, but the value of x remains un-
changed. This is because noset calls b by value, whereas set calls a by
reference. When noset is called, a new space b is allocated and the value
is copied from x, so b is initialized to the value 456. Entering the function
body, its value is reset to 123, but the original value of x will not change
because b and x are di¤erent memory spaces. On the other hand, the
value of v is the reference (memory address) of the array. When set is
called, a is newly allocated, and the value of v, the reference of the array,
is copied. Thus, a and v indicate the same content, the reference of the
array.
When the first element of array a is changed to 123, the value of array v
also changes, of course. The di¤erence is illustrated in Figure 1. The dif-
ference is again distinguished by context: this time in Java, what data
type the identifier indicates. Among programming languages, there are
typed languages and untyped languages. According to Gosling et al.
(1996), types limit the values that a variable can hold or that an expres-
sion can produce, limit the operations supported by those values, and de-
termine the meaning of the operations. Thus, a type generalizes a set of
data and groups data so that they can be handled equally. Java is a typed
language; for example, an integer is a type (denoted as int), and an array
of integers is another type (denoted as int[ ]).
1: class Dog {
2: String nm;
3: Dog(String name) {nm ¼ name;}
4: void run( ) {
5: // . . .
6: }
7: }
8:
9: void test( ) {
10: Dog jolly ¼ new Dog(‘‘Jolly’’);
11: jolly.run( );
12: }
Here, a data type Dog is defined from lines 1 to 7 and an instance is allo-
cated in line 10. The expression
jolly ¼ Dog.new(‘‘Jolly’’)
where new calls the function initialize. In Ruby, the type name Dog al-
ways meaning type. Thus, the confusion between value and type can es-
sentially be avoided. This di¤erence from the value-reference case arises
because values within computer programs are not typed; i.e., type is an
x : ref Dog
m; n : INTEGER;
the leftmost Dog is the metasign where the expression is Dog and the
content is equal to the set of instances including a dog data named ‘Jolly.’
At the object language level, the expression is jolly and content is the in-
stance allocated as Dog(‘‘Jolly’’), which denotes the actual data. Here,
again, we see that a data is multiply expressed: by denotation, then by a
connotation as object language, and then by its metasign. This require-
ment to represent a data at di¤erent levels leads to questions as to how
each expression should be designed. Java uses a solution of taking the
same expression for the metasign and the denotation.
Consequently, the correspondences could be that signs within pro-
grams that denote values only as values are denotations, references are
connotations, and types are metasigns with object-language overlapping
the connotational semiotics layer. The confusion we described in the
previous section is caused by multiple semantics lying on top of one an-
other. The detection of which layer a sign is situated on is enabled by the
context.
Related to the application of Hjelmslev’s connotative and metasemi-
otics to programming languages, there are two domains of programming
theories, each of which attempts to strictly eliminate such sign confusion
and enhance rigid semantic interpretation of programs. One is called
denotational semantics, which aims at rigidly describing the semantics of
a program in order to guarantee the program reliability. Within denota-
tional semantics, programs are transformed into another strict language
based on logic, where there is no problem of connotation. In this logical
form, a program is mathematically proven by deducing the resulting
value (Tennent 1991). The second domain is called type theory, and was
founded partly in response to Russell’s paradox. Type theory is applied to
a programming language as a ‘tractable syntactic method for proving the
absence of certain program behaviors by classifying phrases according to
the kinds of values they compute’ (Pierce 2002). Type theory analysis is
conducted totally at the meta-level of type and is realized through com-
piler type-checking tools. The meta-language and denotation levels both
handle the object language so as to aid the intermediate layer of connota-
tion as object language is handled by humans.
Table 1. Peirce’s classification of signs based on a universal category for each aspect of signs
where the leftmost Dog is a symbol, jolly is an index, and Dog on the
right side is an icon denoting the value.
Consequently, correspondences can be established that an icon is a
value, an index is a reference, and a type is a symbol. The cause of the
confusion described in section 2 is the sign of a lower order in a universal
category being the degenerated form of a higher order.
Object-oriented programming language design has never attempted to
follow Peirce’s philosophy. Rather, its history is full of trial-and-error at-
tempts to meet the requirements and needs of programmers concern-
ing language usability. Nevertheless, the languages have converged into
a form that matches Peirce’s framework as we have shown for the expres-
sion of Dog. Thus, the existence of this object-oriented programming par-
adigm appears to validate Peirce’s categorization of signs.
Table 2. Peirce sign classification, Hjelmslev’s connotative and metasign, and signs in
programming
6. Conclusion
References
Arnold, K., Gosling, J. and Holmes, D. (2000). The Java Programming Language. Reading,
MA: Addison-Wesley.
Barthes, R. (1983). Système de la mode. Paris: Seuil.
— (1995). Système Semiologique. Paris: Seuil.
Dahl, O.-J. and Nygaard, K. (1966). SIMULA — an Algol-based simulation language.
Communications of the ACM 9 (9), 671–678.
Dahl, O.-J., Myrhaug, B. and Nygaard, K. (1984 [1970]). Simula 67: Common Base Lan-
guage (¼ Technical Report Publication S-22). Oslo: Norwegian Computing Center.
Eco, U. (1988). Le Signe. Histoire et analyse d’un concept, adapté de l’italien par Jean-Marie
Klinkenberg. Brussels: Editions Labor.
Gosling, J., Joy, B. and Steele, G. (1996). The Java Language Specification. Reading, MA:
Addison-Wesley.
Herreman, A. (2000). La tolpologie et ses signes. Elements pour une histoire sémiotique des
mathematiques. Paris: L’Hartmattan.
Hjelmslev, L. (1959). Omkring sprogteoriens grundlaggelse, E. Hayashi (trans.). Tokyo:
Kenkyusha.
Marcus, S. (2003). Mathematics through the glasses of Hjelmslev’s semiotics. Semiotica 145
(1/4), 235–246.
Meyer, B. (2000). Object-oriented Software Construction, 2nd ed. Upper Saddle River, NJ:
Prentice-Hall.
Morris, C. W. (1971 [1946]). Signs, Language, and Behavior. The Hague: Mouton.
Noth, W. (1990). Handbook of Semiotics. Bloomington: Indiana University Press.
Parret, H. (1983). Semiotics and Pragmatics — An evaluative comparison of conceptual
frameworks. Amsterdam: John Benjamins.
Peirce, Charles S. (1931–1966). The Collected Papers of Charles S. Peirce, 8 vols., C.
Hartshorne, P. Weiss, and A. W. Burks (eds.). Cambridge, MA: Harvard University
Press. [Reference to Peirce’s papers are designated CP followed by volume and paragraph
number.]
Pierce, B. (2002). Types and Programming Languages. Cambridge, MA: MIT Press.
Rector, R. and Alexy, G. (1982). The 8086 Book. Berkeley, CA: Osborne.
Tanaka-Ishii, K. (2006). Dyadic versus triadic sign models in functional and object-oriented
computer programming paradigms. Semiotica 158 (1/4), 213–232.
Tennent, R. (1991). Semantics of Programming Languages. Upper Saddle River, NJ: Pren-
tice Hall.
Thomas, D. and Hunt, A. (2000). Programming Ruby: The Pragmatic Programmer’s Guide.
Reading, MA: Addison-Wesley.
Yonemori, Y. (1981). Peirce no Kigogaku [Semiotics of Peirce]. Tokyo: Keiso Shobo.
Yuichiro Ishii (b. 1967) is a patent attorney [email protected]. His research interests in-
clude computer programming, software engineering, and legal issues in software. His recent
publications include ‘Thirdness as self-reference in computing’ (with Kumiko Tanaka-Ishii,
2006); and ‘Lambda-term and sign’ (with Kumiko Tanaka-Ishii, in press).