При выборе первого языка программирования, есть много вопросов, которые необходимо учитывать. Многие из них были рассмотрены в ответах выше. Я включил еще 3, так как они были частью моего ответа на закрытый вопрос ( https://cs.stackexchange.com/questions/1946/criteria-for-choosing-a-first-programming-language ), который первоначально вдохновил этот вопрос , Я скопировал свой ответ здесь (и изменил его) на основе текущей политики удаления закрытых вопросов.
Вот 3 момента, которые нужно рассмотреть, используя несколько языков программирования в качестве примеров.
Программирование в большом против программирования в маленьком
При первом обучении программированию нужно научиться программировать в малом , прежде чем переходить к изучению механизмов, помогающих программированию в целом .
Под малым программированием я подразумеваю написание программ, содержащих менее 100 строк. Эти программы будут включать алгоритмы, которые манипулируют простыми структурами данных, имеют простой поток управления и решают простые проблемы. Они, как правило, не будут рассматриваться как приложения .
Под программированием в целом я подразумеваю написание больших программ, построенных из множества компонентов / классов, построенных на основе API, с графическим интерфейсом пользователя, базой данных, возможно, в конфигурации клиент-сервер.
То, о чем должен думать программист при программировании в малом, сильно отличается от того, когда программируется в большом. Программирование в целом требует от программиста задуматься о модульности, хороших интерфейсах, хорошем дизайне, возможности многократного использования и многих других проблемах. Современные языки программирования предоставляют множество конструкций, помогающих программировать в целом. Эти конструкции включают в себя классы, модули, интерфейсы, сокрытие информации и т. Д. При малом программировании эти проблемы гораздо менее важны.
Язык программирования, такой как C ++, имеет множество функций, помогающих программированию в целом, но труднее сесть и начать писать очень простую программу. Ява похожа.
С другой стороны, такой язык, как Python, Ruby, Scheme или Haskell, значительно облегчает непосредственное написание программы.
Высокий уровень против низкого уровня
Такие языки, как C ++ и C, являются языком более низкого уровня. Они позволяют программисту напрямую манипулировать ссылками в памяти. Хотя это позволяет писать очень эффективный код, детали первого уровня могут быть трудными для первого программиста в изучении языка. Некоторые утверждают, что эти детали низкого уровня мешают написанию логики для решения проблемы.
Язык более высокого уровня, такой как Python, облегчает более непосредственное выражение концептов в терминах предметной области.
Статически Типизированный против Динамически Типизированный
C ++, Haskell, Java и многие другие языки имеют статическую типизацию. Это означает, что компилятор автоматически находит места, где возникают потенциальные ошибки, на основе ожидаемых типов значений в каждом месте кода. Существует религиозная война о том, хороша ли статическая типизация или нет, но я буду избегать этой. Одна проблема со статической типизацией для новых программистов состоит в том, что сообщения об ошибках, сообщаемые компилятором, часто трудно понять. Это особенно касается шаблонов C ++ и программ на Haskell в целом.
Python, Ruby и Scheme имеют динамическую типизацию. Это означает, что ошибки обнаруживаются во время работы программы. Можно утверждать, что уже слишком поздно обнаруживать ошибки (но можно также использовать тестирование, чтобы избежать таких ошибок). Опять же, избегая религиозного аргумента, преимущество типа ошибок, с которыми можно столкнуться при написании простых программ на динамически типизированном языке программирования, такого рода, что этот объект не знает, как выполнить эту операцию . В контексте небольшой программы эти ошибки легко понять и отследить.
Такие языки, как C, имеют слабую типизацию, что означает, что, хотя компилятор помогает с некоторыми ошибками, во время выполнения не удается перехватить другие возникающие, такие как недопустимые обращения к памяти. В результате, сообщение об ошибке, возвращаемое программисту, похоже на «Сбой программы». Динамически типизированный язык может перехватывать эти ошибки и преобразовывать их в более понятное сообщение об ошибке.
другие
Для других языков могут вступать в игру другие соображения, такие как поддержка, предоставляемая средой программирования, доступные API, качество книг и онлайн-учебники и т. Д.