мы должны преподавать указатели в курсе "основы программирования"? - PullRequest
5 голосов
/ 19 марта 2009

Следующей осенью я буду преподавать курс по основам программирования, первый курс по информатике. Каковы плюсы и минусы обучения указателей в таком курсе? (Моя позиция: их надо учить).

Редактировать: Моя проблема с аргументом "обслуживать вашу аудиторию" заключается в том, что в первые пару лет обучения в университете мы (специалисты) не знаем, хотели бы студенты быть учеными или нет .. Хотелось бы, чтобы мы знали, но мы должны найти баланс между теми, кто останется в школе (4 года не учёный делает), и теми, кто будет инженерами.

Окончательное решение: Как минимум ссылки, но, возможно, указатели без арифметики указателей.

Ответы [ 9 ]

13 голосов
/ 19 марта 2009

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

6 голосов
/ 19 марта 2009

Да.

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

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

4 голосов
/ 19 марта 2009

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

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

2 голосов
/ 19 марта 2009

Во время моего первого года обучения в CS я осенью прошел курс Java, который был общим введением. Профессор не учил указателям напрямую, но он учил концепции ссылок и тому, почему вы можете изменять объекты, а не когда примитивы передаются в аргументе.

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

Для введения в класс программирования, я бы сказал, просто упомяните ссылки, но не указатели напрямую.

1 голос
/ 19 марта 2009

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

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

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

Когда я преподавал указатели для инженерного класса, я в конечном счете запустил отладчик в простой программе «hello world» и показал учащимся фактический машинный код, значения регистров и соответствующие дампы памяти, с манипулированием стеком и передачей параметров, и т.д., но они были готовы к этому. Будет ли ваша аудитория восприимчива к такой экспедиции для углубленного изучения, чтобы обеспечить четкое понимание того, что происходит за кулисами, и будет ли вы готовы пойти на такие шаги? :)

1 голос
/ 19 марта 2009

Я думаю, что курс «Основы программирования» должен, по крайней мере, касаться базовой архитектуры процессора и языка ассемблера, и если это произойдет, вы не сможете доказать, что не обсуждали указатели. Если вы будете преподавать только языки более высокого уровня (байт-код), то я думаю, что указатели могут запутать аудиторию.

0 голосов
/ 19 марта 2009

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

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

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

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

Мой первый вводный курс по программированию использовал Haskell. Только в последующем курсе, использующем C, были введены указатели (когда я проходил курс, я уже был хорошим программистом на C и C ++; эти предметы были обязательными).

0 голосов
/ 19 марта 2009

Это действительно зависит от цели вашего курса - обучение программированию и обучение информатике - две отдельные цели, и хотя они не являются взаимоисключающими, вводные классы обычно не преподают оба одинаково хорошо. Вот пример различия: скажем, мы хотим научиться сортировать список. Курс программирования на C ++ научит вас использовать синтаксис шаблона функции std :: sort, и домашнее задание может состоять в написании нескольких функторов сравнения. Курс информатики объяснил бы вам, что такое сортировка слиянием, как выглядит алгоритм в псевдокоде, его характеристики производительности / пространства, а домашняя работа - написание самой функции сортировки.

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

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

0 голосов
/ 19 марта 2009

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

Хорошим примером является последняя книга Страуструпа: Программирование - Принципы и практика с использованием C ++ , где он учит, как создавать синтаксический анализатор, использовать ввод / вывод (потоки) и GUI использование, прежде чем даже говорить о указателях!

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...