Отличия между С# и С++

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

Язык С#
Исходный код С# компилируется в так называемый управляемый код (managed code). Как вам, возможно, уже известно, управляемый код представляет собой код на промежуточном языке IL (Intermediate Language), который находится посредине между высокоуровневым языком (С#) и языком более низкого уровня (ассемблером/машинным кодом). Во время выполнения среда CLR (Common Language Runtime — общеязыковая исполняющая среда) на лету компилирует код IL в машинный код, применяя для этого оперативную компиляцию (Just In Time — JIT).

Как и любое проектное решение, эта техника имеет свои достоинства и недостатки. Очевидным недостатком может показаться неэффективность компиляции кода во время выполнения. Этот процесс отличается от интерпретации, которая обычно применяется в языках сценариев вроде Perl и JScript.

Компилятор JIT не компилирует функцию или метод при каждом его вызове; он делает это только первый раз, при этом продуцируя машинный код, родной по отношению к платформе, на которой он выполняется. Очевидное достоинство компиляции JIT — сокращение рабочего множества приложения, поскольку “отпечаток памяти” промежуточного кода существенно меньше.

Во время выполнения приложения компилируется лишь тот код, который необходим. Например, если приложение содержит код вывода на печать, который никогда не требуется, если пользователь не печатает документ, то компилятор JIT никогда его и не скомпилирует. Более того, CLR может оптимизировать выполнение программы на лету. Например, CLR может определить способ сокращения “непопаданий” на страницу памяти в диспетчере памяти, реорганизуя скомпилированный код в памяти, и все это он делает во время выполнения. Если сложить вместе все недостатки, то можно обнаружить, что для большинства приложений достоинства такого подхода перевешивают.

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

Язык С++
В отличие от С#, код С++ традиционно компилируется в родной (native) код. Родной код — это машинный код, используемый процессором, для которого скомпилирована программа. Для простоты предположим, что мы говорим о скомпилированном в машинный код С++, а не об управляемом С++, который обеспечивает C++/CLI. Если вы хотите, чтобы родное приложение С++ работало на разных платформах — 32- и 64-разрядных, — его понадобится скомпилировать по отдельности для каждой из них. Родной двоичный код, полученный на выходе компилятора, обычно не совместим между платформами.

С другой стороны, промежуточный язык IL совместим между платформами, поскольку он, наряду с общей инфраструктурой языка (Common Language Infrastructure — СП), на которой построена CLR, определен международным стандартом. Этот стандарт быстро завоевывает признание и уже реализован вне платформы Microsoft Windows.

В стандарт CLI входит также файловый формат РЕ (Portable Executable — переносимый исполняемый модуль) для управляемых модулей. Таким образом, в действительности можно скомпилировать программу С# на платформе Windows, а выполнять и на Windows, и на Linux, причем без перекомпиляции, поскольку даже формат файлов является стандартизованным.

Степень переносимости чрезвычайно удобна и всегда занимала умы и сердца проектировщиков COM/DCOM в прежние дни, но по разным причинам не была достигнута в нужной мере между разными платформами.

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

Вы можете следить за любыми ответами на эту запись через RSS 2.0 ленту. Вы можете оставить ответ, или trackback с вашего собственного сайта.

Оставьте отзыв

XHTML: Вы можете использовать следующие теги: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

 
Rambler's Top100