Могу ли я делать все на C, что С++ и С# и Java могут делать?

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

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

Ответ 1

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

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

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

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

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

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

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

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

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

Ответ 2

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

Ответ 3

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

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

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

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

Ответ 4

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

Ответ 5

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

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

Ответ 6

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

Да и нет.

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

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

Ответ 7

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

Ответ 8

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

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

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

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

Ответ 9

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

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

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

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

Ответ 10

"Без хорошей библиотеки наиболее интересные задачи трудно сделать на С++; но при наличии хорошей библиотеки практически любая задача может быть упрощена". - Bjarne Stroustrup, цитируемый POCO

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

Ответ 11

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

Is it possible to write in C programming language everything that

вы можете писать на других языках таких как Java, С# или С++. Если это случай, почему в наши дни школы нет преподавать 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 и С# или Obj-C и Cocoa). Возможно, я запутываю язык программирования с каркасом? Если кто-нибудь может прояснить все это для меня, я бы, конечно, проголосовал за вас Ответ.

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

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

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

На мои деньги есть два ответа.

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

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

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

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

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

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

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

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

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

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

Ответ 12

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

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

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

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

Ответ 13

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

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

Ответ 14

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

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

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

Ответ 15

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

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

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