?

Log in

No account? Create an account

Дело Фортрана бессмертно! - Общество дровосеков Бердичева по изучению Мишны

Oct. 25th, 2017

04:26 pm - Дело Фортрана бессмертно!

Previous Entry Share Next Entry

Как в Фортране когда-то можно было изменить значение целой константы, присвоив новое значение по ее адресу, так и сейчас можно то же самое сделать в Питоне: https://kate.io/blog/2017/08/22/weird-python-integers/

>>> for i in range(0, 10):
...   print(i)
...
0
1
2
3
4
5
6
13
8
9


This entry was originally posted at https://spamsink.dreamwidth.org/1065292.html. Please comment there using OpenID.

Comments:

[User Picture]
From:fatoff
Date:October 26th, 2017 12:58 am (UTC)
(Link)
Мутабельная константа.
(Reply) (Thread)
[User Picture]
From:archaicos
Date:October 26th, 2017 09:09 am (UTC)
(Link)
Мутанта!
(Reply) (Parent) (Thread)
[User Picture]
From:vgramagin
Date:October 26th, 2017 01:29 am (UTC)
(Link)
That is suprising! It turns out that all “small integers” with the same value point to the same memory.
Девочка открыла для себя существование integer pool'а.
(Reply) (Thread)
[User Picture]
From:alextr98
Date:October 26th, 2017 02:20 am (UTC)
(Link)
А зачем такие глупости делать, интересно?
(Reply) (Parent) (Thread)
[User Picture]
From:vgramagin
Date:October 26th, 2017 02:24 am (UTC)
(Link)
Какие именно? Писать комментарии, имплементировать пулы или разбираться, почему все так работает?
(Reply) (Parent) (Thread)
[User Picture]
From:alextr98
Date:October 26th, 2017 02:41 am (UTC)

имплементировать пулы

(Link)
естественно
(Reply) (Parent) (Thread)
[User Picture]
From:vgramagin
Date:October 26th, 2017 02:49 am (UTC)

RE: имплементировать пулы

(Link)
для оптимизации работы с immutable objects. Во многих языках есть, не только в питоне. В джаве до +-512 целые хранятся в пуле, насколько я помню
(Reply) (Parent) (Thread)
[User Picture]
From:alextr98
Date:October 26th, 2017 02:52 am (UTC)

для оптимизации работы

(Link)
В чём же оптимизация?
(Reply) (Parent) (Thread)
[User Picture]
From:vgramagin
Date:October 26th, 2017 03:03 am (UTC)

RE: для оптимизации работы

(Link)
В отсутствии необходимости хранить в хипе кучу одинаковых объектов. Наберите в гугле pool benefits in programming, если вам правда интересно, там наверняка будет подробно и по пунктам изложено намного лучше и грамотнее, чем я наберу с планшета
(Reply) (Parent) (Thread)
[User Picture]
From:spamsink
Date:October 26th, 2017 07:54 pm (UTC)
(Link)
Не закрывать пулы констант на запись, очевидно.
(Reply) (Parent) (Thread)
[User Picture]
From:vgramagin
Date:October 26th, 2017 08:02 pm (UTC)
(Link)
Что значит не закрывать? В питоне вообще нет встроенной функциональности оперировать объектами по адресу в памяти. Человек поставил себе специализированную библиотеку, поменял то, что менять не следует и штатными средствами невозможно, а теперь показывает вот какая, типа, херня, и какой язык дурацкий. Это все равно, что я запущу бинарный редактор, открою в нем chrome.exe, поменяю пару бит и начну возмущаться какие в гугле козлы - понаписали браузеров, которые не запускаются
(Reply) (Parent) (Thread)
[User Picture]
From:spamsink
Date:October 26th, 2017 08:20 pm (UTC)
(Link)
С хромом и бинарным редактором ты, конечно, передергиваешь.

С точки зрения пользователя, все библиотеки, которые можно импортировать командой import, равны, и ни одна не более "специализированная", чем другая. Синтаксически вызов функции, которая может сделать то, "чего не следует", ничем не отличается от любого другого, так что определить, какое средство штатное, а какое "нештатное", тоже нельзя.

И я так и не увидел ответа на вопрос, почему бы не закрыть страницу с пулом констант на запись хотя бы для того, чтобы защитить пользователей от себя самих.
(Reply) (Parent) (Thread)
[User Picture]
From:vgramagin
Date:October 26th, 2017 08:28 pm (UTC)
(Link)
Почему передергиваю? Это такая же внешняя библиотека по отношению к питону, как бинарный редактор внешен по отношению к екзешнику. Она написана на С, а не на питоне. Описанная ситуация является даже не то, что нештатной, а вообще не должна рассматриваться при проектировании. Это как ругать электрика за то, что он не поставил в розетку прерывател на случай, если пользователь залезет в нее скрепкой. Иногда надо и в розетку скрепкой залезть, иногда надо и в питоне память ручками поменять. Но когда это делаешь надо понимать что делаешь и зачем.
(Reply) (Parent) (Thread)
[User Picture]
From:yatur
Date:October 26th, 2017 05:23 am (UTC)
(Link)
Дело Фортрана не в наличии пула, а в идее записать что-то по произвольному адресу в памяти и приколоться над результатом. Отличие Питона от Фортрана в том, что нельзя поменять значение семерки по принципу

def f(x): x=13
f(7)

А если начать в памяти ковыряться то можно, наверное, еще не такое забабашить. Garbage in => garbage out.
(Reply) (Thread)
[User Picture]
From:spamsink
Date:October 26th, 2017 06:07 am (UTC)
(Link)
Дело фортрана (самых первых его версий, насколько мне известно; потом поправили) и сегодняшнего питона в том, что можно изменить значение ЛИТЕРАЛЬНОЙ КОНСТАНТЫ. Что в уважающих себя языках не должно быть возможно в принципе.

Edited at 2017-10-26 06:09 am (UTC)
(Reply) (Parent) (Thread)
[User Picture]
From:ilya_dogolazky
Date:October 26th, 2017 06:33 am (UTC)
(Link)
const char *str = "привет";
char *str2 = (char*) str;
str2[2]='e', str2[5]='д';
printf("%s медвед!\n", "привет");

ну и дальше как повезёт, может SIGSEGV, а может и превед
(Reply) (Parent) (Thread)
[User Picture]
From:spamsink
Date:October 26th, 2017 07:52 pm (UTC)
(Link)
Сейчас все больше SIGSEGV. Как, впрочем, и на cовременном фортране:
      subroutine foo(i)
      i = 5
      return
      end
      program main
      call foo(7)
      j = 7
      print *,j
      end
падает на строке i = 5.

У питонцев ума не хватило размещать пул констант в секции констант, или хотя бы закрыть страницу на запись после создания?
(Reply) (Parent) (Thread)
[User Picture]
From:dvv
Date:October 27th, 2017 12:03 pm (UTC)
(Link)
А что мешает библиотеке её открыть взад?
(Reply) (Parent) (Thread)
[User Picture]
From:dvv
Date:October 30th, 2017 10:19 pm (UTC)
(Link)
Like dis:
% cat 00.f
      subroutine foo(i)
      call unpro(i)
      i = 5
      return
      end

      program main
      call foo(7)
      call bar(7)
      end

      subroutine bar(i)
      print *,i
      end
% gfortran 00.f 00.c
% ./a.out
           5
(Reply) (Parent) (Thread)
[User Picture]
From:spamsink
Date:November 1st, 2017 04:44 pm (UTC)
(Link)
А в gf77?
(Reply) (Parent) (Thread)
[User Picture]
From:dvv
Date:November 1st, 2017 05:02 pm (UTC)
(Link)
Если ты имеешь в виду g77, то gfortran — его прямой наследник. И и с -std=g95, и -std=legacy эффект тот же. Otherwise, я не знаю, что такое gf77.
(Reply) (Parent) (Thread)
[User Picture]
From:janatem
Date:October 26th, 2017 11:15 am (UTC)
(Link)
В фортране можно менять значение не только целочисленной константы. Например, построить реализацию анекдота «значение синуса в военное время может достигать четырех».
(Reply) (Thread)
[User Picture]
From:spamsink
Date:October 26th, 2017 07:53 pm (UTC)
(Link)
Можно было. Сейчас константы менять нельзя.
(Reply) (Parent) (Thread)