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

от Уикипедия, свободната енциклопедия
(пренасочване от Моно софтуер)
Моно
Информация
РазработчикXamarin (по-рано от Novell, първоначално от Ximian) и Mono общност
Програмен езикC, C#, XML
Операционна системаWindows, OS X, Linux
Платформаx86-64, x86, ARM, MIPS, PowerPC, SPARC, S390, IA-64
Уебсайтwww.mono-project.com

„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 отново било поставено под въпрос.

Текущ статус и roadmap[редактиране | редактиране на кода]

Текущата версия на 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.

Moonlight[редактиране | редактиране на кода]

Имплементация на 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 компоненти[редактиране | редактиране на кода]

Mono се състои от 3 групи от компоненти:

  1. Базови компоненти
  2. Mono/Linux/GNOME блок за развитие
  3. Microsoft блок за съвместимост

Базовите компоненти включват – C# компилатор, виртуалната машина за Common Language Infrastructure и базовите клас библиотеки.

Mono/Linux/GNOME блокът за развитие осигурява инструменти за създаване на апликации при използване на GNOME и безплатни библиотеки с отворен код.

Microsoft блокът за съвместимост осигурява начин за пренасяне Windows .NET апликации към GNU/Linux. 

Framework архитектура[редактиране | редактиране на кода]

Инструмент за кодово изпълнение

  • Code Execution Engine
  • Класови библиотеки
    • Основна класова библиотека
    • .NET клас библиотеки за съвместимост
    • Mono специфични класови библиотеки
      • Cross platform класови библиотеки за Mono и .NET (Gtk#, Mono Cecil, MonoCSharp, Text.Templating)
      • Unix-specific класови библиотеки (POSIX, Filesystem in Userspace (FUSE), curses)
      • Platform-specific класови библиотеки (автоматизации за: Mac, iOS, Android, MeeGo)
  • CLI Assemblies
  • CLI Metadata
  • Common Language Runtime на Mono
    • Съвместим с ECMA Common Language Infrastructure/.NET Common Language Runtime
    • Mono-specific подобрения
      • Mono.SIMD support
      • Mono co-routines и продължения
  • Mono-specific подобрения
  • Native interop services and COM interop
  • Защита – Transparent Code Framework

Code Execution Engine[редактиране | редактиране на кода]

Машинното време на Mono съдържа code execution engine, който превежда ECMA CIL битови кодове в нативен код и поддържа брой процесори: ARM, MIPS (единствено в 32-битов режим), SPARC, PowerPC, S390 (в 64-битов режим), x86, x86-64 и IA-64 за 64-битови режими.

Кодовия генератор е изложен в 3 режима:

  • Just-in-time (JIT) компилация: машинното време ще превърне ECMA CIL битовите кодове в нативни докато кодът се преработва.
  • Ahead-of-time (AOT) компилация: този код превръща ECMA CIL битовите кодове и генерира нативен код, който е запазен в операционна система, архитектура и CPU специфичен файл. Този режим на операция компила повечето от кода, който обикновено се обработва по време на изпълнение. Има изключения като trampolines и друг административен код, който ще се нуждае от Just-in-time, за да работи.
  • Full Static Compilation: този режим е поддържан само от шепа платформи и повежда Ahead-of-time процеса една стъпка напред и генерира всички trampoline-и, wrapper-и и proxy-та, които са необходими в един статичен файл могат да бъдат статично свързани с програма и напълно премахва нуждата за Just-in-time процес по време на работа. Това е използвано в операционните системи на iOS на Apple, Playstation 3 на Sony, Xbox 360 на Microsoft. 

Garbage collector[редактиране | редактиране на кода]

От Моно 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 платформата се отнася главно към тази библиотека от класове.

Пространства за имена и асемблита (Namespaces and assemblies)[редактиране | редактиране на кода]

Namespace-овете са механизъм, с който логически да се групират сходни класове в йерархическа структура. Това предотвратява конфликти в имената. Структурата се прилага като се използват думи, разделени с точка, където най-честия namespace от високо ниво е System, например System.IO и System.Net. Има и други пространства от имена с високо ниво като например Accessibility и Windows. Потребител може да дефинира namespace като поставя елементи в блок за такива.

Асемблитата са физическото опаковане на класовите библиотеки. Това са .dll файловете, точно както и (но да не се бърка със) Wind32 споделените библиотеки. Примери за асемблита са mscorlib.dll, System.dll, System.Data.dll и Accessibility.dll. Namespace-овете са разпространени сред няколко асемблита и едно асембли може да е изградено от много файлове.

Инфраструктурата на общия език (Common Language Infrastructure)[редактиране | редактиране на кода]

Инфраструктурата на общия език или по-известна като 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 като платформа.

Управляван и неуправляван код (Managed and unmanaged code)[редактиране | редактиране на кода]

В чисто .NET/Моно приложение всичкият код е управляван, тоест е движен от стила на управление на памет на CLI и безопасност на thread-овете. Други .NET или Моно приложения могат да използват завещания код, който се определя като неуправляван, като използват System.Runtime.InteropServices библиотеки за да създават С# връзки. Много библиотеки, които се доставят с Моно използват тази особеност на CLI като Gtk#.

Моно-специфични иновации[редактиране | редактиране на кода]

Моно е въвел изменения в някои среди с нови екстеншъни към базовия C# и CLI спецификации:

  • C# компилатор като обслужване (използва C# компилатора като библиотека).
  • C# интерактивна обвивка.
  • SIMD съпорт като част от Mono.SIMD namespace, където извикванията от метод на специални векторни типове са директно свързани с CPU SIMD инструкциите на основния процесор.
  • Пълна статична компилация на .NET код (използвана върху Mono/iPhone, Mono/PS3).
  • Mono Coroutines (използвани за имплементация на микро-трединг код и разширения, най-вече за разработчици на игри).
  • Асембли инжекции за процеси на живо.
  • Използване на LLVM като JIT backend.
  • Cxxi и CppSharp direct interop със C++ код и библиотеки.

Освен това Моно е достъпен на различни операционни системи и архитектури.

Сродни проекти[редактиране | редактиране на кода]

Няколко проекта разширяват Моно и позволяват на разработчика да го използват в своята среда за разработка. Тези проекти включват: Крос-платформа:

  • Banshee Media Player – крос-платформен музикален плейър, направен с Моно и Gtk# и също така драйвър на множество C# библиотеки и проекти за работа с медия.
  • Beagle – система за търсене на Unix системи.
  • Gecko# – binding-и за вграждане на оформящия енджин използван в Mozilla (Gecko).
  • Gtk#, C# събирачи (wrappers) около основните GTK+ и GNOME библиотеки, написани на C и достъпни на Linux, MacOS и Windows.
  • Mono Migration Analyzer (MoMA) – инструмент, който помага на разработчиците на .NET да намерят места в техния код, които може да не са крос-платформени и следователно да не работят в Моно на Linux и други Unix.
  • MvvmCross, крос-платформена Model View ViewModel платформа, използваща Xamarin.iOS и Xamarin.Android за разработка на мобилни приложения.
  • MonoDevelop – open source и крос-платформена Integrated Development Environment, която поддържа разработването на приложения за ASP.NET, Gtk#, Meego, MonoTouch и Silverlight/Moonlight.
  • Moonlight – имплементациа на Silverlight, която използва Mono.
  • Tao – колекция от графики и байндинги за игри (OpenGL, SDL, GLUT, Cg)
  • ServiceStack високо функционираща Open source .NET REST платформа за уеб, която улеснява разработването на XML, JSON и SOAP уеб обслужване.

Mac OS X:

  • Cocoa# – опаковка около родния OS X toolkit (Cocoa) (deprecated).
  • Monobjc – набор от binding-и за OS X програмиране.
  • MonoMac – по-нови binding-и за OS X програмиране, основана на MonoTouch API дизайна.

Мобилни платформи:

  • MonoDroid. Mono за операционната система на Андроид. С binding-и за API-тата на Андроид.
  • MonoTouch. Mono за iPhone, iPad и iPod Touches. С binding-и за API-тата на iOS.
  • Windows:
  • MonoTools for Visual Studio – Visual Studio plugin, който позволява на Windows разработчиците да използват Linux и Mac OS C от Visual Studio и се интегрира със SUSE Studio.

Други имплементации[редактиране | редактиране на кода]

Microsoft има версия на .NET 2.0 налична само за Windows XP, наречена Shared Source CLI (Rotor). Shared source лиценза на Microsoft може да е недостатъчен за нуждите на общността (то експлицитно забранява комерсиалното използване).

MonoDevelop[редактиране | редактиране на кода]

  • Main article: MonoDevelop

MonoDevelop е безплатна GNOME интегрирана среда за разработка, главно направена за C# и други .NET езици като Nemerle, Boo, и Java, макар че също така поддържа езици като C, C++, Python, Java, и Vala. MonoDevelop първоначално е връзка от SharpDevelop към Gtk#, но от тогава се е развил за нуждите на Моно разработчиците. IDE-то включва управление на класовете, вграден help, довършител на кода, Stetic (GUI designer), поддръжка на проекта и интегриран дебъгер. MonoDoc браузъра предоставя достъп до API документацията и образци за код. Браузъра за документация използва управление на съдържанието от уики-стил, позволявайки на разработчиците да добавят и подобряват документацията.

Xamarin.Android[редактиране | редактиране на кода]

Xamarin.Android (познат в миналото като Mono за Android), който в началото е разработен от Novell и впоследствие продължен от Xamarin, е собствена имплементация на Mono за Android-базирани смарт телефони. За първи път беше пуснат на пазара на 6 април 2011 г. Mono за Android беше разработен така че да позволи на разработчиците по-лесно да използват различни платформи при създаването на приложения, които да работят на всички мобилни платформи. В интервю за H-Online, Мигел де Икаса заявява: „Искаме да позволим на разработчиците да преизползват програмната и бизнес логика на кода си за всички миблни плаформи и да им позволим да променят специфичния за дадена платформа програмен интерфейс.“ През август 2010 говорителят на Майкрософт, Том Ханрахан от центъра за технологии с отворен код на Майкрософт, по повод на съдебния иск на Оракъл срещу Гугъл за правата за използване на Java в Android платформите, казва: „Няма да се стигне до действия, подобни на тези, които Oracle предприемат срещу Гугъл заради Java. Ако пътят на .NET към Android минава през Mono това би попаднало под обещанието на Майкрософт да не търси по съдебен ред защита на някои от патентите си, при определени условия. Xamarin.Android се състои от следните компоненти:

  • Mono runtime
  • дизайнер за потребителски интерфейс за Android
  • Библиотеки:
    • основни .NET библиотеки с класове
    • библиотеки, които свързват интерфейса за програмиране в на Android и Java.
  • Инструменти за компилиране, внедряване и дебъгване
  • Интеграция на Xamarin Studio и Visual Studio 2010 за дизайн на потребителския интерфейс, дебъгване и внедряване от разстояние.

Лицензи[редактиране | редактиране на кода]

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 лиценза би възпрепятствал това:

  • Compiler-as-a-Service на Mono
  • Mono interactive Shell
  • C# компилатора за вграждане на Mono
  • Имплементацията за Mono на C# 4.0 dynamic binder
  • Вграденият парсър и абстрактното синтактично дърво на Mono Develop

Mono и патентите на Майкрософт[редактиране | редактиране на кода]

През голяма част от живота на проекта имплментацията на компоненти от .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[редактиране | редактиране на кода]

Много програми с широк спектър на приложение са разработени с интерфейса за програмиране на приложения на 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.

Източници[редактиране | редактиране на кода]

Вижте също[редактиране | редактиране на кода]

  Тази страница частично или изцяло представлява превод на страницата Mono_(software) в Уикипедия на английски. Оригиналният текст, както и този превод, са защитени от Лиценза „Криейтив Комънс – Признание – Споделяне на споделеното“, а за съдържание, създадено преди юни 2009 година – от Лиценза за свободна документация на ГНУ. Прегледайте историята на редакциите на оригиналната страница, както и на преводната страница, за да видите списъка на съавторите. ​

ВАЖНО: Този шаблон се отнася единствено до авторските права върху съдържанието на статията. Добавянето му не отменя изискването да се посочват конкретни източници на твърденията, които да бъдат благонадеждни.​