it-swarm-eu.dev

Proč nebyl Scala nebyl implementován s C nebo C ++

Ví někdo, proč byl Scala implementován v Java a .NET místo C nebo C++?) Většina jazyků je implementována s Cor C++ [tj. Erlang, Python, PHP , Ruby, Perl] Jaké jsou výhody pro Scala implementováno v Java a .NET jiné než umožnění přístupu Java) = a .NET knihovny?

AKTUALIZACE

Nebylo by Scala= větší zisk, pokud by bylo implementováno v C, protože může být vyladěno lépe než se spoléhat na JVM?

28
Joshua Partogi

Otázka je matoucí, protože C a C++ jsou languages ​​, zatímco JVM je virtuální stroj a .Net je platforma . Scala lze implementovat v C nebo C++ a pro virtuální stroj může vygenerovat strojový kód místo bajtkódu).

Odpověď na položenou otázku:

Scala nebyl implementován v C nebo C++, protože Scala, jazyk, ve kterém je implementován, je mnohem lepší jazyk.

Proč je to lepší? Dobře, přečtěte si o Oderského cíle pro Scala jazyk .

Odpověď na otázku, která mohla být zamýšlena:

Scala generuje primárně bytecode JVM, protože to poskytuje skvělou přenositelnost a funkce, jako je spolehlivý a účinný sběratel odpadu, běhové optimalizace a kompilace just-in-time od JVM .

Dovolte mi zopakovat tu poslední věc: JVM bude compile na strojové kódování horkých míst v kódu, který běží. To je kompilace stejně jako kompilátory C a C++.

K dispozici jsou i další virtuální stroje, ale Odersky, tvůrce Scaly, byl s JVM již velmi dobře obeznámen. Měl v úmyslu mít CLR jako alternativu, ale úsilí o dosažení tohoto cíle zatím nedosáhlo úspěchu.

Odpověď na otázku, která mohla/měla být položena:

Kompilace do strojového kódu neposkytuje dostatečné výhody oproti kompilaci do bajtkódu JVM.

Je jistě možné generovat mikrobiologické značky v C nebo C++, které porazily ekvivalenty JVM. Je také pravda, že extrémně optimalizovaný kód v C nebo C++ porazí extrémně optimalizovaný kód v Java nebo Scala.) Rozdíl však není tak velký, ale pro dlouhodobě spuštěný program.

Všimněte si, že Scala není zvlášť dobrý skriptovací jazyk právě proto, že režie pro krátkodobé programy je příliš velká).

Ve většině případů jsou však rychlost vývoj a snadnost údržby důležitější než rychlost provedení . V těch případech, kdy se lidé více zajímají o psaní kódu na vysoké úrovni, který je snadno srozumitelný a mění se, mohou běhové optimalizace poskytované JVM snadno překonat optimalizace kompilace prováděné kompilátory C nebo C++, čímž se vytvoří JVM (a CLR) ) cíl, který bude skutečně prováděn rychleji.

Takže bez ohledu na to, zda se jednalo o to, že Scala kompilátor je spustitelný strojový kód nebo Scala programy je strojový kód, potenciál zisky rychlosti nemusí být nutně převedeny do reálné zisky z rychlosti.

A mimochodem,

Ukážu vám příklad: Haskell. Haskell generuje strojový kód, a přesto se programy Haskell na přestřelce Debianu horší než Scala. Vzhledem k tomu, může si být někdo jistý Scala programy by byly rychlejší, kdyby byly kompilovány přímo do strojového kódu?

59
Daniel C. Sobral

Jednou z velkých překážek, kterým čelí při představení celého světa, je dostupnost knihoven. Tradiční reakcí na to bylo poskytnout rozhraní FFI (rozhraní cizích funkcí) založené na C, které vám umožní přístup do knihoven na bázi C. To není ideální z mnoha důvodů, mezi nimi především:

  • Existuje mnoho různých způsobů, jakými chtějí knihovny spolupracovat a které nejsou kompatibilní s mnoha jazyky vyšší úrovně. Například pokud knihovna chce ukazatel na struct, jak se jazyky bez ukazatelů [~ # ~] a [~ # ~] ne structrozsah?
  • Mezi paměťovými modely různých knihoven a jazyků existují tvrdé interakce, které nejsou často vyřešitelné nebo, jsou-li řešitelné, jsou velmi náchylné k chybám a chybám.
  • Lepicí kód pro mnoho FFI je netriviální a předpokládá znalosti, které nemusí být ve skutečnosti univerzální. (Věřte tomu nebo ne, ne všichni programátoři jsou C guru, a ani nechtějí být, ani by nemělo být požadováno!)

To je ještě horší u C++. C++ není dokonce kompatibilní s C++ (na binární úrovni, myslím) od kompilátoru k kompilátoru na stejné platformě (!), Nemluvě o jiných jazycích.

Cílení na JVM řeší mnoho z těchto problémů a poskytuje vám přístup k absolutně obrovské sadě knihoven založených na Javě. (Jak ohromné? Prostě rozložte The Apache Software Foundation je obrovský výběr pro začátečníky.)

  • Konvence volání a vlastnictví Java jsou pravidelnější než C.
  • JVM také poskytuje jediný paměťový model (včetně kolekce odpadků) pro jazyky a knihovny, s nimiž je možné rozhraní propojit. Není třeba sledovat, kdo co vlastnil a co má kde uklízet. Runtime to udělá za vás.
  • Lepicí kód pro FFI pro většinu jazyků postavených na JVM neexistuje (protože je poskytován jako rámec za scénami v jazyce). Není třeba programovat v Javě, například pro přístup Java knihovny v Scala, Clojure, JRuby, atd.) K objektům Java) přistupujete stejným způsobem přistupujete k nativním „objektům“ (vyděsit uvozovky, protože například Clojure nemá skutečné objekty v OOP) a ve vašem rodném jazyce.

Kromě těchto výhod máte také další výhody spuštění kdekoli Java běží bez rekompilace (ale with testování !: psát jednou, testovat všude) a mít přístup k poměrně působivé technologii JIT v Javě.

CLR poskytuje podobné silné stránky, ale přidává to, co je slabou stránkou IMO: je to do značné míry prostředí zamykání dodavatelů. (Ano, vím o Mono. Stále si myslím, že se jedná o blokovací prostředí dodavatele.)

Podle tento rozhovor , byl hlavním důvodem přístup k existující Java infrastruktuře a knihovnám).

... Java je existující jazyk s velmi tvrdými omezeními. V důsledku toho jsem nemohl dělat spoustu věcí tak, jak bych je chtěl dělat - způsob, jakým jsem byl přesvědčen byl by to správný způsob, jak je udělat. Takže po té době, kdy jsem se v podstatě zaměřil na svou práci, bylo udělat Java= lepší), rozhodl jsem se, že je čas udělat krok zpět. začít čistým listem a zjistit, zda bych mohl navrhnout něco, co je lepší než Java. Ale zároveň jsem věděl, že nemohu začít od nuly. Musel jsem se připojit k existující infrastruktuře, protože jinak je to prostě nepraktické bootstrap sami se z ničeho bez knihoven, nástrojů a podobných věcí).

Rozhodl jsem se tedy, že i když jsem chtěl navrhnout jazyk odlišný od Java, , vždy by se připojil k infrastruktuře Java) - k JVM a jeho knihovny . To byl nápad ...

18
Jeremiah

Všechny další jazyky, které zmiňujete, Erlang, Python, PHP, Ruby, Perl - všechny byly vytvořeny dříve Java & .NET. Pokud tvůrci těchto jazyků pokud měli v té době k dispozici prostředí runtime Java nebo .NET, pak je možné, že by je mohli využít při vytváření jejich jazyka).

Samozřejmě nemůžu mluvit za vývojáře těchto jazyků, takže nemohu říct s jistotou , že by použili .NET a/nebo Java při jejich vytváření, pokud byly k dispozici, ale zdá se mi to jako dobrý nápad. Koneckonců, vytvořením jazyka, který se má kompilovat do bajtkódu Java/.NET, získáte všechny výhody kompilátorů/optimalizátorů JIT, váš jazyk se automaticky spustí na všech platformách, na nichž běží Java/.NET, máte přístup ke všem knihovnám Java/.NET atd.

10
Dean Harding

JVM/CLR

JVM (a CLR) poskytují jedinečné výhody, pokud jde o optimalizaci a přenositelnost kódu.

Pokud vím, pouze JVM verze Scala je udržována aktuální, .NET verze není.

4
Josh K

Vypadá to, že mícháte dvě nesouvisející věci.

První z nich je, který programovací jazyk používá Scala autor) k implementaci Scaly?

Na to je odpověď Scala samotná.) A je to jediná přijatelná odpověď, opravdu, protože pokud jste tento nový jazyk vymysleli, ale nepoužívejte ho sami k jeho implementaci - co je dobré za to?

Druhou věcí je, co je cílová platforma pro spouštění programů psaných v Scale?

Zde se volba stává zajímavější, ale prozatím jediným cílem, který funguje 100%, je JVM. Podpora .NET stále probíhá. Někteří lidé také pracují na tom, aby dostali Scala), aby zkompilovali do javacsriptu. Teoreticky nic nebrání někomu přidat další „backendy“ pro kompilaci do C, C++, LLVM, nativního kódu nebo cokoli jiného.

Proč byl JVM vybrán jako primární platforma? Můj odhad je, protože

  • všichni chtějí odvoz odpadu
  • velké množství dobrých knihoven připravených k použití
  • velký počet programátorů, kteří se nudí s Java připraveni skočit na něco nového, ale zůstaňte v mezích JVM (nikdo nechce migrovat stávající kód na jinou platformu)
3
artem

Za prvé - myslím, že jste se opravdu chtěli zeptat, proč Scala není zkompilovaný jazyk je to striktní způsob. Řeknu vám, že nevím, ale řeknu také, že není důvod upřednostňovat JVM před nativním kódem.

Proč? Důvod je jednoduchý: jakákoli virtualizační technologie je náročná na paměť, vytváří zbytečnou režii a další vrstvu přesměrování. Nejedná se o jejich implementaci - jedná se vlastně o logiku, která leží za základním konceptem virtualizace. Bez ohledu na to, co děláte, VŽDY skončí s nižšími vlastnostmi. Zejména JVM má hladovou paměť. Už to není tak pomalé, protože má svůj vlastní runtime kompilátor běžící za zády, ale přesto - musí spouštět kompilátorový proces, aby bylo možné najít nejvíce přetížené části kódu a proměnit je v binární kód.

Řekl jsem, že - jediným důvodem, proč jsem si myslel, že tam bylo Scala JVM-based byla pravděpodobně popularita jazyka. Hádám také, že za tímto rozhodnutím byla nějaká lenost, protože je snazší implementovat jazyk než JVM, než zjistit, jak by věci měly vypadat sestavené tak, aby fungovaly napříč platformou - a dokonce i použití stávajících backendů C vyžaduje mnohem více práce kvůli skutečnosti, že věci nejsou tak standardizované jako u JVM.

To je důvod, proč si mohu vzpomenout, ale mějte na paměti, že mohou existovat i jiné důvody - například vydávání licencí a politika tam (což jsou špinavé věci, do kterých se nikdy nechci dostat).

0
luke1985