Symbole zazwyczaj coś znaczą (mają sens, są zrozumiałe) i coś oznaczają (do czegoś się odnoszą). Na przykład znak drogowy może wyrażać ostrzeżenie przed pieszymi (znaczenie) i równocześnie oznaczać miejsce w którym jest przejście dla pieszych.
Także wypowiedzi formułowane w dowolnym języku mogą na coś wskazywać i coś znaczyć.
W przypadku nazw własnych możemy uznać, że znaczenie słowa sprowadza się do wskazania obiektu którego nazwa ta dotyczy. Czyli w tym wypadku znaczenie = oznaczanie. Często jednak jesteśmy w stanie wskazać do czego konkretnie odnoszą się słowa (co oznaczają), chociaż je rozumiemy.
Za rozróżnieniem znaczenia (sensu) i oznaczania (referencji) przytacza się dwa argumenty:
-
Skoro dwa wyrażenia mają takie samo znaczenie, to można je stosować zamiennie. Na przykład „dwie godziny” i „2h” rozumiemy tak samo. Gdyby znaczenie utożsamiać z referencją (oznaczaniem), to analogiczna reguła dotyczyłaby słów wskazujących na to samo. Gottlob Frege sformułował następujący kontrprzykład. Jak wiadomo nazwy “Gwiazda Poranna” i „Gwiazda Wieczorna” oznaczają ten sam obiekt (planeta Wenus). Gdyby “Gwiazda Poranna” i “Gwiazda Wieczorna” miały takie samo znaczenie, można by je stosować zamiennie. Czy jednak stwierdzenie “Gwiazda Poranna = Gwiazda Wieczorna” rozumiemy tak samo jak “Gwiazda Poranna = Gwiazda Poranna”? Nie. W pierwszym przypadku mamy ważne odkrycie a w drugim trywialną tożsamość. Czyli znaczenie (sens, rozumienie) to nie to samo co oznaczanie.
-
Wyrażenia odnoszące się do obiektów nie istniejących, albo sprzecznych są zrozumiałe, ale nic nie oznaczają. Na przykład „Obecny król Francji” na nic nie wskazuje (nic nie oznacza) ale jest zrozumiałe (ma znaczenie).
Pomimo powyższych problemów, nie zaprzestano prób definiowania znaczenia wypowiedzi poprzez to do czego się te wypowiedzi odnoszą. Czy jednak nie prościej jest zdefiniować klasę języków dla których utożsamianie znaczenia z oznaczaniem nie sprawia problemów? Takie założenie nie sprawia żadnych problemów w przypadku języków programowania. Są to sztuczne języki służące do programowania komputerów (te języki nie są przeważnie używane w trakcie działania komputera, tylko na etapie jego programowania). Znaczenie terminów w tym języku to miejsce w pewnej przestrzeni (jak to teraz w modzie mówić: wirtualnej), w której jest przechowywana pewna wartość, albo procedura ją obliczająca. Zastanówmy się, czy takiego rozwiązania nie można uogólnić na każdy dostatecznie precyzyjny język.
Czy wyrażenia „2+2” oraz „4” mają identyczne znaczenie i oznaczają to samo? Frege twierdzi, że oba oznaczają liczbę 4, ale ich znaczenie jest inne. Ale przecież języki programowania zawierają arytmetykę. Najwyraźniej więc między poglądami logików i informatyków na ten temat powstaje różnica (informatycy nie są skłonni do teoretycznych sporów, pewnie stąd ta różnica nigdy dotąd nie stanowiła istotnego problemu). Informatyk uzna zapewne, iż “2+2″ to procedura obliczenia sumy z dwóch dwójek, a “4″ to liczba. Nie oznaczają więc tego samego. Frege wykonuje działania w pamięci i ogłasza, że oba wyrażenia oznaczają to samo. Ale on odnosi się w ten sposób do wyniku działania, a nie do wyrażenia opisującego to działanie. To chyba możemy uznać z a błąd. A w konsekwencji - stwierdzić, że w arytmetyce można utożsamiać znaczenie i oznaczanie. Nie widać też żadnych przyczyn, dla których rozciągnięcie tej tezy na całą matematykę stanowiło jakikolwiek problem.
Widzimy więc, że w miejsce sporu o to, czy sens wypowiedzi daje się sprowadzić do ich oznaczania (semantyka referencyjna), należy zapytać o klasę języków w których taka zgodność oznaczania i znaczenia zachodzi.