15 мар. 2016 г.

Pascal или C для школьников?

Добрый день!

Буквально месяц назад мы отметили 60 лет ENIAC, первого электронного цифрового вычислителя общего назначения, а за три месяца до этого праздновали 200 лет со дня рождения Ады Лавлейс, первого программиста человечества. Поэтому сейчас самый подходящий момент, чтобы подумать об обучении программированию.

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

Но есть и отличия. Давайте попробуем их вспомнить.

Итак, плюсы и минусы языков Си и Паскаль:
- В Си есть qsort (наличие развитой сортировки, которой можно подсунуть свою функцию сравнения, сразу сокращает и упрощает код),
- В Паскале есть строки (пусть их длина ограничена 255 символами, но начать с ними работать гораздо проще, а возможностей для ошибок — меньше),
- В Си краткий синтаксис (многих в Паскале раздражало постоянное написание "begin"/"end", а в Си мы пишем "{"/"}"),
- В Паскале LL(1) грамматика (глядя на начало строки, мы это начало сразу понимаем, в то время как в Си, например, с "int " может начинаться что угодно: хоть переменная, хоть указатель на переменную, хоть функция),
- Есть много популярных языков с Си-подобным синтаксисом (C++/C#/Java/...), поэтому поучиться Си стоит,
- В Паскале легко выводить значения разных типов (сравните "write(a, ', ', b);" с "printf("%d, %f", a, b);" — во втором случае пришлось вспоминать, какого типа наши переменные a и b.

Долгое время Pascal считался хорошим языком для обучения. Кстати, отсутствие qsort сразу же приводило к необходимости реализовать сортировку, что не было вредно. Но сейчас на Паскале почти не пишут, поэтому причин учить этому языку школьников практически нет. Насколько я понимаю, главная причина — в ЕГЭ по программированию есть вопросы по Паскалю. Но такое заталкивание языка в детей явно не добавляет им мотивации.

А какие положительные и отрицательные моменты Паскаля и Си вы помните? Можно учить оба, помня, что это почти одно и то же? Или только Си? Готовиться ли к ЕГЭ?

Хорошей недели!

Ссылки по теме:
- Три программы,
- Программисты-олимпиадники,
- Слишком универсально.

24 комментария:

  1. На всякий случай напомню, как копировать строчки на Си:

    char *strcpy(char *dest, const char* src)
    {
    char *ret = dest;
    while (*dest++ = *src++)
    ;
    return ret;
    }

    Конструкция "while (*dest++ = *src++);" указывает на выразительную мощь, но как же тяжело школьникам через это продираться!

    ОтветитьУдалить
  2. Анонимный15.03.2016, 16:44

    Вспомним историю языков (кратко):
    1. были ассемблеры, на которых писали и операционные системы,и прикладные программы
    2. для прикладных программ придумывают Фортран, также Алгол, затем Паскаль и так далее - программы становиться проще читать, то есть искать ошибки и модифицировать.
    3. нужна замена Ассемблеру - язык близкий к аппаратной части (например, работать напрямую с адресами памяти), но более высокого уровня - процедурый, структурный. Вот тут-то и родился Си с его "i++", memcpy, "unsigned int" - без чего в прикладных программах вполне можно обойтись.

    В процессе обучения человек непременно будет сталкиваться со всеми этими конструкциями, что будет сильно распылять внимание. Поэтому Паскаль (или Бейсик) лучше для обучения. Но думаю, что начинать надо еще в младших классах с преподавания Scratch.

    Виталий

    ОтветитьУдалить
    Ответы
    1. Виталий, спасибо за содержательное дополнение об истории вопроса!

      Удалить
  3. Мне больше нравится Pascal, как первый язык.
    Как раз то, что на С можно написать всякие нечитаемые конструкции, вроде «while (*dest++ = *src++);» - это плюс Паскаля.

    Но да, Паскаль практически мёртвый язык сейчас (я могу назвать парочку живых проектов на Delphi или Object Pascal, но это скорее статистическая погрешность).

    Ну и почему С. Почему не какой0нибудь боле синтаксически сладкий С++ со стандартной библиотекой или вообще c Qt?

    Почему не Python, например? (Мне слишком развращающей видится динамическая типизация, а в остальном тоже вариант.)

    Про минусы C первым языком: http://www.stolyarov.info/files/anti_c_v03.pdf

    ОтветитьУдалить
    Ответы
    1. LisandreL, спасибо за ссылку!
      С моей точки зрения, Python - отличный вариант. C++ с Qt - тоже хорошо, хоть и сложно для первого языка, мне кажется.

      Удалить
  4. Анонимный16.03.2016, 0:05

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

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

    ОтветитьУдалить
  5. Мне почему-то кажется, что лучше - питон.
    Я серьезно, он освобождает от геморроя с памятью, при этом объектно ориентированный, развитая математика (ну вдруг захотят график построить там или уравнение посчитать).
    И главное - лаконичный синтаксис.

    ОтветитьУдалить
  6. Хотя сам я преподавал C# - он популярный, простой синтаксис, опять-таки освобождает от тонкого контроля за памятью, при этом дает представление о том, что бывают два типа памяти (стек, куча). В нем нет такого геморроя со строками и выводом как в С.
    И как плюшка - можно им показать как легко нарисовать оконное приложение с примитивным функционалом, им было прикольно.
    Ну или С++11 наконец, там и массивы нормальные (можно не сильно вдаваться в то, что такое шаблоны) и cout << a << ", " << b << endl; чуть понятнее чем printf("%d,%f\n", a, b)

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

    Паскаль же он... ну умирающий язык.

    ОтветитьУдалить
  7. /У меня в старших классах был препод который преподавал на своем выдуманном простом псевдо языке и это не мешало людям понимать что такое алгоритмы.

    Паскаль же он... ну умирающий язык/
    не находите противоречия, Евгений? Чем выдумывать свой несуществующий, не лучше ли использовать уже существующий, но практически мертвый?
    Да, и почему дискредитировали Бейсик? Я сам учился на Паскале, и люблю его больше Бейсика (именно поэтому), но Бейсик до сих пор в Экселе сидит (в измененном виде, но это не сильно мешает).
    Моя дочь по совету автора этого ресурса (спасибо Вам, Весенний, кстати)стала работать в Scratch, я ей показал сначала, потом уже не заморачивался. У меня вопрос: а там что, есть синтаксис, я только пикторгаммки увидел (сейчас у меня нет возможности посмотреть).

    ОтветитьУдалить
    Ответы
    1. Вячеслав, я не понял вопрос. Вы пробовали у дочери спросить?

      Удалить
    2. Дочь не поймет. Сегодня вечером сам посмотрю, если будет время. Вопрос был такой: может ли обычный пользователь в Скрэтче писать там всякие begin end do if и прочее подобное, или эти средства от пользователя скрыты, и он может только на пиктограммки нажимать?
      Простите за наивность.

      Удалить
  8. Кто-то выше правильно заметил, что учить надо не языку, а программированию.

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

    Потому что C - это боль, от которой в 99% случаев можно избавиться при помощи более высокоуровневых языков. Да, так ученики не узнают, что такое указатели. Но я в своей профессиональной карьере за 10 лет ни разу не страдал от их отсутствия в языках, которыми пользуюсь каждый день.

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

    Если выбирать из более современных языков, у меня есть три варианта:

    1. Java. Строго-типизированный язык, толковая объектная модель, позволяет сосредоточиться на написании кода, а не сражении со звездочками ;)
    2. Python. Простой синтаксис, мультипарадигменность (в 21 веке это важно :)). Из минусов - не строгая типизация, вместо нее duck-typing.

    ОтветитьУдалить
    Ответы
    1. Третий вариант мне самому в процесс показался слишком упоротым, я хотел предложить Scala - она объединяет мультипарадигменность и лакончиность python со всей строгостью Java, но для неокрепшей детской психики это будет слишком болезненный опыт, наверное :)

      Удалить
    2. Спасибо, интересно.
      К сожалению, здесь ещё накладывается ЕГЭ по программированию, в котором есть вопросы именно про Pascal. А про Scala нет :)

      Удалить
  9. Вопросы на экзамене про Pascal, а не про программирование - это само по себе проблема.

    И начинать надо именно отсюда. У меня еще со времен моей собственной школы куча вопросов к школьной программе по информатике. А это было даже до ЕГЭ :)

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

    ОтветитьУдалить
    Ответы
    1. Анонимный18.03.2016, 0:33

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

      Удалить
    2. Да уж, или узость взглядов.

      Удалить
  11. Я бы посоветовал использовать в качестве первого языка обучения Groovy. У него удобный синтакс, он полностью поддерживает синтакс Java, можно использовать и как скриптовый язык.
    Пример печати к консоль: println "Hello world!".
    Есть поддержка во всех бесплатных средах разработки: Eclipse, IntelliJ, NetBeans.

    ОтветитьУдалить
  12. Питоноподобный статически типизированный язык, что-то типа https://ru.wikipedia.org/wiki/Boo
    Да чо уж там, прямо сразу с Хаскелла надо начинать!

    ОтветитьУдалить
  13. Анонимный07.08.2016, 22:31

    Рассмотренные плюсы и минусы в целом не существенны.
    Для "простых" классов я бы взял паскаль и не парился. Для профильных можно Си.
    Указатели есть и в паскале, к слову.
    От указателей всё равно не уйти. Потому что идея - косвенный доступ, есть почти везде в виде ссылок.

    ОтветитьУдалить
  14. Мне кажется для обучения только Python подходит, если говоритm об общепринятой парадигме программирования, а если функциональный язык, то видимо Haskell

    ОтветитьУдалить

Понравилась заметка? Подпишитесь на RSS-feed или email-рассылку.

Хотите поделиться ссылкой с другими? Добавьте в закладки:



Есть вопросы или предложения? Пишите письма на адрес mytribune АТ yandex.ru.

С уважением,
      Илья Весенний