Моно (софтуер)

„Mono“ е безплатен проект, с отворен код, воден от Xamarin (по-рано воден от Novell и първоначално от Ximian), за да създаде Ecma standard-compliant, набор от инструменти, съвместими с .NET Framework, като C# компилатор, Common Language Runtime и други. Логото на Mono е стилизирано маймунско лице, а mono означава „маймуна“ на испански език.
Обявената цел на Mono не е само да може да стартира приложения на Microsoft .NET междуплатформено, но и да предложи по-добри инструменти за развитие за разработчици на Linux. Mono може да работи на много софтуерни системи, като Android, повечето разделяния на Linux, BSD, OS X, Windows, Solaris и няколко игрови конзоли, като PlayStation 3, Wii и Xbox 360.
Проектът Mono е бил оспорван в общостта на отворения код, защото осъществява части от .NET Framework, които може вече да са покрити от патенти на Microsoft. Въпреки че стандардизирани части от .NET Framework са вече покрити от „Open Specification Promise“ на Microsoft, което е споразумение, гласящо че Microsoft няма да заявява своите патенти срещу изпълнения на своите спецификации под определени условия, други части не са, което означава, че проектът Mono може да бъде мишена на съдебни дела за нарушаване на патент.
Когато Microsoft за пръв път представи своя .NET Framework през юни 2000 г. той е описан като „нова платформа базирана на Интернет стандартите“ и през декември същата година базисният иструмент Common Language Infrastructure е публикуван като отворен стандарт „ECMA-335“, така се отваря възможност за независими имплементации. Miguel de Icaza от Xamarin вярвал, че .NET има потенциала да увеличи продуктивността в областта на програмирането и започнал да проучва дали е възможна Linux версия. След осъзнаването, че техния малък екип не може да създаде и поддържа цял продукт, те публикували Mono с отворен код на 19 юли 2001 г. на O'Reilly конференцията.
След 3 години развитие, Mono 1.0 е публикуван на 30 юни 2004 г. Mono еволюира от първоначалната си цел да бъде платформа за развитие за Linux в това да подкрепя широк обхват от архитектури и операционни системи, както и вградените системи.
След като Novell бива купена от Attachmate през април 2011 г., Attachmate обявява стотици съкращения на работната ръка на Novell и така поставя бъдещето на Mono под въпрос.
На 16 май, Miguel de Icaza съобщава в своя блог, че Mono ще бъде подкрепян от Xamarin – компания, която той създава след напускането си от Novell. Оригиналният екип на Mono също се премстил в друга компания. Компанията Xamarin имала за цел да продължи работата си върху Mono и да напише наново търговските .NET блокове за iOS и Android, защото тогава MonoTouch и Mono за Android все още са били собственост на Novell. След съобщението на Miguel de Icaza бъдещето на Mono отново било поставено под въпрос.
Текущата версия на Mono е 4.0.0 (от май 2015 г.). Тази версия предлага същественото API на .NET Framework и поддръжка за Visual Basic.NET и C# версии 2.0, 3.0 и 4.0. LINQ към обекти, XML и SQL са част от разпределението. C# 6.0 e режимът на работа по подразбиране на C# компилатора.
Целта на Mono е да подкрепя всички функции на .NET 4.5 с изключение на Windows Presentation Foundation, Windows Workflow Foundation, Windows Communication Foundation. Някои от липсващите части на .NET Framework са в процес на разработване в експериментален Mono подпроект, наречен Olive.
Имплементация на Microsoft Silverlight с отворен код, наречена Moonlight е добавена от Mono 1.9. Moonlight 1.0 е публикуван на 20 януари 2009 г. и поддържа Silverlight 1.0 приложно-програмни интерфейси. Moonlight 2.0 поддържа Silverlight 2.0 и някои други приложения на Silverlight 3.0
Moonlight проекта е изоставен на 29 май 2012 г. Според Miguel, причините за това са две: добавянето на изкуствени ограничения от страна на Microsoft и фактът, че проектът не успява да събере достатъчно тракция в интернет.
Mono се състои от 3 групи от компоненти:
Базовите компоненти включват – C# компилатор, виртуалната машина за Common Language Infrastructure и базовите клас библиотеки.
Mono/Linux/GNOME блокът за развитие осигурява инструменти за създаване на апликации при използване на GNOME и безплатни библиотеки с отворен код.
Microsoft блокът за съвместимост осигурява начин за пренасяне Windows .NET апликации към GNU/Linux.
Инструмент за кодово изпълнение
Машинното време на Mono съдържа code execution engine, който превежда ECMA CIL битови кодове в нативен код и поддържа брой процесори: ARM, MIPS (единствено в 32-битов режим), SPARC, PowerPC, S390 (в 64-битов режим), x86, x86-64 и IA-64 за 64-битови режими.
Кодовия генератор е изложен в 3 режима:
От Моно 2.8 насам, Моно е с два garbage collector-а: generational и „Boehm conservative collector“. Garbage collector-a, който е по подразбиране преди Моно 3.1.1 (Boehm-Demers-Weiser Conservative Garbage Collector) има значителни ограничения в сравнение с виртуалната машина на Джава или с runtime-a на .NET платформата. Възможно е да възникне изтичане на памет от някои класове на приложения, заради garbage collector-a, затова може да е неподходящ за сървърни приложения, които протичат дълго време.
От октомври 2010 нов generational garbage collector, наречен Simple Generational GC (SGen-GC) става достъпен като част от Моно, започвайки от Моно 3.1.1, който е по подразбиране. За версии от Моно 2.8 до 3.1.0, потребителите могат да изберат да ползват SGen garbage collector като подадат ключа --gs=sgen към runtime-a на Моно при стартиране. Този нов garbage collector има много предимства пред традиционен консервативен скенър. Той използва generational garbage collection, където новите обекти се разпределят от място, по време на цикъла по събиране на излишни обекти и всички обекти, които са оцелели се преместват към по-старото поколение памет. Идеята е, че много обекти са временни и могат да бъдат бързо събрани, а само част от тях са дългосрочни обекти, които живеят през целия живот на приложението. За да подобри поведението, garbage collector-ът определя места с памет към всеки thread, за да позволи на thread-овете да пренасочат нови парчета памет, без да се налага да се съгласуват с други thread-ове. Преместването на нови обекти към старите се случва като се копират данните от старото място към новото „поколенческо“ място и се обновят всички указатели, които са сочили към данните, да сочат към новото място. Това може да е скъпо за големи обекти, затова SGen-a на Моно използва отделно място с памет за големи обекти (Large Object Section) и използва алгоритъма маркирай и изчисти (mark-and-sweep algorithm) за тези обекти.
Sgen се отнася със стака и регистрите консервативно и маркира всички обекти, които могат да бъдат отнесени към някои от тези корени. Предстоящата версия на Моно сканира управлявания стек точно, намалявайки броя на маркираните обекти.
Класовата библиотека доставя обширен набор от удобства за разработка на приложения. Те са написани предимно на С#, но поради общата езикова спецификация (Common Language Specification) могат да бъдат използвани от всеки .NET език. Класовата библиотека е структурирана в пространства за имена (namespace) и разположени в споделени библиотеки, познати като асемблита. .NET платформата се отнася главно към тази библиотека от класове.
Namespace-овете са механизъм, с който логически да се групират сходни класове в йерархическа структура. Това предотвратява конфликти в имената. Структурата се прилага като се използват думи, разделени с точка, където най-честия namespace от високо ниво е System, например System.IO и System.Net. Има и други пространства от имена с високо ниво като например Accessibility и Windows. Потребител може да дефинира namespace като поставя елементи в блок за такива.
Асемблитата са физическото опаковане на класовите библиотеки. Това са .dll файловете, точно както и (но да не се бърка със) Wind32 споделените библиотеки. Примери за асемблита са mscorlib.dll, System.dll, System.Data.dll и Accessibility.dll. Namespace-овете са разпространени сред няколко асемблита и едно асембли може да е изградено от много файлове.
Инфраструктурата на общия език или по-известна като Common Language Runtime се прилага от Моно изпълнителя (Mono executable). Runtime-ът се използва за изпълнение на компилирани .NET приложения. Common Language Infrastructure се дефинира от ECMA стандарта. За да стартира приложение трябва да се извика runtime-a със съответните параметри.
Спецификацията на общия език (CLS) е уточнена в част 6 на ECMA-35 и дефинира интерфейса към CLI като конвенция като основните типове за Enum. Моно компилатора генерира изображение, което съответства на CLS. Това е Common Intermediate Language. Моно runtime-ът взима това изображение и го стартира. ECMA стандартът формално дефинира библиотека, която съответства на CLS като платформа.
В чисто .NET/Моно приложение всичкият код е управляван, тоест е движен от стила на управление на памет на CLI и безопасност на thread-овете. Други .NET или Моно приложения могат да използват завещания код, който се определя като неуправляван, като използват System.Runtime.InteropServices библиотеки за да създават С# връзки. Много библиотеки, които се доставят с Моно използват тази особеност на CLI като Gtk#.
Моно е въвел изменения в някои среди с нови екстеншъни към базовия C# и CLI спецификации:
Освен това Моно е достъпен на различни операционни системи и архитектури.
Няколко проекта разширяват Моно и позволяват на разработчика да го използват в своята среда за разработка. Тези проекти включват: Крос-платформа:
Mac OS X:
Мобилни платформи:
Microsoft има версия на .NET 2.0 налична само за Windows XP, наречена Shared Source CLI (Rotor). Shared source лиценза на Microsoft може да е недостатъчен за нуждите на общността (то експлицитно забранява комерсиалното използване).
MonoDevelop е безплатна GNOME интегрирана среда за разработка, главно направена за C# и други .NET езици като Nemerle, Boo, и Java, макар че също така поддържа езици като C, C++, Python, Java, и Vala. MonoDevelop първоначално е връзка от SharpDevelop към Gtk#, но оттогава се е развил за нуждите на Моно разработчиците. IDE-то включва управление на класовете, вграден help, довършител на кода, Stetic (GUI designer), поддръжка на проекта и интегриран дебъгер. MonoDoc браузъра предоставя достъп до API документацията и образци за код. Браузъра за документация използва управление на съдържанието от уики-стил, позволявайки на разработчиците да добавят и подобряват документацията.
Xamarin.Android (познат в миналото като Mono за Android), който в началото е разработен от Novell и впоследствие продължен от Xamarin, е собствена имплементация на Mono за Android-базирани смарт телефони. За първи път беше пуснат на пазара на 6 април 2011 г. Mono за Android беше разработен така че да позволи на разработчиците по-лесно да използват различни платформи при създаването на приложения, които да работят на всички мобилни платформи. В интервю за H-Online, Мигел де Икаса заявява: „Искаме да позволим на разработчиците да преизползват програмната и бизнес логика на кода си за всички миблни плаформи и да им позволим да променят специфичния за дадена платформа програмен интерфейс.“ През август 2010 говорителят на Майкрософт, Том Ханрахан от центъра за технологии с отворен код на Майкрософт, по повод на съдебния иск на Оракъл срещу Гугъл за правата за използване на Java в Android платформите, казва: „Няма да се стигне до действия, подобни на тези, които Oracle предприемат срещу Гугъл заради Java. Ако пътят на .NET към Android минава през Mono това би попаднало под обещанието на Майкрософт да не търси по съдебен ред защита на някои от патентите си, при определени условия. Xamarin.Android се състои от следните компоненти:
Xamarin лицензира Mono под два различни лиценза, подобно на други продукти като Qt и Mozilla Application Suite. Компилатора за С# на Mono и инструментите са лицензирани под обновения общ лиценз на GNU General Public License (GPLv2)(от версия 2 натам сорс кода на компилатора за C# на Mono също така ще бъдедостъпен и под MIT X11 лиценз), работните библиотеки са лицензирани по GNU Lesser General Public License (LGPLv2), а библиотеките с класове са лицензирани по MIT License. Тези лицензи са за безплатен софтуер и лицензи за софтуер с отворен код и от това следва, че Mono е безплатен софтуер с отворен код.
Лиценза на компилатора за C# е променен от GNU General Public License към MIT X11, за да позволи преизползването на кода на компилатора в някои случаи, когато GPL лиценза би възпрепятствал това:
През голяма част от живота на проекта имплментацията на компоненти от .NET, които не са стандартизирани от Ecma International, е повод за притеснения заради възможни нарушения на патентни права. По-специално се дискутира въпроса дали Майкрософт би могъл със съдебни искове за патенти да унищожи проекта Mono. През юни 2009 Техническият борд на Ubuntu заяви, че не виждат причина да изключат Mono или приложения базирани на него от архивите или от съдържанието на инсталационния пакет.
Основните технологии предадени за стандартизиране на Ecma International и съответно всички компоненти специфични за Unix/GNOME се считат за безопасни, защото Майкрософт изрично поставя стандартите ECMA 334 и ECMA 335 в резолюцията да не търси по съдебен ред защита на някои от патентите си, при определени условия. Притесненията са основно по повод на допълнителни технологии, разработени от Майкрософт като ASP.NET, ADO.NET и Windows Forms, които всъщност са компонентите за съвместимостта на Mono с Windows. Тези технологии не са напълно имплементирани в Mono не са от изключителна важност за разработване на Mono приложения, налични са за удобство на разработчиците, които се нуждаят от пълна съвместимост на Mono със системата Windows.
В случай на възникване на патентни искове, политиката за справяне с тях е следната: Да се работи около патентно защитения обект като се използва различна имплементация, която променя механизмите, без да променя програмния интерфейс. Ако това е невъзможно, тогава трябва да се премахне съответният код и да се намери вече съществуващо техническо решение, което би направило въпросния патент безполезен.
Освен това Mono е включен в списъка на софтуерните програми, които Мрежата за свободни изобретения / Open Invention Network / се е ангажирала да защитава.
На 6 юли 2009 Microsoft обявява, че включва спецификации ECMA 334 и ECMA 335 в обхвата на Обещанието на Майкрософт да не търси по съдебен ред защита на някои от патентите си, като се ангажират да не търсят по съдебен ред правата си върху тези патенти, ако те бъдат имплементирани, дистрибутирани или се използват алтернативни имплементации на .NET средата. Въпреки това, позицията им относно не-ЕСМА компонентите като ASP.NET, ADO.NET, и Windows Forms (които са ябълката на раздора) остава неизяснена.
Ричард Столман / Richard Stallman / от Фондацията за безплатен софтуер /Free Software Foundation/ заявява през юни 2009, че: „Трябва да обезкуражи хората да пишат програми на С#. Затова не трябва да включваме имплементации на С# в основния пакет на GNU/Linux дистрибуциите или в GNOME" През 2007 Брет Смит /, Brett Smith/ от същата фондация заявява, че: „Патентите на Майкрософт са много по-опасни: това е единствената софтуерна компания, кояо се е обявила за враг на GNU/Linux и е заявила намерението си да атакува общността ни с патентни искове“, „C# представлява уникална заплаха за нас“ и „Обещанието на Майкрософт да не търси по съдебен ред защита на някои от патентите си не променя това по никакъв начин“.
Лидерът на проекта Федора, Пол Фийлдс, заявява „Имаме сериозни притеснения около проекта Mono и ще продължим да го разглеждаме заедно с правните ни съветници, дали има нужда да предприемем някакви действия „и все пак „Не сне намерили правно заключение, което да е достатъчно, за да ни накара да прекратим проекта Mono“.
През ноември 2011 на редовната онлайн среща на разработчиците на Ubuntu, самите разработчици гласуват базираният на C# Banshee media player да бъде премахнат от основните инсталации на Ububtu считано от версия 12.04 натам. Въпреки че посочените причини включват проблеми с производителността на ARM архитектурите, блокиране на проблеми при трета версия на GTK+, и това, че според тях поддръжката му не е достатъчно добра. Появиха се и спекулации, че решението е повлияно от желание да се премахне Mono от основната дистрибуция, тъй като и други програми като gBrainy и Tomboy, които зависят от Mono, също предстои да бъдат премахнати. Разработчикът на Mono Джоузеф Майкъл Шиилдс / Joseph Michael Shields/ защитава представянето на Banshee върху АRM архитектурите и също така оценява твърденията, че програмата не се поддържа добре, като насочени персонално към един от основните сътрудници на проекта.
Много програми с широк спектър на приложение са разработени с интерфейса за програмиране на приложения на Mono (API) и C#. Някои от пограмите за Linux Desktop включват Banshee, Beagle, Docky, F-Spot, Gbrainy, GNOME Do, MonoTorrent, Pinta, и Tomboy.
Виртуалния сървър симулиращ реалността в играта OpenSimulator, скриптовите езици на редица видео игри като The Sims 3 и Second Life, или игри базирани на Unity или MonoGame също използват Mono.