С Новым годом! Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.78/32: Рейтинг темы: голосов - 32, средняя оценка - 4.78
deja_woo

Разница между С# и С++

24.06.2009, 18:05. Показов 6567. Ответов 16
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Привет всем,

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

Заранее Благодарен..
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
24.06.2009, 18:05
Ответы с готовыми решениями:

Какая разница между различными сокетами (например, между 775 и 1155)?
Обясните пожалуйста какая разница между сокетами, пример есть сокет 775 и 1155 я понимаю что разем не тот процессора другие но! как насчет...

Разница между != и <=
Здравствуйте! Писал программу с использованием QuickSort и заинтересовала такая вещь: void quickSort(int arr, int left, int right) { ...

Разница между
Разница между gameObject и GameObject?

16
5 / 5 / 1
Регистрация: 01.10.2008
Сообщений: 85
24.06.2009, 22:51
(дочитай до конца, это правда ответ на твой вопрос)
Новая фишка Microsoft - .NET Framework. Это такая... хм... виртуальная машина что ли... Ну, вообще-то это просто набор стандартов, но если по-печному, это такая среда для исполнения программ, написаных на языке CIL (Common Intermediate Language). CIL - не язык вроде С++ или Паскаля, это такой машинный код, с тем лишь отличием, что машины, которая могла бы исполнять этот код, в природе не существует. Есть только _спецификация_, как должна работать эта машина. Есть спецификация на набор инструкций этого кода. Есть много всяких спецификаций вокруг этого всего.
Основная фишка вот в чем: CIL - язык _объектный_. То есть, если в процессорах x86, к примеру, есть команды типа сложить два числа, записать что-то в память и т.п., то в CIL есть прямо инструкции типа 'вызвать метод объекта'. Или: 'создать новый объект'. И в таком духе.
Дальше - больше. Как же исполнять такие программы, если аппаратного обеспечения для них нет и, скорее всего, не будет? А очень просто: надо их перед исполнением перевести в 'настоящий' машинный код (типа 'докомпилировать'). Причем вот что интересно: компиляция эта делается не программистом (типа как обычная компиляция из исходного кода), а самой операционной системой, причем прямо на лету. Запустил ты программу - а она на CIL написана. Операционная система это быстренько просекла, и рррраз - скомпилила обычный exe-шничек, сложила его в специальный кеш, и уже потом выполнила. Разумеется, такая бодяга происходит не каждый раз, а только однажды. А потом уже готовый скомпилированный код из того самого кеша берется.
Называется такая фигня гордо: 'двухфазная компиляция'. Или еще: 'Пи-код'. Или 'байт-код'. Или еще как-нибудь... Идею вообще-то придумал еще Вирт.

Нафиг огород городить, спросите вы? Плюсов тут до фига, и вот главные из них:
1) Многоплатформенность. Сам код на CIL не привязан к конкретному процессору или операционной системе, следовательно, если написать такой вот 'докомпилятор' (называется, кстати, JIT-компилятор, от Just In Time) для, к примеру, UNIX'а, то можно эти программы и на UNIX'е выполнять. И на чем угодно - хоть на кофеварке!
2) Оптимизация. Не секрет, что разные процессоры (да и разные ОС) заточены под разные нужды. Для разного аппаратного обеспечения эффективно применять разные техники генерации кода. Хорошие компиляторы (хороший пример - интеловские С-компиляторы) очень хорошо осведомлены об особенностях платформы и умеют генерировать офигительно эффективный код. Да вот беда: если программу скомпилировать под третий пень, она на нем просто летать будет, зато на пне первом даже медленно не пойдет - вообще не запустится. Приходится компилировать под самый старый процессор, теряя преимущества новых. А что же наши программки на CIL? А тут все как раз схвачено: коли мы программу 'докомпилируем' на каждом компьютере отдельно, то можно и оптимизировать _именно под этот данный конкретный компьютер_, со всеми его аппаратными и программными частями, все равно на другой компьютер скомпилированный код никогда не попадет. А то, что язык очень высокоуровневый (см. выше) дает гораздо больше возможностей для оптимизации.
3) Межъязыковое взаимодействие. Так как CIL - язык высокоуровневый (например, есть инструкция типа 'вызвать метод объекта'), программы, написанные на разных языках, но скомпилированные в CIL, могут прекрасно друг друга понимать: ведь исчезла специфика реализации хранения данных и вызова функций в разных компиляторах. Теперь вызов функции компилируется не в простыню машинного кода, который к тому же получается разный в разных компиляторах, а в одну инструкцию - 'вызов функции'. И на чем бы ни был написан исходный код, CIL-программа в результате
1
Novichek
29.06.2009, 12:41
To Name_fa:
Спасибо за исчерпывающее объяснение.
Еще один маленьлий вопросик.
Допустим у меня установлен .NET и я разрабатываю в нем программы. После компиляции и первого запуска моя программа компилируется в оптимальный машинный код моей платформы. Если я хочу этот машинный код запустить на другом ПК, нужен ли .NET?
86 / 62 / 69
Регистрация: 15.03.2007
Сообщений: 6,903
30.06.2009, 12:42
2Novichek:
Компиляция в машинный код происходит 'на лету' при каждом запуске программы. Этого можно избежать воспользовавшись утилитой ngen, создающей образ программы в машиином коде. Однако полученный образ не является обычным исполняемым файлом Windows и при попытке запуска выдает сообщение об ошибке. Так что перенести этот исполняемый файл на другую платформу не получится.
0
5 / 5 / 1
Регистрация: 01.10.2008
Сообщений: 85
30.06.2009, 13:03
2bazil:

НЕТ, НЕ КАЖДЫЙ РАЗ!!! (сколько уже можно повторять?!), а только при первом запуске. Или если файл с кодом изменился с момента последней компиляции.

2Novichek:

Нет, не сможете, если только вы не крутой хакер. Дело в том, что в результате компиляции не получается полноценного исполняемого модуля. Даже более того: методы объектов компилируются отдельно, по мере надобности. И если какой-то метод никогда не вызывался, то он никогда и не будет скомпилирован.
Теоретически, поскольку получается все равно машинный код, его можно оттуда достать и заставить запускаться. Но это только если вы (как я уже писал) крутой хакер. Но даже в этом случае аналогичной процедуре придется подвергнуть все используемые библиотеки, а их даже в простенькой программе используется немало.
0
86 / 62 / 69
Регистрация: 15.03.2007
Сообщений: 6,903
30.06.2009, 13:17
2Name_fa:

А ты не повторяй, а просто покажи где ты такое прочитал?

Я уже пару дней пытаюсь хоть в одной статье на MSDN найти фразу где говорится что JIT компиляция делается только один раз и вместо этого нахожу только фразы где говорится что это делается каждый раз. И именно поэтому и нужна утилита ngen.
0
86 / 62 / 69
Регистрация: 15.03.2007
Сообщений: 6,903
30.06.2009, 13:26
2Name_fa:

Прочитай то что сам пишешь:

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

Вышеописанное поведение это как раз признак комиляции 'на лету' заново при каждом запуске.
0
Пернатый
30.06.2009, 13:40
To bazile:
Я тоже долго не мог 'врубиться' в эту загадочную компиляцию 'на лету'.
На http://www.gotdotnet.ru/ есть несколько неплохих статейек, проясняющих картину. (Архитектура .NET (обзор), Microsoft .NET Framework FAQ)
Напр. пишут:

Перед выполнением, MSIL преобразуется в машинный код. Он не интерпретируется.

или

Перед тем, как выполнять управляемый код CLR должен сначала скомпилировать управляемые MSIL инструкции в инструкции процессора. Здесь возникает типичная проблема: когда пользователь запускает программу, он не намерен ждать пока вся программа скомпилируется, тем более, что большинство функций программы не будут вызваны. Поэтому CLR, компилирует MSIL код в инструкции процессора, когда функции непосредственно вызваны. Всякий раз, когда такая функция вызывается в будущем, сразу выполняется машинный код (а компилятор уже не вовлекается в процесс).
Пернатый
30.06.2009, 13:47
To Novichek:
на том же http://www.gotdotnet.ru есть статья '.NET - Проблема распространения приложений', подробно описывающая данную проблему.
86 / 62 / 69
Регистрация: 15.03.2007
Сообщений: 6,903
30.06.2009, 13:53
2Пернатый:

Что я не понял из ответа так это за какую точку зрения ты выступаешь?
То что JIT-компиляция происходит один раз или наоборот при каждом запуске?

> Перед выполнением, MSIL преобразуется в
> машинный код. Он не интерпретируется
> ...
> Перед тем, как выполнять управляемый код CLR должен
> сначала скомпилировать управляемые MSIL инструкции в инструкции
> процессора.
Само собой. Я никогда не пытался утверждать обратного

> Здесь возникает типичная проблема: когда пользователь
> запускает программу, он не намерен ждать пока вся
> программа скомпилируется, тем более, что большинство
> функций программы не будут вызваны. Поэтому CLR, компилирует
> MSIL код в инструкции процессора, когда функции непосредственно
> вызваны. Всякий раз, когда такая функция вызывается в будущем,
> сразу выполняется машинный код (а компилятор уже
> не вовлекается в процесс).
Все правильно. И так при каждом новом запуске программы. JIT-компиляция происхожит в динамически выделямых областях памяти из-за чего для отладки и профилирования .NET приложений существует отдельный набор API функций.
0
5 / 5 / 1
Регистрация: 01.10.2008
Сообщений: 85
30.06.2009, 14:37
Компиляция-то в памяти происходит, а скомпилированный образ складывается в кеш на диске.
А то, что методы компилируются отдельно, вовсе не означает, что каждый раз заново. Просто каждый метод компилируется один раз при первом его вызове, а потом складывается в кеш. При последующих вызовах он просто берется из кеша (если он еще не в памяти)
0
86 / 62 / 69
Регистрация: 15.03.2007
Сообщений: 6,903
30.06.2009, 15:24
2Name_fa
Еще раз прошу - скажи где ты такое прочитал?
Я понял твою точку зрения и считаю что ты заблуждаешься. Подверди свои слова доказательствами.

В свою очередь привожу выдержку из статьи 'Performance Considerations for Run-Time Technologies in the .NET Framework' с сайта MSDN.
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dndotnet/html/dotnetperftechs.asp

When Does Code Get JITed?
Here is the path your code goes through when it is executed:

1. Your program is loaded, and a function table is initialized with pointers referencing the IL.

2. The Main method is JITed into native code, which is then run. Calls to functions get compiled into indirect function calls through the table.

3. When another method is called, the run time looks at the table to see if it points into JITed code.

a. If it has (perhaps it has been called from another call site, or has been precompiled), the control flow continues.

b. If not, the method is JITed and the table is updated.

4. As they are called, more and more methods are compiled into native code, and more entries in the table point into the growing pool of x86 instructions.

5. As the program runs, the JIT is called less and less often until everything is compiled.

6. A method is not JITed until it is called, and then it is never JITed again during the execution of the program. You only pay for what you use.
0
Пернатый
30.06.2009, 21:05
To basile:
Полностью согласен. Программа хранится в MSIL-коде и при каждом запуске компилирутся JIT-ом в PE-подобный код.
Альтернативы уже упоминались: 'ngen.exe' или 'install-time code generation mode'
Вообще это неплохо описано на MSDN: Compiling MSIL to Native Code
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpguide/html/cpconjitcompilation.asp
5 / 5 / 1
Регистрация: 01.10.2008
Сообщений: 85
01.07.2009, 12:21
Там нигде не написано, что это происходит каждый раз.
Честно скажу: я не могу привести никаких доказательств, поскольку мой источник - устная беседа с компетентными лицами, а также экспериментальные данные. Однако я продолжаю настаивать на своей точке зрения.
0
Пернатый
01.07.2009, 13:00
To Name_fa:

попробуем пойти от обратного.
Допустим, что программа после первого запуска откомпилировалась и сохранилась в чистом машинном коде на диске. Тогда ее невозможно будет просмотреть ILDASM-ом.
Попробуйте.

Вы правы, что у .NET есть кэш на диске (так называемый native image cache). И Вы абсолютно правы, что когда программа запускается, откомпилированные ее части сохраняются в этом кэше и по при надобности не компилируются заново, а берутся в готовом виде из него.
Можно 'поселить' откопилированный образ программы самостоятельно в кэш, воспользовавшись Native Image Generator (Ngen.exe). С его же помощью можно посмотреть текущее содержимое кэша ngen.exe /show.
0 / 0 / 0
Регистрация: 03.05.2009
Сообщений: 7
01.07.2009, 13:59
да там же ясно написано... программное ядро компилируется один раз, а остальные функции как бы 'подключаются'(компилятся) на лету. Если программа изменяется, то он опять перекомпилирует !ядро!, но не функцию, ибо они всегда компилятся при просьбе ядра ('то есть кликнул, а в ответ тишина' вовсе не значит что прога фигня, просто функция глючит или старый комп =))

ВоПРОС ко всем, кто-нибудь знает проект о разносе мелкомягкой заразы на Юних или Солярис
0
5 / 5 / 1
Регистрация: 01.10.2008
Сообщений: 85
01.07.2009, 14:24
>> Тогда ее невозможно будет просмотреть ILDASM-ом.

Почему же невозможно? Сам-то IL-код при этом никуда не девается.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
01.07.2009, 14:24
Помогаю со студенческими работами здесь

Разница между С и С++
Если не брать во внимание объекты и классы, то разница состоит только лишь в cin, cout и директивах?

Разница между 64 и 32
Здравствуйте, уважаемые эксперты, недавно на ноутбуке умер жесткий диск, в сервсисе его сменили, и поставили виндоус 7 хоум премиум....

Разница между v1.1 и v2.0
Доброго времени суток, появилась потребность обновить прошивку биоса. Ища прошивку на сайте производителя появился вопрос какова разница...

Разница между for in / for of
подскажите пожалуйста, почему последний цикл не вывел &quot;hello&quot;? let arr = ; arr.foo = &quot;hello&quot;; for (let i in arr) { ...

Разница между 0 и 00 ?
Как заставить программу различать 0 и 00 (ноль и два ноля, как в рулетке)? Вариант с заменой 00 на какое-то число не подходит, так как...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути
Programma_Boinc 01.01.2026
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути Сочетание глобально распределённой вычислительной мощности и инновационных. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru