URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 8588
[ Назад ]

Исходное сообщение
"Нюансы: 'компилятор' perl"

Отправлено zs , 13-Янв-10 22:12 
#! /usr/bin/perl -w
# Переменные объявленные как my (например my $var)-
# не включаются в таблицу имен (*var)
# и не имеют адреса по которому к ним можно обратиться (может если угадать.. ?)
# Если передать их адресс какой-либо переменной $tmp,
# то переменная $var автоматически поменяет свой адрес (типа компилятором..  ?)
# (p.s. нельзя локализовать local $var после объявления my $var)

#ВОПРОС - если perl интерпретируемый язык - то откуда этот "компилятор"?

use strict;
our $tmp;

sub b{
my $var1 = "hello";
my $var2;

print "var1 =",\$var1," name_var1 = $var1\t";
print "var2 =",\$var2,"\t";

$tmp = \$var1;
print "\\\$tmp = ",\$tmp,"name \$\$tmp = $$tmp\n";
$$tmp = "bie"; #пытаемся изменить значение переменной var1 на "bie", но это бесполезно, т.к. var1 имеет уже другой адрес, после того как переменной $tmp передали указатель на начальный адрес переменной var1
return;
}

b;
b;
b;


--------------------
РЕЗУЛЬТАТ:

var1 =SCALAR(0x9652b80) name_var1 = hello    
var2 =SCALAR(0x9653380)    
\$tmp = REF(0x9652b40)name $$tmp = hello

var1 =SCALAR(0x9634880) name_var1 = hello    
var2 =SCALAR(0x9653380)    
\$tmp = REF(0x9652b40)name $$tmp = hello

var1 =SCALAR(0x96349d0) name_var1 = hello    
var2 =SCALAR(0x9653380)    
\$tmp = REF(0x9652b40)name $$tmp = hello


Содержание

Сообщения в этом обсуждении
"Нюансы: 'компилятор' perl"
Отправлено XAnder , 14-Янв-10 08:54 
Странные люди требуют непонятного :-)

># Переменные объявленные как my (например my $var)-
># не включаются в таблицу имен (*var)
># и не имеют адреса по которому к ним можно обратиться (может если угадать.. ?)

Какие ещё таблицы? Будьте проще: это просто локальные переменные, которые живут только пока выполняется блок, где они объявлены.

># Если передать их адресс какой-либо переменной $tmp,
># то переменная $var автоматически поменяет свой адрес (типа компилятором..  ?)

Это не так. Переменная будет иметь один и тот же адрес, пока не завершится блок, где она объявлена. После этого переменная исчезает (на самом деле всё немного сложнее, но в первом приближении так). При следующем входе в этот блок создаётся новая переменная с тем же именем.

Да, и бросьте вы эту чехарду с адресами - всё-таки на языке высокого уровня пишете.

># (p.s. нельзя локализовать local $var после объявления my $var)

Ой, что-то вы не того хотите, чует моё сердце. Почитайте perlsub: local - это совсем не то, что кажется на первый взгляд.

>#ВОПРОС - если perl интерпретируемый язык - то откуда этот "компилятор"?

Ну вообще-то интерпретатор имеет право что-то там компилировать во внутренне представление для собственных нужд. В чём проблемы?

В вашем примере программы всё происходит именно так, как и написано, никаких странностей. Только непонятно, зачем всё это. Чего вы добиваетесь? Какого эффекта ждёте?


"Нюансы: 'компилятор' perl"
Отправлено jd , 14-Янв-10 18:24 
>Только непонятно, зачем всё это. Чего вы добиваетесь? Какого эффекта
>ждёте?

Видимо, сокрушить нам мозг. Тоже раза три перечитал, так и не понял, к чему всё это...


"Нюансы: 'компилятор' perl"
Отправлено zs , 15-Янв-10 12:12 
>>Только непонятно, зачем всё это. Чего вы добиваетесь? Какого эффекта
>>ждёте?
>
>Видимо, сокрушить нам мозг. Тоже раза три перечитал, так и не понял,
>к чему всё это...

Прошу прощения что не уточнил цель - я хочу понять "как устроено" в данном случае выделение памяти.

Кстати, может кто подскажет где можно посмотреть реализацию perl'овских функций (т.е. сырцы перловского интерпритатора конкретно для функций my и local (а также немного не в тему - bless)). Мне было не понятно следующее:

1. обратите внимание, что переменные (my) меняют адреса при разных вызовах только в случае если я пытался получить ее адрес.


* По поводу того что язык не нов и изжит... в общем для того и знакомлюсь с ним чтобы убедиться либо наоборот.

* Кстати Python - я так понял просто более читаем, но что касается CPAN - то перл лидирует.



"Нюансы: 'компилятор' perl"
Отправлено Pahanivo , 15-Янв-10 13:38 
>Кстати, может кто подскажет где можно посмотреть реализацию perl'овских функций (т.е. сырцы
>перловского интерпритатора конкретно для функций my и local (а также немного
>не в тему - bless)). Мне было не понятно следующее:

я конечно еще тот "програмер", но по мойму называть my и local функциями это какбы ... некрасиво
это опесатели области видимости переменных

>1. обратите внимание, что переменные (my) меняют адреса при разных вызовах только
>в случае если я пытался получить ее адрес.

ну какбы у перла много тонкостей при работе с переменными и вообще, переменную типа "my" можно скажем сделать статичной (чтобы сохранялосья значение между вызовами блока в котором она определена), так же у перла вроде есть щняга типа "сборшик мусора" которая вычищает неиспользуемые переменные

>* По поводу того что язык не нов и изжит... в общем
>для того и знакомлюсь с ним чтобы убедиться либо наоборот.
>* Кстати Python - я так понял просто более читаем, но что
>касается CPAN - то перл лидирует.

эээ какбы сначала задачу формулируют а потом инструмент выбирают ...
а вы както через жопу ... )) вам ваще шашечки или ехать ))


"Нюансы: 'компилятор' perl"
Отправлено zs , 15-Янв-10 13:46 

>я конечно еще тот "програмер", но по мойму называть my и local
>функциями это какбы ... некрасиво
>это опесатели области видимости переменных
>

Надеюсь проясню - меня больше интересует не сам перл, а то как устроены на уровне си - его функции. (На этом уровне - my и local ничто иное как функции).

>ну какбы у перла много тонкостей при работе с переменными и вообще,
>переменную типа "my" можно скажем сделать статичной (чтобы сохранялосья значение между
>вызовами блока в котором она определена), так же у перла вроде
>есть щняга типа "сборшик мусора" которая вычищает неиспользуемые переменные
>

Можно... например из того что в перл не существует вложенных функций?

>эээ какбы сначала задачу формулируют а потом инструмент выбирают ...
>а вы както через жопу ... )) вам ваще шашечки или ехать
>))

=)) - я ж сказал уже -- шашечки ). Говорю - что перл, только маленькое бесцельное увлечение.



"Нюансы: 'компилятор' perl"
Отправлено Pahanivo , 15-Янв-10 14:35 
>
>>я конечно еще тот "програмер", но по мойму называть my и local
>>функциями это какбы ... некрасиво
>>это опесатели области видимости переменных
>>
>
>Надеюсь проясню - меня больше интересует не сам перл, а то как
>устроены на уровне си - его функции. (На этом уровне -
>my и local ничто иное как функции).

это НЕ функции!!!! это не Си!!!! это язык уровнем выше!!! интерпритаторный!!!!
он не является сильно-типизированным языком как Си - это интерпритатор
и my и local тут ограницения на уровне исполнения

>>ну какбы у перла много тонкостей при работе с переменными и вообще,
>>переменную типа "my" можно скажем сделать статичной (чтобы сохранялосья значение между
>>вызовами блока в котором она определена), так же у перла вроде
>>есть щняга типа "сборшик мусора" которая вычищает неиспользуемые переменные
>>
>
>Можно... например из того что в перл не существует вложенных функций?

чево? ты про inline функции на Си?

>>эээ какбы сначала задачу формулируют а потом инструмент выбирают ...
>>а вы както через жопу ... )) вам ваще шашечки или ехать
>>))
>
>=)) - я ж сказал уже -- шашечки ). Говорю - что
>перл, только маленькое бесцельное увлечение.

ну с твоим подходом это скорей извращение )))


"Нюансы: 'компилятор' perl"
Отправлено zs , 15-Янв-10 16:33 
>это НЕ функции!!!! это не Си!!!! это язык уровнем выше!!! интерпритаторный!!!!
>он не является сильно-типизированным языком как Си - это интерпритатор
>и my и local тут ограницения на уровне исполнения

будем считать - я понял.


>>>ну какбы у перла много тонкостей при работе с переменными и вообще,
>>>переменную типа "my" можно скажем сделать статичной (чтобы сохранялосья значение между
>>>вызовами блока в котором она определена), так же у перла вроде
>>>есть щняга типа "сборшик мусора" которая вычищает неиспользуемые переменные
>>>
>>
>>Можно... например из того что в перл не существует вложенных функций?
>
>чево? ты про inline функции на Си?

я про то что переменная определенная во внешней функции как my во внутренней функции определяется только один раз вне зависимости от того сколько раз была вызвана внешняя функция.
ну типа того:

our $i = 0;

sub a($){
my $var = shift;
local $i = $var;
sub b{
  print $var," - $i \n";
}
&b;
}

a(1);
a(2);
a(3);

#=========РЕЗУЛЬТАТ:
1 - 1
1 - 2
1 - 3


p.s. кстати именно из этого случая - я стал рыться с адресами переменных чтобы понять что к чему... а в итоге все оказалось просто: my - имеет лексическую область видимости, в то время как настоящих вложенных функций в  perl нет, получается что &b - это внешняя функция, но во время "компиляции" в ней создается ячейка памяти с адресом (совпадающим с адресом переменной во внешней функции - а этот адрес заполняется только один раз, потому и получается что внутри вложенной функции остается одно и то же первоопределенное значение.)

А вот на фоне этого - мне и стало интересно как на более низком уровне реализованы my local (и bless)

>ну с твоим подходом это скорей извращение )))

я это называю любопытством ;)


"Нюансы: 'компилятор' perl"
Отправлено Pahanivo , 15-Янв-10 17:44 
как интересно тебе ))
сначало сгенерировать заведомо глюкавый код а потом бегать и удивлятся ))