Всем читателям 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 и т.д.: мы используем операцию «присваивания».

    Присвоить можно:

    1. значение того же типа, что и указатель (строка 36, 37)

    Результат работы программы
    Результат работы программы
    1. адрес другой переменной (строка 11, 17)

    2. специальное значение, которое называется пустой указатель и обозначается служебным словом nil (Оно не связано ни с каким объектом, т.е. ни на что фактически не указывает, строка 41)

      Результат работы программы
      Результат работы программы
    3. значение типа, на который указывает указатель (строка 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 к свободному указателю может привести к ошибке.

Достоинства и недостатки указателей

  1. Достоинства указателей

    • уменьшают объем памяти и сокращает время выполнения программы

    • позволяют возвращать несколько значений из функции и могут использоваться для передачи информации между функциями

    • дают возможность изменить размер динамически выделенного блока памяти

    • позволяют получить доступ к любой ячейки памяти компьютера

    • помогают создавать сложные структуры данных, такие как связанный список, стек, очереди, деревья, графики и т.д.

  2. Недостатки указателей

    • выделенный динамически блок памяти необходимо освобождать явно, иначе может произойти утечка памяти

    • повышают вероятность возникновения ошибок и проблем с памятью. При этом найти и исправить эти ошибки задача не из легких, особенно в объемных программах

    • сложны для понимания и требуют определенного объема знаний. Программист несет ответственность за эффективное и правильное использование указателей

Для чего нужны указатели?

Если нет особой необходимости использовать указатели, лучше выбирать альтернативный вариант, который практически всегда присутствует. Например, использование ссылок.

  1. Для того, чтобы напрямую работать с памятью

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

    Например, при передаче указателя в функцию компьютер не создаёт её локальную копию, а обращается к ней напрямую.

  2. Для динамического управления памятью

    Если нам нужно выделить в памяти некоторую область для хранения своих данных, но стандартные переменные нам не подходят, мы можем использовать указатель. В этом случае мы помещаем в него стартовый адрес ячейки и говорим, сколько байтов после него нужно использовать и что в них положить.

Задачи с применением указателей

  1. Через указатели на указатели посчитать сумму двух чисел и записать в третье.

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.
  1. Напишите функцию 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)


  1. fk0
    00.00.0000 00:00
    +14

    Я компьютер изучал с бейсика и ассемблера. И концепция указателя самое понятное что есть в компьютере. Указатель -- это адрес в памяти. А по адресам записаны байтики. Компьютер же не может работать сразу непосредствнено с именованной переменной. Что тут непонятного?


    1. aamonster
      00.00.0000 00:00
      +4

      Те, кто начинал с бейсика (без ассемблера и операторов peek/poke) или с современных языков с GC (тут ниже товарищ, кажется, жаждет,чтобы учили сразу с Питона) вполне могут этого и не знать. А так-то, конечно, ваше объяснение куда прозрачней того, что в статье)


      1. ReadOnlySadUser
        00.00.0000 00:00
        +2

        Я начал с С++. Учил сам по какой-то случайной книжке издательства Питер. До этого из опыта программирования - калькулятор в консоли на Паскаль. Всё.

        Так вот указатели я понял минут за 5. Я так и не понял нафига под них выделили целую главу. Это самая тупая вещь в истории, как она у кого-то вообще может вызывать проблемы?


        1. PuerteMuerte
          00.00.0000 00:00
          +2

          Это вам так повезло, что вы указатели поняли минут за 5. У большинства студентов такой суперспособности нет.


          1. ReadOnlySadUser
            00.00.0000 00:00
            +2

            1. Всё лежит в памяти компьютера

            2. Память (для простоты) представляем как кучку пронумерованных ячеек

            3. Указатель хранит номер ячейки в которую нужно посмотреть, чтобы найти интересующие нас данные

            4. См. пункт 1 и понимаем, что указатель тоже лежит в памяти

            5. Соответственно указатель на указатель - хранит номер ячейки с другим указателем.

            6. Повторяем пункты 4 и 5 до нужного уровня вложенности указателей.

            Как только эту простейшую схему объяснить, добавить в эту схему арифметику с указателями уже не составит труда.

            Объяснить всякие тонкости с выравниванием, NULL, виртуальной и физической памятью, страничной адресацией и пр. и пр. за 5 минут не получится, но саму концепцию указателей буквально за 5 минут можно рассказать ведь)


            1. PuerteMuerte
              00.00.0000 00:00
              +1

              Как только эту простейшую схему объяснить,

              В этой схеме не хватает главного — зачем это надо, и что с этим делать.


              1. ReadOnlySadUser
                00.00.0000 00:00

                С этим можно много чего делать) Но это всё никак не относится к самой концепции указателя.

                Условно, указатель может указывать вообще не в память, а в пин микроконтроллера, который замаплен в память) Но это ваще никак не относится к указателю как концепции)


                1. perfect_genius
                  00.00.0000 00:00

                  Когда не понимаешь зачем что-то надо, то мозг сопротивляется этой бесполезной, на данный момент, информации.
                  Если же начать с задачи/проблемы ("Нам надо найти в тысяче ячеек, расположенных подряд, определённое число. Как это сделать?"), то всё идёт гораздо легче.


                  1. mayorovp
                    00.00.0000 00:00

                    Если же начать с задачи/проблемы ("Нам надо найти в тысяче ячеек, расположенных подряд, определённое число. Как это сделать?"), то всё идёт гораздо легче.

                    И вот эта явная задача на массив якобы даёт понимание указателей?


                    1. perfect_genius
                      00.00.0000 00:00
                      -2

                      Если бы вы придумали свой вариант, то написали бы в своём комментарии, так?
                      Новичок знает массив, знает как формируется адрес для доступа к любому элементу. Так пусть теперь пробежится по массиву указателем как альтернатива.
                      Далее усложняем уже связанным списком, например.


              1. Didimus
                00.00.0000 00:00

                На Паскале с помощью указателей можно выделять массивы той длины, которая заранее неизвестна. В противном случае вам придётся выделить эту память заранее, при старте программы. А вы не знаете, сколько потребуется


        1. aamonster
          00.00.0000 00:00

          Поверьте, может. См., к примеру, https://www.joelonsoftware.com/2005/12/29/the-perils-of-javaschools-2/ – дофига народа не врубается в указатели. Странно, но факт.


    1. perfect_genius
      00.00.0000 00:00

      Что тут непонятного?

      Ничего непонятного в этом нет. Обычно, сложно понять что происходит в синтаксисе программы с ними. Особенно когда скобки в скобках, а ещё там-же берётся адрес и приведение типа… Мозг сломать можно с непривычки.


    1. Didimus
      00.00.0000 00:00

      Наименование переменной в коде тоже своего рода указатель, только не в виде физического адреса. Alias, так сказать


  1. kale
    00.00.0000 00:00
    +25

    За курсовые на Хабре теперь зачет дают или автомат сразу?


    1. SalamWord Автор
      00.00.0000 00:00
      +4

      Почему? Нет, это наше желание.


    1. vconst
      00.00.0000 00:00
      +2

      А это уже не первый раз. Препод говорит, что если напишете пост на Хабре и он выйдет из песочницы — то будет какой-то зачет лабы или чего-то такого


      1. Pochemuk
        00.00.0000 00:00
        +4

        Но тут, хотя бы, собственные мысли. А в тот раз была куча переводных статей и даже с одинаковыми КДПВ.


      1. Exosphere
        00.00.0000 00:00
        +2

        Как всегда, слышал звон… :-) Ситуации уже разобрали. Кстати, сейчас никаких сессий и зачетов не идёт, только семестр начался. И любая самостоятельная студенческая статья всегда имеет равные с другими шансы выйти на Хабр.


        1. vconst
          00.00.0000 00:00

          Как всегда
          Ага-ага, ну да, ну да ))


      1. aamonster
        00.00.0000 00:00
        +4

        Тут выглядит скорее "чтобы разобраться – надо объяснить кому-нибудь". Imho, достойное поведение, только ресурс выбран неудачный.


      1. SalamWord Автор
        00.00.0000 00:00

        может, у вас такое есть. с таким не сталкивались


    1. Aldres
      00.00.0000 00:00

      А меня мой преподаватель по ГИСам, кстати, сам толкал перетащить курсовую в статью на хабре. Но увы, уже после зачета. Так что думаю, вполне могут быть и такие прогрессивные


  1. DistortNeo
    00.00.0000 00:00
    -6

    Я теперь понимаю, почему язык C для начинающих подходит лучше, чем Паскаль:


    1. Операция выделения памяти отделена от указателя.
    2. Передача аргументов по ссылке делается явным образом через указатели.


    1. lamerok
      00.00.0000 00:00

      В Си нет ссылок.


      1. DistortNeo
        00.00.0000 00:00
        +1

        Именно поэтому я и написал, что передача делается явно через указатели.


        1. alexey_public
          00.00.0000 00:00

          Что значит явно через указатели?

          typedef unit8_t *pType;

          myFunc(pType myData){...


          1. DistortNeo
            00.00.0000 00:00

            От того, что вы объявили алиас, указатель не перестал быть указателем.


            1. alexey_public
              00.00.0000 00:00

              Ну так указатель в Паскале тоже не перестаёт быть указателем. Только записан точно так же.


              1. aamonster
                00.00.0000 00:00
                +2

                Я так понимаю, товарищ имеет в виду, что нет var-аргументов, как в Паскале (или передаваемых по ссылке, как в c++), и получение адреса переменной всегда надо выполнять явно.

                Но и тут есть исключение – массивы.


                1. alexey_public
                  00.00.0000 00:00

                  Насчёт var согласен. Не могу сказать хорошо это или нет. В Паскале к этому привык, в С/C++ наоборот - привык что только через ссылку.

                  var нравится, но это совсем немного, но всё же другой стиль разработки.


                  1. aamonster
                    00.00.0000 00:00
                    +2

                    В C++ всё опять усложнилось – можно передать указатель на переменную, а можно ссылку на неё. Казалось бы, одно и то же, но есть нюанс...


                    1. DistortNeo
                      00.00.0000 00:00

                      Мне в этом плане нравится C#, где ключевое слово ref надо указывать и в сигнатуре функции, и при её вызове.


                    1. alexey_public
                      00.00.0000 00:00
                      +1

                      А кстати да, но, откровенно говоря, ссылки в С++ - это отдельный мир со своими правилами, такого в Паскале нет, может и к лучшему.


  1. b00b1ik
    00.00.0000 00:00
    -3

    ничего, в следующем семестре узнаете, что бывает 3 вид памяти))


  1. ahdenchik
    00.00.0000 00:00
    -7

    Это где в 2023 Паскаль дают?


    1. WondeRu
      00.00.0000 00:00
      -11

      ВУЗы РФ, в 2027 они узнают про python.

      Меня очень бесил в 2002 преподаватель, который заставлял для 8086 писать на ассемблере, хотя c++ уже использовался два десятилетия для этих целей.


    1. maisvendoo
      00.00.0000 00:00
      +15

      А почему это, 2023 году, нельзя использовать для обучения ЯП, специально разработанный для обучения? Где и в каком месте этот язык "устарел"?

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

      Может быть не надо использовать замшелый и покрытый плесенью Borland Pascal для DOS, или свистелки типа ABC Pascal, а взять Паскаль здорового человека - FreePascal? С этим я соглашусь. В остальном - Паскаль гораздо более подходит для обучения, чем предлагаемый ниже питон. В том числе и в 2023 году

      Авторам статьи - успехов! Порекомендую книги Андрея Столярова "Программирование: Введение в профессию" в трех томах. Первая книга как раз посвящена Паскалю, и там хорошо раскрыта тема указателей.


      1. DistortNeo
        00.00.0000 00:00
        +2

        Python, как это ни странно, тоже строго типизированный язык. Просто типизация динамическая, а не статическая, и нет прямого доступа к памяти.


        1. maisvendoo
          00.00.0000 00:00
          +4

          Питон - интерпретируемый язык, ниша применения его вполне определенная, и это - не обучение


          1. centralhardware2
            00.00.0000 00:00
            -4

            Не более интерпритируемый чем ruby или джава. Вот bash действительно можно назвать интерпретируемым, если только и в него jit уже не встроили


            1. comdivuz
              00.00.0000 00:00

              А то что в джаве jit и уже давно вы тоже не слышали? Так то с 1999 года


        1. PuerteMuerte
          00.00.0000 00:00
          +5

          Просто типизация динамическая, а не статическая

          Это, кстати, минус для обучения. Чтобы учить студентов понимать типы, хорошо, когда они видны.


      1. SalamWord Автор
        00.00.0000 00:00
        +1

        Спасибо!


      1. Didimus
        00.00.0000 00:00

        А чем Борланд паскаль плох? Он не запускается на современных машинах?


        1. DreamingKitten
          00.00.0000 00:00
          +3

          Там упоминается именно Borland Pascal для DOS. Запустить сейчас что-то досовское уже становится нетривиальной задачей.

          Тем более что есть вполне себе современный и кросплатформный FreePascal и у него даже есть консольная IDE с таким же интерфейсом как у TP/BP.


        1. mayorovp
          00.00.0000 00:00

          Да даже если и запускается...


          Вот самое то на современном мониторе работать в текстовом режиме 80 на 50! (А те кто не умеют этот режим включать — будут работать 80 на 25).


          Опять же, жалкие 64 килобайта на массив. Мне их не хватало даже в школьных олимпиадах.


  1. AlienJust
    00.00.0000 00:00

    >> В строках 16, 19, 21, 28 и т.д.

    довольно сложно считать номера строк тут


    1. SalamWord Автор
      00.00.0000 00:00

      Да, понимаю. До публикации были строки, но после модерации пропали, извините. Я думаю это из-за того, что в списке языков на хабре не было Паскаля. Учтем это в будущих статьях.


      1. DreamingKitten
        00.00.0000 00:00
        +2

        Delphi там есть.


  1. Pochemuk
    00.00.0000 00:00
    +7

    А чем книга «Алгоритмы + структуры данных = программы» Н. Вирта для изучения указателей в Паскале плоха?


  1. aamonster
    00.00.0000 00:00
    +2

    Очень здорово, что вы не просто учитесь, но и систематизируете свои знания (хотя мне и кажется, что ваш текст – это, скорей, эссе для сдачи преподавателю, чем статья на Хабре).

    Блин, хабровский редактор забодал, дальше была критика и советы, но они пали смертью храбрых. Вкратце – не путайте свойства собственно указателей и динамического выделения памяти и изучите несколько других языков для сравнения.


    1. SalamWord Автор
      00.00.0000 00:00

      Спасибо! Нам так не объяснили подробно на лекциях, к сожалению. Разобравшись, захотелось помочь другим. Не понимаю, почему уже второму человеку кажется, что это мы делали для зачета или в качестве эссе преподавателю (это не так))) )


      1. spc
        00.00.0000 00:00
        -4

        Потому что Pascal настолько древний, что разбирать там, как мне видится, уже особо нечего (особенно, если говорить об уровне института, где он обычно для галочки).


        1. maisvendoo
          00.00.0000 00:00
          +1

          Поясните, пожалуйста, всё же - почему паскаль "настолько древний"? Что в нем устарело?


          1. vconst
            00.00.0000 00:00
            -4

            В исходном паскале нет классов и наследования. Выучив функциональное программирование — потом придется переучиваться на ооп

            Хотя, щяс же такого паскаля уже нет, есть только дельфи?


            1. kipar
              00.00.0000 00:00
              +3

              В досовском борланд паскале тоже классы и наследование есть (начиная с Turbo Pascal 5.5, 1989 год). А более ранний - это видимо из периода перфокарт, я сомневаюсь что ему в этом веке учили.


              1. vconst
                00.00.0000 00:00

                А ведь точно, были ))
                Как-то это мимо меня прошло в школе. Помню, что ООП я начал изучать уже на Борланд С++


                1. maisvendoo
                  00.00.0000 00:00

                  Если не ошибаюсь, ООП есть и во FreePascal


                  1. PuerteMuerte
                    00.00.0000 00:00

                    Конечно, если учесть хронологию появления реализаций Паскаля как Turbo Pascal -> Turbo Pascal with objects -> Delphi -> FreePascal


            1. maisvendoo
              00.00.0000 00:00

              Есть FreePascal, умеющий 64 бит код под несколько платформ


            1. maisvendoo
              00.00.0000 00:00

              Del


              1. perfect_genius
                00.00.0000 00:00

                phi?


            1. maisvendoo
              00.00.0000 00:00
              +2

              Конечно - функциональщина - как раз то, что необходимо знать первокурснику. И да, вы помоему путаете функциональное программирование с процедурным


              1. vconst
                00.00.0000 00:00

                вы помоему путаете функциональное программирование с процедурным
                Вполне вероятно)


            1. WraithOW
              00.00.0000 00:00
              +1

              Не соглашусь — это как раз хорошая последовательность. Сначала базовый подход где всё в main (или что там у паскаля вместо него, уже не помню), потом наворачиваем первый уровень абстракции — процедурное программирование, потом второй уровень — объединяем процедуры в классы.


          1. dlinyj
            00.00.0000 00:00

            На нём нет практически коммерческих разработок. Устроится на работу программистом паскаля, если не невозможно, то очень сложно (какой-нибудь НИИ на задворках вселенной).


            1. maisvendoo
              00.00.0000 00:00
              +1

              Речь идет не о рабочем инструменте, а о языке, предназначенном для обучения программированию, базовым принципам, таким как алгоритмы и структуры данных


              1. dlinyj
                00.00.0000 00:00
                +1

                А зачем учить тому, что будет не нужно? И почему нельзя учить сразу на современном языке?


                1. sabaca
                  00.00.0000 00:00
                  +1

                  Столбиком умножать/делить тоже не нужно? Таблица умножения?


                  1. vconst
                    00.00.0000 00:00

                    Разница между паскалем и с — не настолько трагична, как между «столбиком и калькулятор».


                    1. maisvendoo
                      00.00.0000 00:00
                      +2

                      Вы ошибаетесь - разница ужасающе трагична. И это связано как раз с концепцией указателей. Если в паскале на начальных этапах обучения можно спокойно обойтись без них, то в си ввод данных с клавиатуры уже заставляет применять операцию взятия адреса. Ну и так далее, примеров могу гору привести


                      1. vconst
                        00.00.0000 00:00

                        //скрипит мозгами, пытается вспомнить, путается в показаниях

                        Зачем нужно взятие адреса, когда можно читать из потока?


                      1. DreamingKitten
                        00.00.0000 00:00

                        В сях вроде как нет потоков, они в плюсах только появились.


                      1. vconst
                        00.00.0000 00:00

                        stdin/out?


                      1. DreamingKitten
                        00.00.0000 00:00

                        Ммм, ладно. Потоки есть. Но без указателей вы их не прочитаете, емнип.


                      1. vconst
                        00.00.0000 00:00

                        Да, но без прямой адресации, функциям передается указатель на то — в куда передавать данные из потока. Более низкий уровень не требуется


                      1. maisvendoo
                        00.00.0000 00:00

                        Вот именно! std::cin - это C++, но никак не С


                    1. WraithOW
                      00.00.0000 00:00
                      +1

                      Для начинающего кодить наличие в языке нормальной поддержки строк и массивов (включая многомерные) — манна небесная.


                      1. vconst
                        00.00.0000 00:00

                        Ладно… Паскаль я последний раз щупал так давно, что нет смысла о нем спорить. Самоотвод)


                      1. WraithOW
                        00.00.0000 00:00

                        Да я тоже его давно не трогал, меня вон в соседнем треде натыкали носом в enum'ы. Но у меня до сих пор флешбеки от того, как я пересаживался с этого самого паскаля на си, и это напоминало переезд в Австралию, где каждый булыжник пытается тебя убить.


                      1. vconst
                        00.00.0000 00:00

                        О да. Особенно учитывая, что С это было про системное программирование и наворотить там делов было элементарно


                      1. PuerteMuerte
                        00.00.0000 00:00

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


                      1. vconst
                        00.00.0000 00:00

                        Я тогда в школе учился. Самое страшное, что у меня могло случиться — это зависание компа, где решал очередную олимпиадную задачку ))


                      1. DreamingKitten
                        00.00.0000 00:00

                        За это приходилось платить тем, что большинство таких проверок выполнялось в рантайме. Хотя их можно было отключить при компиляции, но из-за этого Паскаль получил репутацию тормозного языка.


                      1. vconst
                        00.00.0000 00:00

                        Зато в С было просто. Хочешь — проверяешь ошибки и исключения, хочешь — не проверяешь, но программа может запросто вывалиться по банальному делению на ноль или несуществующему имени файла. Каждый ССЗБ


                      1. PuerteMuerte
                        00.00.0000 00:00
                        +2

                        но из-за этого Паскаль получил репутацию тормозного языка.

                        Да, но это больше среди студентов. Когда начинаешь работу, понимаешь, как это круто — в дебаг-сборке сразу видеть, где налажал. А в продакшен уже просто собираешь без этого оверхеда.


                  1. dlinyj
                    00.00.0000 00:00
                    +1

                    Вы путаете тёплое с мягким. Умножение столбиком и таблица умножения в жизни нужна, паскаль нет.


                1. WraithOW
                  00.00.0000 00:00
                  +3

                  что будет не нужно

                  На этом этапе учат не языку, а программированию. В Паскале есть низкоуровневый доступ в памяти, который позволяет пощупать концепции типа кучи/стека, но при этом есть хоть какая-то защита от дурака в отличие от того же c/c++. После этого программист в три прихлопа пересаживается на джаву, но при этом у него не лопается мозг от int vs Integer.


                  Можно было бы, в теории, использовать Go/Rust, но у них блин свои приколы — один сразу начинает делать мозги обработкой ошибок, другой — борроу-чекером.


                  1. maisvendoo
                    00.00.0000 00:00
                    +1

                    На этом этапе учат не языку, а программированию.

                    Совершенно верно - организации программ, типам данных, алгоритмам, структурам данных. Паскаль, как язык, я еще раз повторю - создан Николаусом Виртом специально для обучения программированию, обладает строгой статической типизацией, не разрешает неявного преобразования типов. При этом дает возможность работать с указателями, что позволяет освоить базовые структуры данных. То не содержит ничего более того, что нужно новичку-первокурснику.

                    Давать же с нуля ЯП, фактически применяемые при разработке реального ПО - это насилие над человеческим сознанием, вырождающуюся в дальнейшую глубокую некомпетентность


            1. maisvendoo
              00.00.0000 00:00

              На нём нет практически коммерческих разработок. Устроится на работу программистом паскаля, если не невозможно, то очень сложно (какой-нибудь НИИ на задворках вселенной)

              Такое впечатление, что высшем учебном заведении программистов учат только одному языку программирования


      1. aamonster
        00.00.0000 00:00

        Я верю. Формат просто похожий, но некоторые детали выдают, что писалось для себя/своих, а не для препода. И именно поэтому препод бы такой текст оценил – ему ж надо, чтобы студент разобрался в теме. Ну и указатели – базовая вещь, так что основная аудитория Хабра их давно знает или уже не будет знать никогда, статья по ним тут несколько неожиданна.

        ЗЫ: У вас в вузе основы ассемблера или устройства ЭВМ были? Понимание, как в комменте @fk0 – оно всё-таки базовое, всё прочее накручивается на него.


        1. SalamWord Автор
          00.00.0000 00:00

          нет, к сожалению


  1. PuerteMuerte
    00.00.0000 00:00
    +1

    Статическая память — это память, которая выделяется до начала работы программы, на стадии компиляции и сборки.

    Динамическая память — это оперативная память, которая выделяется в процессе компиляции программы

    Это неверно. Статическая память выделяется при компиляции программы (технически нет, но по крайней мере это общепринятая формулировка, и можно считать её верной), динамическая выделяется, собственно, динамически — во время работы программы.
    Но в целом за статью плюсик, ибо достойный уровень качества, хотя и тема была актуальной ещё примерно когда ваши бабушка с дедушкой были молодожёнами.


    1. SalamWord Автор
      00.00.0000 00:00

      Спасибо. В некоторых ВУЗах есть Паскаль, поэтому и рассмотрели эту тему, т.к. она у многих вызывает затруднения.


  1. TimID
    00.00.0000 00:00

    И чего это в статье только простые типы данных рассматриваются. Сдаётся, дело нечисто и всё же не ради просвещения непросвещенных столь куцая статья о базовых принципах работы с памятью написана. Где записи, где массивы, где объекты. А как же незабвенный mem[]?


    1. SalamWord Автор
      00.00.0000 00:00

      Статья ведь называется "Знакомство..", то есть она освещает базу для работы с указателями.


  1. DreamingKitten
    00.00.0000 00:00
    +6

    Вспомнилось что-то. Паскаль -- очень выразительный и лаконичный язык. Во всяком случае, никто из тех, кого я этим доставал, не смог адекватно перевести на другие языки следующее:

    type TDayTime = (dMorning, dDay, dEvening, dNight);
    const Names : array [TDayTime] of string = ('Morning', 'Day', 'Evening', 'Night');


    1. spacediver
      00.00.0000 00:00

      Да, это ни с чем не сравнимое ощущение буквальности, что ли, языка. Немного, разве что, в Лиспе оно возможно?..


    1. AnthonyMikh
      00.00.0000 00:00
      -5

      Rust с библиотекой strum:


      #[derive(strum::EnumVariantNames)]
      enum DayTime {
          Morning,
          Day,
          Evening,
          Night,
      }
      
      // `DayTime::VARIANTS` - массив `["Morning", "Day", "Evening", "Night"]`

      И да, насчёт выразительности и лаконичности Pascal читать смешно.


    1. 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;
          }
      
      }
      

      Буковок больше, но с адекватностью и выразительностью никаких проблем.


    1. comdivuz
      00.00.0000 00:00

      Хотите переведу?

      ```kotlin

      enum class DayTime { Morning, ... }

      val names = DayTime.values().map{it.name() }

      ```


      1. DreamingKitten
        00.00.0000 00:00

        Как мне уже тут справедливо заметили ниже, пример не о строковом представлении перечислимого типа, а о том, что им можно индексировать массив.


    1. 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).


    1. WraithOW
      00.00.0000 00:00

      del


      1. DreamingKitten
        00.00.0000 00:00
        +2

        Нет здесь никакого волшебства, это вас разбаловали языки, которые дают программисту чересчур много способов выстрелить себе в ногу. Строгая типизация таких приколов не позволяет:

        main.pas(2,81) Error: Expected another 1 array elements

        Ну и как меня уже тут справедливо поправили, пример кода не о текстовом представлении, а о том, что массивы можно индексировать перечислимым типом. Где ещё такое есть в том, что сейчас модно и современно?


        1. 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"];


          1. DreamingKitten
            00.00.0000 00:00
            +2

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


  1. Zhuikoff
    00.00.0000 00:00

    Спор о лучшем языке программирования не имеет смысла, если у тебя есть нож и нужно отрезать кусок колбасы - просто отрежь и съешь.


    1. PuerteMuerte
      00.00.0000 00:00

      Если у тебя есть нож, ты и без программирования можешь неплохо зарабатывать.


  1. Tanner
    00.00.0000 00:00
    +1

    Указатели в Паскале, заголовок в ВордАрте… Ностальгия.


  1. serafims
    00.00.0000 00:00
    +1

    Концепция указателей хорошо видна в Паскале тогда, когда начинают делать лабы с файлами типизированными, по сути там и пишут в файл с его позицией какиепнибудь записи, смещаясь каждый раз на размер записи.
    Студентов, вероятно, путает вся эта синтаксическая магия со знаками-крышками, собаками и т. п.


  1. dlinyj
    00.00.0000 00:00
    +1

    Хочу сказать, что статья очень достойная. Вы молодцы, и продолжайте в том же духе! Не бойтесь критики, и смело идите вперёд.

    Но на счёт паскаля, это трагедия что этот язык преподают. Те, кто в ВУЗах преподаёт ДОС, Pascal, Windows XP, 8080 и прочий старый хлам — просто враги прогресса и студентов. Эти знания никогда не пригодятся.

    Говорят, мол, зная паскаль можно выучить другие языки. Таки да, но что мешает сразу начать с си? Намного больше пользы, даже если человек не будет его использовать, синтаксис будет полезен.


    1. vconst
      00.00.0000 00:00
      -2

      что мешает сразу начать с си?
      А еще лучше С++
      Потому что с него прямая дорога в шарп, джаву, котлин и тд тп, что потом выберет студент. Все равно, в основе С++


      1. dlinyj
        00.00.0000 00:00
        +2

        Способы мышления си и с++ разные. Каждый кулик своё болото хвалит. Я, скорее, за классический си.


        1. vconst
          00.00.0000 00:00
          -1

          Абсолютно разные. Потому надо начинать с С++, ибо он куда более современный. А чистый С пусть выбирают уже на специализации, может кто в микроконтроллеры уйдет. Другим то он зачем?


          1. DistortNeo
            00.00.0000 00:00
            +6

            Не надо начинать с C++. Это один из самых сложных языков в мире, который практически никто не знает на 100%, и который требует обширного багажа предварительных знаний и нескольких лет для изучения.


          1. dlinyj
            00.00.0000 00:00
            +2

            Ядро Linux, системные программисты.


            1. vconst
              00.00.0000 00:00

              Ну да, очень небольшие ниши


              1. dlinyj
                00.00.0000 00:00
                +1

                «небольшие» :)))


                1. vconst
                  00.00.0000 00:00
                  +1

                  По сравнению со всяким энтерпрайзом то? Или мобильной разработкой?


                  1. dlinyj
                    00.00.0000 00:00
                    +1

                    Смотровая площадка у университета. Там байкеры собираются, как вы знаете.
                    Очередная тусовка.
                    В одной стороне реальные такие дядьки бородатые, солидные. Харлеи стоЯт в рядок блестят хромом, все один к одному. Дядьки чинно спокойно стоят, что-то свое перетирают. Все так спокойно, благородно, солидно…

                    В другой стороне пацаны на спортах. Вжик-вжик, туда сюда, постоянно шастают, визжат, вилли и т.п., то в магазин отъедут, то приедут, как улей пчелиный короче.

                    Тут один из них к дядькам подлетает, стоппи, дым из под колес… И спрашивает:
                    — мужики! А чего вы с нами никогда не знакомитесь?
                    Дядька спокойно так, сплевывая в сторону:
                    — а чего с вами знакомиться-то?.. ВЫ КАЖДЫЙ ГОД НОВЫЕ...


                    БАШ :). Та же «мобильная разработка», в каждом телефоне стоит ядро Linux, которое тоже требует драйверов ;)

                    Ещё раз присказка про кулика и болото. Правды тут нет, но востребованность на эту тему тоже большая.


                    1. WraithOW
                      00.00.0000 00:00

                      Команд, которые пишут эти самые драйвера, на порядки меньше, чем прикладных разработчиков.


                      1. vconst
                        00.00.0000 00:00
                        +1

                        Требую фотофиниш!!!


                      1. dlinyj
                        00.00.0000 00:00
                        +1

                        Я хвалю своё болото )


                    1. vconst
                      00.00.0000 00:00
                      +1

                      Драйвер пишет одна команда, а пользуется им — тысячи


                      1. dlinyj
                        00.00.0000 00:00
                        +1

                        Да я не спорю, моя мысль была только на счёт паскаля. В остальном с тобой я согласен.


      1. DistortNeo
        00.00.0000 00:00

        Как раз опыт C++ здесь может сильно мешать. Например, в STL используется довольно своеобразный способ работы с коллекциями и итераторами, имеющий мало общего с C#/Java/Kotlin/Python.


        1. vconst
          00.00.0000 00:00

          Тогда — сразу Джаву )


      1. PuerteMuerte
        00.00.0000 00:00

        Потому что с него прямая дорога в шарп, джаву, котлин и тд тп, что потом выберет студент. Все равно, в основе С++

        Прямая дорога в шарп, джаву и т.д. не с С++, а как раз с Паскаля. Паскаль намного ближе к тоже же шарпу, чем С++. Потому что для перехода на шарп с Паскаля нужно запоминать простейшие технические штуки вроде «скобочки вместо бегин/энд», а для перехода с С++ на шарп надо учить новую парадигму программирования.


    1. khrapko
      00.00.0000 00:00
      +2

      Ну не пойму я в чем трагедия то. Я начинал с бейсика и фортрана. Потом много ассемблера. И Паскаля 6.
      Потом дельфи. И до сих пор на нем пишу. Это не значит, что я на чем то другом не пишу. Устану перечислять чего я только не использовал.
      Этот спор мне всегда напоминал медведя Балу в Маугли. Когда он наказывает мальчика зато, что тот бежит на двух ногах. Ну мальчику так удобнее. Удобнее преподам излжжить материал и они излагаю. Паскаль четко реализует все классические операторы Алгоритмического языка программирования. Удобнее студентам понять эти азы. А дальше в полет.
      Больше всего не люблю заказчиков, которые приходят и диктуют мне на каком языке я должен им что то исполнить. При этом еще не имея денег на оплату. Та какая блин разница. Это если ты идешь в команду, то там да. Там уже пишут все на одном и надо выть как и вся стая.
      В общем ребята молодцы. Изложили нормально. Я тут отвлекался и не запомнил привели ли они примеры связных списков. Тут чуть выше человек спрашивал, для чего это нужно. Вот для этого и нужно.
      Еще раз возвращаясь к устареванию или исполнению. Ну я много на дельфи использую библиотек от С. Заголовочный файл написал и вперед.
      Как то так. Когда то Вирт по моему создал еще Модула. Типа там больше было операторов для работы с внешними устройствами. Ну вот эта Модула вроде и новее Паскаля и где она. Та нету.


      1. dlinyj
        00.00.0000 00:00
        -2

        В общем ребята молодцы. Изложили нормально.


        Большие молодцы.

        Трагедия в старческом подходе и обучению старью.


        1. khrapko
          00.00.0000 00:00

          Так старперы там преподают в ВУЗах. Я и сам не молод, но как то попросили меня подобрать пару программистов во вновь создаваемую фирму. Ну где их взять молодых и умных. Пошел по старой памяти на защиту дипломов в институт. Ну лет 10-15 назад мой шеф по аспирантуре сказал, что кандидатская сейчас это что то типа диплома в мое время, а диплом это как курсовая работа в твое же время. Ну точно дипломы какие то хилые, послушать нечего. Все бубнят о методах черного и белого ящика при тестировании. О программировании как то не очень. И в комиссии мои одногодки,а то и на десяток полтора лет старше. Противно
          Но я повторяю. Та неважно какой язык. К примеру у Кнута и своя машина и свой язык. Думаю мало кто его знает. Но читали многие.
          У нас один препод четко излагал. Есть несколько операторов и они есть во всех алгоритмических языках

          1. Оператор присваивания (тут между переменной и значением можете вписать что себе хотите)

          2. Условный оператор (тут можете логическое выражение заключать в скобки или не заключать. И операторы после выражения в скобках или нет

          3. Операторы цикла

          3.1 С определенным количством циклов (for etc...)

          3.2 С предусловием (условие проверяется до выполнения)

          3.3 С постусловием (условие проверяется после хотя бы одного прохода)

          1. Операторы ввода-вывода.

          2. Оператор безусловного перехода (это запрещено и упоминать всуе)

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


          1. PuerteMuerte
            00.00.0000 00:00
            +1

            Я и сам не молод, но как то попросили меня подобрать пару программистов во вновь создаваемую фирму. Ну где их взять молодых и умных.

            А в этой новой фирме какие-то другие программисты предполагались? Потому что взять молодых и умных студентов из ВУЗа в новую фирму, где нет хотя бы одного опытного программиста, это самоубийственная идея.


            1. khrapko
              00.00.0000 00:00

              Предполагалось, что я буду руководителем филиала из одной западной страны. Язык этой страны мне не очень нравиться и когда они начали предлагать свои компы со своим хендехоховским языком, да еще и зажимать бабло, то я отказался. Но по моему филиал таки существовал. Я точно не знаю. Так вот раз уж такая песня про старье то работали там на Шестом бейсике. Для меня было дико смотреть на это после Дельфи.
              Да и хочу вам сообщить что есть еще и прагматика во всех этих вопросах. В США и Австралии многие пишут на Коболе (старье, но пишут) потому, что это оплачивается.
              И я еще раз повторяю. Лично мне да по фиг на чем писать. Алгоритм он и есть алгоритм. Но если работать в команде то тут про личности можно забыть. И завывать на том, за что платят


              1. PuerteMuerte
                00.00.0000 00:00

                Так вот раз уж такая песня про старье то работали там на Шестом бейсике

                Дело не в языке. Вчерашние студенты без толкового ментора на любом языке запорят проект с вероятностью 90%


                1. khrapko
                  00.00.0000 00:00

                  Так я же и пытаюсь про это рассказать.
                  Пришел я в коммерческую фирму. Писали на Клиппере.
                  Дали в помощь мне еще девочку. Дал задание. Быстро написала.
                  Но как вам сказать. Одно и то же раз 15 повторила. Я говорю - а че бы это в процедуру или подпрограмму не вынести. Ответ поразил. А зачем. Редактор же легко позволяет копировать одни и теже участки текста.


                  1. PuerteMuerte
                    00.00.0000 00:00

                    О Майн Готт :)
                    Ну это тоже вопрос к преподавателю программирования, который не рассказал самое начало азбуки нормального кода, зачем нужны подпрограммы, и как придётся страдать, когда нужно будет сделать, например, одно изменение кода в этом куске.


                    1. PereslavlFoto
                      00.00.0000 00:00

                      "Редактор же легко позволяет" изменить в одном месте и затем "копировать одни и теже участки текста".

                      Индийский метод не просто так возник.


          1. dlinyj
            00.00.0000 00:00
            -1

            Оператор безусловного перехода (это запрещено и упоминать всуе)

            Могу вас уверенно сказать, что это ошибочное утверждение. Есть места, где он используется повсеместно. Можете открыть любой драйвер Linux. Из последнего, с чем сталкивался.

            Учить надо тому, что может использовать выпускник сразу после выпуска. Паскаль нельзя, как и ДОС, как и 8080.


            1. PuerteMuerte
              00.00.0000 00:00

              Учить надо тому, что может использовать выпускник сразу после выпуска.

              Мы за годы института писали на Паскале, на VB, на С, С++, гоняли в хвост и в гриву SQL и так далее. И было здорово, что на первом курсе нам дали именно Паскаль, а потом на втором сказали, что ок, собственно программировать научились, теперь давайте двигаться дальше. И по-моему, нигде Паскаль не мучают все пять лет, может разве что на филфаке и религиоведении. Это язык для «лёгкого старта», после чего уже студенты занимаются чем-то другим. Поэтому его вполне себе можно использовать.


              1. dlinyj
                00.00.0000 00:00

                Четырнадцатилетнего учил си, не вижу проблем :)


                1. PuerteMuerte
                  00.00.0000 00:00

                  Оптимизация обучения — это не про не когда у вас четырнадцатилетний ребенок, а про когда у вас два потока по сотне восемнадцатилетних.


                  1. dlinyj
                    00.00.0000 00:00
                    -4

                    Вы зачем-то со мной спорите, пытаетесь мне что-то доказать. Я переучиваю студентов после убогого обучения.
                    То что мы когда-то учили паскаль, и даже, о боже пишем на нём (у меня даже статьи есть тут), и любим его, не означает то, что язык морально устарел.
                    Любовь к паскалю одно, а вот засорять мозг — другое.

                    Постоянно пытаюсь донести мысль, что если мы хотим получить годные кадры на выпуске ВУЗа, то нужно отказаться от порочных практик преподавания ненужного старья. Ведь, в ВУЗах автомобилестроения нет курса по паровым двигателям, верно?


                    1. PuerteMuerte
                      00.00.0000 00:00
                      +3

                      любим его, не означает то, что язык морально устарел.

                      Ну так в обучении программированию нет морального устаревания. Моральное устаревание есть в продакшене. А учиться программировать надо на том, на чём легче учиться. Паскаль в этом плане прекрасно подходит до сих пор. А потом уже, когда первые шаги сделал, можно и к чему-то более применимому на практике переходить.
                      Ведь, в ВУЗах автомобилестроения нет курса по паровым двигателям, верно?

                      Да есть, в общем. Не в практическом плане, а в теории, как работают тепловые машины, действительно рассказывают на примере паровых двигателей, потому что это просто и понятно. А потом уже переходят к более сложным ДВС.


                      1. dlinyj
                        00.00.0000 00:00
                        -1

                        Простой вопрос: в передовых странах мира, флагманах технологий изучают паскаль по программе?

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


                      1. khrapko
                        00.00.0000 00:00

                        Тут я Вас поддерживаю на 100 %. Но я выше написал. Просто старперы, которых уже не переспоришь. А вот кто молодой красивы пойдет излагать в ВУЗ передовой язык какой нибудь. Так вот и нету людей.


                      1. PuerteMuerte
                        00.00.0000 00:00

                        Простой вопрос: в передовых странах мира, флагманах технологий изучают паскаль по программе?

                        Наверное нет. А встречный вопрос — мы, выученные на паскалях, отстаем в качестве разработчиков ПО от передовых стран?

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

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


                    1. khrapko
                      00.00.0000 00:00

                      Я вот никак не пойму, кто принял как истину в последней инстанции , что Паскаль устарел и мы просто портим молодежь.
                      Я не вижу проблемы устаревание.
                      Только бизнес. МС позволяет себе вкладывать большие бабки в рекламу Студии. А Борланд и тем более Ембаркадеро то точно не могут. Вот вам и причина устаревания.
                      Мой друг уехал в Ирландию. Когда его спрашивали на чем он пишет то он отвечал на Дельфи от Борланд. Его спрашивали - это фирма вашего дяди чтоли. Никто не спрашивал работы, которые он сделал. Все почему то нужно язык. Какому то бухгалтеру заскорузлому, который и программируемы калькулятор освоить не может, подавай визуал студию. Зачем, он не знает.
                      Вот кстати о МС SQL и FireBird. Тоже старый движок фареберд. То, что МС купила Сибейз и дала ему свое имя, то наверное никто и не помнит. А вот заказчик мне. Ты на Фареберде не пиши , а пиши на МС СЕКУЕЛ. Почему - пояснить никто не может. Я ему показываю ту же задачу написаную в двух разных СУБД и фареберд шустрее делает выборку. Но ему дай что то то от МС, потому, что это фирма.


                      1. dlinyj
                        00.00.0000 00:00

                        У вас типичная ошибка построения статистики по кругу знакомств. Это нерепрезентативная выборка. То, что вам ещё удаётся находить работу с паскалем, не означает что он популярен.

                        Только бизнес. МС позволяет себе вкладывать большие бабки в рекламу Студии. А Борланд и тем более Ембаркадеро то точно не могут. Вот вам и причина устаревания.

                        Удивительно, около 15 лет не пользуюсь продуктами MS и не пишу для них. А везде не используется паскаль. Нигде не встречал (тоже ошибка). Веб, приложения для бизнеса, аппаратные приложения, и т.п. Питон и тот будет мощнее и удобнее паскаля.


                      1. khrapko
                        00.00.0000 00:00

                        Питон и тот будет мощнее и удобнее паскаля.

                        Та вы правы, что Питон круче. Я как то начитался и думаю, возьму ка я напишу что нить на Питоне. Но первая фраза, которая мне попалась в какой то статье - Питон не очень подходит для десктопных приложений.
                        От и облом. Я то другие и пишу очень очень редко. Вот так и закончилась наша любовь


                      1. khrapko
                        00.00.0000 00:00

                        У вас типичная ошибка построения статистики по кругу знакомств. Это нерепрезентативная выборка. То, что вам ещё удаётся находить работу с паскалем, не означает что он популярен.

                        Та не ищу я уже работу. Это она еще за меня держится. Но того же материала на том же Дельфи наработано ой как много. Предприятие на нем работает. И как, несмотря на мои неоднократные объявления не появляются люди могущие еще написать на том же Дельфи. Но к сожалению не находится и людей, которые могут переложить это все на более современный язык. Ну так, чтобы при это не положить работу предприятия.


                      1. PuerteMuerte
                        00.00.0000 00:00
                        +2

                        Ты на Фареберде не пиши, а пиши на МС СЕКУЕЛ. Почему — пояснить никто не может. Я ему показываю ту же задачу написаную в двух разных СУБД и фареберд шустрее делает выборку. Но ему дай что то то от МС, потому, что это фирма.

                        Заказчик интуитивно прав. У огнептицы сейчас есть несколько критических недостатков, которые программным путём не исправляются:
                        1. По ней фиг найдёшь специалиста. Ну т.е. относительно несложно найти дедушку вроде меня, который двадцать лет назад был ого-го, лабал на Delphi+FB/IB, и может быть что-то ещё помнит, но попробуй ещё уговорить его поменять текущий стек на тот, что был 20 лет назад.
                        2. А ещё по ней фиг найдёшь хостинг. Ну т.е. если хочется олд-стайл, локальный сервер, свой админ, бэкапы и всё такое, вам никто богато жить не запретит. Но если вам хочется делегировать это облачникам, не получится. МС СКЛ — запросто, мускуль с постгресом — вообще навалом. А огнептицу попробуй ещё найди.
                        Ну а быстродействие, то такое, если у вас бизнес генерирует столько транзакций, что быстродействие MS SQL стало бутылочным горлышком, вам можно позавидовать.


                    1. khrapko
                      00.00.0000 00:00
                      +1

                      Вот в вузах где изучают передовые атомные станции и изучают паровые двигатели. И турбины. И очень много про пар.
                      Вот по моему мнению так технология вращения турбины паром от банального нагрева воды давно устарела, а поди так и используется вовсю.


                      1. dlinyj
                        00.00.0000 00:00
                        -1

                        Вы передёргиваете мою мысль. Я говорил про поршневые паровые двигатели, которые не используются.


                1. khrapko
                  00.00.0000 00:00

                  ТА учить это одно. А вот как он будет выпонять работу это другое.
                  А то такие как примеры не с программирования. Попросили поставить виндовс. Мол такой умный четырнадцатилетний. Ну все может на компе. Меня всегда умиляли родители, которые и пультом от телека поьзоваться не могут, оценивают сое чадо как гения в программировании.
                  Ну вот.Поставил. Через неделю что то не работает. Что делал спрашиваю. Драйвер ставил. На фига. Плачет.. Хорошо. Переставил систему.
                  Через неделю опять не работает. Спрашиваю, что дела. Та тут мол освобождал место на диске. Был большой каталог Виндовс называтся. Я его и удалил.
                  А так родители говорят что просто гений.
                  Дальше молчу.


            1. khrapko
              00.00.0000 00:00

              Я же не говорю, что не испоьзуется. Но опять же обращаясь к книгам Кнута и Дейкстры вспоминается, что использование этого оператора - МОВЕТОН.
              И действительно иногда думаешь - ну никак без него. Но потом подумаешь и вот он выход . И даже красивше получается.
              И почему нельзя про ДОС. Мой сын после института работал на заводе, где программировал контролеры. И нормально. При этом диплом был на паскале у него.


              1. dlinyj
                00.00.0000 00:00

                И почему нельзя про ДОС. Мой сын после института работал на заводе, где программировал контролеры. И нормально. При этом диплом был на паскале у него.


                Какой ужас… А потом мы удивляемся, что у нас такое технологическое отставание.


            1. WraithOW
              00.00.0000 00:00

              Ну эт не от хорошей жизни, если честно, а от невыразительности языка. В той же жабе аналог будет выглядеть как


              synchronized(data.updatedLock) {
                  int status = pmbus_get_status(client, page, reg);
                  if (status < 0) {
                      return status
                  }
                 //...
              }

              При этом олдовым unrestricted goto обычно никто не пользуется, максимум как раз то, что вы привели в качестве примера.


            1. mayorovp
              00.00.0000 00:00

              Конкретно в указанном вами месте оператор условного перехода нужен из-за отсутствия в языке RAII и try/finally.


              Вот, кстати, их бы включить в список не помешало...


            1. AnthonyMikh
              00.00.0000 00:00

              Есть места, где он используется повсеместно. Можете открыть любой драйвер Linux...

              Как и полагал, пример показывает, как goto используется вместо отсутствующего RAII или хотя бы defer. Вы скорее бедность C продемонстрировали, чем нужность goto.


      1. vconst
        00.00.0000 00:00
        +3

        В общем ребята молодцы. Изложили нормально
        Девчата ))


        1. perfect_genius
          00.00.0000 00:00

          Пацаны ваще девчата :)


      1. SalamWord Автор
        00.00.0000 00:00
        +1

        Спасибо:)))


    1. SalamWord Автор
      00.00.0000 00:00
      +1

      Спасибо!


    1. 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 (бакалавриат и магистратура). Поверьте, семестр Паскаля на первом курсе никому не повредит


  1. man_of_letters
    00.00.0000 00:00

    0. Паскаль был светлой юношеской любовью, какое-то время был тру-фанатом и более чем наработался с ним. Убийство микрософтом экосистемы Delphi не забуду, не прощу.
    1. Эта статья вызывает боль у завсегдатаев хабра, потому что технические аспекты мёртвого языка должны жить в гугле, статьи про паскаль могут быть интересны в ностальгическом ключе, чтобы утёрли слёзы гики 90х
    2. Преподавать в Университете уже несуществующие языки — так-то плевок в будущее общества, полно современных языков, на которых можно показать всю базу в любых разрезах, не уступающих по «читабельности».
    3. Если авторов действительно удивляет реакция читателей, и если это ваша будущая профессия, то проводите больше времени тут, чем у вас там. Пора разбираться где и за что вам согласятся платить деньги. Лучше получить 3 у такого препода, но потратить время на самостоятельное погружение во что угодно, встречающееся в вакансиях.


    1. dlinyj
      00.00.0000 00:00

      Подписываюсь под каждым словом.


  1. perfect_genius
    00.00.0000 00:00
    -1

    Страшно представить в каком виде представлена информация об указателях Паскаля в Интернете, раз вы пытались это всё собрать и донести в более доступном виде. Потому что ваш материал тоже очень сложный, очень нагруженный. Сразу вспомнилась школа, где надо было всё это бездумно зубрить и не понимать — за что же так мучить ученика? В чём он провинился?