Никогда раньше не работал с .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: Перенесено из 'Философия программирования'