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 сразу же приводило к необходимости реализовать сортировку, что не было вредно. Но сейчас на Паскале почти не пишут, поэтому причин учить этому языку школьников практически нет. Насколько я понимаю, главная причина — в ЕГЭ по программированию есть вопросы по Паскалю. Но такое заталкивание языка в детей явно не добавляет им мотивации.

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

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

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

29 комментариев:

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

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

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

    ОтветитьУдалить
    Ответы
    1. Анонимный16.04.2020, 18:25

      сишники любят говорить про некую "выразительную мощь"... а что это по сути? разве умение нагромоздить кучу спецсимволов в одну строку это выразительная мощь? врядли. программа должна быть читаема влет. вся логика прозрачная и прямая и сразу понятная. если через нее приходится продираться значит что-то не так. потому что пишется она один раз а читается много раз! насчет выразительности тогда уж лисп и функциональные языки - вот там универсальность алгоритмов есть а не в си. begin/end? да запарили уже сишники хвастаться своим неумением настроить свою ИДЕ. кто вам мешает сделать чтоб при нажатии вашей любимой волнушки генерировались эти бегины и енды? только ваше неумение.

      Удалить
  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 - тоже хорошо, хоть и сложно для первого языка, мне кажется.

      Удалить
    2. Анонимный16.04.2020, 18:43

      а знаете почему любят говорить "с++ для профессионалов"? это не ложь но смысл этой фразы на самом деле далек от общепринятого. она значит буквально что языки Си и С++ настолько кривые и замороченные что развивать и поддерживать программы на них могут только платные "профессионалы". тренированные дисциплинированные и с нормальной поддержкой ИДЕ. но эта фраза вовсе не значит обратного - что _если_ вы будете использовать эти языки _то_ вы автоматически попадете в категорию профессионалов... вовсе нет... а ведь вы именно это и подумали когда слышали исходную фразу, да? хехе... на самом деле эти языки для профессионалов как раз потому что эти языки своей кривизной обеспечивают им годами внешне сложную работу, а не наоборот )) тупой и прямой паскаль "профессионалам" не выгоден. им как раз выгоден кривой пхп в котором нет логики а есть куча частных случаев. чем хуже тем им лучше. платный закат солнца вручную за ваши деньги был еще в древнем египте.

      Удалить
  4. Анонимный16.03.2016, 00: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, 00: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. Анонимный29.12.2016, 16:01

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

    ОтветитьУдалить
  15. Анонимный29.10.2017, 12:33

    У нас в школе (лет 50 тому)понятия информатика не существовало. Только в институте нас начали обучать FORTRAN, но для нас это был программируемый калькулятор. Но прежде всего учили структурному программированию. Сейчас, увы, этому не учат и не умеют. Учится только тот, кто этого хочет и умеет найти преподавателя. Так что для школы и ЕГЭ лучшее - Pascal. Он строго типизирован и ставит мозги на место. Сам до сих пор им пользуюсь, т.к. низкоуровневое программирование не использую. Хотя иногда пишу вставки на Assembler.

    ОтветитьУдалить
  16. Анонимный01.02.2018, 10:59

    А по мне,так лучше Паскаль и нет,лично для меня С,С++СШарп,Ява трудные,хотя быть может мне просто так кажется

    ОтветитьУдалить
  17. Во первых, нужно определится, чем ты хочешь заниматся! Определившись со своей будующей сферой деятельности нужно посмотреть какие языки там рулят(Высокоуровневые или низкоуровневые). Если высокоуровневые то смысла тратить время на паскаль нет, его знание и знания приобретённые пока его изучал. Тебе не пригодятся никогда!!!
    Если же в сфере куда ты хочешь окунаться рулят Низкоуровневые языки то Паскаль для первого языка идеален! Низкоуровневые языки такие как Асемблер, Фортран, С, С++ и т.д. Довольно сложны в понимании и в коде легко допустить ошибку.
    И тут выходит его величество паскаль. Он компактен, лёгок в понимании, он тоже является низкоуровневым. И самое главное... ПАСКАЛЬ ЭТО УЧЕБНЫЙ ЯЗЫК ОН ИЗНАЧАЛЬНО БЫЛ ПРИДУМАН ДЛЯ ОБУЧЕНИЯ ПРОГРАММИРОВАНИЮ.
    Главное не делай ошибку всех начинающих которые тупо берут книжку типо С++ шаг за шагом, в которой описан сам язык. Изучают её и... Потом негодуют я же выучил язык программирования, почему я до сих пор програмировать не умею? Дело в том, что знание языка програмирования не сделает вас хорошим программистом. Поэтому надо найти какие нибудь курсы по ОСНОВАМ ПРОГРАММИРОВАНИЯ желательно не менее 30 часов. В которых будут учить что такое компьютер, что такое процессор, почему компьютер умеет считать только до одного. Что такое драйвера , что за зверь системы исчесления , как перевести число в двоичную или десятичную или шестнадцатиричную систему исчисления и т.д. Затем что такое Алгоритмы , с чем их едят какие алгоритмы использовать в том или ином случае. После курса желательно прикупить книжку потолше по алгоритмам и в свободное время вдумчиво почитать, паралельно можно приступать к изучению выбранного языка. Да если выберите низкоуровневый язык програмирования и соответственную сферу например(программирование микроконтроллеров или робототехника, или програмирование операционных систем и т.д. Придётся научится паять без этого никуда))

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

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

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



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

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