Компонентность .NET шита белыми нитками
От: Сергей Губанов Россия http://sergey-gubanov.livejournal.com/
Дата: 02.12.04 09:12
Оценка: +1 -8 :))) :))) :))) :))) :))) :))) :))) :))) :))) :))) :))) :)
Никогда раньше не работал с .NET, но слышал что она является компонентной/модульной. Вчера решил проверить так ли это на самом деле. Основным принципом модульной расширяемой системы является то, что она состоит из динамически {загружаемых, выгружаемых, линкуемых} модулей, причем каждый модуль может быть загружен и слинкован с остальными модулями, естественно, только один раз (зачем в модульной системе загружать и линковать 2 экземпляра одного и того же модуля???); а также то что она обладает одним единственным сборщиком мусора на всю систему.
Например, модуль M1:
MODULE M1

VAR X*: INTEGER;

END M1.

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

В .NET это не так!
Каждый якобы модуль системы .NET (будем писать его в кавычках: "модуль"), оказывается вовсе не является модулем всей системы .NET. А он является модулем лишь каждого конкретного приложения которое его импортировало. Сколько приложений импортировало этот "модуль" столько экземпляров его и будет создано.

Вот пример:
Исходный код "модуля" M1.dll:
namespace M1
{
    public class Var
    {
        public static int X;
    }
}

Исходный код "модуля" A1.exe:
namespace A1
{
    class Program
    {
        static void Main(string[] args)
        {
            M1.Var.X++;
            System.Console.WriteLine("M1.Var.X = {0}", M1.Var.X);
            System.Console.ReadLine();
        }
    }
}

Исходный код "модуля" A2.exe:
namespace A2
{
    class Program
    {
        static void Main(string[] args)
        {
            M1.Var.X++;
            System.Console.WriteLine("M1.Var.X = {0}", M1.Var.X);
            System.Console.ReadLine();
        }
    }
}

Скомпилировал M1.dll, A1.exe, A2.exe и положил их троих в один и тот же каталог. Запустил A1.exe и A2.exe, каждый из них вывел один и тот же ответ M1.Var.X = 1. То есть каждый из "модулей" A1 и A2 работает со своим экземпляром "модуля" M1, а вовсе не с одним единственным как это должно быть в модульной расширяемой системе.





Выводы
1) Сама .NET не является модульной системой. Модульной системой является каждое конкретное .NET приложение, в рамках которого модули загружены/слинкованы в единственном экземпляре.

2) Вот вам и объяснение того почему минимальные .NET приложения типа "Здравствуй Мир!" используют так много памяти (3.8 мегабайтов для минимального консольного и 8 мегабайтов для минимального оконного) — они просто содержат в себе копии всех системных/библиотечных модулей, чего не было бы если бы сама .NET была модульной! А что если системные/библиотечные модули будут требовать не 4-8 мегабайтов, а 100-200 мегабайтов? Расширяемой модульной системе это безразлично, так как она каждый модуль загружает лишь однажды, а .NET создаст их столько раз сколько приложений их использует!

3) Раз так, то, думается, что и сборщик мусора присутсвует в .NET не в единственном экземпляре (как это должно быть в модульной расширяемой системе), а опять же, во множественном.


11.12.04 02:01: Перенесено из 'Философия программирования'
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.