Я могу сделать все в C, который могут сделать C++ и C# и Java? [закрытый]

11
задан Sahat Yalkabov 2 June 2010 в 23:36
поделиться

15 ответов

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

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

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

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

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

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

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

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

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

29
ответ дан 3 December 2019 в 00:37
поделиться

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

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

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

1
ответ дан 3 December 2019 в 00:37
поделиться

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

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

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

1
ответ дан 3 December 2019 в 00:37
поделиться

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

Для вас, безусловно, будет выгодно выучить более одного [программирования] языков. Овладейте хотя бы парочкой из них. Тогда вы сможете легко читать код, написанный на другом языке, и при этом понимать его суть.

1
ответ дан 3 December 2019 в 00:37
поделиться

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

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

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

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

3
ответ дан 3 December 2019 в 00:37
поделиться

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

3
ответ дан 3 December 2019 в 00:37
поделиться

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

Да и нет.

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

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

6
ответ дан 3 December 2019 в 00:37
поделиться

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

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

5
ответ дан 3 December 2019 в 00:37
поделиться

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

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

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

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

7
ответ дан 3 December 2019 в 00:37
поделиться

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

5
ответ дан 3 December 2019 в 00:37
поделиться

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

35
ответ дан 3 December 2019 в 00:37
поделиться

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

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

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

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

3
ответ дан 3 December 2019 в 00:37
поделиться

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

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

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

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

1
ответ дан 3 December 2019 в 00:37
поделиться

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

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

]
2
ответ дан 3 December 2019 в 00:37
поделиться

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

 Можно ли написать на языке программирования C все, что

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

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

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

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

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

 Хорошо, основная причина, по которой я спрашиваю, заключается в том, что я не хочу привязываться к

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

2
ответ дан 3 December 2019 в 00:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: