Чи важливо вивчення C важливо для інформатики? [зачинено]


15

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

Мені дуже цікаво вивчити всі аспекти інформатики, але я хочу вірити, що мені не потрібно знати певну мову, щоб зрозуміти більшість концепцій інформатики. Але коли я починаю читати книги та статті про фундаментальні поняття інформатики, такі як Структури даних та Дизайн алгоритмів, здається, що мені потрібно вивчити С, оскільки всі приклади та навіть уроки знаходяться на мові С (а іноді і на Java).

Моє запитання: чи є С як мовою програмування важливою для комп’ютерних наук, або у нас просто трапилось, що всі наші ресурси в CS написані на C? Чи можна вивчити інформатику, не вивчаючи C?


4
Ось думка Джоела Спольського з цього приводу: joelonsoftware.com/articles/CollegeAdvice.html Це дискусійно, але я думаю, що він має свої моменти.
Док Браун

2
Пуристи стверджують, що інформатика не стосується комп’ютерів, що робить мови програмування непотрібними.
Blrfl

1
Що ви маєте на увазі під "інформатикою"? Те, що ви описуєте, - це, здебільшого, інженерія програмного забезпечення, що є інформатикою. Крім того, я не бачу, як усі ресурси записуються в C. Я прочитав досить багато книг про алгоритми / структури даних, і жоден не використовувався C. Майже всі вони використовували якусь мову псевдокоду, легко зрозумілу кожному (ну, крім TAOCP, який використовує збірку ... але це вже інша історія)
Bakuriu

Нереальність? Це мало бути вигадкою автокорекції з університету чи це якась школа чорної магії? Я знаю Невидимий університет: [
Мисливець на олень

Відповіді:


31

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

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

(наголос мій)

Ну, операційні системи та мережеві стеки - це два важливі аспекти інформатики, і всі домінуючі операційні системи та стеки в мережі написані значною мірою в C. Якщо ви хочете зрозуміти це, вам слід навчитися C. Так, деяким школам вдається викладати їх ОС-класи на Java, але це як читання Гомера англійською мовою.

Крім того, мова не є такою великою мовою. Якщо ви дійсно хочете вивчити всі аспекти інформатики, вам слід знизати плечима і сказати "мех", "яка ще одна мова?"


Я загалом погоджуюся з цим, хоча для мене "навчання" С означає, що я по суті досить вільно володію мовою, щоб писати на ньому нетривіальні програми без допомоги. Я не впевнений, чи є такий рівень розуміння необхідною умовою для операційних систем та мережевого програмування.
Теластин

3
@Telastyn: це означає, що ти достатньо вільний, щоб зрозуміти і змінити код операційної системи та мережевий код - домени, для яких використовується C, і все. Це не означає, що вам потрібно знати, як писати ігри на C, робити гарні користувальницькі інтерфейси та графічні програми в C, графіці або двигунах машинного інтелекту на C; тому що для кожного іншого домену CS існує інший вибір мови.
rwong

12

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

На сьогодні університети, як правило, використовували системи Unix. Зручно, що це було запрограмовано в C. Можна почати з вивчення C на будь-якій машині, і, врешті-решт, потрапити до вихідного коду Unix в C. Вдома студенти можуть використовувати компілятор C, такий як Borland Turbo C для Windows, або MPW на Mac - він працював скрізь.

Паскаль був іншим варіантом, але це, як правило, мало проблему в тому, що в певний момент програмування просто не вистачало мови, щоб зробити те, що вам потрібно було зробити (програмування ОС на мові Pascal було б болісним).

Деякі з старших шкіл вивчали Фортран, але знову ж таки, це було недостатньо потужною мовою у багатьох випадках, щоб можна було викладати класи CS вищого рівня (теорія AI у фортран? Доцільна, але болісна).

І так, довгий час C був вибором.

Це не єдиний вибір, і зараз існує чимало коледжів, які навчають на інших мовах обмацувати деякі внутрішні та вивчати концепції вищого рівня, не маючи справу з потворністю управління пам’яттю тощо. Деякі вважають, що це добре, деякі вважають, що це погано .


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


Для запису, тренування AI традиційно проводили з компаньйоном з яєчним головою C протягом 70-х та 80-х років, LISP, але відповідь на голову.
jwrush

@jwrush моя відповідь була більшою мірою відповідно до того, що ти можеш займатися вивченням AI і на C, порівняно з іншими мовами того часу (не LISP - і я взяв клас «шпигун» у 90-х для AI). Зрозуміло, MIT (будинок яєць) в той час навчав багато своїх класів у LISP - і це, безумовно, був інший варіант, але не зовсім практичний в інших сферах. Викладаючи, важливо було працювати на одній і тій же основі в кожному класі, щоб не довелося проводити перший тиждень або два, навчаючи учнів іншій мові, спеціалізованій для цього класу.

12

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

Хоча інформатика стосується понять, які можна засвоїти незалежно від будь-якої конкретної мови програмування, є поля, які можуть бути набагато краще зрозуміти, вивчаючи C або вивчаючи це поле за допомогою C.

  • Алгоритми та структури даних. Стандарт C майже нічого з цього не має - наявність цих програм уже реалізована мовою або в її стандартній бібліотеці, як правило, є демотиваційною для студентів: " Чому я повинен турбуватись про реалізацію чогось доступного?"Дивлячись на фрагмент коду С, ви відразу бачите його алгоритмічну вартість, оскільки все в C складається лише з декількох машинних інструкцій. Мови високого рівня (наприклад, Perl або Python) часто використовують розширені структури даних під кришкою легкого синтаксису. Код відчуває себе легко, але це не так. Ви вже потребуєте великої кількості знань, щоб правильно міркувати про алгоритмічну складність цих фрагментів коду. Тому ці мови не так підходять для вивчення алгоритмів та структур даних, і багато програмістів, які завжди жили на мовах високого рівня, як правило, нездатні вирішувати проблеми з виконанням, коли вони стикаються з ними.

  • Операційні системи. Більшість операційних систем написані на C. Як ви хочете зрозуміти створення процесів, не забуваючи ніколи fork? Шар абстракції Java VM тут не допомагає. І просто говорити про це, не створюючи жодного разу процес, ще гірше ... Як ви можете написати таке програмне забезпечення, як Eclipse, яке може перенаправити стандартний висновок в одне з його вікон? Для цього вам потрібно зрозуміти поняття на рівні ОС, і ви можете торкатися їх безпосередньо безпосередньо на C.

  • Непрямий. Ви не можете обійтися C без роботи з покажчиками. Покажчики змушують вас думати на двох рівнях, і це розтягує ваші навички абстракції.

Є також деякі технічні переваги знань C:

  • Міжмовна сумісність. Ви хочете інтегрувати чудовий модуль Ruby у свій проект Python (тут замініть дві довільні мови). Можливо, єдиний спосіб зробити це через C, оскільки обидві мови мають іноземний інтерфейс до C.

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


Я не кажу, що кожну програму слід писати на C. Але C може допомогти вам у знанні, що корисно незалежно від мови, якою ви програмуєте.


Арифметика вказівника має вирішальне значення для розуміння операційних систем, оскільки призводить до того, чому. Наприклад, чому купи та стеки відрізняються, чому віртуальна пам'ять спрацьовує добре чи погано, чому деякі петлі працюють швидше, ніж інші тощо
Michael Shopsin

6

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

TL; DR : На мій погляд, C простий, хороший 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 працює, оскільки кожен оператор має чітко визначену семантику. У С. немає перевантаження.

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. Я вважаю, що цей світ звертається до моїх естетичних почуттів, і я б порадив кожному, хто вважає С своєю наступною ціллю, розглянути ці моменти. Я вважаю, що аргументи щодо операційних систем і того, що краще підтримувати, чітко викладаючи їх, тому що, звичайно, не потрібно розуміти ядра, щоб бути успішним програмістом, але можна знайти ці поля переконливими.


3

Мова програмування, яку ви використовуєте для обговорення науки про обчислення, значною мірою не має значення для завдання вивчення засобів та науки про обчислення.

У (напевно) семінарній роботі з інформатики, мистецтва комп'ютерного програмування не використовується жодна з існуючих мов для інформування теми. Натомість Дональд Кнут вирішив визначити вигаданий комп’ютер та мову вигаданої машини (та пов'язану з ним мову асемблери), в рамках якої він обговорює всі теми.

Ще одна високо оцінена робота з цього питання, «Структура та інтерпретація комп’ютерних програм» , використовувала аналогічний підхід, розробляючи спрощений діалект мови програмування LISP, щоб діяти як власний контекст. Ця мова - це те, що ми зараз знаємо як Схема.

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

Отже, ні, C не потрібен для розуміння інформатики. Важливо ваше розуміння основних понять алгоритмів та їх застосування.


2

Я розпочав кар'єру в програмуванні, вивчивши vb3 з посібників, що постачаються разом з дискетами, з якими він вийшов. Я навчився деякого Java і зміг виробляти якісь респектабельні програми, але це не було, поки я не вивчав С в університеті, я відчував, що справді розумію, що відбувається "під капотом". Зараз я працюю лише з .net і ніколи не переживаю за покажчики, недійсні адреси або переповнення - але я їх розумію, це інформує про рішення, які я приймаю щодня, а деякі старі шкільні речі все ще є в сучасних інтерпретованих мовах, прапорах , трохи розумні операції, булева логіка, всі потужні інструменти та дуже ефективні.

Вивчіть C. Це буде стояти вам добре. Я зберігав копію посібника з програмістами протягом багатьох років і читав Керніган та Річі від обкладинки до обкладинки. Неважливо, на якій мові ви працюєте з Understanding C, безумовно, допоможе.


1

Чи можна вивчити інформатику, не вивчаючи C?

Відповідь - так. Я отримав ступінь CS, і не потрібно було вивчати C, а більше Java. Принаймні, в моїй школі акцент робився на вивченні об’єктно-орієнтованого програмування, дещо було викладено мову мовлення складання, структури даних та дизайн баз даних.


7
Ви впевнені, що ваш ступінь охоплює " всі аспекти" CS?
SK-логіка

Я б сказав усі необхідні аспекти. Жоден ступінь не охоплює всіх аспектів програми навчання. Плюс "все" є суб'єктивним.
PhillyNJ

1
Як ви визначаєте "необхідне"? Все є все - означає, що охоплює всі можливі програми CS. Це не "суб'єктивно", це цілком можна оцінити.
SK-логіка

Я визначаю "необхідне" в контексті того, що CS охоплює вивчення обчислювальної техніки та комп'ютерних технологій, апаратних засобів та програмного забезпечення, а не будь-яку конкретну мову, що відповідає на початкове запитання.
PhillyNJ

Гаразд, і як ви збираєтесь охоплювати обладнання без мов низького рівня? Як ви висвітлите історію мов програмування (що є винятково важливою частиною "всіх" CS) без такої ключової мови? Як ви покриєте семантику мови програмування без хоча б однієї мови з арифметикою вказівника? Так чи інакше, але мова, схожа на C, повинна бути присутнім у будь-якій комплексній навчальній програмі CS.
SK-логіка

0

Це дійсно залежить від того, що ви хочете робити з тим, чого ви навчаєтесь. Безумовно, правда, що багато алгоритмів задано в С або його нащадках. Однак за ці роки я бачив більше прикладів C ++, C # та Java. Навчання CS призначене для загального розуміння обчислень, а отже, як підібрати або створити мову, відповідну для завдання.

Однак, є ще багато людей, у яких перша і остання мова є деякою різницею C або Java, і не всі вони пройдуть навчання для розуміння будь-якої мови, яку надає ступінь CS. Навіть деякі випускники CS мають проблеми з програмуванням. Тому вам може знадобитися досить добре розуміти ті мови, якими ви можете спілкуватися з ними, залежно від вашого кар’єрного шляху. Якщо ви плануєте дотримуватися навчальних закладів, тоді у вас з'явиться ще більше мовних бар'єрів щодо вмісту, особливо в міждисциплінарних областях (де люди використовують prolog, lisp, haskell, matematika тощо)


-1

Якщо ви дійсно збираєтеся вивчити "всі аспекти інформатики" (амбітний план!), Вам доведеться мати справу з декількома різними мовами складання і хоча б однією HDL (і практикувати кодування на рівні netlist в ньому).

І як крок на вищому рівні, щоб підійти до цих справді фундаментальних речей, вам доведеться підібрати щось на зразок С або Паскаль, його неминуче. Пропуск кроків по сходах абстракції контрпродуктивний.

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.