.NET : Насочване към времето за изпълнение

Започвам да чета задълбочено за .NET framework и нейното Common Language Runtime. Чета общ преглед на .NET от Microsoft и съм не съм сигурен какво има предвид това твърдение.

Кодът, който е насочен към времето за изпълнение, е известен като управляван код, докато кодът, който не е насочен към времето за изпълнение, е известен като неуправляван код.

Как се насочвате към Common Language Runtime? Знам, че е по подразбиране при разработване във Visual Studio, но как бихте насочили конкретно към CLR?

Какъв код при разработване на .NET приложение няма да е насочен към CLR и поради това да се нарича неуправляван код?


person contactmatt    schedule 29.05.2010    source източник
comment
Ако въпросите ми нямат смисъл, моля обяснете :)   -  person contactmatt    schedule 29.05.2010


Отговори (3)


Насочването към времето за изпълнение означава компилиране за времето за изпълнение, което е, наред с други неща, извеждане на CIL, известен още като MSIL (за разлика от машинния код x86/x64/и т.н.).

Казването, че всичко, което не е насочено към времето за изпълнение, е „неуправляем код“, е малко фалшива дихотомия. Кодът, изпълняван на JVM например, може да се управлява, но мисля, че можем да приемем в този контекст изречението да означава „неуправляван [от CLR]“.

Би било възможно да се напише C# компилатор, който може да излъже собствен код и да не е насочен към времето за изпълнение (въпреки че вероятно ще имате нужда от някакво време за изпълнение поне за GC), и е също толкова възможно да напишете C компилатор, който изплю CIL. В този пример хипотетичният C# компилатор няма да е насочен към времето за изпълнение, но хипотетичният C компилатор ще бъде. Важното разграничение тук е отделянето на езика от неговата цел.

.NET приложение, което не е насочено към времето за изпълнение, би било противоречие. Ако не беше насочено към времето за изпълнение, нямаше да е .NET приложение.

Въпреки това може да стане по-размито с unsafe и P/Invoke. Когато използвате функционалност като P/Invoke или COM взаимодействие, в крайна сметка се насочвате към времето за изпълнение и допълнително към някои други неща. Това обаче не означава, че сте спрели да се насочвате към времето за изпълнение, а просто означава, че имате допълнителни зависимости извън времето за изпълнение. Следенето на този вид неща е причината неща като CLSCompliantAttribute съществуват.

person Logan Capaldo    schedule 29.05.2010
comment
Възможно ли е да напишете приложение във Visual Studio, което не е насочено към CLR? Доколкото знам, дори писането на визуално c++ приложение е насочено към CLR. - person contactmatt; 29.05.2010
comment
Сигурен. Настройката на версията за това коя версия на CLR да се насочи към C++ проекти е нещо като случайност на потребителския интерфейс, ако не използвате /clr, тези настройки нямат никакъв ефект върху изхода и exe или dll и т.н. нямат зависимост от CLR. - person Logan Capaldo; 29.05.2010

Целият код, който работи в .NET framework, е управляван код. Пример за неуправляем код е C++, той се нарича неуправляван или естествен код.

person Puppy    schedule 29.05.2010
comment
Така че, ако разработите C++ приложение в .NET framework, неговият все още управляван код? - person contactmatt; 29.05.2010
comment
да, има нещо, наречено Managed C++, което генерира .NET IL код. Повечето хора го избягват за нещо различно от оперативна съвместимост. - person Dave Markle; 29.05.2010
comment
Да, има C++/CLI, който се управлява. Но, доколкото ми е известно, той е почти неизползван и преобладаващата част от C++ е компилиран като роден. - person Puppy; 29.05.2010
comment
Така че само за пояснение, ако пишете визуално C++ приложение, то се управлява? В MSDN намерих това, докато Ако използвате Microsoft® Visual C++® .NET, можете да пишете управляван код с помощта на Visual C++, който предоставя предимствата на управлявана среда за изпълнение, както и достъп до мощни възможности и изразителни типове данни, които вие са запознати с. - person contactmatt; 29.05.2010
comment
@DeadMG, какво точно означава изявлението, компилиране в естествен код? Какво означава нативният код в този контекст? - person contactmatt; 29.05.2010
comment

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

Ако някои елементи се търсят по-често от други, малък кеш може да бъде полезен. Например, ако прилагате операция lookup() за файлова система (където данните в крайна сметка се съхраняват някъде на диск), кешът може да помогне изключително много.

Можете ли изобщо да сортирате/пресеете данните, така че най-често търсените елементи да са близо до началото на масива?

Практично ли е да съхранявате данните си в два комплекта? Едната е сортирана, едната е несортирана? Сортирани, трябва да можете да търсите бързо вашия артикул. Ако не бъде намерен, отидете до вашия несортиран списък и търсете линейно през него. Защо? Въпреки че казахте, че не е практично да се вмъква след всяко вмъкване, практично/ефективно ли е периодично да се вмъква от несортирания списък в сортирания?

Трябва ли всичко да е в един несортиран масив? Можете ли да поставите данните си в блокове от сортирани данни? Тоест може да имате 1000 сортирани записа на блок. Търсенето на всеки сортиран блок може да бъде по-бързо от търсенето в целия несортиран списък.

Само няколко идеи. Те може да не са приложими за вашата ситуация, но се надяваме да са полезни.

- person Puppy; 29.05.2010

Това е размит термин, означава "конфигуриране на инструментите за изграждане за генериране на двоично изображение, което е съвместимо с управляваното време за изпълнение". Изпълним файл, който може да изпълнява управляван код, следва стандартния файлов формат PE32. Познати ви като EXE и DLL файлове. Такова двоично изображение се нарича "сглобяване" на езика .NET. Форматът му е добре документиран в този стандартен документ на Ecma.

Повечето масово използвани инструменти за изграждане са много специфични за създаване на управлявани модули. Като csc.exe и vbc.exe, съответно C# и VB.NET компилаторите. Някои инструменти могат да генерират и двете и трябва да се изпълняват с правилните опции на командния ред, за да получите желания краен резултат. Подобно на cl.exe и link.exe, компилаторът и линкерът за C/C++ с вградена поддръжка за езика C++/CLI. Те могат също да създават сборки, които съдържат комбинация от управляван IL и машинен код.

Особено последните два инструмента не са толкова лесни за използване за насочване към управляваното време за изпълнение. Работата на IDE и системата за компилиране, включена в Visual Studio, е да го улеснят.

person Hans Passant    schedule 29.05.2010
comment
Уау, добра находка в документа на стойката на ECMA +1 - person contactmatt; 29.05.2010