Как стать автором
Обновить

«Pascal и уж тем более Basic точно не нужны»: интервью с тренерами по спортивному программированию

Время на прочтение 10 мин
Количество просмотров 30K
Всего голосов 32: ↑21 и ↓11 +10
Комментарии 204

Комментарии 204

Секрет популярности изучения паскаля и бейсика в школах всего один — учителя хоть их с горем пополам знают.

Паскаль в свое время не мешал нашим выигрывать на международных студенческих олимпиадах по программированию, когда другие обычно выбирали С\С++.
Паскаль, как средство обучения программированию очень даже неплох. Позволяет так сказать набить руку и заточить мозги под программирование.
НЛО прилетело и опубликовало эту надпись здесь
С 2009го года и в Delphi встроено, а с 2005 — в язык Ада. Аду на олимпиадах доступной для выбора не видел никогда почему-то. 2009й год от момента написания поста был 9 лет назад. 2005й — 13й лет назад. В 2005м я ещё участвовал в олимпиадах, и очень ныло от того, что Ады нет. Вирт приезжал в НГУ, там Модулу-2 поставили на сервер, а Аду не поставили, вот где споры были. А что на C++ кому-то придёт в голову, я такого даже представить не мог, и не было знакомых олимпиадников таких. Вся литература по олимпиадам, всё ж под Паскаль заточено, а если чуть под другим углом посмотреть, то и на Аду можно в уме переводить. Не хочется Аду, за 4 года до Delphi 2009, казалось бы, тоже всю литературу никто не перепишет и всех учителей не заменит. Откуда выскочил этот чёрт из табакерки, вообще не ясно.
Они сильно проще, учить надо не языкам, а программированию, пониманию чем цикл отличается от условного ветвления, а не шаблонной магии.
Ну хоть не PERL. Хотя boost тоже весёлый. А чем С не угодил? Если не лезть глубоко в его заморочки — обычный язык.
C, C++ и Objective C — это три разных человека!
Я в курсе. У чистого С заморочек особо и нет (ну кроме указателей). Всё самое весёлое появилось позже. Да сейчас вряд-ли его где преподают, везде плюсы.
За перл действительно можно под трибунал. А в C нет нормального ООП да и в целом всякого хорошего что есть в современном C++ — nullptr, enum class, кастов всяких, указателей поумнее, да те же шаблоны. А то ж многие работодатели страдают после того как недавний студент начинает по всему коду делать new и забывать про delete.
Си разве что для олимпиадников может оказаться лучшим выбором.
Когда атом перечисляемого типа True, целое число 1 и символ ^A (SOH, START OF HEADING) — всё неотличимое одно и то же, это что, обычный язык?
Не совсем обычный. True равное целому числу с единицами во всех разрядах — как-то привычнее. А то, что символ это однобайтовое целое — в доюникодную эпоху было обычнее некуда.
Вполне обычно и удобно. В отличие от того же Perl или Javascript, где у тебя нет никаких гарантий типа той самой проверяемой переменной. Тут где-то пролетела статья на тему true|false в JS — вот где жесть.
Я считаю, что C++ сложноватый чтобы начинать с него свой первый путь в IT.
Может я и ошибаюсь, но не могу представить как школьники будут «переваривать» указатели. Я имею ввиду «продвинутых школьников», те которые захотят углубиться.
В Паскале тоже есть указатели, и ничего, мы в 80-х как-то переварили…
Они там вообще не на таком уровне, куда проще.
практически на одинаковом, разве что вычитать нельзя и плюсовать к базе

другое дело, что их использование нужно «не на таком уровне, куда проще»
type a = ^b;
c = ^a;
d = ^c;

function x(var q: a; w: c): d;
Уже можно
разве что вычитать нельзя и плюсовать

var
p:pointer;
b:array[0..10] of integer;
begin
p:=@b[0];
p:=pointer(integer(p)+sizeof(integer)*4);

Паскаль не стоит на месте и развивается. Так что Object Pascal — его естественное продолжение.
А если говорить о стандартном паскале, то там тоже не все так страшно, даже если sizeof(integer)<>sizeof(pointer), а указатель не является целым числом.


type
a = record
 case i:integer of
 1:p:pointer;
 2:r:record
       s:word;
       o:word;
    end;
end;

Данная конструкция позволит в теории организовать арифметику с указателем в системе, в которой адрес представлен двумя словами — сегментом и смещением на процессорах 8086, например.
Конечно, это не полноценная адресная арифметика в с/с++, но все же.

НЛО прилетело и опубликовало эту надпись здесь
95% бабок у подъездов считают, что преимущества C и C++ над паскалем сильно преувеличены, когда речь идет об олимпиадных задачках на один файл и 100 строк кода.
Когда в олимпиадной задаче нужен std::map или даже просто надо отсортировать массив, паскаль резко сливает С++ и питону. А вот олимпиадных задач, где необходимы были указатели, я что-то не припомню.
Ага, цель задачек — проверить, умеют ли школьники пользоваться std::map и -o3 в опциях компилятора.
Ну не знаю, какая цель, но задачи, решаемые с использованием ассоциативных массивов, на олимпиадах бывают. И задачи, в которых решение на питоне не укладывается в лимит времени, тоже встречаются. А вот в задачах, где нужны операции со строками, питон может оказаться удобнее С++.
Да там даже паскаль будет удобнее)
Судя по тому, что в ветке комментариев pascal vs c вы постоянно упоминаете питон, последний у вас явно вызывает сильные чувстсва. Ничего, это нормально: у меня тоже. Со временем вы научитесь сдерживаться.

Если бы я проводил олимпиаду для школьников (т.е. решение нескольких задачек в одиночку за строго ограниченное время) сейчас, я бы вообще не оставил выбора языков кроме паскаля под дос с ограничением в 640кб (с запретом хаков типа asm и директив компилятору). Причин тому вагон.
Но олимпиады проводите не вы, и у тех, кто их проводит, мнение от вашего отличается.
А что не так с питоном? Для начального обучения его вполне можно использовать.
Вы тролите? В Delphi давно уже есть все нужные дженериковые примитивы
Где Delphi с дженериками? На acm.timus.ru есть только freepascal 2.6, на codeforces.com — Delphi 7, FreePascal 3, PascalABC.NET 2
А разве это проблема Pascal/Delphi, а не acm.timus.ru/codeforces.com с устаревшими компиляторами?
Конечно это не проблема паскаля, но это та реальность, с которой надо считаться. В принципе обучать программированию на паскале наверное неплохо, но если говорить про олимпиады, то вот только на прошлой неделе у сына олимпиада по информатике была — на тимусе. Да, и компилятор С++ там вполне современный, с поддержкой С++14.
Ну и конечно реальная разработка программ от олимпиадного программирования очень сильно отличается. Но паскаль также используют сильно реже, чем С++.
Где Delphi с дженериками?

На официальном сайте Embarcadero скачивайте и радуйтесь жизни.
FreePascal 3
Новый FPC уже с дженериками. Ждем официального релиза, пока что в транке.
Вполне спокойно обучаем школьников на Си. Не скажу, что те же указатели всегда сходу даются, но и сильно больших проблем нет. Опять же, это про тех школьников, которые сами хотят.
C или C++?
Обычно все же Си. У нас двухнедельная интенсивная школа. За это время Си освоить вполне реально, с++ уже сложно.
А в какой среде? Удобная и быстрая IDE с отладкой при изучении имеет не малое значение.
гораздо большее значение имеют хорошие преподаватели и интересные задачи.
У нас каждый преподаватель в своей небольшой группой сам выбирает инструментарий. У меня это обычно linux + vim + gdb.
Многие взрослые «пугаются» консоли, а то дети (которые сами не хотят).
Поэтому и учим. Люди боятся того, чего не знают.
linux+vim+gdb…
А какого возраста дети, если не секрет?
Меня тут коллеги пытаются убедить что даже Си школьникам преподавать — преступление против человечности, а тут vim )).
После 7 класса и выше.

Преступление — выдать учебник по Си и на этом закончить. Язык действительно не такой простой, но обычно все проблемы в книжках описаны. Настоящие проблемы при обучении лежат вне языка. Механизм сборки под разные IDE (и не IDE), втягивание чужих либ, различные нетривиальные проблемы компиляции/линковки.

Хорошо, если ученик сможет сформулировать вопрос и ответ окажется на stackoverflow (про англ. не забудьте), но обычно даже непонятно что нужно искать (это я себя в раннем возрасте вспоминаю, желание что-то делать отбивало очень сильно). Поэтому если нет доступного человека, который сможет подсказать что делать, когда ничего не понятно, то такую связку не советую.
Примерно также пытаюсь объяснить окружающим. Хотя наши споры это, конечно, теоретизирование, но всё же.
Подозреваю, что если выдать книжку по Паскалю/Питону/Джаве и на этом закончить результат будет аналогичный ).
Если это Dive into Python или основы JS, то очень даже неплохо все выйдет.
Всё таки, когда есть живой специалист, который может направить в нужную сторону, поправить, подсказать как не налететь на грабли — даже мне взрослому проще.
Да особо вроде никто и не спорил, что с учителем проще. Я к тому что выучить основы python/js по учебнику вполне реально довольно малой кровью в отличие от тех же плюсов. Хорошие практик, организация кода, алгоритмы и шаблоны программирования обычно находятся в отдельных учебнках и более агностичны по отношению к используемым языкам.
Всё как обычно… Можно лопатой гвозди забивать, другой вопрос — зачем, если есть молоток. Но у нас отдельным людям виднее. Если точнее, человеку просто очень нравится linux. Но это не подход преподавателя, согласитесь?!..
Ну он не столько сложноватый, сколько ненужный, странный и неконсистентный.

При всём богатстве выбора: от python/ruby, go, swift, rust, haskell/erlang, lisp/closure, (вставьте своё любимое), почему нужно предпочесть именно c++?
Ни стандартного кроссплатформенного компилятора, ни пакетного менеджера, ни сколь-нибудь консистентного подхода.

Если выбирать по критерию «близость к железу» — то лучше предпочесть С. (И более консистентный, но не менее ужасный для 2018года Objective-C.)

C++ травмирует молодую психику также как и Basic.
Будут потом думать, что C++ = OOP.
а для чего для олимпиадных задач нужно наличие?
кроссплатформенного компилятора, ни пакетного менеджера, ни сколь-нибудь консистентного подхода
Чтобы иметь возможность готовиться к ним на любой платформе? Без «undefined behaviour».

Встречный вопрос: какие такие возможности для решения именно олимпиадных задач даёт C++?
Которых нет в других перечисленных более современных языках?
(То, что средствами самого языка никак файл не открыть с входными данными? Или что i/o это тоже не часть языка? :)
ответа я не увидел. как связано UB и пакетный менеджер ???

i/o для C/C++ является частью стандарта и реализации

При всём богатстве выбора: от python/ruby, go, swift, rust, haskell/erlang, lisp/closure, (вставьте своё любимое), почему нужно предпочесть именно c++?
кроме питона остальное — пока что экзотика или нишевое(свифт) в реальном мире. зачем учить экзотике или языку — однодневке?

но не надо С++ первым языком — он не для обучения
С++ == OOP =)
но учиться лучше на чем то попроще

но я не за Питон, несмотря на всю его популярность в обучении на западе, скорее за Оберон
Не, именно «=» ;)

Да и дело тут не в «попроще», а в том, что есть не менее быстрые, универсальные и без архитектурно неконсистентного багажа языки. Зачем изучать гибрид удава с ежом и всю эту историческую подоплёку их взаимоотношений и различных противоположных подходов, если рядом есть уже готовый метр колючей проволоки? (Rust/Swift/Go)

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

Угу, а грузить указателями, нуль-терминированными строками и циклами трёх видов — всегда пожалуйста.
Ну и для освоения хаскеля на уровне, чтобы олимпиадные задачки решать, школьной математики более чем достаточно. Заодно не будет когнитивного диссонанса от "как это — x = x+1?"

Да что сложного в указателях, как концепции? Детали, вроде выравнивания данных, MMU, способов адресации и пр. нужны ой как не сразу :) В начале лучше просто об этом не думать)
Открою страшную тайну — указатели есть даже в бейсике. Правда они там нужны крайне редко (обычно при работе за пределами среды бейсика) и мало кто о них на самом деле знает.
На том уровне, на котором надо преподвать в школе до указателей может и не дойти.
Кроме того, в Паскале они тоже есть, но очень неудобные.
Ну, считаю, что без Pascal'я не особо получится обучить — сразу указатели, много непонятной канители. Pascal в свою очередь прост и лаконичен. А питоны, руби и т.п. по-моему вообще не языки — а интерпретаторы. С я могу использовать вообще везде, где захочу, Там и использую, а пакетные менеджеры — фигня, ручками тоже можно, тем более какие-то специфические штуки с пакетным менеджером поставить сложно. Питоны и тп — медленные нереально, а их фанаты как фанаты всей техники Apple — раз я этим пользуюсь — это круто.
«Pascal в свою очередь прост и лаконичен.» Python, вот кто прост и лаконичен.

fix: Фанаты С/С++/паскаля как фанаты всей техники апле — раз я этим пользуюсь это круто.
<ирония> С/С++ я считаю вобще не языки, а компиляторы.</ирония>
То, что код Питона не компилируется — большой минус. Вот сегодня напоролся: сеть считалась, считалась и через пол-дня оказалось, что в одном колл-бэке немного неверно описана процедура. Всё, результаты в мусор, правим, считаем занова. В компилируемых языках такое, к счастью, невозможно в принципе. Конечно, там своих вопросов хватает. Однако, приятно когда компьютер делает хотя бы часть работы за тебя (при этом еще существенно быстрее и с меньшими ресурсами, чем в интерпретаторах :)).
То, что код Питона не компилируется — большой минус.

Если вы именно про компиляцию, то есть компиляторы. Например, Nuitka.


Если вы про проверку типов, то ставьте аннотации, используйте pylint и mypy, пишите тесты и assert'ы. Сразу много ошибок отпадёт. Как минимум не игнорируйте предупреждения PyCharm, если вы им пользуетесь.


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

Невозможно неверно описать процедуру? Очень даже возможно. Типы – это не гарантия правильности.

Невозможно неверно описать процедуру?
Невозможно неявно и без последствий передать не тот тип.
Типы – это не гарантия правильности.

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

Я о том, что статическая типизация не панацея, а вы о том, что динамическая приводит к ошибкам. Это, вообще говоря, разные утверждения.


С Python ситуация лучше чем с JS, так как в Python есть аннотации типов.


Вы можете написать так:


def f(x):
    return x * 2

И это будет работать как с числами, так и со списками, строками и всем, что поддерживает операцию *.


А можете написать так:


def f(x: int) -> int:
    return x * 2

И при попытке вызвать функцию с нецелым аргументом достаточно умная IDE (например, PyCharm) или статический анализатор (например, mypy) выдаст предупреждение.


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

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

def resample(image, spacing, new_spacing=[1, 1, 1]):

def plot_2d(image3d, axis, pid, img_dir):

def make_circular_mask(img_shape, roi_center, roi_radii):

def plot_2d(img, mask, pid, img_dir):

Могу вам сотни примеров привести.
Мало того, что этот код вообще нечитаем, понять что здесь что можно только прогнав скрипт на выполнение. В Паскале-подобных языках я на 90% могу сказать, что делает код, даже если вижу в его первый раз. В Питоне же 'благодаря' динамической типизации без отладчика может быть вообще неясно что и как происходит в коде.
Ну и проверить типы, понятно, никакой возможности нет.
Ну и тесты, тесты, тесты, тесты :) Нормальную типизацию заменили тестами :) У нас миллионно-строчные проекты на Delphi десятилетиями живут без тестов, переходят с версии на версию, со среды на среду (Delphi > Lazarus), с операционки на операционку (Windows > Linux), с минимальным тестированием и изменениями.
Вообще, замечено, что на JS без тестов просто никуда, а на Delphi тестов пишут намного меньше.
Могу вам сотни примеров привести.

Что именно непонятно в этих примерах? Объекты какого типа передавать? Так это ясно из документации. Просто ещё одну строчку в ней нужно прочитать.
Если написано image, то разве неясно, что надо передавать объект-изображение того типа, который поддерживает эта библиотека. Намного ли понятнее станет, если будет написано как ниже?


function resample(image: TImage, spacing: TSpacing, new_spacing: TSpacing): TImage;

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

И о каком скрипте речь? Это только заголовки функций.


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

Может быть, дело в том, что Pascal вы знаете хорошо и привыкли читать код на нём, а Python нет?


То, что вы говорите, это очень субъективная оценка. Откуда такие проценты? Может, на Pascal вы смотрите на пузырьковую сортировку, а на Python – исходники какого-нибудь условного asyncio.


Вот мне код на Python проще читать. Я же не привожу это как аргумент.


Ну и проверить типы, понятно, никакой возможности нет.

Что ж, повторю ещё раз. Нормальные IDE умеют выводить типы. Да, даже без аннотаций. И mypy работает тоже, если вы не будете указывать аннотации. Просто выведенные типы без них будут шире, возможно.


Ну и тесты, тесты, тесты, тесты :) Нормальную типизацию заменили тестами :) У нас миллионно-строчные проекты на Delphi десятилетиями живут без тестов.

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


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


Вообще, замечено, что на JS без тестов просто никуда, а на Delphi тестов пишут намного меньше.

Кем замечено? И опять вы упоминаете JS. Причём он тут, когда речь о Python? Или по-вашему, это похожие языки? Так вот, это совершенно не так.


С другой стороны, в Python есть много выразительных средств, которых нет в Pascal. Например, генераторы, богатый набор встроенных, работающих из коробки типов данных, богатая стандартная библиотека.


У Python много недостатков, да. Но вы их не назвали, а почему-то сосредоточились на типизации. А это не недостаток, а особенность.


Складывается впечатление, что ваше знакомство с Python было поверхностным. Вам язык показался непривычным, и вы решили, что он никуда не годится. Но надо было просто дать ему шанс. И тогда бы вы увидели, что для каких-то задач лучше Pascal, а для каких-то Python. Языки просто нельзя судить в абсолютных категориях.

Намного ли понятнее станет, если будет написано как ниже?
function resample(image: TImage, spacing: TSpacing, new_spacing: TSpacing): TImage;
В несколько раз точно. TImage — это стандартный класс. Сразу заранее понятно, что и как будет работать и что нужно передавать. Кроме TImage существует несколько стандартных контейнеров для изображений (TGraphic, TBitmap, TPicture, ...). Ну и обще-распространенных библиотек хватает. Я, например, сторонние TDIB и TNativeJPG использую постоянно. Кто-то — TFastImage, кто-то TDXDraw, TImageEnView и так далее, библиотек изображений для Delphi десятки. Уже из самого названия класса понятно, какую библиотеку используют, и, в целом, что ожидать от объявленного кода.
TSpacing? Среда в помощь (раз уж вы среду призываете, позволим себе). Кликнули по нему с нажатым контролом и сразу увидели определение класса, стало понятно как и что передавать. Запускать ничего не нужно, документация не нужна, в коде всё видно. На что кликать тут? :) def plot_2d(image3d, axis, pid, img_dir)? Pycharm просто ничего не показывает.
Что именно непонятно в этих примерах? Объекты какого типа передавать? Так это ясно из документации. Просто ещё одну строчку в ней нужно прочитать.
Не всегда есть документация, увы. Нормальная документация — вообще редкость, как на Питоне, так и на Паскале. В лучшем случае у коммерческого кода. А так как большинство кода Питона — бесплатно, то и документация соответствующая. Вообще, когда пользователь зачем то полез в документацию, значит система спроектирована не очевидно.
И о каком скрипте речь? Это только заголовки функций.
В Паскале почти всегда заголовков достаточно, что бы понять, что нужно передавать функции, по телу рыться, как правило, не нужно.
То, что вы говорите, это очень субъективная оценка. Откуда такие проценты? Может, на Pascal вы смотрите на пузырьковую сортировку, а на Python – исходники какого-нибудь условного asyncio.

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

Тесты могут быть полезны, я спорить не буду. Однако лучше, когда сам язык берет на себя часть тестирования во время компиляции. Потому что он это делает постоянно и сам, а тесты нужно писать каждый раз и руками.
Или по-вашему, это похожие языки?
И там и там — динамическая типизация.
С другой стороны, в Python есть много выразительных средств, которых нет в Pascal. Например, генераторы,
Из недавнего обсуждения в конференции телеграмм: «все генераторы — итераторы».
Если что, итераторы в Delphi завезли уже лет 10 назад.
Например, генераторы, богатый набор встроенных, работающих из коробки типов данных, богатая стандартная библиотека.

Я сходу не могу вспомнить область, подо что бы для Delphi/Lazarus не существовало библиотек. Кроссплатформенность? Есть полная. Веб — пожалуйста. Расчеты, графика — сколько угодно. А вот как в Питоне с графическим интерфейсом? Насколько я знаю — никак. В лучшем случае приходится внешний QT использовать.
Складывается впечатление, что ваше знакомство с Python было поверхностным. Вам язык показался непривычным, и вы решили, что он никуда не годится.
Я не говорю, что язык принципиально плох и бесполезен. Но он намного сложнее Паскаля. И порог входа многократно выше.
Добавлю несколько ссылок.
Постоянно пополняемый список бесплатных библиотек:
github.com/Fr0sT-Brutal/awesome-delphi
Сотни тысяч учебных вопросов, ответов и задач:
www.cyberforum.ru/pascal
www.cyberforum.ru/delphi-beginners
Кому интересно, канал по Delphi/Lazarus, множество профессионалов, ежедневная активность:
t.me/Delphi_Lazarus
С другой стороны, в Python есть много выразительных средств, которых нет в Pascal. Например, генераторы,


Из недавнего обсуждения в конференции телеграмм: «все генераторы — итераторы».
Если что, итераторы в Delphi завезли уже лет 10 назад.


Нет, генераторов там нету. Нечто похожее на генераторы было в Модуле-2, называлось корутины. Корутина, вызываемая как итератор, и выдающая новые значения, пока не кончатся — это генератор. Чтоб сделать корутину в языке, надо уметь распиливать процедуры, точки входа/выхода делать, состояния между вызовами запоминать. Delphi такого не делает. В Delphi если хочется так сделать, программисту нужно самому вывернуть код.

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

В Питоне ещё устоялся общий с Хаскеллем синтаксис list comprehensions, это тоже иногда относят к мощи языка. Я в Spring.Collections видел на работе, как там замыканиями выражаются фильтры и проекции, так что писать на Delphi такое можно, но монструозненько, да.

Тем временем в языке Ада к ужасу старожилов понапихали всякого в готовящийся стандарт 2020, и что-то вроде list comprehensions тоже просматривается.

M := [for Key of Keys use Key => Integer'Image (Key)];
--  сокращенная форма:
M := [for Key of Keys => Integer'Image (Key)];


function Factorial(N : Natural) return Natural is
  ([for J in 1 .. N => J]'Reduce("*", 1));


for J in 1 .. 10 when J mod 2 = 0 loop
   Ada.Text_IO.Put_Line (J'Img);
end loop;


 G : constant Matrix :=
    (for I in 1 .. 4 =>
       (for J in 1 .. 4 =>
          (if I = J then 1.0 else 0.0)));


Ужас, кстати оправданный. Я на работе наблюдаю, как программисты, которые не умеют писать с использованием мониторов и условных переменных, вместо этого используют восходящие замыкания и TTask.Run. А где восходящие замыкания раз, там уже и CPS начинает процветать. Казалось бы, это не web, пишите и наслаждайтесь синхронным стилем, но нет. Скатывается в какой-то JavaScript, только многопоточный. Когда поток явный и чего-то ждёт, он в отладчике отсвечивает, и понятно, что происходит. А эти восходящие замыкания, используемые как продолжения, их же можно забыть вызвать, а можно вызвать дважды. Настоящий поток дважды не продолжится, а тут пожалуйста. А вы бы видели стектрейсы, в которых несколько раз на стеке продолжение. Свихнуться можно, пытаясь понять.

А в языке Ада замыкания только нисходящие, как в 70х годах. Вот так, поработав с Delphi, понимаешь, как мудро было в Ada 2005 не сделать восходящих замыканий.

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

Кроссплатформенность? Есть полная.


Тут, мне кажется, то, что было губительно — это фрагментация дистрибутивов. Если компилируешь в натив, то у тебя версия символа glibc будет не та, библиотеки будут искаться не там, ещё понавылазит нюансов, и будешь только сидеть и разгребать, а в Python и Java удар принимает на себя среда исполнения, а внутри иллюзия гомогенной среды исполнения. На Delphi было супер, когда вокруг везде Wintel. И чтобы вернуться в рай, чтоб писали программисты быстрые программы и не мучали процессоры интерпретаторами, надо воссоздать гомогенность.
От статьи попахивает «ламерством» за километр. Особенно про сложности программирования после 30 лет. Я вот после 30 только вкатился и никаких проблем)
Или что Паскаль и Бейсик травмируют психику. Эти языки идеологически близки к С#, области их применений совпадают, но почему то никто не говорит, что С# травмирует психику)
Ну смотря какой бейсик, если типа VB/VBA — с функциями и прочим — то он ничем не травмирует, а если суровый классический где из переходов только GOSUB/GOTO и из циклов только FOR — то это может быть слишком оторвано от современности.
Уж лучше с ассемблера тогда начинать.
Так такой уж нигде и не встретишь.
Мой любимый диалект — MS Quick Basic (и то это конец 80х), там есть и разбиение на модули, и циклы с пред и постусловием и пр.

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

oisee из циклов в QB ещё есть: DO WHILE/UNTIL...LOOP, WHILE...WEND + выбор SELECT CASE.
Я имею ввиду .NET версии этих языков. Все они есть в Visual Studio, и по-возможностям не слишком сильно отличаются друг от друга. Все таки сейчас конец 2018 года, а не 70-ые прошлого века.
У этих бейсиков от бейсика только название — они практически ничем не отличаются от того же Objective Pascal/Java/C#.

Обвинения в адрес бейсика в «травмоопасности» относятся только к «настоящему» бейсику. (Который «Beginner's All-purpose Symbolic Instruction Code» с обязательными номерами строк.)

И вот, скажем, расцвет клонов ZX Spectrum в России — это середина 90-х (может быть Москва/Питер — начало 90-х). Да, там в период расцвета скорее уже фигачили на ASM'е, но встроенный Sinclair Basic — именно что классический: номера строк и GOTO/GOSUB/RETURN. Это то, с чего начинали нынешние 35-40-летние IT. Травмоопасен ли он?

И это прямо 90-е, а никак не 80-е или 70-е.

(При том, что на самом же спектруме были расширения: LaserBasic/BetaBasic/MegaBasic с функциями и процедурами.)
Обвинения в адрес бейсика в «травмоопасности» относятся только к «настоящему» бейсику. (Который «Beginner's All-purpose Symbolic Instruction Code» с обязательными номерами строк.)

… которого живьем, «в природе» никто и не видел давно.
Почему мы не берем при обсуждениях, скажем, первый стандарт С++, вместо современного состояния, а с Бейсиком производится именно это?
Это нужно спрашивать тех, кто эти обвинения выдвигает. Но новых давно не слышно. Всё по старинке повторяют Дейкстру (1975).
где из переходов только GOSUB/GOTO и из циклов только FOR — то это может быть слишком оторвано от современности.

И чё? На нём же не проект писать, а чисто с алгоритмами экспериментировать.
Для чего-то более серьёзного — переходить на более актуальные языки. Знание нескольких языков — расширяет кругозор.
Расскажу те моменты которые были действительно важными в обучении меня любимого: (хотя я так ничему серьёзному и не научился, но на работе первым спрашивают именно меня, а не ребят из IT отдела...):
-Материал из интерактивной обучающей справки встроенной в windows 3.11 по работе с мышкой (он лучший, да-да не смейтесь!). Потому что мышкой водить все умеют, но не понимают и даже не задумываются что они делают. Многие люди в возрасте давно пользующиеся компьютером не знают когда нужно использовать двойной клик, а когда правый (каждый раз получают результат только эксперементальным способом); почему при перемещении мыши в сторону курсор едет по диагонали ( мышку то не ровно держат). Короче базовей чем базовые знания — только умение работать с аппаратурой. Но почему то все это пускают на самотёк. Короче считаю это действительно важным моментом на котором необходимо акцентировать обучение, хотя к программированию это и не относится. Это тот момент когда так называемые «устаревшие» знания очень даже помогли бы но их не знают даже старики.
-Книгу «dos для чайников». Потому что там лучше всего описана фаиловая система. Конкретно рассказано зачем именно нужны каталоги, откуда появилась маркировка в windows дисков (A, C, D, E) и что именно они делают. (заодно и с командной строкой знакомит и когда в учебнике по любому языку будет сказано скомпилировать выполнив команду в терминале ученик уже не растеряется). Лучше книги не найти.
-правки скриптов для бота игры ultima online. Никакого понятия как писать код, но коротенькие скрипты обычно читаются очень легко даже не понимающему человеку. Давно заметил что людям очень легко даются задания в стиле попробовать найти переменную в коде и исправить чтобы добиться своего результата. Как минимум это привлекает к программированию. Без этого кажется что языки это китайская грамота. А после этого наоборот — кажется что ты это уже где-то видел.
-учебник по Java (не помню имени хорошего автора, но помню что в книге помимо хорошего описания там был отличный пример с java web апплетами и рассказом о двойной буферизации… короче можно было сразу попробовать что-то как тогда казалось крутое) там отлично показывало что такое объектно ориентированное программирование. Сразу оговаривалось как работает память в компьютере. тем более что сейчас куча фреймворков написаны таким образом чтобы взаимодействие с ними осуществлялось по большей части как раз в обьектно-ориентированном стиле.). Я просто не находил подобного в других книгах, да чё уж там я и эту конкретно до сих пор сного найти не могу :))
-Затем python где всё можно написать проще и быстрее. и сразу знакомство с PyQt, peewee и kivy без понятия того как этот самый python работает в принципе.
Затем долгие попытки просто собраться сесть и изучить си и ассемблер. Даже не читая всё серьёзно — многократное возвращение к одному и тому же материалу из разных источников всё же сформировало внутреннее представление как именно это всё работает, и как люди до этого дошли…
Когда на самом деле надо было тупо сидеть и штрудировать все известные человечеству алгоритмы. Но это не интересно…

Так вот последний шаг с алгоритмами на самом деле не обязательно делать последним. более того его можно равномерно размазать по всей программе обучения даже в принципе без какого бы ни было языка, и даже без компьютера. Наша система образования до этого уже додумалась и так и решила поступить, но из-за того что для этого продолжают использовать сами компьютеры — (а у детей компьютер это чёрный ящик с картинками и развлекательными играми (т.е. отсутствует понимание того что в принципе происходит)) естественно появляется автоматическая блокировка в понимании в подсознании. Новые знания просто не входят в голову потому что голова пытается переварить — «а что вообще произошло на экране». Сам с таким сталкивался. Тут проблема рисунка совы из трёх кружочков. никогда заранее не знаешь что необходимо разжевать, а что и так ясно. Да и — каждый опыт уникален. Для каждого ученика свой подход нужен. Но такого не будет в наших школах до момента под названием «никогда». Поэтому считаю что единая программа не нужна в принципе. Нужна единая база знаний. ученики которые хотят изучить компьютер сами читать будут, а которым это не нужно — неправильная подача материала с пропусками «очевидных» вещей — только укоренит в ученике отрешённость от материала.
Первый шаг с алгоритмами можно оставить и на самих учеников. Из личного опыта: у нас в школе пытались ввести информатику.
Год первый: Был правильный преподаватель, который учил правильным и умным вещам. Но нихрена не понятным… Честно всё списал и в памяти не осталось ровным счётом ничего, кроме самого факта, что такое было.
Год второй: Пришла дама, которая сказала «вот вам компьютер с васиком, вот десяток операторов, которые делают такие и такие вещи. Играйтесь». Месяца через полтора пытался написать игру на бумажке…
Теория на пустом месте крайне плохо ложится в детские головы (сужу по своему классу). А вот когда уже есть опыт ковыряния — всё проще. Про более старших ничего не могу сказать, я тогда уже на асм перешел.
НЛО прилетело и опубликовало эту надпись здесь
А в чём смысл? Что это дайт для понимания?
НЛО прилетело и опубликовало эту надпись здесь
Что-то в этом есть…
Петр: Я считаю, что в любом языке надо сначала освоить базовые вещи, позволяющие писать простейшие программы (переменные, if, циклы, массивы, строки, вещественные числа). С ними уже можно решать практически любую олимпиадную задачу. Остальное — уже по мере надобности.

И в университете, и в школе — это основы. Вне зависимости от языка. Правда, есть проблема, когда простые действия сложно выполнить средствами языка или это будет что-то нереальное. Например, редактирование двоичного файла — тут и на С/С++, и паскаль, и питон — можно применить. А вот тот же PHP уже как-то не в тему. Ближе к извращениям в контексте редактирования двоичных файлов — Lua и Brainfuck. Невозможные — HTML и CSS как и другие неполные по Тьюрингу

Петр: Как и на любом языке, разделяя код на разумные сущности, именуя переменные и т.д. Но на школьном уровне почти ничего из этого не нужно, максимум — ставить адекватные отступы.

Этот неловкий момент, когда даже про отступы не всем рассказывают. Или не всем понятно как табуляцией/пробелами пользоваться. Например — отступы есть, но имеют случайную длину. О чем это я, когда даже в Word встречаются абзацы, оформленные с помощью пробелов!

— Можно ли начать обучение С++, минуя Pascal и Basic?
Петр: Я бы рекомендовал заменить C++ на Python
Сергей: Если для знакомства, то лучше все-таки подойдет Python.

Тогда уже и С++ не нужен? И Python будет даже идеальным, т.к. изначально обучает правильно использовать отступы строк. У С/С++/паскаль и прочих с отступами проблемы, ведь эти языки не требуют отступы и особо отступы не контролируются.
Странное утверждение в заголовке.
Лично я считаю, что Pascal — идеальный язык для обучения программированию, тем более что он изначально был создан для этой цели. Во-первых, Pascal имеет простой и хорошо читаемый синтаксис. Во-вторых, Pascal не бьет новичка по голове кучей технических деталей как C и С++, позволяя сконцентрироваться на основах программирования, но в то же время и не прячет эти детали глубоко под капот, поощряя ученика разобраться с ними когда придёт время. В третьих, изучение Pascal даёт знания, которые не пропадут зря даже при переходе на другой язык программирования. В четвёртых, Pascal не является «игрушечным языком», он вполне пригоден для написания больших и сложных приложений. Не понимаю, ради чего нужно пытаться «закапывать» такой отличный инструмент? Просто из за современных веяний моды?
нет ООП, в этом Оберон лучше

а база одинаковая

На ООП свет клином не сошёлся, это явно не первая и не вторая глава обучения. Ну и, строго говоря, концепции ООП можно реализовать и в паскале.

средствами стандартного паскаля — нельзя

Можно. ООП — это не про языковые конструкции, а про модель предметной области.

да, только с помощью наследования и инкапсуляции (полиморфизм еще можно сэмулировать). а их нет в стд.паскале
Это да. Я когда-то читал книгу про ООП на Фортране-77.
А можно пример?
Насколько я помню, книга называлась «Математика для программистов» и была в красной обложке, автора не помню.
В гуглояндексе её сейчас не вижу.

Может, учебник Кушниренко и Лебедева для мехмата? Только он «Программирование для математиков» назывался. Он в обложках разного цвета был. У меня тоже в красной, хотя в интернете везде тёмно-зеленая на картинках.

Может, учебник Кушниренко и Лебедева для мехмата? Только он «Программирование для математиков» назывался.
Да, это он -_-
(Фамилии трудно запоминаются, не то что Хювенен и Сеппянен, например.)
Даже в Borland Pascal 7 было ООП, а в более современном FreePascal и Delphi классы уже ничем не уступают С++ и Java.
Более того, в последней версии среды разработки (Rad Studio 10.3) уже можно объявлять переменные прямо в цикле for.

begin
  for var i: Integer := 1 to 10 do ...
  for var Item: TItemType in Collection do...
 
  for var i := 1 to 10 do ... 
  for var Item in Collection do ...
end;
и какое отношение это имеет к теме обучения?
Никакого.
Это комментарий к комментарию уважаемого RedCatX, а не к статье.
Ааа, который не знает про оператор оверлодинг, РАИИ, метапрограммирование и приведение классовых типов средствами языка =)

Хвалите друг друга, да.

Впрочем, это оффтоп тут
НЛО прилетело и опубликовало эту надпись здесь
да
Ещё можно писать так:

(procedure var
  menu: IList<ICommand>;
begin
  menu := …
  …
end)();


Впрочем, обычный адский declare-begin-end получше бы смотрелся. Жаль, что создатели Delphi после заимствований из Модулы-3 в Delphi 2 поглупели и больше не смотрят на другие ветки Паскаля.
НЛО прилетело и опубликовало эту надпись здесь
Pascal, python — мой текущий стек. Сложно представить любой белее менее большой проект без ООП, я честно не понимаю как можно писать стабильный и понятный код, что бы не стыдно было его показывать новым коллегам. Для меня Pascal удобнее C, хотя и на нем опыт достаточный был, выбрал осознанно.
Ну а чем С# или, прости хоспаде, JavaScript хуже Pascal? То, что он пригоден для написания чего-то там, не означает, что он будет использоваться для этого. Почему бы не обучаться сразу на гораздо более востребованных языках? Для JS, вообще достаточно блокнота.

Ничего не скажу об эффективности изучения C++ в школьном возрасте. Но все, с кем я учился в техникуме и университете, и кто не осилил указатели в C++, хотя у них и получалось что-то на паскале, программистами не стали.
Мы в техникуме были брошены по языкам программирования почти на произвол судьбы.

Все изучали сами. Чуть было понятных лекций по Delphi и Pascal. Зато книги по этим языкам у меня были отличные, что меня с головой и затянуло в программирование.

По С++ было вообще полное самообучение по книге Татьяны Павловской. Как то ну очень нудно шло обучение. Реально помогала целеустремленность и база знаний по Pascal. Иначе (не хочется думать) может бы С++ и не знал (хотя в работе я его не использую, но любовь к нему осталась и к книгам Страуструпа тоже).

По ассемблеру была препод женщина «живой процессор». Наши боялись как огня. Объясняла довольно тяжко и без заинтересованности (без энтузиазма).

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

Нет, ну JS это уже реальная травма психики. После него и ООП и функциональщина будут даваться с трудом.

Ok, TypeScript!
И зачем? Грядёт wasm, и скоро можно будет писать фронтенд хоть на Паскале, хоть на Java — всё одно будет…
А для тайпскрипта одним блокнотом к сожалению не обойдешься
Нет, ну JS это уже реальная травма психики. После него и ООП и функциональщина будут даваться с трудом.

Ерунда. Здоровый человек может изучать любые языки в любом порядке.
Никакой язык не травмирует психику, если только психика не была ущербна изначально.
Отталкиваться надо не от языка программирования а от решаемых задач.
Пример — обработка текстов — оптимально Perl. Обработка больших объёмов бинарных данных — С/С++.

С моей точки зрения было бы правильным обучать программированию параллельно обучению робототехнике (а тут внезапно вылезает Scratch :) ). Если эту тему развивать, то можно и математику, и физику подключить в рамках единой концепции образования.
Пример — обработка текстов — оптимально Perl.

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

Например, слесарей учат работать напильником и учат на примере гаечного ключа (у меня этот ключ уже 30 лет лежит) На каких примерах учат программистов? Абстракции не всем интересны.
Вы жестоки. После Perl им потребуется помощь психолога, чтобы переключиться на что-нубудь типа C++. Особенно если привыкнут использовать специфические для перла конструкции с постусловием типа a=b+c if(z) и приколы с переменными/фекциями по умолчаниямю. Ну и регулярки тут уже помянули.

Perl офигителен для ковыряния текстов, но для начала всё-таки стоит давать более универсальные навыки.
А зачем уже счастливому и всемогущему человеку переключаться с Perl? =)
Эмм… За новыми задачами? Далеко не всё на нём писать… удобно.
Чтобы счастливому и всемогущему человеку было что поесть?
По вашим ссылкам.
242 вакансии «perl»
3 205 вакансий «c++»

Но вообще поиск в hh по ключевому слову — не показатель.Там часто пишут что-нибудь типа «Знание как минимум одного из скриптовых языков: perl, bash, python.»
Надо было еще 1С привести и Дракон.
Есть еще и не всемогущие окружающие, которым придется это читать в попытках понять происходящее. А то и, упаси рандом, поддерживать это дело. Если вы конечно не lone wolf со своим стартапом
Обработка больших объёмов бинарных данных — С/С++.
Мы сейчас бинарные данные обрабатываем терабайтами на Delphi/Lazarus. Windows/Linux. Отлично работает.
Это работа «для себя». Одна из причин — переносимость программ, другая (хотя я в ней не уверен) — сопряжение с библиотеками. Хотя при отсутствии переносимости проблемы сопряжения нет. Без рассуждений на тему отсутствия знания Паскаля в массах — выучить при острой необходимости несложно.
Биндинги в Delphi/FPC есть практически ко всем распространенным библиотекам. Я так с ходу и не вспомню, для чего нет сопряжения. Хотя, скорее всего, можно найти.

"Оно то, конечно, ничего, ежели б кабы то! Но так, как оно не токмо то, а прямо почём зря.."
Где-то так. Учить можно чему угодно и как угодно, 200 лет назад в школьников палкой сколачивали латынь и богословие… Сейчас в тренде программирование.

Боги желтых заголовков! Так вырвать слова из контекста. Этому место на Lenta.ru.

«Можно ли начать обучение С++, минуя Pascal и Basic?»
PS Конечно чтобы изучать C++ не надо сначала изучать Pascal или Basic.
Но вот надо ли первым языком изучать С++? сильно сомневаюсь. Впрочем как и опрашиваемые преподаватели.
У нас, в Воронежской области процентов 99 сидят на Pascalе, т.к. он входит в «рекомендованные» языки (это ответ на js, vba...), много разных методичек -для учителей/учеников, как ни говори, хорошая ide.
Ну и главное, конечно без математики никуда. А, еще, а Вы программы (школьные) смотрели? Что и чему там учат? Я как то давно общался с одним товарищем, который принимал участие в написании стандарта по информатике для базового уровня (но не часть программирования), Когда, товарищ, увидел, что хотят в базовом и профильном уровне — сразу была названа фамилия другого товарища — это конкретный технарь, далёкий от школьного образования. Вот и получается, что программы (разделы) стандарта пишут люди далёкие от школы. По моему, лучше придерживаться старому принципу — «лучше меньше, да лучше», нежели чем жить как сейчас. Это в редких школах есть учителя информатики, которые адекватно воспринимаю новые технологии, в большинстве же случаев это не так.
Ох уж этот извечный спор, что для чего лучше… Могу судить только по себе, ибо вообще начинал с ассемблера z80. Если понимаешь как устроен компьютер изнутри, то с языками высокого уровня вообще проблем не возникает. Помню еще на том же спектруме был и c++ и pascal и балуясь с ними на досуге, написал классическое заполнение экрана #FF, сделал вывод, что по скорости кода pascal опережает местный c++ примерно раз в 5. Ну а тонны скобочек, звездочек и точек с запятыми, идиотски реализованная работа с указателями лишь подогрели мое неприятие плюсов как языка. Сейчас, конечно без проблем могу использовать и его, вопрос лишь в том, что он мне ни разу не пригодился, потому что абсолютно всё можно сделать красиво и сразу с интерфейсом в том же Delphi или Lazarus'е c FPC. Обработка гигабайт эквайринговых выгрузок сбера (текстовые данные) — 20 минут и удобное приложение готово, обработка гигабайт xml выгрузок по организациям, с преобразованием в эксель или бд — полчаса-час максимум (не забываем, что это уже с интерфейсом). Да мне проще работать даже с MS Office из Delphi (обработка таблиц или шаблонов Word), чем из родного VBA. Чем мне заменить для этого Lazarus или Delphi? Ну а учитывая ещё и появившуюся у них кроссплатформенность, вообще считаю бессмысленным заморачиваться на что-то другое… Ну кроме как если отсутствуют биндинги на нужные либы, написанные на плюсах. Ну и скорость компиляции и удобство IDE и отладки, знаете ли, далеко не на последнем месте находятся.
Достаточно глупое заявление, с тем, что Pascal и Basic не нужны. Как раз таки они нужны для того, чтобы человек, который впервые сел за программирование писал 90% всего сам. Благодаря этому в человеке взращивается умение понимать, когда нужно использовать один алгоритм, а когда совершенно другой. Например, тот же самый sort(), ведь в спортивном программировании, особенно на С++ это всего одна строчка, когда в паскале около 2-3 десятков. Да, по началу будет сложно, но как только человек «перерастёт» Pascal и сядет за C++ он поймёт, что обучение на Pascal было необходимым.
Опсь. На плюсах за написание своей сортировки пузырьком как-то наказывают?
Большинство знакомых спортивных программистов использует sort(), ведь зачем тратить время на написание своей сортировки(того же пузырька)? В СП время очень много значит, как пример в ACM ICPC.
скорее могут наказать за использование уже готовых сортировок. Дают указания, что сторонние и свои библиотеки юзать нельзя, а также такой перечень команд: (список команд). Чаще всего просто ограничиваются запретом юзать файлы, ассемблер, системные команды и все то, что может привести к краху проверяющей программы

Но упоминание конкретно запрета сортировки не встречал в общем случае. В частных — да, когда стоит умение реализовать именно сортировку, а не юзануть готовую.
НЛО прилетело и опубликовало эту надпись здесь
Если основная цель — познакомить учеников с элементами программирования в сжатые сроки, а не целенаправленно программированию обучать, то лучше все-таки подойдет Python.
Я знаю человека, который пытался учиться программированию у такого типа. После вопросов вроде «а как сделать, чтобы программа была в отдельном файле и без браузера запускалась» стало очень грустно — они на занятиях что-то там копипастили в Jupyter Notebook и даже лопатили какие-то данные в Pandas, при этом не имея практически никакого понимания о структурах и типах данных, переменных.

Python, безусловно, хороший язык. Jupyter — отличный инструмент для прототипирования, но от паскаля в данном случае было бы куда больше пользы. Он как минимум не менее выразителен, чем Python, а статическая типизация только в кассу.
Аргументируйте. Если стоит задача познакомить человека с программированием, а не написать CRM, то чем это:

for i := size - 1 downto 1 do
    for j := 1 to i do
        if arr[j] > arr[j + 1] then 
            begin
                _ := arr[j];
                arr[j] := arr[j + 1];
                arr[j + 1] := _;
            end;

хуже этого?

for i in range(size - 1, 0, -1):
    for j in range(i):
        if arr[j] > arr[j+1]:
            arr[j], arr[j+1] = arr[j+1], arr[j]

Кроме того, если открыть CLRS или любую другую «языконезависимую» книгу по алгоритмам, там с высокой долей вероятности будет примерно такой псевдоязык:



что практически идентично паскалю:

procedure InsertionSort(t: Array of Integer; n: Integer);
var i, j, q: Integer
begin
 for i := 2 to n do
  begin
   j := i;
   q := t[i];
   while ((j > 1) and (t[j-1] > q)) do
    begin
     t[j] := t[j-1];
     j := j - 1;
    end;
   t[j] := q;
  end;
end.

Думаю, не случайно — такая запись не претендует на красоту или лаконичность, но достаточно наглядная и, главное, однозначная. Она описывает выполнение программы, не вызывая вопросов вроде «входит в range() последний элемент диапазона или нет?», «что делает третий параметр -1?», «здесь нужно i++ или ++i?»

Для самых-самых основ, просто чтоб показать, что такое программирование можно брать вообще любой достаточно высокоуровневый язык. Вот тот же пример на F# (я не предлагаю преподавать его в школе, просто пример):


let InsertionSort (t: int array) = 
  for i = 1 to t.Length - 1 do
    let mutable j = i
    let q = t.[i]
    while j > 0 && t.[j-1] > q do
      t.[j] <- t.[j-1]
      j <- j - 1
    t.[j] <- q

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


Она описывает выполнение программы, не вызывая вопросов вроде «входит в range() последний элемент диапазона или нет?», «что делает третий параметр -1?», «здесь нужно i++ или ++i?»

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


Программа на Pascal более низкоуровневая. Скажем, в ней мы обязаны передавать n. Нет стандартной команды для сортировки. Бедный набор структур данных, встроенных в сам язык.


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


Тут много спорят о языках, но мало обсуждают цели.

Скажем, в ней мы обязаны передавать n.

В синтаксисе array of, кстати, нет, не нужно. 1 to High(t) сделают дело (1 вместо 2 потому что открытые массивы индексируются с нуля).

Нет стандартной команды для сортировки.


Да как нету-то. Девять лет как есть. Сейчас уже 10. 10-так их лет. ДЕСЯТЬ!!! ДЕСЯТЬ!!!

Кстати, какая там сигнатура?

class procedure Sort<T>(var Values: array of T); overload;
class procedure Sort<T>(var Values: array of T; const Comparer: IComparer<T>); overload;
class procedure Sort<T>(var Values: array of T; const Comparer: IComparer<T>; Index: Integer; Count: Integer); overload;


Оу, надо же. n можно не передавать.
Отвечаю на «Чем хуже» — range — объяснение — «ну, так это здесь описывают...» как то не хорошо для начального восприятия.
ДА, и в каких это школах дают сортировки и еще а где и когда, в школе, изучаются подпрограммы?, да еще в таком применении? И еще, очень понятна школьнику запись i++.
Вопросик, наверное всё таки никто и программу по информатике в руках и не держал… Это в книжках вводят в курс через алгоритмический язык, в школах — практически нет, минут 10-20 от силы… вот в результате и получаем, тут не до поняли, там не до учили, а изучать будем конкретный язык программирования, да еще что б он к егэ был бы прикручен.
Я бы рекомендовал заменить C++ на Python. Pascal и уже тем более Basic точно не нужны

Обучение лучше начинать с языка со Строгой Типизацией.

https://pikabu.ru/story/kak_prostrelit_sebe_nogu_boyan_dlya_programmistov_462373


ЗАДАЧА: Прострелить себе ногу.
C: Вы простреливаете себе ногу.
Pascal: Компилятор не позволит вам прострелить себе ногу

Так что как раз для учебных целей pascal вполне годен ;)

НЛО прилетело и опубликовало эту надпись здесь
Ни pascal, ни python никого ничему интересному не учат. Разве что один учит, что begin и end ходят парами, а второй — что нужно смотреть за табуляциями ;)
Учит учитель. И, если имеется в виду общеобразовательная школа, там с программированием приблизительно так же как и с музыкой. Предмет есть, но чтобы на школьных уроках музыки кого-то научили играть на каком-то музыкальном инструменте — я не слышал.
... ни pascal, ни... никого ничему интересному не учат.
Разве что один учит, что begin и end ходят парами
За выживший в «эволюционной борьбе» begin можете сказать спасибо вполне конкретному ( с какого-то момента) бизнесмену. Почти дословно: «И зачем нам Borland Modula-2, когда и то что есть продаётся?»

Так что учит, ещё как учит... Скорее, правда, учит «жизни, как она есть»
НЛО прилетело и опубликовало эту надпись здесь

Вы, наверное, имели в виду статическую типизацию. Python — strongly typed, там вроде как строгая динамическая типизация.

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

Не только.
Со строками, например, в pascal все очень просто. В C — достаточно сложно. В python… Необычно.

А как в Питоне это выглядит и работает?

В питоне строка — это обьект с кучей методов. Ок, ООП наше все и сразу, даже если мы не собирались прямо сейчас вникать в эту концепцию. Но метода length() у строки нет, есть функция, которая эту длину возвращает (в байтах или в символах? надо мануал читать). Ок, это исключение просто запомнить.
python "из коробки" значительно мощнее чем pascal, но хитростей в нем очень много.

Но метода length() у строки нет, есть функция, которая эту длину возвращает (в байтах или в символах? надо мануал читать). Ок, это исключение просто запомнить.

Вы просто слишком опытный программист, раз ищете именно метод и сомневаетесь, в байтах или в символах. В Python всё гораздо проще.


Не нужно использовать ООП для базового использования строк. Есть функция len, которая работает со всеми объектами, имеющими длину (строки, массивы, словари и т. д.). Как именно она работает (а она как раз и вызывает тот метод) – для новичка неважно. Это можно отложить до времени, когда будет изучено ООП. Мы же не изучаем алгоритмы сборки мусора в Java сразу после того, как познакомились с new.


По поводу байтов или символов. Всё тоже очень просто. Строка (тип str) – последовательность символов. Значит и длина в символах. Как они внутри кодируются – это уже не наша проблема, и новичка особо волновать не должно. А если нужны байты или кодировка нас волнует, то есть тип bytes.


В Python очень мало хитростей на самом деле.

Мы же не изучаем алгоритмы сборки мусора в Java сразу после того, как познакомились с new.

А вот познакомить с самым тупым алгоритмом в этот момент было бы неплохо (в конце концов — остальные STW-алгоритмы просто более хитрые, а не STW в проде вроде пока один и к нему раньше полноценного понимания JMM и STW алгоритом GC лучше не приближаться)… так же как и дать самую общую инфу по JMM.

Было бы неплохо, согласен. Но про new нужно сказать уже на первом-втором занятии, так как без него никуда. И если вывалить на ученика/студента сразу все подробности, то они так и будут лежать мёртвым грузом, так как на следующих занятиях они использоваться не будут. Но сказать, конечно, что такое сборка мусора вообще, нужно.


Так и в Python. На первом занятии можно сказать, например, что len узнаёт длину отправляя запрос самим объектам. А когда дойдёт дело до ООП и __волшебных_методов__, уже можно будет рассказать про то, как именно этот запрос выполняется.

Ну если дошли уже до new — то базу по JMM и GC давать обязательно надо. Ну просто это взаимозависимые понятия. Сами алгоритмы элементарнейшим образом можно погонять в main-методе без формирования полноценного класса.

В питоне строка — это обьект с кучей методов
К слову говоря, это не так уж плохо. И в новых паскалях уже давно к строкам написаны хелперы. И можно обращаться вот так: s.Length, s.ToInteger, s.Replace и т.п. И это удобно, на самом деле.
Старые варианты, конечно, никуда не делись: Length(s), StrToInt(s), StringReplace(s, ...)
Что за странный паскаль? StrToInt это уже модуль SysUtils из дельфей/FPC. В паскале — val(string, var int, var err_index), str(string, var int). Реплейсов там и в помине небыло — пишешь свою процедурку за O(MN) — это уже хороший тон, а то так поглядишь как сейчас реализуют — пока можем найти то, что можем заменить — это уже O(M*N*N*N) — с substring'ами.

Мое мнение, как не_разработчика, Python гораздо интереснее и целесообразнее изучать в школе. Но опять же это безотносительно спортивного программирования, о котором я ничего не знаю.
Математические задачи, графики, прикладные задачи математики в физике, химии, биологии можно легко комбинировать с Python и результаты демонстрировать в докладах, оформленных с помощью Jupyter или как вариант с помощью LaTeX.
Для заинтересованных в разработке — уже подключать Qt.

Петр из статьи — это я (хотя меня и не предупредили о том, что статья будет опубликована :), и некоторые мои фразы несколько покорректировали, но вроде не очень существенно).

Тут много дискуссий вызвал извечный вопрос про то, с какого языка начинать обучение программированию и, в частности, мой ответ, который еще и оказался вынесен в заголовок статьи. Давайте я более подробно раскрою свой ответ. (Отмечу, что за ответы Инессы и Сергея я не отвечаю и не во всем с ними согласен :) )

Я рекомендую всем начинающим начинать обучение с питона. На нем вполне можно получить базовые навыки программирования (и, как я это писал в ответе на другой вопрос — это не типы, не ООП, а переменные, циклы, if'ы и т.д.; представление о типах данных вы, конечно, тоже получите, пусть и несколько неявное). И после этого вы не просто можете написать пару учебных программ, но вы владеете инструментом, который вам наверняка пригодится и в дальнейшем в жизни — в университете, в работе, если ваша работа хоть как-то, пусть косвенно, будет связана с программированием. Если вы будете профессионально заниматься программированием, то скорее всего вы изучите и другие языки, и все продвинутые концепции, но питон все равно всегда вам пригодится. А если вы не будете профессиональным программистом, но будете писать какие-нибудь небольшие скрипты, то питона вам будет более чем достаточно.

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

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

Ruby, go, swift, rust, даже C# и Javascript — все-таки (как минимум, пока что) достаточно нишевые языки. Это, естественно, мое мнение, я могу и ошибаться, но кажется, что именно питон сейчас является такой «затычкой к каждой бочке», языком, который пригодится более-менее везде, особенно для людей, не ставших профессиональными программистами. А профессиональные выучат себе любой другой язык, когда он понадобится.

Еще отдельно отмечу то, что на питоне очень мало boilerplate — простейшие программы типа «сумма двух чисел» пишутся в три строчки. (Сравните, например, это с тем, что происходит в той же Java.) Для школьников это, безусловно, важно — зачем им писать кучу boilerplate-кода, которого они пока не понимают.

(И да, отмечу, что я имею в виду именно чистый питон, а не Jupiter и т.д.)

(И интересная тема про Kotlin, я слушал о нем ряд хороших отзывов (не в контексте обучения), но сам я его не знаю, и язык слишком новый, опыта использования его как первого языка пока мало, если такой опыт вообще есть. Ну и не знаю, решили ли они проблемы с Java-boilerplate.)
бейсик вам после школы почти наверняка нигде никогда не пригодятся

Скрипты в MS Office на каком языке? ;)
Если интересует карьера программиста — да, basic это узкая ниша.

И много вы скриптов в офисе в своей жизни писали? Особенно таких, для которых нужно нетривиальное знание языка.

Я же пишу — «почти» никогда. Да, конечно, и паскаль вам может теоретически пригодиться, но все-таки это весьма и весьма редко.
Я рекомендую всем начинающим начинать обучение с питона

А что с упомянутой выше типизацией и возможностью прострелить из-за этого ноги?
Можно подумать в Cи/Паскале это сложно сделать.
В Паскале надо оочень постараться скомпилировать такой код.

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

Правильно, если ученик дошел до преобразований типов, то он уже «продвинутый» и стреляет в ногу осознанно.
Всё таки среднестатистически код Паскаля обходится без указателей. Местами — да, но это скорее исключение. Либо какие-то довольно узко-специальные места типа низкоуровневой работы с графикой и банарными данными. Вероятность выстрела в ногу при таком уровне программирования существенно снижается.
Код си же изобилует указателями чуть менее чем весь. Вот на гитхабе открыл первый встречный модуль (что бы не быть голословным):
github.com/jwilberding/bcp/blob/master/bcp.c
видим массово рассыпанные '&', '*'
Мне представляется, что на начальном уровне и в простых программах это не так существенно. И если вы не будете работать профессиональным программистом, то тоже не очень существенно. Вообще, честно говоря, не понимаю, зачем в современном мире читать книги по языку программирования, когда есть интернет.

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

SPARK — подмножество языка Ада
Многозадачность, в ее полном варианте, имеет очень сложную семантику исполнения. Но при использовании Ravenscar профиля она все же подлежит формальному анализу.
...
Важной возможностью... анализа является обнаружение неинициализированных переменных.
...
Далее, существуют формальные процессы верификации, касающиеся доказательств:
•Формальная верификация свойств надежности (т.е. гарантия отсутствия возбуждения предопределенных исключений);
•Формальная верификация функциональных свойств, основанных на контрактах, таких как пред-условия и пост-условия.

В случае с функциональными свойствами, которые кроме пред- и пост-условий включают в себя инварианты циклов и утверждения, касающиеся типов, анализатор генерирует предположения, которые необходимо доказать для гарантирования корректности программы.
...
За последние годы произошел значительный прогресс в области автоматического доказательства теорем, благодаря чему GNATprove способен автоматически исполнять множество условий верификации.
Мы про начальное обучение школьников говорим (когда редкая программа больше сотни строчек), или про что?
(
100 строк — это немало...
В 100 строк вмещается, например, расчет отпуска или больничного
Из них 25 встроенного языка,
правда, цикл расчета среднемесячного дохода(?) на Clarion
)

Кстати, об обучении тех кто ходит в 9-11 классы ( и всех желающих с 4 класса),
есть предложение обсудить бело-зеленую книгу 6мм. толщиной:

Простое и сложное в программировании
Серия: Кибернетика — неограниченные возможности и возможные ограничения
ISBN: 5-02-006595-1
Переплет: мягкий;

Простое и сложное в программировании [Текст] / Академия наук СССР; авт. предисл. Е. П. Велихов. — М.: Наука, 1988. — 169, [5] с.: ил. — ISBN 5-02-006595-1: Б. ц.

Вишняков, Юрий Саввич
канд. физ.-мат. наук
Грюнталь, Андрей Игоревич
канд. физ.-мат. наук
А. И. Грюнталь
Кольцова, Анастасия Андриановна
канд. техн. наук
А. А. Кольцова
Пачков, Степан Александрович
С. А. Пачков
Семенов, Алексей Львович
д-р физ.-мат. наук
А. Л. Семенов

Приведу часть оглавления вне спойлера ( по нему проще вспомнить книгу тем кто её читал, а остальным понять о чём она):
...
Глава 2. Коза, капуста и другие с точки зрения программиста
Глава 3. Путник снова в лабиринте
Глава 4. Доказательства в программировании
Глава 5. Алгоритм Евклида
Глава 6. Кто тяжелее, или Нижние и верхние оценки для задачи сортировки
Глава 7. Сколько веревочке ни виться, или Почему программы кончают работу
Глава 8. Снова о сортировке
Глава 9. Могут ли восемь ферзей не бить друг друга, или Обход дерева
Глава 10. Можно ли поднять себя за волосы, или Рекурсия
Глава 11. От рекурсивного определения к программе
Глава 12. Ханойские башни
...
Глава 14. Переборные задачи
Глава 15. Игры, игры, игры
Глава 16. Снова об играх
Глава 17. Гениальный режиссер и его жертва
...
Глава 20. Игра в животных, или Искусственный интеллект
Глава 21. Программистские басни
Глава 22. Компьютеры и общество
...
Начиная с 17 главы ( или чуть раньше) — «но и для их родителей» и(или) «про жизнь», рекомендую

Например, что из неё пригодится «и в дальнейшем в жизни — в университете, в работе»? Актуальность?
Паскаль (ок, и Оберон — раз я уж зацепил тему) имеет очень краткое описание и учебники.
Плюсом имеем весьма учебную и продвинутую среду PascalABC

Даже книга Гослинга по Яве — 250 страниц.

А по Питону имеем книгу Лутца на 1280стр. Вчетверо толще учебника по информатике для старшеклассников — это, на мой взгляд, перебор.

Может есть что покороче для школьников?
Ну и рекомендуйте IDE для обучения
Для школьников про питон? pythontutor.ru
Зачем школьникам, начинающим изучать программирование, читать полноценные книги по языку? Им нужно-то небольшое подмножество языка, и для этого нужна не большая книга, а небольшая методичка. У меня на сайте (algoprog.ru, см. уровень 1) есть все нужные материалы, или вот ниже советуют pythontutor — на мой взгляд, там не очень понятно для школьников, но это мое личное мнение.
Возможно, этого и достаточно школьникам — но и только им.
Когда то давно, я тоже так считал — что пролистать некоторую основу (методичку) и пару примеров и будет достаточно.

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

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

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

И да, конечно, школьники понимают, что методички мало. Но имея такие базовые знания, они уже сами зачастую в состоянии нагуглить нужную информацию.
А IDE — я рекомендую WIng IDE 101, хотя это несколько спорный вопрос.
Всё течет, всё меняется. Популярность языков меняется. Пока что Питон на взлете. Надолго ли? К слову, визуал Бейсик тоже на взлете. Рано Бейсик хороним :)
Согласен, что, конечно, это определяется и популярностью языков. Да, через 10-20 лет скорее всего будет другой хороший язык для старта.
Ну вы еще учтите, что в образовании темп медленнее. Одно дело — в стартапе вы попробовали новую технологию и через месяц уже пилите на ней прод, другое дело в образовании — как минимум, чаще раза в год менять технологию очень сложно (не будете же вы посреди учебного года говорить школьникам, что все, старый язык программирования устарел, давайте новый), плюс чтобы какой-то язык стал реально популярен в начальном обучении, надо, чтобы накопился какой-то опыт и т.д. Еще конкретно в олимпиадном программировании есть фактор готовности организаторов олимпиад предоставить этот язык…

Например, я стал использовать питон для начального обучения только года три назад (до того использовал паскаль) — и то, питон я стал использовать не в последнюю очередь потому, что у меня были несколько знакомых учителей, уже использовавших питон, и только после того, как в течение пары олимпиадных сезонов ряд моих школьников успешно участвовали в олимпиадах на питоне (который они выучили не на моих начальных занятиях, а где-то в других местах типа Летней компьютерной школы).
Ок. Жизнь расставит всё на свои места :) С Руби тем же, видимо, уже расставила.
Хотя я хорошо помню как его форсили. Смотрим дальше.
НЛО прилетело и опубликовало эту надпись здесь
«Питон — это бейсик сегодня!» :)
И «в следующие 40 лет он» принесёт «столько же» пользы/вреда как и предтеча BASIC «в предыдущие 40»? или нет?

( Это полу-цитата переводной статьи-главы из бело-зеленой 6мм. книги
см. здесь же в комментариях «координаты»)
НЛО прилетело и опубликовало эту надпись здесь
НЛО прилетело и опубликовало эту надпись здесь
Интересно. Надо будет пообщаться со знакомыми преподавателями насчет Котлина.

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

Другое дело, что IntelliJ, подозреваю, сложная (говорю по опыту PyCharm'а для питона). Создавать проект, все такое, ради программы на две строчки — это кажется слишком. Среды а-ля Wing IDE 101 или Code::Blocks кажутся удобнее в этом плане — запустил и сразу пишешь код.
НЛО прилетело и опубликовало эту надпись здесь
на Питоне я писал, давно, теперь нет. Там удобно было быстро получить желаемые изменения и функционал.
А сейчас Powershell. Потому что тоже самое, можно быстро отладиться и при этом таскать среду исполнения уже не нужно.
Необходимые DLL можно прямо из себя же сгенерить через встроенный C#.
И наоборот можно подключить к C# программе скрипты на Powershell с доступом к внутренним объектам.
Но конечно C/C++ так и остается основным выбором, если программа в основном работает с WinAPI.
При всем очевидном, замечу. Освоивший Pascal или Basic, может продолжать осваивать и другие технологии, развивая свой кругозор. И наоборот, если Basic не прошел — дальше вряд-ли что-то получится.

Из опыта.
Да, ведь главное — научиться мыслить, а не просто кодить. +в карму
Несколько ссылок. Как бы не хоронили Паскаль, однако он остается у нас одним из самых востребованных языков. В обучении в том числе. Несколько ссылок:
www.cyberforum.ru/pascal
www.cyberforum.ru/delphi-beginners
Есть что-то подобное на Питоне или JS?
Кому интересно, канал по Delphi/Lazarus, множество профессионалов, ежедневная активность:
t.me/Delphi_Lazarus
Геннадий Короткевич все свои олимпиады в школе писал на Pascal'е — и получал первые места на ВКОШПе и т.п. — ну и что? Плох что-ли?
Зарегистрируйтесь на Хабре , чтобы оставить комментарий