2010-06-02 1 views
10

Можно ли написать на языке программирования C все, что вы могли бы написать на других языках, таких как Java, C# или C++. Если это так, почему в наши дни школы не учат C вместо Java?Могу ли я сделать все на C, что C++ и C# и Java могут делать?

Хорошо, основная причина, по которой я прошу, заключается в том, что я не хочу привязываться к одному языку программирования и платформе (.NET и C# или Obj-C и Cocoa). Возможно, я запутываю язык программирования с каркасом? Если бы кто-нибудь мог прояснить все это для меня, я бы, конечно, проголосовал за ваш ответ.

+0

В моей школе есть курсы, в которых я уверен, что Java, C, C++, Matlab и Scheme. Я бы не удивился, если бы некоторые курсы не использовали другие языки. Итак, что это такое в школах, преподающих только Java? – Donnie

+0

Можете ли вы определить, что вы называете «может делать» для опубликованных языков программирования? – YeenFei

+0

@ Donnie Да, школы учат все виды языков, но Java, как правило, представляет собой уровень интро для программирования. Это то, что нужно большинству людей, чтобы удовлетворить требования к степени компьютерной науки. По крайней мере, так оно и есть в моем колледже. –

ответ

26

Можно ли написать на языке программирования C все, что вы могли бы написать на других языках, таких как Java, C# или C++.

В основном. (Не отвлекайтесь на полноту Тьюринга, это красная селедка.) Есть два набора вещей, которые трудно сделать в C:

  • Управление памяти. В Java и C# вы просто выделяете объекты, система вычисляет, когда они больше не нужны, и память перерабатывается. В C и C++ вам приходится беспокоиться об управлении памятью самостоятельно. (У вас есть возможность libgc сборщик мусора Hans Boehm, но многие программисты C не хотят совершить его, и некоторые люди сообщали о трудностях получения его на работу.) Код

  • повторного использования через наследование и полиморфизм в безопасный тип. Вы можете принудительно использовать повторное использование в C путем разумного использования указателей и указателей функций void *, но вы теряете преимущества проверки типа компиляции. Вы только не можете получить те же гарантии, что и с шаблонами C++ или Java generics. Это гарантия времени компиляции, а не временная гарантия, и полнота Тьюринга не имеет отношения к этому аргументу.

Почему не школы в эти дни учат C вместо Java?

(некоторые школы продолжают учить C, и почти все школы предлагают что-то в С.) Для обучения, основные преимущества Java над C является то, что

  • Вы никогда не должны беспокоиться об управлении памятью. Это важно, потому что понимание данных, распределенных по кучам, и когда звонить по телефону free, довольно сложно для большинства студентов. (Ад, это трудно для многих выпускников.)

  • Это гораздо, гораздо легче писать полиморфный код с использованием дженериков; C не имеет ничего сопоставимого с дженериками, проверенными типом Java. И повторное использование через полиморфизм является очень важной концепцией в программировании.

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

+7

Я не согласен с «не отвлекайтесь на завершающую полноту»; на фундаментальном уровне любой завершающий язык turing может делать все, что угодно, кроме любого завершающего полного языка языка, если оба компилируются в машинный код. Остальное просто придирается к функциям. Если вопрос не связан с тем, что нужно перебирать черты ... – RCIX

+0

@ blwy10: Почему «не включая C»? C++ не подразумевает C каким-либо образом. Просто потому, что C++ делает совместимость C с обратной совместимостью, главная особенность не означает, что хороший программист на C - хороший программист на C++ или наоборот. –

+0

@billy: Собственно, быть очень честным. Я не помню, почему я написал это ... Я отредактирую его. Это звучит странно. Спасибо, что указали! – blwy10

5

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

+8

Ну, у C нет исключений;) – nall

+2

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

+0

@nall, fyi C имеет исключение. – YeenFei

35

Любой язык, который является Turing Complete, т.е. C, C++, Java или C#, могут вычислять все, что можно вычислить.

+0

@Eli Courtwright: Спасибо :) –

+22

Go, brainf ** k! – naiad

+20

Как говорит @Vuntic, этот ответ строго верен, но не очень полезен. Есть много вещей, для которых мы используем языки программирования, которые не являются вычислениями. Например, вы не можете написать драйвер устройства на языке, единственной концепцией ввода-вывода является stdin/stdout, а не потому, что ему не хватает мощности Turing, а потому, что вы не можете связать его соответствующим образом. – Amadan

5

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

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

+1

Спасибо, что очистил мою дискуссию «Java» против «C» для учебных целей :) –

+4

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

+2

Я думаю, что не совсем понятно, почему Java является преобладающим языком обучения. Lisp, Perl и Python (среди прочего) имели задолго до того, как появилась Java. –

7

Возможно, вы, возможно, «достигнете» той же функциональности, используя только язык C при разработке приложения, но усилия, требуемые против более современных объектно-ориентированных языков, вероятно, будут значительно выше. Все в конечном итоге скомпилируется до машинного языка. Кроме того, способность писать приложения с использованием шаблонов проектирования, вероятно, значительно уменьшается с использованием языка C.

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

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

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

+9

«Кроме того, возможность писать приложения с использованием шаблонов проектирования, вероятно, значительно уменьшается с использованием языка C». Ба. Объектно-ориентированный! = Организованный. У вас может быть один без другого (в обоих направлениях). –

+0

Вы, кажется, намекаете на то, что C не имеет яркого сообщества с открытым исходным кодом. Я отсылаю вас к Linux ... и 16.8% от Sourceforge (Java имеет 25.4%, C++ 20.5%). Источник: http://holycall.tistory.com/entry/SourceForge-Programming-Languages-Statistics – Stephen

+0

@Stephen: эти показатели с 2008 года. Я не думаю, что они больше актуальны. Кроме того, OP говорил больше о C в отличие от C++. –

5

Можно ли написать на языке программирования C все, что вы могли бы написать на других языках, таких как Java, C# или C++.

Да и нет.

Да, в теории: Потому что с помощью C, вы можете написать Java, C# и C++ компиляторов и запуска среды времени (а затем написать что-нибудь, что вы можете писать на Java, C# и C++)

Нет, на практике: поскольку Java, C# и C++ уже имеют библиотеки времени выполнения, которые не существуют и не легко могут быть вызваны из C; и потому, что Java, C# и C++ предоставляют множество высокоуровневых функций (например, для управления памятью и ООП), которые упрощают программирование ...и если вы программируете на пределе своих возможностей, то язык, который упрощает программирование, означает, что вы можете делать с ним что-то, что вы не могли бы сделать иначе.

3

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

+0

Что вы подразумеваете под 'абстракциями'? –

3

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

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

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

Редактировать: Я забыл упомянуть C++. Вы можете думать об этом как о компромиссе между двумя мирами, но лично я бы держался подальше от него, если возможно. Это уродливо, если не использовать с особой осторожностью. Большинство проблем лучше всего обслуживает либо прямой C, либо что-то более дружелюбное, как Python или C#.

+0

-1 для того, что сказано о C++. –

+0

@Billy ONeal: Да, это замечание было явно заброшено - когда C++ * * используется с особой осторожностью, он в любом случае уродлив. Разумеется, очень мощный и полезный язык, но синтаксис, который может любить только мать. –

+0

@camccann: Да. Синтаксис настолько уродлив, что он был скопирован большинством других основных языков программирования, в том числе C#, Java и PHP. (Хорошо, у вас могут быть Python и Ruby ...) –

3

Да, теоретически вы можете, если только определенные ограничения не препятствуют этому (удачи, написав веб-приложение J2EE на C).

Однако, существует больше выбора языка, чем какой-либо конкретный язык возможно. Существует также то, что он делает легко и что он делает для вас. Возьмите сборку мусора, например. Существуют сборщики мусора (такие как Boehm's) для C и C++, но Java и C# предоставляют единицу времени выполнения и построены вокруг того, что они доступны. Бывают случаи, когда вы не хотите сборщика мусора, но для большинства приложений хорошая сборка мусора означает, что есть целый класс проблем, о которых программисту больше не нужно беспокоиться. И это означает, что больше их драгоценного внимания и времени можно потратить на решение реальной проблемы.

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

Так что, хотя вы можете делать почти все на C, есть веские причины не делать этого, и студенты могут извлечь выгоду из возможности писать полезные программы, не беспокоясь о мелочах ручного управления памятью. Разумеется, они должны сделать некоторое время C в своем образовании, чтобы они лучше понимали, что делает их программа на Java или C# под капотом (и, следовательно, лучше прогнозировать и понимать ее производительность и т. Д.), Но легкость во многих делах на языках более высокого уровня дает им большую пользу как для обучения, так и для практики.

1

Языки программирования - это просто инструменты, которые мы используем для связи с машинами.

Как художник будет использовать инструменты (кисти и молотки и камеры), чтобы создавать различные произведения искусства (картины, скульптуры, обрамленные картины). Это зависит от художника много раз. Посмотрите на наши классические произведения искусства, есть много новых кистей и размеров, а также текстуры и всевозможные STUFF, но лионардо ди Винчи нуждаются в них для создания шедевров?

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

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

1

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

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

2

«Без хорошей библиотеки, наиболее интересные задачи трудно сделать в C++, но дали хорошую библиотеку, практически любая задача может быть легко.» - Бьярне Страуструп, цитата из POCO

Я думаю, что для большинства языков, библиотеки/фреймворки для того, что языки имеют большее значение, чтобы сделать какие-либо реальные работы. И бывает, что современные языки, как правило, имеют организованные и сплоченные библиотеки и рамки, которые упрощают их использование. Это больше о том, как легко вы делаете что-то, а не то, что эти языки can do от себя.

+0

Я частично согласен с этим. Хорошим примером является PHP - на мой взгляд, дизайн PHP плохой. Однако он имеет лучшую документацию, которую я видел для языка программирования, и имеет богатый и отличный набор libs/встроенных модулей. – Cam

1

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

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

Когда я узнал об объектно-ориентированном анализе и дизайне, мне был предоставлен выбор C++, Java, C#, Python или любого другого объектно-ориентированного языка программирования, который был доступен на университетских компьютерах для программирования. Чтобы я мог показывать свои код скомпилирован и работал по мере необходимости.

+1

«... преподавайте самые популярные языки ... подходящие для большинства рекламных объявлений ...» ** Звук, который вы слышите, является плачем учителя. ** –

+0

@Norman Ramsey: Успокойтесь, что у вас есть роскошь скорбеть, мой друг; но для тех из нас, кто должен жить в этом мире, увидев, что еще возможно, у нас нет слез, оставшихся для пролить. –

1

Нет, по крайней мере, с практической точки зрения. Рассмотрим один пример - Java на веб-серверах.

В теории вы, вероятно, могли бы сделать то же самое с кодом CGI, написанным на C, как это обычно делается на серверах с использованием Java. Фактически, многие интернет-провайдеры не позволят вам использовать их, даже если вы можете их написать, и вам придется (по крайней мере) перекомпилировать их для использования на разных платформах. Хуже того, если вы используете Java, вы можете легко найти фреймворки для обработки множества довольно сложных задач (например, cookie и persistence), по крайней мере, достаточно хорошо, но с C вам почти наверняка придется реализовать все это самостоятельно.

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

2

Мне нравятся вопросы, которые вы задаете как студент.

Is it possible to write in C programming language everything that 

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

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

В то время я видел замечательное сходство между тем, что я считал «лучшей практикой» в процессуальном мире и тем, что OO делало для нас. Моя предпосылка заключалась в том, что, хотя OO настоятельно рекомендует нам делать некоторые вещи элегантно и разумно, в процедурных языках, таких как C, у нас есть возможность применить равную элегантность, если мы просто знаем, как правильно использовать вещи.

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

Конечно, другое дело в том, что, хотя вы практически, практически, можете добиться практически любого (коммерческого) результата с использованием какого-либо языка/структуры, некоторые из них предлагают значительные преимущества по производительности над другими. Просто потому, что вы можете это сделать, необязательно означает, что вы захотите, если вам придется потратить дополнительный месяц, чтобы создать код рамки, который вы можете просто вызвать в другой среде.

Ok the main reason why I am asking is because I don't want to tie down to 

один язык программирования и платформы (.NET и C# или Obj-C и какао). Возможно, я запутываю язык программирования с каркасом? Если бы кто-нибудь мог прояснить все это за меня, я бы наверняка проголосовал за ваш ответ .

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

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

Тот же вопрос может быть применен к фреймворкам.

Есть два ответа на этот вопрос за мои деньги.

Во-первых, я займусь этим с точки зрения развития вашего умения.

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

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

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

Во-вторых, я займусь этим с точки зрения роста вашей карьеры.

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

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

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

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

Наконец, я просто скажу, что у OO есть много преимуществ по сравнению с процедурными, нет вопроса о том, какой из них является лучшим способом программирования для меня. Но не забывайте о функциональности - этот стиль программирования становится все более актуальным и начинает превращаться в коммерческий мир после длительного пребывания в академических кругах. Ознакомьтесь с некоторыми недавними обсуждениями и презентациями Андерса. Вы получите представление о том, как он будет «соответствовать», а не «заменить» императивные языки программирования.

Смежные вопросы