Архитектура C : насколько она похожа на машинную архитектуру

#c# #c #architecture

#c# #c #архитектура

Вопрос:

Итак, все, на чем я когда-либо программировал, — это C , и я часто вижу, как люди упоминают, что причина, по которой C быстр, заключается в том, что он так похож на машинный код. Мне интересно, что именно представляет собой архитектура машинного / C кода, почему сходство делает ее быстрее и как она сравнивается с другими архитектурами, такими как C #.

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

Диаграммы или указатели на статьи по этому вопросу были бы великолепны!

Ответ №1:

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

С другой стороны, языки «более высокого уровня», такие как C # (или Java, Ruby, Python, Perl, Haskell, Scheme и т. Д.), Имеют более или менее существенную базовую систему поддержки времени выполнения. Для некоторых языков это означает, что назначение может сначала включать поиск чего-либо в таблице; для других это может означать, что назначение иногда представляет собой простое копирование или сложную обработку данных в других случаях, в зависимости от типа данных. Гораздо сложнее предсказать, как ваши утверждения будут переведены в машинный код.

C находится в интересной промежуточной позиции: некоторые назначения похожи на назначения C; другие на самом деле являются перегруженными вызовами operator=() , и вы никогда не знаете, что получите (без тщательного изучения, конечно.) У C есть система выполнения; это просто намного легчечем для Ruby, Haskell или Scheme.

Комментарии:

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

Ответ №2:

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

Ответ №3:

Эволюция языков программирования показывает, что чем больше у вас удобства в программировании, тем больше компромиссов в производительности вам нужно заплатить за это. Для большинства начинающих программистов Java определенно более дружелюбна к ним, чем c или c . (управление памятью, заголовочные файлы, контейнеры и т. Д.). C или C быстрее, чем Java, потому что они компилируются в машинный код, который можно загружать и запускать напрямую.Но для java вы можете знать о JRE, которая является средой выполнения для кода Java, поскольку код Java компилируется в некоторый код, понятный только виртуальной машине Java (который написан на c с небольшой сборкой).The .Net framework для C # — это как JRE для Java. Эта разница в производительности может иметь большое значение в некоторых бизнесах, ориентированных на производительность, но для большинства приложений это едва заметно. Надеюсь, это объясняет!