Является ли изучение C необходимым для информатики? [закрыто]

15

Я передний конец разработчик , который едва даже увидеть файл с .hили .cрасширение. Я знаю базовый синтаксис Си, я выучил его в Unreality, но никогда не интересовался таким низкоуровневым программированием, потому что это было просто слишком много настроек для простых вещей.

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

У меня вопрос, является ли C как язык программирования необходимым для информатики, или у нас просто есть все наши ресурсы в CS, написанные на C? Можно ли изучать информатику без изучения C?

Мохсен
источник
4
Вот мнение Джоэл Спольски по этому поводу: joelonsoftware.com/articles/CollegeAdvice.html Это подлежит обсуждению, но я думаю , что у него есть свои очки.
Док Браун
2
Пуристы утверждают, что информатика не связана с компьютерами, что делает ненужными языки программирования.
Blrfl
1
Что вы подразумеваете под "информатикой"? Я думаю, что вы описываете в основном часть программной инженерии в области компьютерных наук. Кроме того, я не вижу, как все ресурсы написаны на C. Я прочитал довольно много книг об алгоритмах / структурах данных, и ни одна не использовала C. Почти все они использовали какой-то язык псевдокодов, легко понятный для всех (ну, кроме TAOCP, который использует сборку ... но это другая история)
Бакуриу
Unreality? Предполагалось, что это была причуда автокоррекции из университета или это какая-то школа черной магии? Я знаю Невидимый Университет, хотя: [
Охотник на Оленей

Ответы:

31

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

Мне очень интересно изучать все аспекты информатики, но я хочу верить, что мне не обязательно знать конкретный язык, чтобы понять большинство концепций информатики.

(акцент мой)

Итак, операционные системы и сетевые стеки - это два огромных аспекта компьютерных наук, и все доминирующие операционные системы и сетевые стеки в основном написаны на C. Если вы хотите понять их, вы должны изучить C. Да, некоторым школам удается преподавать их классы ОС на Java, но это похоже на чтение Гомера на английском языке.

Кроме того, C не такой большой язык. Если вы действительно хотите изучить все аспекты информатики, вы должны пожать плечами и сказать: «Мех», «Какой еще язык?»

Чарльз Э. Грант
источник
Я в целом согласен с этим, хотя для меня «изучение» C означает, что я достаточно свободно владею языком, чтобы писать на нем нетривиальные программы без посторонней помощи. Я не уверен, является ли этот уровень понимания необходимым условием для операционных систем и сетевого программирования.
Теластин
3
@Telastyn: это означает, что вы достаточно свободно понимаете и модифицируете код операционной системы и сетевой код - домены, для которых используется C, и все. Это не значит, что вам нужно знать, как писать игры на C, создавать привлекательные приложения для создания пользовательского интерфейса и диаграмм на C, графические или машинные механизмы на C; потому что для любого другого домена CS есть другой выбор языка.
Rwong
12

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

Безусловно, университеты обычно используют системы Unix. Удобно, что это было запрограммировано на C. Можно начать с изучения C на любом компьютере и в конечном итоге получить исходный код Unix на C. Дома студенты могут использовать компилятор C, такой как Borland Turbo C на Windows или MPW на Mac - он работал везде.

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

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

И так, долгое время С был выбор.

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


Так что нет, изучение C не обязательно для изучения информатики. Вы можете найти много других книг, которые преподают информатику на Java или Python. Просто долгое время, С был выбор, и академические книги движутся медленно.


источник
Напомним, что обучение искусственному интеллекту традиционно проводилось с помощью компаньона С в течение 70-х и 80-х годов, LISP, но ответ на этот вопрос не стоит.
jwrush
@jwrush мой ответ был в большей степени похож на то, что вы можете изучать ИИ на C, по сравнению с другими языками того времени (не на LISP - и в 90-х годах я взял урок lisp для ИИ). Конечно, MIT (дом яйцеголов) в то время преподавал много своих уроков в LISP - и это был, конечно, другой вариант, но не совсем такой практичный в других областях. При обучении было важно работать на одной и той же основе в каждом классе, чтобы не тратить первую неделю или две на обучение студентов другому языку, специализированному для этого класса.
12

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

Хотя информатика связана с понятиями, которые можно изучать независимо от какого-либо конкретного языка программирования, существуют области, которые могут быть намного лучше поняты при изучении C или изучении этой области с использованием C.

  • Алгоритмы и структуры данных. В стандарте C их практически нет - их уже реализовали на языке или в стандартной библиотеке, что, как правило, демотивирует учащихся: « Почему я должен беспокоиться о реализации чего-то легкодоступного?«Глядя на фрагмент кода C, вы сразу же видите его алгоритмическую стоимость, поскольку все в C компилируется только с несколькими машинными инструкциями. В высокоуровневых языках (например, Perl или Python) часто используются сложные структуры данных под капотом облегченного синтаксиса. Код кажется легким, но это не так. Вам уже нужно много знаний, чтобы правильно рассуждать об алгоритмической сложности этих фрагментов кода. Поэтому эти языки не так подходят для изучения алгоритмов и структур данных, и многие программисты, которые всегда жили на языках высокого уровня, как правило, не способны решать проблемы с производительностью, когда сталкиваются с ними.

  • Операционные системы. Большинство операционных систем написаны на C. Как вы хотите понять процесс создания без вызова fork? Слой абстракции Java VM здесь не поможет. И просто говорить об этом, даже не создавая процесс, еще хуже ... Как вы можете написать программное обеспечение, такое как Eclipse, которое может перенаправлять стандартный вывод в одно из своих окон? Для этого вам нужно понять концепции уровня ОС, и вы можете коснуться их непосредственно только в Си.

  • Косвенность. Вы не можете сделать C, не имея дело с указателями. Указатели заставляют вас думать на двух уровнях, и это расширяет ваши навыки абстракции.

Есть также некоторые технические преимущества знания C:

  • Межязыковая совместимость. Вы хотите интегрировать отличный модуль Ruby в ваш проект Python (замените два произвольных языка здесь). Скорее всего, единственный способ сделать это - через C, потому что оба языка имеют внешний интерфейс с C.

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


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

Миклош Гомоля
источник
Арифметика указателей имеет решающее значение для понимания операционных систем, поскольку приводит к тому, почему. Например, почему кучи и стеки отличаются, почему виртуальная память работает хорошо или плохо, почему некоторые циклы работают быстрее, чем другие, и т. Д.
Майкл Шопсин
6

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

TL; DR : На мой взгляд, C - это просто, хороший C читабелен, и есть определенная радость, которую можно найти в стучащих битах.

С простой

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

Простое это красиво .

С не таинственный

В отличие от многих языков более высокого уровня, вам будет сложно найти много странных, непонятных символов в C. В мире C основным средством как абстракции, так и «синтаксического сжатия» является функция - семантически очень простая и понятная конструкция. Хороший стиль Си поощряет почти поэтическую, читаемую красоту. Чтобы проиллюстрировать это, давайте попробуем прочитать следующий фрагмент из ядра Linux. Даже не имея представления о базовых структурах данных и деталях реализации, мы можем понять следующее:

bool kthread_freezable_should_stop(bool *was_frozen)
{
    bool frozen = false;

    might_sleep();

    if (unlikely(freezing(current)))
        frozen = __refrigerator(true);

    if (was_frozen)
        *was_frozen = frozen;

    return kthread_should_stop();
}

Середина функции гласит: «Если маловероятно, что ток замерзнет, ​​спросите холодильник, действительно ли замерзание произошло». Доктор Сьюз не мог бы написать это лучше.

Читается это красиво .

C прозрачен

Если оператор C не включает в себя вызов функции, вы обычно можете получить очень хорошее представление о его стоимости во время выполнения и побочных эффектах. C дает программисту контроль и в конечном итоге доверяет ему или ей делать правильные вещи. Мы можем получить представление о том, что происходит, когда этот (слегка переформатированный для SE) фрагмент из реализации strlen()в библиотеке GNU C выполняется, поскольку каждый оператор имеет четко определенную семантику. Там нет перегрузки в C.

for (char_ptr = str; ((unsigned long int) char_ptr & (sizeof (longword) - 1)) != 0;
        ++char_ptr)

if (*char_ptr == '\0')
    return char_ptr - str;

В целях «оптимизируемости» это свойство отлично подходит. Можно утверждать, что некоторые языки более высокого уровня облегчают сжатое выражение алгоритмов более высокого уровня (например, C ++ с классами и перегрузкой), но для целей C, предназначенных для работы в качестве переносимого ассемблера, C идеален. Иногда, при успешном выполнении низкоуровневого кода, программист может чувствовать себя единым с машиной, в некотором смысле (или ноль - это деталь реализации). Это не значит, что другие языки плохие, недостаточно "дзен" или что-то в этом роде глупое, просто то, что IMO C может быть интересным в том смысле, в каком многие другие языки его выбрали, по многим уважительным причинам.

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

idoby
источник
3

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

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

Другая высоко ценимая работа на эту тему, «Структура и интерпретация компьютерных программ» , использовала аналогичный подход, разработав упрощенный диалект языка программирования LISP, чтобы действовать в качестве своего собственного контекста. Этот язык является тем, что мы знаем сейчас как Схема.

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

Итак, нет, C не является необходимым для понимания информатики. Важно ваше понимание основных понятий алгоритмов и их применения.

greyfade
источник
2

Я начал карьеру в программировании, изучая vb3 из руководств, которые поставлялись на прилагаемых дискетах. Я выучил немного java и смог создать несколько респектабельных программ, но только когда я изучал C в университете, я почувствовал, что действительно понимаю, что происходит «под капотом». Сейчас я работаю только с .net и никогда не беспокоюсь об указателях, недействительных адресах или переполнениях - но я понимаю их, это информирует о решениях, которые я принимаю ежедневно, и некоторые вещи старой школы все еще существуют на современных интерпретируемых языках, флаги , битовые операции, логическая логика, все мощные инструменты и очень эффективные.

Изучите C. Это поможет вам в этом. Я годами хранил копию руководства для программистов и читал Кернигана и Ричи от корки до корки. Неважно, на каком языке вы в конечном итоге работаете с Understanding C, это определенно поможет.

Matt
источник
1

Можно ли изучать информатику без изучения C?

Ответ - да. У меня есть степень по CS, и я не был обязан изучать C, а скорее Java. По крайней мере, в моей школе акцент делался на изучении объектно-ориентированного программирования с некоторыми учениями по языку ассемблера, структурам данных и проектированию баз данных.

PhillyNJ
источник
7
Вы уверены, что ваша степень охватывает « все аспекты» CS?
SK-logic
Я бы сказал, все необходимые аспекты. Никакая степень не охватывает все аспекты программы обучения. Плюс «все» субъективно.
PhillyNJ
1
Как вы определяете «необходимо»? Все это все смысл, охватывающий все возможные приложения CS. Это не «субъективно», это вполне поддается количественной оценке.
SK-logic
Я определяю «необходимый» в контексте того, что CS охватывает изучение вычислительной техники и компьютерных технологий, аппаратного и программного обеспечения, а не какой-либо конкретный язык, который отвечает на первоначальный вопрос.
PhillyNJ
Хорошо, а как вы собираетесь охватить оборудование без языков низкого уровня? Как вы будете освещать историю языков программирования (которая является исключительно важной частью «всего» CS) без такого ключевого языка? Как вы будете охватывать семантику языка программирования без хотя бы одного языка с арифметикой указателей? Так или иначе, но язык, похожий на C, должен присутствовать в любой всеобъемлющей программе CS.
SK-logic
0

Это действительно зависит от того, что вы хотите сделать с тем, что вы изучаете. Это определенно верно, что многие алгоритмы приведены в C или его потомках. Однако за эти годы я видел больше примеров C ++, C # и Java. То, что CS должен преподавать, является общим пониманием вычисления, и поэтому, как выбрать или создать язык, подходящий для задачи под рукой.

Тем не менее, все еще есть много людей, чей первый и последний язык - это некоторая вариация C или Java, и не все из них будут обучены понимать любой язык, который дает степень CS. Даже некоторые выпускники CS имеют проблемы с программированием. Поэтому вам может понадобиться достаточно хорошее понимание этих языков, с которыми вы можете общаться с ними, в зависимости от вашей карьеры. Если вы планируете придерживаться научных кругов, у вас будет еще больше языковых барьеров для контента, особенно в междисциплинарных областях (где люди используют пролог, lisp, haskell, mathematica и т. Д.)

JZX
источник
-1

Если вы действительно собираетесь изучать «все аспекты информатики» (амбициозный план!), Вам придется иметь дело с несколькими различными языками ассемблера и хотя бы с одним HDL (и практиковаться в кодировании на уровне списка соединений).

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

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

SK-логика
источник