2009-04-02 4 views
3

Недавно я разговаривал с моим другом, который начал класс C++ пару месяцев назад (его первое знакомство с программированием). Мы вообще познакомились с темой C# и .NET, и он сказал мне, что он «обречен» на все распространенные проблемы (низкоскоростные, прерывистые байт-коды и т. Д.). Я согласился с ним по всем этим вопросам, но я сдержался, сказав, что это было обречено, только потому, что я чувствовал, что со временем такие языки, как C#, могли бы стать родным кодом (если бы Microsoft предпочла изменить реализацию .NET с байт-код, среда выполнения JIT для компиляции непосредственно на собственный код, такой как ваша программа на C++).Может ли управляемый код (особенно .NET) когда-либо стать «неуправляемым»?

Мой вопрос: я здесь на обед? Я имею в виду, что это может занять много работы (и может сломать слишком много вещей), но нет какого-то магического барьера, который не позволяет скомпилировать код C# изначально (если он захочет сделать это), правильно? Было время, когда C++ считался языком очень высокого уровня (который он по-прежнему есть, но не так сильно, как в прошлом), но теперь он является основой (наряду с C) для собственных API-интерфейсов Microsoft. Идея, что .NET в один прекрасный день может быть на том же уровне, что и C++ в этом отношении, кажется только вопросом времени и усилий для меня, а не фундаментальным недостатком в дизайне языка.

EDIT: Я должен добавить, что если возможна встроенная компиляция .NET, почему Microsoft не хочет идти по этому маршруту? Почему они выбрали путь к байт-коду JIT?

ответ

28

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

Идея о том, что C# медленно, смехотворна. Некоторые из компонентов winforms медленны, но если вы знаете, что вы делаете, C# сам является очень быстрым языком. В этот день и в любом случае это вообще сводится к алгоритму; выбор языка не поможет вам, если вы реализуете плохой вид пузыря. Если C# помогает вам использовать более эффективные алгоритмы с более высокого уровня (и, по моему опыту, как правило, это делает), который превзойдет любые другие проблемы с частотой.

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

C# скомпилирован в IL. Этот ИЛ распространяется на локальные машины. Пользователь запускает программу, и эта программа затем скомпилирована JIT на собственный код для этого аппарата после. В следующий раз, когда пользователь запускает программу на этом компьютере, у них запущено полностью родное приложение. Существует также оптимизатор JIT, который может немного мутить, но это общая картина.

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


Что касается декомпиляции:

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

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

Если вас больше беспокоит ваше приложение, появившееся на сайтах warez, вы еще более ошибаетесь. Так или иначе, он появится там. Гораздо лучшая стратегия - engage those users.


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

+0

Я всегда получаю немного смешок от людей, которые не имеют понятия, насколько далеки друг от друга C# и Java. – Samuel

+0

RE: второй абзац - хорошо сказано sir – annakata

+0

Но почему я могу все еще бросать .NET-программы в .NET Reflector и получать из него исходный код? Точка, факт остается фактом, что декомпиляция остается риском. Да, C++ тоже декомпилябелен, но уровень сложности - это миры друг от друга, и я думаю, именно поэтому вы не увидите .NET Photoshop. – GRB

0

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

1

Вы полагаете, что тот факт, что C# управляемый код является дефектом дизайна?

+0

Не столько Управляемая часть, но больше байткода части. (Постоянная) уязвимость к простой декомпиляции (даже с обфускацией), по-видимому, является огромным препятствием для будущего потребления крупными производителями программного обеспечения. – GRB

+0

будущее потребление ....? настоящее потребление кажется довольно значительным. – andleer

+0

Вы действительно должны прекратить использовать термин байт-код. Это не относится к C#. И декомпиляция является проблемой для всех языков, лучшая защита - это патенты и лицензии. – Samuel

0

Это наверняка может, но настоящий вопрос - почему? Я имею в виду, конечно, это может быть медленным (er), но в большинстве случаев любые существенные различия в производительности сводятся к проблемам проектирования (неправильные алгоритмы, конфликты потоков, ресурсы hogging и т. Д.), А не проблемы с языком. Что касается «прерывистого» байт-кода, на самом деле это не представляет большой интерес для большинства компаний, учитывая ставки усыновления.

В чем дело, что это лучший инструмент для работы? Для некоторых это C++; для других - Java; для других, C# или Python, или Erlang.

1

C# может быть изначально скомпилирован с использованием такого инструмента, как NGEN, а команда MONO (open source .net framework) разработала полную компиляцию AOT (раньше времени), которая позволяет C# работать на IPhone. Однако полная компиляция кропотлива, потому что она разрушает кросс-платформенную совместимость, и некоторые оптимизации для конкретной машины не могут быть выполнены. Тем не менее, важно также отметить, что .net не является интерпретированным языком, а JIT (как раз вовремя) скомпилировал язык, что означает, что он запускается изначально на машине.

1

чувака, FYI, вы всегда можете скомпилировать C# сборки в нативное изображение с помощью ngen.exe

и вы предлагаете .net испорчено дизайн? это был .net, который вернул ms обратно в игру со своего дерьмового vb 5, vb 6, com days. это была одна из их самых больших ставок

java делает то же самое - так вы предлагаете java тоже является ошибкой?

рег. крупные вендоры - обратите внимание, что .net был чрезвычайно успешным среди компаний всех размеров (кроме тех парней с открытым исходным кодом - ничего плохого в этом). все эти компании внесли значительные инвестиции в инфраструктуру .net.

и сравнить скорость C# C++ - это сумасшедшая идея по мне. C++ дает u управляемую среду наряду с мощной инфраструктурой мирового класса?

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

его не о C++ в/с C#, удалось в/с неуправляемым. оба одинаково хороши и одинаково сильны в своих собственных областях

0

Doomed? Из-за предполагаемых проблем с производительностью? Как насчет сравнения цены:

  • часа программиста
  • аппаратных компонентов

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

Как насчет сравнения проблем обслуживания при попытке найти утечки памяти в коде на C++ по сравнению с кодом C# с мусором?

«Аппаратная Дешево, Программисты Дорого»: http://www.codinghorror.com/blog/archives/001198.html

+0

Это было его слово, а не mine;) – GRB

+0

Ну, вы можете процитировать меня в следующий раз, когда вы поговорите с ним;) –

Смежные вопросы