psilogic: (Default)
psilogic ([personal profile] psilogic) wrote2008-10-22 10:23 pm

Во.. кстати...

Про классический треугольник в языке. Как только его не пишут (вариантов терминологии полно - всякие денотаты, концепты...). В этой книжке так:


"Значение — обозначаемый именем предмет ими класс предметов
Смысл — способ, каким имя обозначает предмет (информация о предмете).
Имя — языковое изображено, обозначающее предмет."


Не буду копипастить разъяснения афтара. Сами почитайте три абзаца от слов "Каждое имя имеет значение и смысл" и до картинки. Сцылка:
http://exsolver.narod.ru/Books/Other/Logica/c5.html
Объяснения обычные (в смысле похожие объяснения я видел у других авторов, скажем, у Чёрча).

Может, кому интересно? Давно хотелось обсудить - неспешно, вдумчиво. Никакого сценария обсуждения у меня нет, и свое мнение толком не сформировано. Скажу только одно: интуитивно мне эта схема очень не нравится. Но интуиция меня, бывает, подводит.

Возможно, это привычка программиста. Кто не программист, поясню: у нас повсюду такие вещи состоят не из трех частей, а из двух:
1. Есть адрес, который указывает где что-то лежит.
2. Есть это самое "что-то".
Причем, адрес тоже где-то лежит. Может быть, лежит только временно. Может быть адрес адреса. Могут быть циклические ссылки (1 указывает на 2, 2 указывает на 1). И куда тогда девать этот самый треугольник?

В книжке приводится пример:
"Разные выражения, обозначающие один и тот же предмет, имеют одно и то же значение, но разный смысл (т е. смысл выражений “4”, “2 + 2” и “9 - 5” различен)."

Да ну нафик. Это три адреса: "4", "2 + 2", "9 - 5". Первый адрес - указывает на цифру. Два других - на пару цифр и операцию. Если к этим трем адресам применить некую процедуру: рассматривать их как инструкцию по вычислению, то можно получить число. Одно и то же. Но ведь можно и другую процедуру применить. Скажем, засунуть в какое-нибудь уравнение.

Как-то так... мутно все, не могу сформулировать.

[identity profile] bsivko.livejournal.com 2008-10-22 07:30 pm (UTC)(link)
y - это ссылка.
как переменная она существует только во время компиляции.

в жабе нет различия между ссылкой и указателем, так как там все через указатели.
для C++ ссылка это альтернативное имя объекта
например:

int* x;
int* & y = x;
x = new int(0);
*y = 1;
std::cout << x << std::endl;


результат - печать '1'. Т.е. x и y - это имена одной и той же переменной.

[identity profile] bsivko.livejournal.com 2008-10-22 07:34 pm (UTC)(link)
по поводу существования во время компиляции.
ссылками один и тот же объект можно называть по-разному.
например,

struct a_t {
int x;
}

a_t y;
int & z = y.x;

// Строка 1.
std::cout << y.x << std::endl;
// Строка 2.
std::cout << z << std::endl;


Строка 1 и строка 2 компилятся в один и тот же байт-код. И если заменить в проге все z на y.x, то ничего не изменится в EXE.

[identity profile] psilogic.livejournal.com 2008-10-22 07:37 pm (UTC)(link)
не... я имею в виду, что "физиологически" y - это же адрес адреса, а x - просто адрес. В y хранится адрес x, в x хрантся адрес 0. просто у неявно все время "разыменовывается".

[identity profile] bsivko.livejournal.com 2008-10-22 07:41 pm (UTC)(link)
Если говорить языком аффтара, то

“самое глубокое озеро мира”
“the most deep lake of the world”

имеют одинаковый смысл и разное имя. Если правильно понимаю..

[identity profile] psilogic.livejournal.com 2008-10-22 07:49 pm (UTC)(link)
типа, да... но это не ссылка и указатель.

int* x;
int* & y = x;

дело в том, что код генерируется все-таки разный для

*x = 0 и *y = 0.

В первом случае происходит одно обращение к адресу, во втором - два. Т.е. технически y - это вовсе не другое имя, не равноценный алиас. Это просто сокращение. В C писали бы так:

int* x;
int** y = &x;
*x = 0;
**y = 0;

В C++ сделали такую хрень как ссылка, это указание каждый раз, когда написано "y" делать автоматически еще одну операцию "*", которую не писать каждый раз. Потому ссылки вообще-то "дороже".

Вот ежели в вашем примере всякий раз автоматически переводить вторую фразу на русский перед использованием - это будет что-то типа того...

[identity profile] bsivko.livejournal.com 2008-10-22 07:59 pm (UTC)(link)
Думаю сейчас вопрос не в языке. Мне как-то лень спорить (;

Если так:

взять две одинаковые по содержанию функции get_baikal(), только одна называется get_baikal(), а вторая - get_most_deep_lake_in_the_world() с одинаковым содержимым (прверкой на 1620).

Так вот, имя - это одно из get_most_deep_lake_in_the_world()/get_baikal(), смысл - содержание функции, предмет - результат обработки.

Где-то так.
Но я в этих треугольниках не разбираюсь, только пишу как понял по-своему.