Oxygene (programovací jazyk) - Oxygene (programming language)
![]() | Tento článek má několik problémů. Prosím pomozte zlepšit to nebo diskutovat o těchto otázkách na internetu diskusní stránka. (Zjistěte, jak a kdy tyto zprávy ze šablony odebrat) (Zjistěte, jak a kdy odstranit tuto zprávu šablony)
|
![]() | |
Vývojář | Software RemObjects |
---|---|
Poprvé se objevil | 2005[1] |
Plošina | Společná jazyková infrastruktura, Jáva, Kakao, CPU-Native, Windows 32/64 bit, Linux 32/64 bit, WebAssembly |
Licence | Zkušební verze |
webová stránka | elementscompiler |
Ovlivněno | |
Delphi je Objekt Pascal, C# |
Oxygen (dříve známý jako Chrome) je programovací jazyk vyvinutý uživatelem Software RemObjects pro Microsoft Společná jazyková infrastruktura, Jáva Platforma a Kakao. Kyslík na bázi Delphi je Objekt Pascal, ale má také vlivy od C#, Eiffelova, Jáva, F# a další jazyky.
Ve srovnání s nyní zastaralými Delphi.NET „Oxygene nezdůrazňuje úplnou zpětnou kompatibilitu, ale je navržen tak, aby se stal„ novým objevem “jazyka, byl dobrým občanem platforem řízeného vývoje a využil všechny funkce a technologie poskytované .SÍŤ a Java runtime.
Oxygene je komerční produkt a nabízí plnou integraci do Microsoft je Vizuální studio IDE ve Windows, stejně jako jeho vlastní IDE, oheň pro použití na Operační Systém Mac. Kompilátor příkazového řádku je k dispozici zdarma. Oxygen je jedním ze čtyř jazyků podporovaných základním jazykem Kompilátor prvků řetězec nástrojů, vedle C#, Rychlý a Jáva).
V letech 2008 až 2012 společnost RemObjects Software poskytla licenci na svou kompilátor a technologii IDE Embarcadero které mají být použity v jejich Embarcadero Prism produkt.[2] Od podzimu 2011 byl Oxygene k dispozici ve dvou samostatných edicích, přičemž druhé vydání přidávalo podporu pro běhové prostředí Java a Android. Počínaje vydáním XE4 již Embarcadero Prism není součástí SKU RAD Studio. Pro migraci na Oxygene existuje řada cest podpory a upgradů pro zákazníky Prism.[3] Od roku 2016 existuje pouze jedno vydání Oxygene, které umožňuje vývoj ve Windows nebo macOS a které může vytvářet spustitelné soubory pro Windows, Linux, WebAssembly .NET, iOS, Android, Java a macOS.
Jazyk
Jazyk Oxygene má svůj původ v Object Pascal obecně a zejména v Delphi, ale byl navržen tak, aby odrážel pokyny pro programování .NET a vytvořil sestavy plně kompatibilní s CLR. Proto byly některé vedlejší jazykové funkce známé z Object Pascal / Delphi zrušeny nebo revidovány, zatímco do jazyka byla přidána spousta nových a modernějších funkcí, jako jsou Generics nebo Sequences and Queries.
Oxygen je objektově orientovaný jazyk, což znamená, že k navrhování programů používá třídy, které mohou obsahovat data a spouštět kód.[je zapotřebí objasnění ] Třídy jsou „prototypy“ pro objekty, stejně jako myšlenka na jablko je prototypem jablka, které si můžete skutečně koupit v obchodě. Je známo, že jablko má barvu a že ji lze oloupat: to jsou data a spustitelný „kód“ pro třídu apple.
Oxygene poskytuje podporu některých funkcí paralelního programování na jazykové úrovni. Cílem je použít všechna jádra nebo procesory počítače ke zlepšení výkonu. K dosažení tohoto cíle je třeba úkoly rozdělit mezi několik vláken. The .NET Framework je ThreadPool
třída nabídla způsob, jak efektivně pracovat s několika vlákny. The Knihovna paralelních úloh (TPL) byl představen v .NET 4.0, aby poskytoval více funkcí pro paralelní programování.
Operátoři mohou být v kyslíku přetíženi pomocí operátor třídy
syntax:
třída operátor implicitní(i : Celé číslo) : Moje třída;
Všimněte si, že pro přetížení operátora každý operátor má název, který musí být použit v syntaxi přetížení operátoru, protože například „+“ by nebyl platný název metody v Oxygene.[4]
Struktura programu
Oxygene nepoužívá „jednotky“ jako Delphi, ale používá organizované a seskupené typy jmenných prostorů .NET. Obor názvů může zahrnovat více souborů (a sestav), ale jeden soubor může obsahovat pouze typy jednoho oboru názvů. Tento jmenný prostor je definován na samém vrcholu souboru:
jmenný prostor ConsoleApplication1;
Soubory kyslíku jsou rozděleny na rozhraní a implementační část, což je struktura známá z Delphi. Sekce rozhraní následuje deklaraci oboru názvů. Obsahuje používá
klauzule, která v Oxygene importuje typy z jiných jmenných prostorů:
používá Systém.Linq;
Importované obory názvů musí být v samotném projektu nebo v odkazovaných sestavách. Na rozdíl od C # nelze v Oxygenu definovat aliasy pro jmenné prostory, pouze pro názvy jednotlivých typů (viz níže).
V návaznosti na používá
klauzule soubor obsahuje deklarace typů, jako jsou známy z Delphi:
rozhranítyp ConsoleApp = třída veřejnost třída metoda Hlavní; konec;
Stejně jako v C # je Main metoda vstupním bodem pro každý program. Může mít parametr args: Array of String
pro předávání argumentů příkazového řádku do programu.
Lze deklarovat více typů bez opakování typ
klíčové slovo.
Implementace deklarovaných metod je umístěna v implementační části:
implementacetřída metoda ConsoleApp.Hlavní;začít // zde přidejte svůj vlastní kód Řídicí panel.WriteLine('Ahoj světe.');konec;konec.
Soubory jsou vždy ukončeny konec.
Typy
Jako jazyk .NET používá Oxygene systém typů .NET: Existují typy hodnot (například struktury) a referenční typy (například pole nebo třídy).
Ačkoli nezavádí vlastní „předdefinované“ typy, nabízí Oxygene pro některé z nich „pascalish“ obecná jména,[5] takže například System.Int32
lze použít jako Celé číslo
a Booleovský
(System.Boolean
), Char
(System.Char
), Nemovitý
(System.Double
) připojte se také k rodině pascal-typenames. Strukturální charakter těchto typů, který je součástí .NET, je plně zachován.
Stejně jako ve všech jazycích .NET mají typy Oxygene viditelnost. V Oxygenu je výchozí viditelnost shromáždění
, což je ekvivalentní s vnitřní
viditelnost v C #. Další možná viditelnost typu je veřejnost
.
typ Moje třída = veřejnost třídakonec;
Viditelnost lze nastavit pro každý definovaný typ (třídy, rozhraní, záznamy, ...).
Alias name can be defined for types, which can be used locally or in other Oxygene assemblies.
typ IntList = veřejnost Seznam<Celé číslo>; // viditelné v jiných sestavách s kyslíkem SecretEnumerable = IEnumerable<Tětiva>; // není viditelný v jiných sestavách
Aliasy veřejného typu nebudou viditelné pro jiné jazyky.
Evidence
Záznamy jsou tím, co se strukturám .NET říká v Oxygene. Jsou deklarovány stejně jako třídy, ale s záznam
klíčové slovo:
typ MyRecord = záznam metoda Foo; konec;
Jelikož jsou to jen struktury .NET, záznamy mohou obsahovat pole, metody a vlastnosti, ale nemají dědičnost a nemohou implementovat rozhraní.
Rozhraní
Rozhraní jsou ve světě .NET velmi důležitým konceptem, samotný rámec je velmi využívá. Rozhraní jsou specifikace malé sady metod, vlastností a událostí, které musí třída implementovat při implementaci rozhraní. Například rozhraní IEnumerable
specifikuje GetEnumerator
metoda, která se používá k iteraci přes sekvence.
Rozhraní jsou deklarována stejně jako třídy:
typ MyInterface = veřejnost rozhraní metoda Udělej to tak : IEnumerable; vlastnictví Bar : Tětiva číst psát si; konec;
Vezměte prosím na vědomí, že pro vlastnosti getter a setter nejsou výslovně specifikovány.
Delegáti
Delegáti definují podpisy pro metody, takže tyto metody lze předávat v parametrech (např. Zpětná volání) nebo ukládat do proměnných atd. Jsou to typově bezpečný NET ekvivalentní ukazatelům funkcí. Používají se také při akcích. Při přiřazování metody delegátovi je nutné použít @
operátor, takže kompilátor ví, že člověk nechce volat metodu, ale jen ji přiřadit.
Oxygene může vytvářet anonymní delegáty; například metody mohou být předány do Vyvolat
metoda ovládacího prvku bez deklarace delegáta:
metoda MainForm.MainForm_Load(odesílatel: Systém.Objekt; E: Systém.EventArgs);začít Vyvolat(@Dělej něco);konec;
Anonymní delegát s podpisem metody Dělej něco
bude vytvořen překladačem.
Oxygene podporuje polymorfní delegáty, což znamená, že delegáti, kteří mají parametry sestupného typu, jsou kompatibilní s přiřazením. Předpokládejme dvě třídy Moje třída
a MyClassEx = třída (MyClass)
, pak v následujícím kódu BlubbEx
je úkol kompatibilní s Blubb
.
typ delegát Blubb(odesílatel : Objekt; m : Moje třída); delegát BlubbEx(odesílatel : Objekt; mx : MyClassEx);
Fields can be used to delegate the implementation of an interface, if the type we're of implements this interface:
Realizátor = veřejnost třída(IMyInterface) // ... implementovat rozhraní ...konec;Moje třída = veřejnost třída(IMyInterface) fNěkterý implementátor : Realizátor; veřejnost nářadí IMyInterface; // stará se o implementaci rozhraníkonec;
V tomto příkladu kompilátor vytvoří veřejné metody a vlastnosti v Moje třída
, které volají metody / vlastnosti fNěkterý implementátor
, implementovat členy IMyInterface. To lze použít k zajištění funkce podobné mixinu.[6]
Anonymní metody
Anonymní metody jsou implementovány uvnitř jiných metod. Nejsou přístupné mimo metodu, pokud nejsou uloženy uvnitř pole delegáta. Anonymní metody mohou používat místní proměnné metody, ve které jsou implementovány, a pole třídy, do které patří.
Anonymní metody jsou zvláště užitečné při práci s kódem, který má být spuštěn ve vlákně GUI, což se provádí v .NET předáním metody, proveďte Vyvolat
metoda (Control.Invoke
ve WinForms, Dispečer.Invoke
ve WPF):
metoda Okno1.PredictNearFuture; // deklarováno jako asynchronní v rozhranízačít // ... zde spočítejte výsledek, uložte jej do proměnné „theFuture“ Odesílatel.Vyvolat(Dispečer Priorita.ApplicationIdle, metoda; začít theFutureTextBox.Text := budoucnost; konec);konec;
Anonymní metody mohou mít také parametry:
metoda Okno1.PredictNearFuture; // deklarováno jako asynchronní v rozhranízačít // ... zde spočítejte výsledek, uložte jej do proměnné „theFuture“ Odesílatel.Vyvolat(Dispečer Priorita.ApplicationIdle, metoda(Budoucnost : Tětiva); začít theFutureTextBox.Text := Budoucnost ; konec, budoucnost);konec;
Používají se oba zdrojové kódy anonymní delegáti.
Oznámení o majetku
Oznámení o majetku se používá hlavně pro datovou vazbu, když GUI musí vědět, kdy se hodnota vlastnosti změní. Rozhraní .NET poskytuje rozhraní INotifyPropertyChanged
a INotifyPropertyChanging
(v .NET 3.5) pro tento účel. Tato rozhraní definují události, které musí být aktivovány při změně / změně vlastnosti.
Oxygen poskytuje oznámit
modifikátor, který lze použít na vlastnosti. Pokud se použije tento modifikátor, kompilátor přidá rozhraní do třídy, implementuje je a vytvoří kód pro vyvolání událostí při změně / změně vlastnosti.
vlastnictví Foo : Tětiva číst fFoo psát si SetFoo; oznámit;vlastnictví Bar : Tětiva; oznámit 'Blubb'; // upozorní, že vlastnost „Blubb“ byla změněna místo „Bar“
Modifikátor lze použít na vlastnosti, které mají metodu setter. Kód pro vyvolání událostí bude poté přidán do této metody během času kompilace.
Příklady kódu
Ahoj světe
jmenný prostor Ahoj světe;rozhranítyp Ahoj třído = třída veřejnost třída metoda Hlavní; konec;implementacetřída metoda Ahoj třído.Hlavní;začít Systém.Řídicí panel.WriteLine('Ahoj světe!');konec;konec.
Generický kontejner
jmenný prostor GenericContainer;rozhranítyp TestApp = třída veřejnost třída metoda Hlavní; konec; Osoba = třída veřejnost vlastnictví Jméno: Tětiva; vlastnictví Příjmení: Tětiva; konec;implementacepoužívá Systém.Sbírky.Obecný;třída metoda TestApp.Hlavní;začít var můj seznam := Nový Seznam<Osoba>; // odvození typu můj seznam.Přidat(Nový Osoba(Jméno := 'John', Příjmení := 'Srna')); můj seznam.Přidat(Nový Osoba(Jméno := 'Jane', Příjmení := 'Srna')); můj seznam.Přidat(Nový Osoba(Jméno := 'James', Příjmení := 'Srna')); Řídicí panel.WriteLine(můj seznam[1].Jméno); // Není potřeba žádný casting Řídicí panel.ReadLine; konec;konec.
Obecná metoda
jmenný prostor GenericMethodTest;rozhranítypGenericMethodTest = statický třídaveřejnost třída metoda Hlavní;soukromé třída metoda Zaměnit<T>(var vlevo, odjet, že jo : T); třída metoda DoSwap<T>(vlevo, odjet, že jo : T);konec;implementacetřída metoda GenericMethodTest.DoSwap<T>(vlevo, odjet, že jo : T);začít var A := vlevo, odjet; var b := že jo; Řídicí panel.WriteLine(„Typ: {0}“, Typ(T)); Řídicí panel.WriteLine('-> a = {0}, b = {1}', A , b); Zaměnit<T>(var A, var b); Řídicí panel.WriteLine('-> a = {0}, b = {1}', A , b);konec;třída metoda GenericMethodTest.Hlavní;začít var A := 23;// odvození typu var b := 15; DoSwap<Celé číslo>(A, b); // v této metodě nedochází k downcastingu na Object. var aa := 'abc';// odvození typu var bb := 'def'; DoSwap<Tětiva>(aa, bb); // v této metodě nedojde k downcastingu na Object DoSwap(1.1, 1.2); // zadání závěru pro obecné parametry Řídicí panel.ReadLine();konec;třída metoda GenericMethodTest.Zaměnit<T>(var vlevo, odjet, že jo : T);začít var tepl := vlevo, odjet; vlevo, odjet:= že jo; že jo := tepl;konec;konec.
Výstup programu:
Typ: System.Int32-> a = 23, b = 15-> a = 15, b = 23 Typ: System.String-> a = abc, b = def-> a = def, b = abc Typ: System.Double- > a = 1,1, b = 1,2-> a = 1,2, b = 1,1
Rozdíly mezi Delphi a Oxygenem
- jednotka: Nahrazeno jmenný prostor klíčové slovo. Vzhledem k tomu, že Oxygene nezkompilovává jednotlivé soubory, ale jednotlivé projekty, nezávisí to na názvu souboru. Místo toho se klíčové slovo jednotka nebo jmenný prostor používá k označení výchozího jmenného prostoru, ve kterém jsou pro daný soubor definovány všechny typy
- postup a funkce: metoda je preferované klíčové slovo postup a funkce stále pracovat.
- přetížení: V Oxygene jsou všechny metody standardně přetíženy, takže k tomu není potřeba žádné speciální klíčové slovo
- .Vytvořit(): Toto volání konstruktoru bylo nahrazeno Nový klíčové slovo. Stále to lze povolit v možnosti projektu ze starších důvodů
- tětiva: Znaky v řetězcích jsou založeny na nule a jsou jen pro čtení. Řetězce mohou mít nulové hodnoty, takže testování proti prázdnému řetězci není vždy dostačující.
Kritika
Někteří lidé by rádi přenesli svůj kód Win32 Delphi do Oxygene, aniž by provedli velké změny. To není možné, protože zatímco Oxygene vypadá jako Delphi, existuje dost změn, aby byl nekompatibilní pro jednoduchou rekompilaci. Zatímco název mu dává vzhled jiné verze Delphi, není to tak úplně pravda.[7]
Kromě jazykového rozdílu, Knihovna vizuálních komponent framework není v Oxygenu k dispozici.[8] To dělá portování ještě obtížnějším, protože klasický kód Delphi spoléhá hlavně na VCL.
Viz také
Reference
- ^ http://www.elementscompiler.com/elements/oxygene/history.aspx
- ^ „Stránka Embarcadero Prism, ve spodní části stránky obrázek uvádějící, že je vytvořen pomocí RemObjects Oxygene“.
- ^ „Archivovaná kopie“. Archivovány od originál dne 2013-06-20. Citováno 2013-06-06.CS1 maint: archivovaná kopie jako titul (odkaz)
- ^ „Archivovaná kopie“. Archivovány od originál dne 8.7.2011. Citováno 2010-01-09.CS1 maint: archivovaná kopie jako titul (odkaz)
- ^ „Archivovaná kopie“. Archivovány od originál dne 8.7.2011. Citováno 2010-01-10.CS1 maint: archivovaná kopie jako titul (odkaz)
- ^ „Archivovaná kopie“. Archivovány od originál dne 8.7.2011. Citováno 2010-01-17.CS1 maint: archivovaná kopie jako titul (odkaz)
- ^ „Diskuse o přetečení zásobníku, kde lidé poznamenávají, že Oxygene není Delphi Win32“. Archivovány od originál dne 2012-10-25. Citováno 2016-07-25.
- ^ „Recenze Delphi Prism 2010, kde ve třetím odstavci uvádějí, že VCL.net není k dispozici“.