Всем читателям habr.com, привет! Мы студенты Технического ВУЗа- Мария и Екатерина, и хотим рассказать о своем опыте работы с указателями на языке программирования Паскаль.
Знакомство с указателями произошло еще на первом курсе, когда нам читали предмет по языку программирования Паскаль. Данная тема нас заинтересовала, поэтому мы изучили множество статей и учебной литературы. Отметим, не нашли ни одной, в которой довольно подробно, понятно и, главное, доступно для людей любого уровня знаний было бы рассказано об использование указателей в Паскале. Безусловно, информация по этой теме имеется в интернете, но она разрознена и большинство авторов сложно доносят информацию для неподготовленного читателя, который только начинает путь программиста.
Как показывает практика, тема указателей сложна для понимания, именно поэтому у нас родилась идея - написать публикацию о работе с динамической памятью и указателями, чтобы любому, увидевшему данную статью, подобная тема стала ясна.
Виды памяти в языке программирования Паскаль
Оперативная память ПК представляет собой совокупность элементарных ячеек для хранения информации — байтов, каждый из которых имеет собственный номер. Эти номера называются адресами, они позволяют обращаться к любому байту памяти.
Существует много различных видов оперативной памяти. Все эти виды можно разделить на две подгруппы — статическая память (Static RAM) и динамическая память (Dynamic RAM). Когда говорится о видах памяти, имеются в виду способы организации работы с ней, включая выделение, освобождение памяти и методы доступа.
Статическая память
Статическая память - это память, которая выделяется до начала работы программы, на стадии компиляции и сборки.
Компиляция - это преобразование программы, составленной на исходном языке высокого уровня (одним из которых является Паскаль - процедурно-ориентированный язык программирования высокого уровня), в эквивалентную программу на низкоуровневом языке или машинном коде (Машинный код - это двоичные числа, выражающие команды процессора и данные, которые нужно обработать. Его трудно понять и проводить в нем какие-то корректировки).
Сборка — процесс получения информационного продукта из исходного кода. Чаще всего сборка — исполняемый файл — двоичный файл, содержащий исполняемый код (машинные инструкции) программы или библиотеки.
статические переменные имеют фиксированный адрес, известный до запуска программы и не изменяющийся в процессе ее работы.
доступ к статическим переменным осуществляется через их имена.
статические программные объекты порождаются автоматически перед выполнением программы или подпрограммы, в которой они описаны, и существуют, пока выполнение этой программы или подпрограммы не завершится. Размер статических объектов не изменяется на протяжении всего времени их существования.
Примером статического объекта в языке Паскаль является переменная, описанная в блоке программы или подпрограммы (процедуры, функции).
Приведем пример статического объекта:
var n: integer;
begin
n:=32;
end.
Такое объявление порождает статическую переменную целого типа.
Динамическая память
Динамическая память - это оперативная память, которая выделяется в процессе компиляции программы. При динамическом размещении заранее не известны ни тип, ни количество размещаемых данных, к ним нельзя обращаться по именам, как к статическим переменным. Программа может захватывать участки динамической памяти нужного размера. После использования ранее захваченный участок динамической памяти следует освободить.
Под динамическую память отводится пространство между статической памятью и стеком. Обычно стек располагается в старших адресах виртуальной памяти и растет в сторону уменьшения адресов. Программа и константные данные размещаются в младших адресах, выше располагаются статические переменные. Пространство выше статических переменных и ниже стека занимает динамическая память:
Динамическую память обычно используют при:
обработке больших массивов данных
разработке САПР (Система Автоматизации Проектных Работ)
временном сохранение данных при работе с графическими и звуковыми средствами ЭВМ
К таким объектам относят:
файлы (текстовые, типизированные, нетипизированные)
-
линейные структуры
односвязные (очередь, стек, список и т.д.)
многосвязные (многосвязный список)
кольцевые структуры (односвязный и многосвязный кольцевые списки)
разветвленные структуры (деревья и графы)
Управление динамической памятью связано с использованием ссылочного типа данных. Величины, имеющие ссылочный тип, называют указателями.
Указатели простейшие действия с ними
Указатель - это переменная, которая содержит адрес другой переменной (байта памяти).
Объявление указателей
var
p:^integer;
Где «^» означает, что задаётся указательный тип, а затем идет имя любого стандартного или ранее описанного типа.
Операции над указателями
Для работы с указателем объявим еще одну переменную, но уже не указательного типа (строка 3).
var
p:^integer;
n:integer;
k:^integer;
k1:integer;
y1:^integer;
y2:^integer;
y3:^integer;
begin
n:=5;
p:=@n;
writeln('адрес n:',@n);
writeln('значение n:',n);
writeln('адрес p:',@p);
writeln('значение p:',p);
writeln('Разыменование или получения значения по адресу,который содержит p в качестве значения:',p^);
k:=@k1;
k^:=9;
writeln('Разыменование или получения значения по адресу,который содержит k в качестве значения:',k^);
writeln();
If k^=p^ then
begin
writeln('значения переменных, расположенных по разным адресам, одинаковое');
writeln('значение p:',p);
writeln('значение k:',k);
end;
If k^<>p^ then
begin
writeln('значения переменных, расположенных по разным адресам, разные');
writeln('Разыменование k:',k^);
writeln('Разыменование p:',p^);
end;
writeln();
y2:=@n;
y1:=y2;
writeln('Разыменование y1:',y1^);
writeln('Разыменование y2:',y2^);
writeln();
y3:=nil;
writeln('Значение y3:',y3);
end.
В строках 11, 12, 14, 17, 36: мы получаем адрес переменной, используя символ «@».
-
В строках 16, 19, 21, 28 и т.д.: мы получаем значение переменной по её адресу, используя символ «^». Данная операция называется «разыменование».
(Разыменование это операция получения значения объекта, адрес которого хранится в указателе).
Добавим в нашу программу две переменные: типа указатель - k и целое k1 (строки 4,5).
-
В строках 10, 11, 17 и т.д.: мы используем операцию «присваивания».
Присвоить можно:
значение того же типа, что и указатель (строка 36, 37)
адрес другой переменной (строка 11, 17)
-
специальное значение, которое называется пустой указатель и обозначается служебным словом nil (Оно не связано ни с каким объектом, т.е. ни на что фактически не указывает, строка 41)
значение типа, на который указывает указатель (строка 18)
В строке 21: мы сравниваем указатели на «равенство».
В строке 28: мы сравниваем указатели на «неравенство».
Процедуры для работы с указателями
Первым шагом после объявления переменной типа указатель (строка 2) является процедура выделения памяти, которая обозначается new(указатель). Данная процедура имеет один параметр (строка 4).
var
p:^integer;
begin
new(p);
end.
После применения процедуры new под переменную p выделилась память.
*Для более лучшего усвоения материала будем графически изображать указатели. На схеме точка будет ставиться точка у указателя и рисоваться стрелка для связывания его с соответствующим объектом.
Объект, созданный с помощью new в процессе выполнения программы или подпрограммы, существует вплоть до завершения основной программы, или до тех пор, пока он не будет уничтожен явно. При создании объекта указатель на него помещается в переменную, являющуюся фактическим параметром оператора вызова процедуры new.
В начальный момент выполнения программы переменная p не имеет никакого значения:
После создания динамического объекта указатель на него автоматически присваивается переменной p. Схематично результат изображается следующим образом:
Переменная p теперь "указывает" на объект целого типа, поэтому саму указательную переменную тоже называют указателем. Заметим, что параметр процедуры new однозначно определяет, какого типа объект порождается. В данном случае из описания типа переменной p следует, что порождается объект типа integer. Отметим, что порождаемые объекты не имеют никакого начального значения.
Для освобождения динамического памяти, на которую указывает указатель применяется процедура удаления dispose(указатель) (строка 8). Параметр в этой процедуре должен быть указатель на уже существующий динамический объект, иначе возникнет ошибка.
var
p:^integer;
begin
new(p);
writeln('Адрес указателя: ',@p);
writeln('Значение указателя: ',p);
writeln('Разыменование указателя: ',p^);
dispose(p);
writeln();
writeln('Адрес указателя после удаления: ',@p);
writeln('Значение указателя после удаления: ',p);
end.
После применения объект, указанный в качестве фактического параметра перестает существовать, a указатель на него удаляется из множества значений указательного типа, в результате чего все переменные, содержащие указатель на уничтоженный объект, становятся неопределёнными.
Следует помнить, что повторное применение процедуры dispose к свободному указателю может привести к ошибке.
Достоинства и недостатки указателей
-
Достоинства указателей
уменьшают объем памяти и сокращает время выполнения программы
позволяют возвращать несколько значений из функции и могут использоваться для передачи информации между функциями
дают возможность изменить размер динамически выделенного блока памяти
позволяют получить доступ к любой ячейки памяти компьютера
помогают создавать сложные структуры данных, такие как связанный список, стек, очереди, деревья, графики и т.д.
-
Недостатки указателей
выделенный динамически блок памяти необходимо освобождать явно, иначе может произойти утечка памяти
повышают вероятность возникновения ошибок и проблем с памятью. При этом найти и исправить эти ошибки задача не из легких, особенно в объемных программах
сложны для понимания и требуют определенного объема знаний. Программист несет ответственность за эффективное и правильное использование указателей
Для чего нужны указатели?
Если нет особой необходимости использовать указатели, лучше выбирать альтернативный вариант, который практически всегда присутствует. Например, использование ссылок.
-
Для того, чтобы напрямую работать с памятью
Указатели нужны для того, чтобы можно было напрямую работать с оперативной памятью.
Например, при передаче указателя в функцию компьютер не создаёт её локальную копию, а обращается к ней напрямую.
-
Для динамического управления памятью
Если нам нужно выделить в памяти некоторую область для хранения своих данных, но стандартные переменные нам не подходят, мы можем использовать указатель. В этом случае мы помещаем в него стартовый адрес ячейки и говорим, сколько байтов после него нужно использовать и что в них положить.
Задачи с применением указателей
Через указатели на указатели посчитать сумму двух чисел и записать в третье.
var
num_1, num_2:integer; //два числа, значения которых будут использоваться в сложении
sum:integer; //переменная для сохранения рез-та сложения
x, y:^integer; //переменные для хранения адресов двух чисел
x1:^^integer; //первое слагаемое
y1:^^integer; //второе слагаемое
begin
//занесение в переменные числовых значений
num_1:=1;
num_2:=2;
//присваивание переменным типа указатель в кач-ве значения адресов переменных целевого типа
x:=@num_1;
y:=@num_2;
//присваивание переменным типа указатель на указатель в кач-ве значения адресов переменных типа указатель
x1:=@x;
y1:=@y;
//суммирование двух чисел, это получается за счет двойного разыменования переменной типа указатель на указатель на тип integer
sum:=x1^^+y1^^;
writeln('сумма:',sum);
end.
-
Напишите функцию swap, которая меняет значения переданных аргументов.
В Pascal существуют два типа подпрограмм: процедуры и функции (служебные слова: procedure, function). Процедуры после выполнения не возвращают никакое значение из подпрограммы, а функция возвращает результат. При написании подпрограмм важным этапом выступает передача параметров. Выделяют параметры-значения и параметры-переменные.
-
Параметры-значения
При этом в формальные параметры подпрограммы передаются копии фактических. Перед формальными параметрами нет слова Var. С такими параметрами удобно работать, так как при вызове подпрограммы на их место можно подставить не только переменную, но и константу или выражение. Даже если внутри подпрограммы значение такого параметра меняется, при выходе из нее оно восстанавливается (так как меняется значение не самого параметра, а его копии).
-
Параметры-переменные
При этом в формальные параметры подпрограммы передаются адреса фактических. Фактические значения по указанному адресу меняются. Перед формальными параметрами указывается слово Var.
Пример передача значений в подпрограмму со словом var есть в задаче 2.
-
//Создаем два указателя на целое число и две переменные типа целое число
var
p1:^integer;
p2:^integer;
x:integer;
y:integer;
{Процедура меняет местами значения двух переменных;
Входные параметры: две целые переменные;}
procedure Swap(var a,b:integer);
//Создаем временную переменную типа целое
var temp:integer;
begin
//Присваиваем temp значение первой переменной
temp:=a;
//Присваиваем первой переменной значение второй
a:=b;
//Присваиваем второй переменной значение temp
b:=temp;
end;
begin
//Присваиваем целое значение переменным
x:=5;
y:=8;
//Инициализируем указатели
p1:=@x;
p2:=@y;
//Вызываем процедуру, которая меняет местами значения двух переменных, используя операцию разыменовывание
Swap(p1^, p2^);
writeln (p1^);
writeln(p2^);
end.
Заключение
В данной статье мы попытались на собственном опыте изучения указателей в Паскале поделиться полученными знаниями и простым языком объяснить базовые понятия, подкрепив их примерами и схемами. Если вы разобрались в теме указателей: получили новые знания или освежили в памяти ранее изученное, значит, цель статьи достигнута
Конечно, мы рассказали не все об указателях и их возможностях. Надеемся, что данная статья помогла Вам найти ответы на интересующие вопросы по рассматриваемой теме и побудила к дальнейшему, более глубокому, изучению указателей не только на языке Паскаль, но и применению их в любых своих программах. До встречи в будущих статьях :)
Комментарии (169)
kale
00.00.0000 00:00+25За курсовые на Хабре теперь зачет дают или автомат сразу?
vconst
00.00.0000 00:00+2А это уже не первый раз. Препод говорит, что если напишете пост на Хабре и он выйдет из песочницы — то будет какой-то зачет лабы или чего-то такого
Pochemuk
00.00.0000 00:00+4Но тут, хотя бы, собственные мысли. А в тот раз была куча переводных статей и даже с одинаковыми КДПВ.
Exosphere
00.00.0000 00:00+2Как всегда, слышал звон… :-) Ситуации уже разобрали. Кстати, сейчас никаких сессий и зачетов не идёт, только семестр начался. И любая самостоятельная студенческая статья всегда имеет равные с другими шансы выйти на Хабр.
aamonster
00.00.0000 00:00+4Тут выглядит скорее "чтобы разобраться – надо объяснить кому-нибудь". Imho, достойное поведение, только ресурс выбран неудачный.
Aldres
00.00.0000 00:00А меня мой преподаватель по ГИСам, кстати, сам толкал перетащить курсовую в статью на хабре. Но увы, уже после зачета. Так что думаю, вполне могут быть и такие прогрессивные
DistortNeo
00.00.0000 00:00-6Я теперь понимаю, почему язык C для начинающих подходит лучше, чем Паскаль:
- Операция выделения памяти отделена от указателя.
- Передача аргументов по ссылке делается явным образом через указатели.
lamerok
00.00.0000 00:00В Си нет ссылок.
DistortNeo
00.00.0000 00:00+1Именно поэтому я и написал, что передача делается явно через указатели.
alexey_public
00.00.0000 00:00Что значит явно через указатели?
typedef unit8_t *pType;
myFunc(pType myData){...
DistortNeo
00.00.0000 00:00От того, что вы объявили алиас, указатель не перестал быть указателем.
alexey_public
00.00.0000 00:00Ну так указатель в Паскале тоже не перестаёт быть указателем. Только записан точно так же.
aamonster
00.00.0000 00:00+2Я так понимаю, товарищ имеет в виду, что нет var-аргументов, как в Паскале (или передаваемых по ссылке, как в c++), и получение адреса переменной всегда надо выполнять явно.
Но и тут есть исключение – массивы.
alexey_public
00.00.0000 00:00Насчёт var согласен. Не могу сказать хорошо это или нет. В Паскале к этому привык, в С/C++ наоборот - привык что только через ссылку.
var нравится, но это совсем немного, но всё же другой стиль разработки.
aamonster
00.00.0000 00:00+2В C++ всё опять усложнилось – можно передать указатель на переменную, а можно ссылку на неё. Казалось бы, одно и то же, но есть нюанс...
DistortNeo
00.00.0000 00:00Мне в этом плане нравится C#, где ключевое слово
ref
надо указывать и в сигнатуре функции, и при её вызове.
alexey_public
00.00.0000 00:00+1А кстати да, но, откровенно говоря, ссылки в С++ - это отдельный мир со своими правилами, такого в Паскале нет, может и к лучшему.
ahdenchik
00.00.0000 00:00-7Это где в 2023 Паскаль дают?
WondeRu
00.00.0000 00:00-11ВУЗы РФ, в 2027 они узнают про python.
Меня очень бесил в 2002 преподаватель, который заставлял для 8086 писать на ассемблере, хотя c++ уже использовался два десятилетия для этих целей.
maisvendoo
00.00.0000 00:00+15А почему это, 2023 году, нельзя использовать для обучения ЯП, специально разработанный для обучения? Где и в каком месте этот язык "устарел"?
Паскаль - строго типизированный язык, исключающий, ко всему прочему, неявное преобразование типов, содержащий все необходимые для начинающего парадигмы.
Может быть не надо использовать замшелый и покрытый плесенью Borland Pascal для DOS, или свистелки типа ABC Pascal, а взять Паскаль здорового человека - FreePascal? С этим я соглашусь. В остальном - Паскаль гораздо более подходит для обучения, чем предлагаемый ниже питон. В том числе и в 2023 годуАвторам статьи - успехов! Порекомендую книги Андрея Столярова "Программирование: Введение в профессию" в трех томах. Первая книга как раз посвящена Паскалю, и там хорошо раскрыта тема указателей.
DistortNeo
00.00.0000 00:00+2Python, как это ни странно, тоже строго типизированный язык. Просто типизация динамическая, а не статическая, и нет прямого доступа к памяти.
maisvendoo
00.00.0000 00:00+4Питон - интерпретируемый язык, ниша применения его вполне определенная, и это - не обучение
centralhardware2
00.00.0000 00:00-4Не более интерпритируемый чем ruby или джава. Вот bash действительно можно назвать интерпретируемым, если только и в него jit уже не встроили
PuerteMuerte
00.00.0000 00:00+5Просто типизация динамическая, а не статическая
Это, кстати, минус для обучения. Чтобы учить студентов понимать типы, хорошо, когда они видны.
Didimus
00.00.0000 00:00А чем Борланд паскаль плох? Он не запускается на современных машинах?
DreamingKitten
00.00.0000 00:00+3Там упоминается именно Borland Pascal для DOS. Запустить сейчас что-то досовское уже становится нетривиальной задачей.
Тем более что есть вполне себе современный и кросплатформный FreePascal и у него даже есть консольная IDE с таким же интерфейсом как у TP/BP.
mayorovp
00.00.0000 00:00Да даже если и запускается...
Вот самое то на современном мониторе работать в текстовом режиме 80 на 50! (А те кто не умеют этот режим включать — будут работать 80 на 25).
Опять же, жалкие 64 килобайта на массив. Мне их не хватало даже в школьных олимпиадах.
AlienJust
00.00.0000 00:00>> В строках 16, 19, 21, 28 и т.д.
довольно сложно считать номера строк тут
SalamWord Автор
00.00.0000 00:00Да, понимаю. До публикации были строки, но после модерации пропали, извините. Я думаю это из-за того, что в списке языков на хабре не было Паскаля. Учтем это в будущих статьях.
Pochemuk
00.00.0000 00:00+7А чем книга «Алгоритмы + структуры данных = программы» Н. Вирта для изучения указателей в Паскале плоха?
aamonster
00.00.0000 00:00+2Очень здорово, что вы не просто учитесь, но и систематизируете свои знания (хотя мне и кажется, что ваш текст – это, скорей, эссе для сдачи преподавателю, чем статья на Хабре).
Блин, хабровский редактор забодал, дальше была критика и советы, но они пали смертью храбрых. Вкратце – не путайте свойства собственно указателей и динамического выделения памяти и изучите несколько других языков для сравнения.
SalamWord Автор
00.00.0000 00:00Спасибо! Нам так не объяснили подробно на лекциях, к сожалению. Разобравшись, захотелось помочь другим. Не понимаю, почему уже второму человеку кажется, что это мы делали для зачета или в качестве эссе преподавателю (это не так))) )
spc
00.00.0000 00:00-4Потому что Pascal настолько древний, что разбирать там, как мне видится, уже особо нечего (особенно, если говорить об уровне института, где он обычно для галочки).
maisvendoo
00.00.0000 00:00+1Поясните, пожалуйста, всё же - почему паскаль "настолько древний"? Что в нем устарело?
vconst
00.00.0000 00:00-4В исходном паскале нет классов и наследования. Выучив функциональное программирование — потом придется переучиваться на ооп
Хотя, щяс же такого паскаля уже нет, есть только дельфи?kipar
00.00.0000 00:00+3В досовском борланд паскале тоже классы и наследование есть (начиная с Turbo Pascal 5.5, 1989 год). А более ранний - это видимо из периода перфокарт, я сомневаюсь что ему в этом веке учили.
vconst
00.00.0000 00:00А ведь точно, были ))
Как-то это мимо меня прошло в школе. Помню, что ООП я начал изучать уже на Борланд С++maisvendoo
00.00.0000 00:00Если не ошибаюсь, ООП есть и во FreePascal
PuerteMuerte
00.00.0000 00:00Конечно, если учесть хронологию появления реализаций Паскаля как Turbo Pascal -> Turbo Pascal with objects -> Delphi -> FreePascal
maisvendoo
00.00.0000 00:00+2Конечно - функциональщина - как раз то, что необходимо знать первокурснику. И да, вы помоему путаете функциональное программирование с процедурным
vconst
00.00.0000 00:00вы помоему путаете функциональное программирование с процедурным
Вполне вероятно)
WraithOW
00.00.0000 00:00+1Не соглашусь — это как раз хорошая последовательность. Сначала базовый подход где всё в main (или что там у паскаля вместо него, уже не помню), потом наворачиваем первый уровень абстракции — процедурное программирование, потом второй уровень — объединяем процедуры в классы.
dlinyj
00.00.0000 00:00На нём нет практически коммерческих разработок. Устроится на работу программистом паскаля, если не невозможно, то очень сложно (какой-нибудь НИИ на задворках вселенной).
maisvendoo
00.00.0000 00:00+1Речь идет не о рабочем инструменте, а о языке, предназначенном для обучения программированию, базовым принципам, таким как алгоритмы и структуры данных
dlinyj
00.00.0000 00:00+1А зачем учить тому, что будет не нужно? И почему нельзя учить сразу на современном языке?
sabaca
00.00.0000 00:00+1Столбиком умножать/делить тоже не нужно? Таблица умножения?
vconst
00.00.0000 00:00Разница между паскалем и с — не настолько трагична, как между «столбиком и калькулятор».
maisvendoo
00.00.0000 00:00+2Вы ошибаетесь - разница ужасающе трагична. И это связано как раз с концепцией указателей. Если в паскале на начальных этапах обучения можно спокойно обойтись без них, то в си ввод данных с клавиатуры уже заставляет применять операцию взятия адреса. Ну и так далее, примеров могу гору привести
vconst
00.00.0000 00:00//скрипит мозгами, пытается вспомнить, путается в показаниях
Зачем нужно взятие адреса, когда можно читать из потока?
DreamingKitten
00.00.0000 00:00Ммм, ладно. Потоки есть. Но без указателей вы их не прочитаете, емнип.
vconst
00.00.0000 00:00Да, но без прямой адресации, функциям передается указатель на то — в куда передавать данные из потока. Более низкий уровень не требуется
WraithOW
00.00.0000 00:00+1Для начинающего кодить наличие в языке нормальной поддержки строк и массивов (включая многомерные) — манна небесная.
vconst
00.00.0000 00:00Ладно… Паскаль я последний раз щупал так давно, что нет смысла о нем спорить. Самоотвод)
WraithOW
00.00.0000 00:00Да я тоже его давно не трогал, меня вон в соседнем треде натыкали носом в enum'ы. Но у меня до сих пор флешбеки от того, как я пересаживался с этого самого паскаля на си, и это напоминало переезд в Австралию, где каждый булыжник пытается тебя убить.
vconst
00.00.0000 00:00О да. Особенно учитывая, что С это было про системное программирование и наворотить там делов было элементарно
PuerteMuerte
00.00.0000 00:00Системное оно или нет, больше зависело от того, пересаживался ли ты на С на работе или в институте, но первым неприятным сюрпризом на сях было то, что в отличии от паскаля, никто не предупреждал ни о выходе за пределы массива, ни о переполнении переменных и так далее :)
vconst
00.00.0000 00:00Я тогда в школе учился. Самое страшное, что у меня могло случиться — это зависание компа, где решал очередную олимпиадную задачку ))
DreamingKitten
00.00.0000 00:00За это приходилось платить тем, что большинство таких проверок выполнялось в рантайме. Хотя их можно было отключить при компиляции, но из-за этого Паскаль получил репутацию тормозного языка.
vconst
00.00.0000 00:00Зато в С было просто. Хочешь — проверяешь ошибки и исключения, хочешь — не проверяешь, но программа может запросто вывалиться по банальному делению на ноль или несуществующему имени файла. Каждый ССЗБ
PuerteMuerte
00.00.0000 00:00+2но из-за этого Паскаль получил репутацию тормозного языка.
Да, но это больше среди студентов. Когда начинаешь работу, понимаешь, как это круто — в дебаг-сборке сразу видеть, где налажал. А в продакшен уже просто собираешь без этого оверхеда.
dlinyj
00.00.0000 00:00+1Вы путаете тёплое с мягким. Умножение столбиком и таблица умножения в жизни нужна, паскаль нет.
WraithOW
00.00.0000 00:00+3что будет не нужно
На этом этапе учат не языку, а программированию. В Паскале есть низкоуровневый доступ в памяти, который позволяет пощупать концепции типа кучи/стека, но при этом есть хоть какая-то защита от дурака в отличие от того же c/c++. После этого программист в три прихлопа пересаживается на джаву, но при этом у него не лопается мозг от int vs Integer.
Можно было бы, в теории, использовать Go/Rust, но у них блин свои приколы — один сразу начинает делать мозги обработкой ошибок, другой — борроу-чекером.
maisvendoo
00.00.0000 00:00+1На этом этапе учат не языку, а программированию.
Совершенно верно - организации программ, типам данных, алгоритмам, структурам данных. Паскаль, как язык, я еще раз повторю - создан Николаусом Виртом специально для обучения программированию, обладает строгой статической типизацией, не разрешает неявного преобразования типов. При этом дает возможность работать с указателями, что позволяет освоить базовые структуры данных. То не содержит ничего более того, что нужно новичку-первокурснику.
Давать же с нуля ЯП, фактически применяемые при разработке реального ПО - это насилие над человеческим сознанием, вырождающуюся в дальнейшую глубокую некомпетентность
maisvendoo
00.00.0000 00:00На нём нет практически коммерческих разработок. Устроится на работу программистом паскаля, если не невозможно, то очень сложно (какой-нибудь НИИ на задворках вселенной)
Такое впечатление, что высшем учебном заведении программистов учат только одному языку программирования
aamonster
00.00.0000 00:00Я верю. Формат просто похожий, но некоторые детали выдают, что писалось для себя/своих, а не для препода. И именно поэтому препод бы такой текст оценил – ему ж надо, чтобы студент разобрался в теме. Ну и указатели – базовая вещь, так что основная аудитория Хабра их давно знает или уже не будет знать никогда, статья по ним тут несколько неожиданна.
ЗЫ: У вас в вузе основы ассемблера или устройства ЭВМ были? Понимание, как в комменте @fk0 – оно всё-таки базовое, всё прочее накручивается на него.
PuerteMuerte
00.00.0000 00:00+1Статическая память — это память, которая выделяется до начала работы программы, на стадии компиляции и сборки.
Динамическая память — это оперативная память, которая выделяется в процессе компиляции программы
Это неверно. Статическая память выделяется при компиляции программы (технически нет, но по крайней мере это общепринятая формулировка, и можно считать её верной), динамическая выделяется, собственно, динамически — во время работы программы.
Но в целом за статью плюсик, ибо достойный уровень качества, хотя и тема была актуальной ещё примерно когда ваши бабушка с дедушкой были молодожёнами.SalamWord Автор
00.00.0000 00:00Спасибо. В некоторых ВУЗах есть Паскаль, поэтому и рассмотрели эту тему, т.к. она у многих вызывает затруднения.
TimID
00.00.0000 00:00И чего это в статье только простые типы данных рассматриваются. Сдаётся, дело нечисто и всё же не ради просвещения непросвещенных столь куцая статья о базовых принципах работы с памятью написана. Где записи, где массивы, где объекты. А как же незабвенный mem[]?
SalamWord Автор
00.00.0000 00:00Статья ведь называется "Знакомство..", то есть она освещает базу для работы с указателями.
DreamingKitten
00.00.0000 00:00+6Вспомнилось что-то. Паскаль -- очень выразительный и лаконичный язык. Во всяком случае, никто из тех, кого я этим доставал, не смог адекватно перевести на другие языки следующее:
type TDayTime = (dMorning, dDay, dEvening, dNight); const Names : array [TDayTime] of string = ('Morning', 'Day', 'Evening', 'Night');
spacediver
00.00.0000 00:00Да, это ни с чем не сравнимое ощущение буквальности, что ли, языка. Немного, разве что, в Лиспе оно возможно?..
AnthonyMikh
00.00.0000 00:00-5Rust с библиотекой strum:
#[derive(strum::EnumVariantNames)] enum DayTime { Morning, Day, Evening, Night, } // `DayTime::VARIANTS` - массив `["Morning", "Day", "Evening", "Night"]`
И да, насчёт выразительности и лаконичности Pascal читать смешно.
Maccimo
00.00.0000 00:00Ну вот вам Java:
public enum DayTime { Morning("Morning"), Day("Day"), Evening("Evening"), Night("Night"); private final String name; DayTime(String name) { this.name = name; } public String getName() { return name; } }
Буковок больше, но с адекватностью и выразительностью никаких проблем.
comdivuz
00.00.0000 00:00Хотите переведу?
```kotlin
enum class DayTime { Morning, ... }
val names = DayTime.values().map{it.name() }
```
DreamingKitten
00.00.0000 00:00Как мне уже тут справедливо заметили ниже, пример не о строковом представлении перечислимого типа, а о том, что им можно индексировать массив.
kipar
00.00.0000 00:00+4Вы не совсем полный пример привели, из-за чего отвечающие подумали что дело в переводе энама в строку.
Лучше как-то так:
type TDayTime = (dMorning, dDay, dEvening, dNight); const Names : array [TDayTime] of string = ('Morning', 'Day', 'Evening', 'Night'); const RussianNames : array [TDayTime] of string = ('Утро', 'День', 'Вечер', 'Ночь'); type TWeekDay = (Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday); var PowerLoad[TWeekDay, TDayTime] of Double; ... for day in TWeekDay do PowerLoad[day, dEvening] := PowerScale[dEvening] * PowerLoad[day, dMorning] ...
т.е. дело в использовании энама в массивах в качестве индекса. Такое нужно довольно часто, из коробки я видел разве что в AMPL, где-то для этого приходится использовать хеш-таблицу (хотя она очевидный оверкилл когда и число элементов и их номера известны заранее), где-то можно сделать аналог с помощью метапрограммирования (я и сам делал, для Crystal).
WraithOW
00.00.0000 00:00del
DreamingKitten
00.00.0000 00:00+2Нет здесь никакого волшебства, это вас разбаловали языки, которые дают программисту чересчур много способов выстрелить себе в ногу. Строгая типизация таких приколов не позволяет:
main.pas(2,81) Error: Expected another 1 array elements
Ну и как меня уже тут справедливо поправили, пример кода не о текстовом представлении, а о том, что массивы можно индексировать перечислимым типом. Где ещё такое есть в том, что сейчас модно и современно?
AnthonyMikh
00.00.0000 00:00Ну и как меня уже тут справедливо поправили, пример кода не о текстовом представлении, а о том, что массивы можно индексировать перечислимым типом.
Стоило бы так сразу и сказать. Rust с enum-map:
use enum_map::{enum_map, Enum, EnumMap}; #[derive(Enum)] enum DayTime { Morning, Day, Evening, Night, } fn names() -> EnumMap<DayTime, &'static str> { enum_map! { DayTime::Morning => "Morning", DayTime::Day => "Day", DayTime::Evening => "Evening", DayTime::Night => "Night", } }
Или, если нужно без зависимостей или нужно индексировать именно массивы:
use std::ops::{Index, IndexMut}; impl<T> Index<DayTime> for [T; 4] { type Output = T; fn index(&self, idx: DayTime) -> &Self::Output { &self[idx as usize] } } impl<T> IndexMut<DayTime> for [T; 4] { fn index_mut(&mut self, idx: DayTime) -> &mut Self::Output { &mut self[idx as usize] } } const NAMES: [&'static str; 4] = ["Morning", "Day", "Evening", "Night"];
DreamingKitten
00.00.0000 00:00+2Я тут хотел было съязвить насчёт того, что это были бы прекрасные кандидаты на что-то вроде IOCCC, но потом понял, что на самом деле ваш код прекрасно иллюстрирует мою мысль, спасибо.
Zhuikoff
00.00.0000 00:00Спор о лучшем языке программирования не имеет смысла, если у тебя есть нож и нужно отрезать кусок колбасы - просто отрежь и съешь.
PuerteMuerte
00.00.0000 00:00Если у тебя есть нож, ты и без программирования можешь неплохо зарабатывать.
serafims
00.00.0000 00:00+1Концепция указателей хорошо видна в Паскале тогда, когда начинают делать лабы с файлами типизированными, по сути там и пишут в файл с его позицией какиепнибудь записи, смещаясь каждый раз на размер записи.
Студентов, вероятно, путает вся эта синтаксическая магия со знаками-крышками, собаками и т. п.
dlinyj
00.00.0000 00:00+1Хочу сказать, что статья очень достойная. Вы молодцы, и продолжайте в том же духе! Не бойтесь критики, и смело идите вперёд.
Но на счёт паскаля, это трагедия что этот язык преподают. Те, кто в ВУЗах преподаёт ДОС, Pascal, Windows XP, 8080 и прочий старый хлам — просто враги прогресса и студентов. Эти знания никогда не пригодятся.
Говорят, мол, зная паскаль можно выучить другие языки. Таки да, но что мешает сразу начать с си? Намного больше пользы, даже если человек не будет его использовать, синтаксис будет полезен.vconst
00.00.0000 00:00-2что мешает сразу начать с си?
А еще лучше С++
Потому что с него прямая дорога в шарп, джаву, котлин и тд тп, что потом выберет студент. Все равно, в основе С++dlinyj
00.00.0000 00:00+2Способы мышления си и с++ разные.
Каждый кулик своё болото хвалит.Я, скорее, за классический си.vconst
00.00.0000 00:00-1Абсолютно разные. Потому надо начинать с С++, ибо он куда более современный. А чистый С пусть выбирают уже на специализации, может кто в микроконтроллеры уйдет. Другим то он зачем?
DistortNeo
00.00.0000 00:00+6Не надо начинать с C++. Это один из самых сложных языков в мире, который практически никто не знает на 100%, и который требует обширного багажа предварительных знаний и нескольких лет для изучения.
dlinyj
00.00.0000 00:00+2Ядро Linux, системные программисты.
vconst
00.00.0000 00:00Ну да, очень небольшие ниши
dlinyj
00.00.0000 00:00+1«небольшие» :)))
vconst
00.00.0000 00:00+1По сравнению со всяким энтерпрайзом то? Или мобильной разработкой?
dlinyj
00.00.0000 00:00+1Смотровая площадка у университета. Там байкеры собираются, как вы знаете.
Очередная тусовка.
В одной стороне реальные такие дядьки бородатые, солидные. Харлеи стоЯт в рядок блестят хромом, все один к одному. Дядьки чинно спокойно стоят, что-то свое перетирают. Все так спокойно, благородно, солидно…
В другой стороне пацаны на спортах. Вжик-вжик, туда сюда, постоянно шастают, визжат, вилли и т.п., то в магазин отъедут, то приедут, как улей пчелиный короче.
Тут один из них к дядькам подлетает, стоппи, дым из под колес… И спрашивает:
— мужики! А чего вы с нами никогда не знакомитесь?
Дядька спокойно так, сплевывая в сторону:
— а чего с вами знакомиться-то?.. ВЫ КАЖДЫЙ ГОД НОВЫЕ...
БАШ :). Та же «мобильная разработка», в каждом телефоне стоит ядро Linux, которое тоже требует драйверов ;)
Ещё раз присказка про кулика и болото. Правды тут нет, но востребованность на эту тему тоже большая.
DistortNeo
00.00.0000 00:00Как раз опыт C++ здесь может сильно мешать. Например, в STL используется довольно своеобразный способ работы с коллекциями и итераторами, имеющий мало общего с C#/Java/Kotlin/Python.
PuerteMuerte
00.00.0000 00:00Потому что с него прямая дорога в шарп, джаву, котлин и тд тп, что потом выберет студент. Все равно, в основе С++
Прямая дорога в шарп, джаву и т.д. не с С++, а как раз с Паскаля. Паскаль намного ближе к тоже же шарпу, чем С++. Потому что для перехода на шарп с Паскаля нужно запоминать простейшие технические штуки вроде «скобочки вместо бегин/энд», а для перехода с С++ на шарп надо учить новую парадигму программирования.
khrapko
00.00.0000 00:00+2Ну не пойму я в чем трагедия то. Я начинал с бейсика и фортрана. Потом много ассемблера. И Паскаля 6.
Потом дельфи. И до сих пор на нем пишу. Это не значит, что я на чем то другом не пишу. Устану перечислять чего я только не использовал.
Этот спор мне всегда напоминал медведя Балу в Маугли. Когда он наказывает мальчика зато, что тот бежит на двух ногах. Ну мальчику так удобнее. Удобнее преподам излжжить материал и они излагаю. Паскаль четко реализует все классические операторы Алгоритмического языка программирования. Удобнее студентам понять эти азы. А дальше в полет.
Больше всего не люблю заказчиков, которые приходят и диктуют мне на каком языке я должен им что то исполнить. При этом еще не имея денег на оплату. Та какая блин разница. Это если ты идешь в команду, то там да. Там уже пишут все на одном и надо выть как и вся стая.
В общем ребята молодцы. Изложили нормально. Я тут отвлекался и не запомнил привели ли они примеры связных списков. Тут чуть выше человек спрашивал, для чего это нужно. Вот для этого и нужно.
Еще раз возвращаясь к устареванию или исполнению. Ну я много на дельфи использую библиотек от С. Заголовочный файл написал и вперед.
Как то так. Когда то Вирт по моему создал еще Модула. Типа там больше было операторов для работы с внешними устройствами. Ну вот эта Модула вроде и новее Паскаля и где она. Та нету.dlinyj
00.00.0000 00:00-2В общем ребята молодцы. Изложили нормально.
Большие молодцы.
Трагедия в старческом подходе и обучению старью.khrapko
00.00.0000 00:00Так старперы там преподают в ВУЗах. Я и сам не молод, но как то попросили меня подобрать пару программистов во вновь создаваемую фирму. Ну где их взять молодых и умных. Пошел по старой памяти на защиту дипломов в институт. Ну лет 10-15 назад мой шеф по аспирантуре сказал, что кандидатская сейчас это что то типа диплома в мое время, а диплом это как курсовая работа в твое же время. Ну точно дипломы какие то хилые, послушать нечего. Все бубнят о методах черного и белого ящика при тестировании. О программировании как то не очень. И в комиссии мои одногодки,а то и на десяток полтора лет старше. Противно
Но я повторяю. Та неважно какой язык. К примеру у Кнута и своя машина и свой язык. Думаю мало кто его знает. Но читали многие.
У нас один препод четко излагал. Есть несколько операторов и они есть во всех алгоритмических языкахОператор присваивания (тут между переменной и значением можете вписать что себе хотите)
Условный оператор (тут можете логическое выражение заключать в скобки или не заключать. И операторы после выражения в скобках или нет
Операторы цикла
3.1 С определенным количством циклов (for etc...)
3.2 С предусловием (условие проверяется до выполнения)
3.3 С постусловием (условие проверяется после хотя бы одного прохода)
Операторы ввода-вывода.
Оператор безусловного перехода (это запрещено и упоминать всуе)
Наверное что то еще. Но уже подзабыл. Вот напишите вашу новейшую программу в этих терминах и все дела. Точно так же ее можно будет написать на других языках.
PuerteMuerte
00.00.0000 00:00+1Я и сам не молод, но как то попросили меня подобрать пару программистов во вновь создаваемую фирму. Ну где их взять молодых и умных.
А в этой новой фирме какие-то другие программисты предполагались? Потому что взять молодых и умных студентов из ВУЗа в новую фирму, где нет хотя бы одного опытного программиста, это самоубийственная идея.khrapko
00.00.0000 00:00Предполагалось, что я буду руководителем филиала из одной западной страны. Язык этой страны мне не очень нравиться и когда они начали предлагать свои компы со своим хендехоховским языком, да еще и зажимать бабло, то я отказался. Но по моему филиал таки существовал. Я точно не знаю. Так вот раз уж такая песня про старье то работали там на Шестом бейсике. Для меня было дико смотреть на это после Дельфи.
Да и хочу вам сообщить что есть еще и прагматика во всех этих вопросах. В США и Австралии многие пишут на Коболе (старье, но пишут) потому, что это оплачивается.
И я еще раз повторяю. Лично мне да по фиг на чем писать. Алгоритм он и есть алгоритм. Но если работать в команде то тут про личности можно забыть. И завывать на том, за что платятPuerteMuerte
00.00.0000 00:00Так вот раз уж такая песня про старье то работали там на Шестом бейсике
Дело не в языке. Вчерашние студенты без толкового ментора на любом языке запорят проект с вероятностью 90%khrapko
00.00.0000 00:00Так я же и пытаюсь про это рассказать.
Пришел я в коммерческую фирму. Писали на Клиппере.
Дали в помощь мне еще девочку. Дал задание. Быстро написала.
Но как вам сказать. Одно и то же раз 15 повторила. Я говорю - а че бы это в процедуру или подпрограмму не вынести. Ответ поразил. А зачем. Редактор же легко позволяет копировать одни и теже участки текста.PuerteMuerte
00.00.0000 00:00О Майн Готт :)
Ну это тоже вопрос к преподавателю программирования, который не рассказал самое начало азбуки нормального кода, зачем нужны подпрограммы, и как придётся страдать, когда нужно будет сделать, например, одно изменение кода в этом куске.PereslavlFoto
00.00.0000 00:00"Редактор же легко позволяет" изменить в одном месте и затем "копировать одни и теже участки текста".
Индийский метод не просто так возник.
dlinyj
00.00.0000 00:00-1Оператор безусловного перехода (это запрещено и упоминать всуе)
Могу вас уверенно сказать, что это ошибочное утверждение. Есть места, где он используется повсеместно. Можете открыть любой драйвер Linux. Из последнего, с чем сталкивался.
Учить надо тому, что может использовать выпускник сразу после выпуска. Паскаль нельзя, как и ДОС, как и 8080.PuerteMuerte
00.00.0000 00:00Учить надо тому, что может использовать выпускник сразу после выпуска.
Мы за годы института писали на Паскале, на VB, на С, С++, гоняли в хвост и в гриву SQL и так далее. И было здорово, что на первом курсе нам дали именно Паскаль, а потом на втором сказали, что ок, собственно программировать научились, теперь давайте двигаться дальше. И по-моему, нигде Паскаль не мучают все пять лет, может разве что на филфаке и религиоведении. Это язык для «лёгкого старта», после чего уже студенты занимаются чем-то другим. Поэтому его вполне себе можно использовать.dlinyj
00.00.0000 00:00Четырнадцатилетнего учил си, не вижу проблем :)
PuerteMuerte
00.00.0000 00:00Оптимизация обучения — это не про не когда у вас четырнадцатилетний ребенок, а про когда у вас два потока по сотне восемнадцатилетних.
dlinyj
00.00.0000 00:00-4Вы зачем-то со мной спорите, пытаетесь мне что-то доказать. Я переучиваю студентов после убогого обучения.
То что мы когда-то учили паскаль, и даже, о боже пишем на нём (у меня даже статьи есть тут), и любим его, не означает то, что язык морально устарел.
Любовь к паскалю одно, а вот засорять мозг — другое.
Постоянно пытаюсь донести мысль, что если мы хотим получить годные кадры на выпуске ВУЗа, то нужно отказаться от порочных практик преподавания ненужного старья. Ведь, в ВУЗах автомобилестроения нет курса по паровым двигателям, верно?PuerteMuerte
00.00.0000 00:00+3любим его, не означает то, что язык морально устарел.
Ну так в обучении программированию нет морального устаревания. Моральное устаревание есть в продакшене. А учиться программировать надо на том, на чём легче учиться. Паскаль в этом плане прекрасно подходит до сих пор. А потом уже, когда первые шаги сделал, можно и к чему-то более применимому на практике переходить.Ведь, в ВУЗах автомобилестроения нет курса по паровым двигателям, верно?
Да есть, в общем. Не в практическом плане, а в теории, как работают тепловые машины, действительно рассказывают на примере паровых двигателей, потому что это просто и понятно. А потом уже переходят к более сложным ДВС.dlinyj
00.00.0000 00:00-1Простой вопрос: в передовых странах мира, флагманах технологий изучают паскаль по программе?
Причина изучения паскаля не в его удовительном свойстве, а в банальном нежелании преподавателей обучаться и изучать новое.
khrapko
00.00.0000 00:00Тут я Вас поддерживаю на 100 %. Но я выше написал. Просто старперы, которых уже не переспоришь. А вот кто молодой красивы пойдет излагать в ВУЗ передовой язык какой нибудь. Так вот и нету людей.
PuerteMuerte
00.00.0000 00:00Простой вопрос: в передовых странах мира, флагманах технологий изучают паскаль по программе?
Наверное нет. А встречный вопрос — мы, выученные на паскалях, отстаем в качестве разработчиков ПО от передовых стран?Причина изучения паскаля не в его удовительном свойстве, а в банальном нежелании преподавателей обучаться и изучать новое.
В значительной мере да, но это, скажем так, не критично. Критично то, что преподаватель программирования в ВУЗе зарабатывает намного меньше, чем программист, поэтому естественный отбор работает в другую сторону.
khrapko
00.00.0000 00:00Я вот никак не пойму, кто принял как истину в последней инстанции , что Паскаль устарел и мы просто портим молодежь.
Я не вижу проблемы устаревание.
Только бизнес. МС позволяет себе вкладывать большие бабки в рекламу Студии. А Борланд и тем более Ембаркадеро то точно не могут. Вот вам и причина устаревания.
Мой друг уехал в Ирландию. Когда его спрашивали на чем он пишет то он отвечал на Дельфи от Борланд. Его спрашивали - это фирма вашего дяди чтоли. Никто не спрашивал работы, которые он сделал. Все почему то нужно язык. Какому то бухгалтеру заскорузлому, который и программируемы калькулятор освоить не может, подавай визуал студию. Зачем, он не знает.
Вот кстати о МС SQL и FireBird. Тоже старый движок фареберд. То, что МС купила Сибейз и дала ему свое имя, то наверное никто и не помнит. А вот заказчик мне. Ты на Фареберде не пиши , а пиши на МС СЕКУЕЛ. Почему - пояснить никто не может. Я ему показываю ту же задачу написаную в двух разных СУБД и фареберд шустрее делает выборку. Но ему дай что то то от МС, потому, что это фирма.dlinyj
00.00.0000 00:00У вас типичная ошибка построения статистики по кругу знакомств. Это нерепрезентативная выборка. То, что вам ещё удаётся находить работу с паскалем, не означает что он популярен.
Только бизнес. МС позволяет себе вкладывать большие бабки в рекламу Студии. А Борланд и тем более Ембаркадеро то точно не могут. Вот вам и причина устаревания.
Удивительно, около 15 лет не пользуюсь продуктами MS и не пишу для них. А везде не используется паскаль. Нигде не встречал (тоже ошибка). Веб, приложения для бизнеса, аппаратные приложения, и т.п. Питон и тот будет мощнее и удобнее паскаля.
khrapko
00.00.0000 00:00Питон и тот будет мощнее и удобнее паскаля.
Та вы правы, что Питон круче. Я как то начитался и думаю, возьму ка я напишу что нить на Питоне. Но первая фраза, которая мне попалась в какой то статье - Питон не очень подходит для десктопных приложений.
От и облом. Я то другие и пишу очень очень редко. Вот так и закончилась наша любовь
khrapko
00.00.0000 00:00У вас типичная ошибка построения статистики по кругу знакомств. Это нерепрезентативная выборка. То, что вам ещё удаётся находить работу с паскалем, не означает что он популярен.
Та не ищу я уже работу. Это она еще за меня держится. Но того же материала на том же Дельфи наработано ой как много. Предприятие на нем работает. И как, несмотря на мои неоднократные объявления не появляются люди могущие еще написать на том же Дельфи. Но к сожалению не находится и людей, которые могут переложить это все на более современный язык. Ну так, чтобы при это не положить работу предприятия.
PuerteMuerte
00.00.0000 00:00+2Ты на Фареберде не пиши, а пиши на МС СЕКУЕЛ. Почему — пояснить никто не может. Я ему показываю ту же задачу написаную в двух разных СУБД и фареберд шустрее делает выборку. Но ему дай что то то от МС, потому, что это фирма.
Заказчик интуитивно прав. У огнептицы сейчас есть несколько критических недостатков, которые программным путём не исправляются:
1. По ней фиг найдёшь специалиста. Ну т.е. относительно несложно найти дедушку вроде меня, который двадцать лет назад был ого-го, лабал на Delphi+FB/IB, и может быть что-то ещё помнит, но попробуй ещё уговорить его поменять текущий стек на тот, что был 20 лет назад.
2. А ещё по ней фиг найдёшь хостинг. Ну т.е. если хочется олд-стайл, локальный сервер, свой админ, бэкапы и всё такое, вам никто богато жить не запретит. Но если вам хочется делегировать это облачникам, не получится. МС СКЛ — запросто, мускуль с постгресом — вообще навалом. А огнептицу попробуй ещё найди.
Ну а быстродействие, то такое, если у вас бизнес генерирует столько транзакций, что быстродействие MS SQL стало бутылочным горлышком, вам можно позавидовать.
khrapko
00.00.0000 00:00+1Вот в вузах где изучают передовые атомные станции и изучают паровые двигатели. И турбины. И очень много про пар.
Вот по моему мнению так технология вращения турбины паром от банального нагрева воды давно устарела, а поди так и используется вовсю.dlinyj
00.00.0000 00:00-1Вы передёргиваете мою мысль. Я говорил про поршневые паровые двигатели, которые не используются.
khrapko
00.00.0000 00:00ТА учить это одно. А вот как он будет выпонять работу это другое.
А то такие как примеры не с программирования. Попросили поставить виндовс. Мол такой умный четырнадцатилетний. Ну все может на компе. Меня всегда умиляли родители, которые и пультом от телека поьзоваться не могут, оценивают сое чадо как гения в программировании.
Ну вот.Поставил. Через неделю что то не работает. Что делал спрашиваю. Драйвер ставил. На фига. Плачет.. Хорошо. Переставил систему.
Через неделю опять не работает. Спрашиваю, что дела. Та тут мол освобождал место на диске. Был большой каталог Виндовс называтся. Я его и удалил.
А так родители говорят что просто гений.
Дальше молчу.
khrapko
00.00.0000 00:00Я же не говорю, что не испоьзуется. Но опять же обращаясь к книгам Кнута и Дейкстры вспоминается, что использование этого оператора - МОВЕТОН.
И действительно иногда думаешь - ну никак без него. Но потом подумаешь и вот он выход . И даже красивше получается.
И почему нельзя про ДОС. Мой сын после института работал на заводе, где программировал контролеры. И нормально. При этом диплом был на паскале у него.dlinyj
00.00.0000 00:00И почему нельзя про ДОС. Мой сын после института работал на заводе, где программировал контролеры. И нормально. При этом диплом был на паскале у него.
Какой ужас… А потом мы удивляемся, что у нас такое технологическое отставание.
WraithOW
00.00.0000 00:00Ну эт не от хорошей жизни, если честно, а от невыразительности языка. В той же жабе аналог будет выглядеть как
synchronized(data.updatedLock) { int status = pmbus_get_status(client, page, reg); if (status < 0) { return status } //... }
При этом олдовым unrestricted goto обычно никто не пользуется, максимум как раз то, что вы привели в качестве примера.
mayorovp
00.00.0000 00:00Конкретно в указанном вами месте оператор условного перехода нужен из-за отсутствия в языке RAII и try/finally.
Вот, кстати, их бы включить в список не помешало...
AnthonyMikh
00.00.0000 00:00Есть места, где он используется повсеместно. Можете открыть любой драйвер Linux...
Как и полагал, пример показывает, как goto используется вместо отсутствующего RAII или хотя бы defer. Вы скорее бедность C продемонстрировали, чем нужность goto.
maisvendoo
00.00.0000 00:00+5Те, кто в ВУЗах преподаёт ДОС, Pascal, Windows XP, 8080 и прочий старый хлам — просто враги прогресса и студентов.
Те кто продолжает запускать TP и BP в сеансе недоэмуляции DOS под Windows XP и на этом учат студентов - реально враги прогресса и студентов. В то время когда есть FreePascal версии 3.2.2 вышедшей в 2021 году. Это раз.
Второе - те кто предлагает начать обучение программированию с C такие же враги, равно как и те, кто предлагает для этой цели Python. Оба языка, в 2023 году, имеют вполне определенные ниши применения: первый - системное программирование, второй - веб-разработка и скриптинг. Не смотря на то, что оба именуются языками общего назначения.
Си с его UB, неявным приведением типов, указателями с порога, malloc-ами и прочими прелестями - это конечно то, что нужно первокурснику! Еще раз повторю - начинать обучения с ЯП изобилующего такими "сюрпризами" - это сознательная профдеформация обучаемого. Достаточно одно примераint a = 1; int b = 2; float c = a / b; printf("%f\n", c);
чтобы прийти к пониманию того, что вот новичку как раз не нужно разбираться с тем, почему c = 0.0 - у него у новичка - есть другие задачи, и хорошо бы, чтобы компилятор любезно подсказал или запретил неявное преобразование типов.
Почему-то Вы упрямо утверждаете о ненужности языка. Может Паскаль как язык и не нужен, а вот как средство получения первоначальных навыков программирования он подходит лучше любого ЯП. Для освоения "нужных" в Вашем понимании вещей обучение в специалитете длится 5 лет, а по болонской системе - все 6 (бакалавриат и магистратура). Поверьте, семестр Паскаля на первом курсе никому не повредит
man_of_letters
00.00.0000 00:000. Паскаль был светлой юношеской любовью, какое-то время был тру-фанатом и более чем наработался с ним. Убийство микрософтом экосистемы Delphi не забуду, не прощу.
1. Эта статья вызывает боль у завсегдатаев хабра, потому что технические аспекты мёртвого языка должны жить в гугле, статьи про паскаль могут быть интересны в ностальгическом ключе, чтобы утёрли слёзы гики 90х
2. Преподавать в Университете уже несуществующие языки — так-то плевок в будущее общества, полно современных языков, на которых можно показать всю базу в любых разрезах, не уступающих по «читабельности».
3. Если авторов действительно удивляет реакция читателей, и если это ваша будущая профессия, то проводите больше времени тут, чем у вас там. Пора разбираться где и за что вам согласятся платить деньги. Лучше получить 3 у такого препода, но потратить время на самостоятельное погружение во что угодно, встречающееся в вакансиях.
perfect_genius
00.00.0000 00:00-1Страшно представить в каком виде представлена информация об указателях Паскаля в Интернете, раз вы пытались это всё собрать и донести в более доступном виде. Потому что ваш материал тоже очень сложный, очень нагруженный. Сразу вспомнилась школа, где надо было всё это бездумно зубрить и не понимать — за что же так мучить ученика? В чём он провинился?
fk0
Я компьютер изучал с бейсика и ассемблера. И концепция указателя самое понятное что есть в компьютере. Указатель -- это адрес в памяти. А по адресам записаны байтики. Компьютер же не может работать сразу непосредствнено с именованной переменной. Что тут непонятного?
aamonster
Те, кто начинал с бейсика (без ассемблера и операторов peek/poke) или с современных языков с GC (тут ниже товарищ, кажется, жаждет,чтобы учили сразу с Питона) вполне могут этого и не знать. А так-то, конечно, ваше объяснение куда прозрачней того, что в статье)
ReadOnlySadUser
Я начал с С++. Учил сам по какой-то случайной книжке издательства Питер. До этого из опыта программирования - калькулятор в консоли на Паскаль. Всё.
Так вот указатели я понял минут за 5. Я так и не понял нафига под них выделили целую главу. Это самая тупая вещь в истории, как она у кого-то вообще может вызывать проблемы?
PuerteMuerte
Это вам так повезло, что вы указатели поняли минут за 5. У большинства студентов такой суперспособности нет.
ReadOnlySadUser
Всё лежит в памяти компьютера
Память (для простоты) представляем как кучку пронумерованных ячеек
Указатель хранит номер ячейки в которую нужно посмотреть, чтобы найти интересующие нас данные
См. пункт 1 и понимаем, что указатель тоже лежит в памяти
Соответственно указатель на указатель - хранит номер ячейки с другим указателем.
Повторяем пункты 4 и 5 до нужного уровня вложенности указателей.
Как только эту простейшую схему объяснить, добавить в эту схему арифметику с указателями уже не составит труда.
Объяснить всякие тонкости с выравниванием, NULL, виртуальной и физической памятью, страничной адресацией и пр. и пр. за 5 минут не получится, но саму концепцию указателей буквально за 5 минут можно рассказать ведь)
PuerteMuerte
В этой схеме не хватает главного — зачем это надо, и что с этим делать.
ReadOnlySadUser
С этим можно много чего делать) Но это всё никак не относится к самой концепции указателя.
Условно, указатель может указывать вообще не в память, а в пин микроконтроллера, который замаплен в память) Но это ваще никак не относится к указателю как концепции)
perfect_genius
Когда не понимаешь зачем что-то надо, то мозг сопротивляется этой бесполезной, на данный момент, информации.
Если же начать с задачи/проблемы ("Нам надо найти в тысяче ячеек, расположенных подряд, определённое число. Как это сделать?"), то всё идёт гораздо легче.
mayorovp
И вот эта явная задача на массив якобы даёт понимание указателей?
perfect_genius
Если бы вы придумали свой вариант, то написали бы в своём комментарии, так?
Новичок знает массив, знает как формируется адрес для доступа к любому элементу. Так пусть теперь пробежится по массиву указателем как альтернатива.
Далее усложняем уже связанным списком, например.
Didimus
На Паскале с помощью указателей можно выделять массивы той длины, которая заранее неизвестна. В противном случае вам придётся выделить эту память заранее, при старте программы. А вы не знаете, сколько потребуется
aamonster
Поверьте, может. См., к примеру, https://www.joelonsoftware.com/2005/12/29/the-perils-of-javaschools-2/ – дофига народа не врубается в указатели. Странно, но факт.
perfect_genius
Ничего непонятного в этом нет. Обычно, сложно понять что происходит в синтаксисе программы с ними. Особенно когда скобки в скобках, а ещё там-же берётся адрес и приведение типа… Мозг сломать можно с непривычки.
Didimus
Наименование переменной в коде тоже своего рода указатель, только не в виде физического адреса. Alias, так сказать