Есть замечательный язык программирования — Fortran, в который уже в течении 50 лет вносятся разные осовременивающие его новшества. И где он теперь? Почему то авторы всяких физических и геофизических моделей охотнее используют C/C++.
По поводу определения понятий переменных и указателей я кратко, но надеюсь исчерпывающее ответил к другому вашему комментарию habr.com/ru/post/516070/#comment_21987278
По поводу файлов и переменных. У переменной есть еще один важный, но не упомянутой мною атрибут — программа, в которой она существует. Файл как таковой существует сам по себе.
По поводу ссылок на авторитетные источники. Ссылаясь на кого-то, ссылающийся берет на себя всю ответственность за написанное другим автором в рамках цитирования и дополнительных оговорок. Авторитет здесь не причем. Авторитет — тот, кого прочитают первым, а не тот, на кого сошлются неглядя. Большинство из тех, кто сейчас на чем либо программирует начинали с чего-то вроде Бейсика или Паскаля. И там с понятием переменной все было четко — именованная ячейка памяти.
Возвращаясь к Питону. Можно дать четкое и понятное описание его грамматики не прибегая к понятию переменной, используя, при этом, термины «ссылка», «объект», «класс», «тип» и т.п. не переопределяя их.
Программист пишет ПО согласно ТЗ для использования автором ТЗ или третьими лицами. Пользователь использует языки программирования для создания собственных инструментов для решения стоящих перед ним задач. Пример — Датасаентист.
нельзя из 2 вычесть 3 не выходя из множества натуральных чисел. «Клянусь говорить только правду и ничего кроме правды, но не всю.»
Не очень понял противопоставление C и интерпретируемых языков.
Ну примерно в этом ключе
$ cat sample.c
int printf(const char*, ...);
int main() {
int x = 1;
int y = x;
printf("&x=%p\n", &x);
printf("&y=%p\n", &y);
return 0;
}
$ ./sample
&x=0x7fff9c148fac
&y=0x7fff9c148fa8
$ cat sample.py
x = 1
y = x
print(f'id(x)={id(x)}')
print(f'id(y)={id(y)}')
$ python3 sample.py
id(x)=9062624
id(y)=9062624
хотя, конечно, далеко не для всех интерпретируемых языков
$ cat sample1.py
import numpy as np
X = np.array([1,2,3])
Y = X
X[1] = -2
print('X=', X)
print('Y=', Y)
$ python3 sample1.py
X= [ 1 -2 3]
Y= [ 1 -2 3]
$
$ cat sample1.m
X = [1 2 3];
Y = X;
X(2) = -2;
X
Y
Как раз для упрощения на начальных этапах, можно считать объект переменной.
Основной принцип образования — ни на каком из этапов нельзя давать ложную информацию. Единственное упрощение — полнота.
Как в 1-м классе на 0 делить нельзя, так и на первом курсе. Только на первом курсе рассказывают как обходить проблему деления на ноль.
Переменная — этикетка к коробке.
Лет 10 назад в статье про переменные в интерпретируемых языках это объяснялось уже так. Рисовалась двойка лежащая в подписанной коробке в случае С и двойка с повешенными на нее бирками в случае какого-то из интерпретируемых языков. Ссылку дать не могу, не нашел.
переменная — область памяти, связанная с идентификатором
Возьмем файл. Лежит в области памяти? Да, пусть и не оперативной. А может закеширован и именно там и лежит. Идентификатор есть? Есть — его имя. Но файлы переменными почему то не называют.
Далее, рассмотрим UNIX-подобные ос. В них у одного файла может быть несколько имен и файл будет существовать до тех пор, пока с ним будет хотя бы одно имя. Ничего не напоминает? Может объекты в Python файлами назовем? Нет не будем, потому что у файлов есть дополнительные свойства, которых нет у объектов Питон.
И если с формальной точки зрения ссылки
Я же пишу, вы ударяетесь в начетничество и формалистику. Это же касается и следующего за этой фразой абзаца.
Можно рассмотреть еще «переменные» в Wolfram Language с его двумя формами «присваивания». Там вообще чудеса можно творить. Фактически речь идет о записях, указывающих на связь между литералом и выражением. В одной форме присваивания выражение вычисляется (простите редуцируется), а в другой оставляется как есть.
Так вот результат последовательности операций
x = a+b
y = x
z := x
x = c+d
для кого то результат может оказаться неожиданным. (Хотя проверить не могу, Mathematica у меня нет уже довольно давно).
Это общепринятый среди программистов на Python
нужно всё-таки разделять программистов на Питоне и пользователей Питона. Кого сейчас больше — вопрос, но это оффтоп.
Говоря о языке как таковом, я считаю, лезть под капот вообще не нужно, можно оперировать только его описаниями и фактическими свойствами реализаций. Везде выше я писал примеры на чистом Python, которые должны работать одинаково в любых его реализациях.
Пока идет работа с иммутабельными (с точки зрения Python) объектами, «переменные» ведут себя привычным образом, по крайней мере до тех пор, пока не начинаем сравнивать их id. Как только объекты становятся сложнее «переменные» сразу превращаются в ссылки.
Извините, но ваши слова — форменное начетничество. Для большинства переменная — изменяемый объект имеющий два неизменных атрибута: имя и тип, и изменяемое значение. Конечно, с формальной точки зрения указатель и переназначаемая ссылка являются переменными. Но когда говорят о них, их так и называют, не используя термин «переменная».
UPD: разовью мысль. В Python есть объекты, изменяемые либо нет, с раз и навсегда заданным типом, но не имеющими имени. В этом смысле они не являются переменными. И есть изменяемые ссылки, которые авторы языка, на правах демиургов окрестили «переменными». Но для этих «переменных» разрешены ровно две операции: переназначение и обращение посредством них. А привычных переменных, которые можно складывать, вычитать, сравнивать, и т.п. присваивать им значение, брать их адрес и привязывать к ним ссылки в Python нет.
x ссылка на иммутабельный объект класса 'int'. Только если в С++ ссылка всегда привязана к одному и тому же объекту в пределах области видимости и времени жизни, в Python можно переназначать ссылки, из-за чего возникает иллюзия переменных.
В реальном мире да (с редкими оговорками), в мире школьных задач сплошь и рядом. Не знаю про динамические массивы в Паскале, может и там есть проверки.
речь идет о выходе за границы массивов фиксированных размеров. Там, где программа на Паскале честно ляжет, программа на С может продолжить весело работать повергая всех в шок своим странноватым поведением.
Поэтому его для первоначальному обучению программированию и не используют.
Что касается приведенных вами отличий, то существенным из них является является только первое, да и то с оговоркой. Паскаль, с точностью до отдельных конструкций, которые вряд ли кто нибудь будет использовать в крупных проектах, является подмножеством С.
Дело не в Марьванне а в условном Пете, который до этого сочинял только алгоритмы вроде «еще одно слово и будешь утираться кровавыми соплями» и ограниченным по времени учебным планом.
Обычно, на этапе изучения циклов ещё нет понятия объектов.
в том то и проблема, что в случае с Питоном понятие объекта в том или ином виде нужно для объяснения сути цикла for. Либо нужно держать учеников в неведении относительно истинного синтаксиса цикла.
Ради справедливости можно сказать, что в С++ тоже есть указатели и также можно сделать переменные взаимозависимыми.
Ради справедливости следует заметить, что смысла в С++ без указателей нет, но никто в здравом уме и трезвой памяти не предлагает использовать его для обучения основам программирования.
За последние лет 50 создана уйма учебных языков, позволяющих ученикам практиковаться в конкретных особенностях программирования, в том числе «ошибаться по делу» и легко выяснять причины своих ошибок, без риска «выстрелить себе в коленку», там где это не актуально.
По поводу файлов и переменных. У переменной есть еще один важный, но не упомянутой мною атрибут — программа, в которой она существует. Файл как таковой существует сам по себе.
По поводу ссылок на авторитетные источники. Ссылаясь на кого-то, ссылающийся берет на себя всю ответственность за написанное другим автором в рамках цитирования и дополнительных оговорок. Авторитет здесь не причем. Авторитет — тот, кого прочитают первым, а не тот, на кого сошлются неглядя. Большинство из тех, кто сейчас на чем либо программирует начинали с чего-то вроде Бейсика или Паскаля. И там с понятием переменной все было четко — именованная ячейка памяти.
Возвращаясь к Питону. Можно дать четкое и понятное описание его грамматики не прибегая к понятию переменной, используя, при этом, термины «ссылка», «объект», «класс», «тип» и т.п. не переопределяя их.
Программист пишет ПО согласно ТЗ для использования автором ТЗ или третьими лицами. Пользователь использует языки программирования для создания собственных инструментов для решения стоящих перед ним задач. Пример — Датасаентист.
Ну примерно в этом ключе
хотя, конечно, далеко не для всех интерпретируемых языков
Основной принцип образования — ни на каком из этапов нельзя давать ложную информацию. Единственное упрощение — полнота.
Как в 1-м классе на 0 делить нельзя, так и на первом курсе. Только на первом курсе рассказывают как обходить проблему деления на ноль.
Лет 10 назад в статье про переменные в интерпретируемых языках это объяснялось уже так. Рисовалась двойка лежащая в подписанной коробке в случае С и двойка с повешенными на нее бирками в случае какого-то из интерпретируемых языков. Ссылку дать не могу, не нашел.
Возьмем файл. Лежит в области памяти? Да, пусть и не оперативной. А может закеширован и именно там и лежит. Идентификатор есть? Есть — его имя. Но файлы переменными почему то не называют.
Далее, рассмотрим UNIX-подобные ос. В них у одного файла может быть несколько имен и файл будет существовать до тех пор, пока с ним будет хотя бы одно имя. Ничего не напоминает? Может объекты в Python файлами назовем? Нет не будем, потому что у файлов есть дополнительные свойства, которых нет у объектов Питон.
Я же пишу, вы ударяетесь в начетничество и формалистику. Это же касается и следующего за этой фразой абзаца.
Можно рассмотреть еще «переменные» в Wolfram Language с его двумя формами «присваивания». Там вообще чудеса можно творить. Фактически речь идет о записях, указывающих на связь между литералом и выражением. В одной форме присваивания выражение вычисляется (простите редуцируется), а в другой оставляется как есть.
Так вот результат последовательности операций
x = a+b
y = x
z := x
x = c+d
для кого то результат может оказаться неожиданным. (Хотя проверить не могу, Mathematica у меня нет уже довольно давно).
нужно всё-таки разделять программистов на Питоне и пользователей Питона. Кого сейчас больше — вопрос, но это оффтоп.
Пока идет работа с иммутабельными (с точки зрения Python) объектами, «переменные» ведут себя привычным образом, по крайней мере до тех пор, пока не начинаем сравнивать их id. Как только объекты становятся сложнее «переменные» сразу превращаются в ссылки.
Это замечание также является ответом на ваш комментарий habr.com/ru/post/516070/#comment_21985010
UPD: разовью мысль. В Python есть объекты, изменяемые либо нет, с раз и навсегда заданным типом, но не имеющими имени. В этом смысле они не являются переменными. И есть изменяемые ссылки, которые авторы языка, на правах демиургов окрестили «переменными». Но для этих «переменных» разрешены ровно две операции: переназначение и обращение посредством них. А привычных переменных, которые можно складывать, вычитать, сравнивать, и т.п. присваивать им значение, брать их адрес и привязывать к ним ссылки в Python нет.
habr.com/ru/company/mailru/blog/454324
Абстрагированы, чтобы сосредоточиться на главном на тот момент.
Что касается зависимых типов, наверное, хорошо, что их там нет.
Что касается приведенных вами отличий, то существенным из них является является только первое, да и то с оговоркой. Паскаль, с точностью до отдельных конструкций, которые вряд ли кто нибудь будет использовать в крупных проектах, является подмножеством С.
в том то и проблема, что в случае с Питоном понятие объекта в том или ином виде нужно для объяснения сути цикла for. Либо нужно держать учеников в неведении относительно истинного синтаксиса цикла.
Ради справедливости следует заметить, что смысла в С++ без указателей нет, но никто в здравом уме и трезвой памяти не предлагает использовать его для обучения основам программирования.
За последние лет 50 создана уйма учебных языков, позволяющих ученикам практиковаться в конкретных особенностях программирования, в том числе «ошибаться по делу» и легко выяснять причины своих ошибок, без риска «выстрелить себе в коленку», там где это не актуально.