Java, a C# i projekty mono


(Sumek) #1

Witam,

Język C# miał się stać konkurencją dla Javy i ją wyprzeć jednak tak się nie stało za to powstało wiele projektów mono(mono for linux, monodroid itd.). Zastanawia mnie czy język C# może z projektami mono zostać wykorzystywany do programowania w mono i C# np. w androidzie czy iOS? Czy raczej C# zostanie tylko nadal wykorzystywany do pisania aplikacji biznesowych dla firm?


(Razi) #2

C# i .NET nigdy nie wyprą Javy z jednego względu: są rozwijane przez MS i tylko na ich platformy. A takie monopolowe rozwiązania nie są zbyt lubiane przez konkurencję. Dlatego też powstał Mono, żeby dać możliwość użycia tego języka i części tej platformy pod innymi platformami.

Zdaniem zapaleńców .NETa projekt Mono kuleje i jest do niczego. Zdaniem programistów Mono wszelkie niedogodności da się ominąć. Mono nie jest pełną implementacją .NETa, brakuje wielu ficzerów z m.in. 4.0 i 3.5, przez co nie wszystkie programy napisane w tych wersjach działają pod Mono prawidłowo.

Z Javą jest inaczej: wydawana jest oryginalna (sun/oracle JRE i JDK) lub w pełni zgodna z oryginalną implementacją (openjdk) Javy (SE i EE) na wszystkie desktopowe platformy. Dodatkowo Java SE jest używana na Androidzie. ME jest używana na niemal wszystkich starszych i nowszych telefonach.

Wyjątkiem jest tu chyba iOS, na którym Apple chce zarobić: brak Javy, a programy trzeba pisać w Objective-C, a kompilator na iOSa wydany tylko na macosa. Więc żeby cokolwiek napisać na iOSa trzeba mieć maca.

Powstają programy dla użytkowników domowych w C# i .NET, ale czy nie lepiej napisać to w Javie, która jest na każdą platformę?

Napisałem mój program w Javie i na 1000 ściągnięć tylko 750 jest z Windowsa, na drugim Linux, na trzecim "nieznany" (być może BSD), na czwartym MacOS. Jak widać te popularne statystyki gdzie windows ma 94% niezbyt się przekładają na ilość użytkowników softu działającego pod każdym systemem.

Moim zdaniem Java jest bardziej uniwersalna, nawet w zastosowaniach biznesowych: nie ważne czy firma docelowa ma windowsy, linuksy, czy maci: odpali. A przeważnie zleceniodawcy nie obchodzi w jakiej technologii jest wykonana aplikacja, tylko że działa.

Jeżeli chcesz użyć C# i zachować zgodność z Mono, to używaj tylko Mono. Wtedy masz pewność że ten soft odpali zarówno pod Mono jak i .NETem


(Sumek) #3

Interesuje mnie to dlatego, że Java pomimo jak mówią .NET-owcy, że się nie rozwija zyskuje coraz większą popularność za sprawą Google'a.

C# wiele aplikacji biznesowych jest w nich pisanych jak i strony ASP.NET choć wisi chmura nad .NET przy ostatnich wiadomościach odnośnie Windows 8.

Ciekawa jest też tendencja tego, że C++ traci popularność a w jego miejsce wchodzi czysty C i trochę Java.


(Razi) #4

Mało komu przy dzisiejszych maszynach chce się klepać kod na tak niskim poziomie jak C++ (mimo że jest to język wysokopoziomowy) i dbać ręcznie o pamięć. Jedyną nadzieją na przyszłość C++ jest skończenie standardu C++0x, wprowadzenie w nim prostszego zarządzania pamięcią i wątków. Być może znów ten język będzie przenośny międzysystemowo. Ale zanim powstanie sprawna implementacja to będzie trzeba jeszcze kilka lat poczekać.

To że Java się nie rozwija jest jedynie propagandą. Java ma się dobrze, tydzień temu Java 7 wyszła, Java 8 zapowiadana jest na połowę, albo koniec 2012, jak gdzieś wyczytałem i mają wprowadzić to, czego nie zdążyli przy 7.

Tam gdzie chodzi o bezpieczeństwo i niskie koszty, wybiera się Javę lub C#. Sam Wielki Zderzacz Hadronów jest zaprogramowany ponoć w Javie i stoi na Linuksie. Jedynie warstwa obsługi urządzeń jest pewnie napisana w C, bo Java do sprzętu bezpośrednio nie może się odwołać. Przy takich zasobach pieniężnych mogli sobie pozwolić na wolniejszy soft, ale szybsze maszyny, żeby zrekompensować mniejszą wydajność.

W normalnych programach użytkowych wydajność nie jest aż tak ważna, zwłaszcza a aplikacjach akcja-reakcja, gdzie coś się dzieje tylko przy jakimś zdarzeniu jak naciśnięcie buttona.

ASP.NET jest dość często stosowany, ale łatwo go rozpoznać głównie dlatego, że najczęściej stosuje się rozszerzenie .asp. W przypadku witryn postawionych na Javie mało kto używa starego rozszerzenia .jsp, tylko faceletów .xhtml, przyjaznych adresów, czy też .do dla prostych aplikacji żądanie>odpowiedź.


(Sumek) #5

A to o tym, że Wielki Zderzacz Hadronów jest napisany też w Javie to nie wiedziałem. Dawniej nie lubiłem Javy i omijałem ją szerokim łukiem ale ostatnio zauważyłem, że wiele fajnych przyszłościowych projektów jak Android powstaje w Javie więc coś interesującego musi być w tym języku i zawsze kojarzyła mi się z małymi programami na komórki czy strony internetowe, a nie w pełni działającym pełnym oprogramowaniem czy systemem operacyjnym.


(Razi) #6

Android jest napisany w C, w Javie się pisze tylko aplikacje na niego. Czemu Java? Bo bezpieczniej kiedy aplikacja działa w maszynie wirtualnej niż bezpośrednio w systemie, pozwala to na lepsze zarządzanie uprawnieniami aplikacji. Jest SDK do natywnych aplikacji w C++, ale nie jest zalecane, a te programy i tak są odpalane w maszynie wirtualnej.

W Javie pisze się często "systemy operacyjne" (raczej oprogramowanie) "systemów wbudowanych", takich jak odtwarzacze DVD, dekodery satelitarne, telewizory. Przykładowo na bootscreenie z NBoxa jest info "Powered by Java".

Java nigdy nie cieszyła się uznaniem dziadków-programistów C++, którzy pisali masę książek na temat właśnie ich języka. Java jest wolniejsza, ale nie jest ona zawsze wymagana. Czy kalkulator wymaga potężnej mocy obliczeniowej?

Co do samego LHC nie jestem pewien czy cały jest w Javie, ale CERN szuka programistów Java.


(Sumek) #7

Dlaczego pisze się takie rzeczy w Javie jak lepiej byłoby chyba je pisać w czymś takim jak C czy C++?


(somekind) #8

Że niby lepszy byłby monopol Javy niż czegoś innego?

Zależy jaki to program. :wink:

To wszystko zależy, bo zleceniodawca przeważnie ma już jakąś infrastrukturę. Np. firmową sieć z 1000 komputerów stojących na Windowsach, skonfigurowane AD i np. jakiś system firmowy pracujący już na bazie MSSQL. W takiej sytuacji jednym z wymagań będzie, aby zamawiany system działał na tej samej infrastrukturze, łatwo się z nią zintegrował, nie wymagał dokupienia nowych licencji czy wsparcia i mógł być obsługiwany przez obecnych administratorów. Więc raczej nikt w Linuksa i Javę się pchał wtedy nie będzie.

Taka uwaga: jeden Mac, ale dwa Maki.

A w niej rewolucyjne nowości, takie jak stringi w switch, które w normalnych językach są od dawna albo od zawsze. W Javie 8 mają dojść lambdy i metody rozszerzające, które np. w NET są od jesieni 2007. To nie jest propaganda, to fakty, którym Oracle stara się przeciwdziałać.

Coś mi się tu nie zgadza. LHC to maszyna, a Java sprzętu nie może obsługiwać, to w takim razie co jest w niej napisane?

ASP.NET to domyślnie rozszerzenie aspx. Ale np. ASP.NET MVC domyślnie stosuje przyjazne adresy, url rewrite też nie jest żadnym problemem. A tak w ogóle, to jakie to ma znaczenie? :wink:

A co do pytania z pierwszego postu - to raczej zagadka dla wróżki niż dla nas. :slight_smile: Ale nie sądzę, żeby zrobił się jakiś ogromny run na pisanie w Mono czy też Monodroid. Raczej żadna firma nie będzie zamawiała custom software na Mono, no bo po co, skoro może korzystać z oficjalnej implementacji frameworka ze wsparciem?


(Razi) #9

Napisałem że obsługa sprzętu prawdopodobnie w C, nie w Javie. Przecież Java jako że nie ma dostępu do sprzętu teoretycznie nie powinna umieć obsługiwać OpenGLa. OpenGL jest obsługiwany za pomocą natywnego sterownika.

LHC to nie tylko sprzęt, ale i farma komputerów wykonująca obliczenia i wyświetlająca wyniki. Widocznie Linux + Java na setki komputerów wyszły taniej niż Windowsy i .NET z C#.

Monopol Javy byłby lepszy choćby z tego względu, że jest rozwijany na wszystkie platformy, a nie tylko windows. W dodatku jest darmowa. .NET z tego co wiem wymaga licencji na windowsa, więc pisząc pod "oryginalnego" .NETa trzeba mieć windowsa, którego ja nie mam zamiaru kupować.


(somekind) #10

Lepiej podałbyś jakieś oficjalne źródło. Bo oferta pracy dla programisty Javy w CERN nie oznacza, że oprogramowanie obsługujące czy nawet analizujące dane z LHC jest napisane w tym języku. Po pierwsze CERN to nie tylko LHC, po drugie różnych programów i programików jest tam pewno tysiące.

Analiza danych "wyprodukowanych" przez sprzęt, to trochę co innego niż sterowanie sprzętem.

Thank You, Captaian Obvious!

Niewątpliwie zastosowania naukowe i akademickie to jeden z obszarów, w którym to środowisko sprawdza się lepiej. I co z tego? Są inne obszary, w których wygodniej, taniej i lepiej jest użyć innych technologii. Warto zdawać sobie z tego sprawę, a nie być zaślepionym jednego tylko rozwiązania.

Monopol NIGDY nie jest dobry. Konkurencja jest podstawową siłą napędową postępu.


(Razi) #11

http://atlas.ch/news/images/stories/lhc_first2.jpg - GUI wygląda znajomo? Biało-szarobłękitne gradienty, jasne kolory, ścięte taby... Metal, stary motyw Swinga.

http://atlas.ch/photos/atlas_photos/sel ... atlas1.jpg - stara ramka KDE

Stronka z CERNu, "moduł" ATLAS, zajmujący się analizą wyników z LHC.

Wiadomo przecież że w Javie nie da się bezpośrednio sprzętu napisać, to też napisałem że obsługa sprzętu pewnie w C. nie sądzę by ktokolwiek odważyłby się coś takiego w niższym poziomie napisać (tzn. w assemblerze), gdzie bardzo łatwo o błąd. Sam LHC jak i zdecydowana większość superkomputerów stoi na Linuksie.

Monopol nigdy nie jest dobry, ale z tych 2 wolałbym by to akurat Java była częściej wykorzystywana. Ludzie dziesiątki lat żyli bez lambdy (swoją drogą jeszcze nie znalazłem ich praktycznego zastosowania), więc i w javie se dzisiaj poradzą.


(Fiołek) #12

Monodroid, MonoTouch. Z tym posiadaniem Maca to nie taka do końca prawda(z tego co wiem, ale nie jest to potwierdzona informacja, Hackintosh jest legalny w Europie(traci się tylko gwarancję na system)).

Bez funkcji, obiektów, zmiennych, co lepsze - bez kompilatorów, też sobie radzili, ale jaki jest tego sens?

Prosty przykład:

C#:

button1.Click += (s, e) => sthVar = sth;

Java:

button1.setOnClickListener(new OnClickListener() { void onClick(View v){sthVar = sth;} });

To jest bardzo prosty przykład, ale lambda jest naprawdę wygodna, jeśli umie się z niej korzystać. Lepszym przykładem są enumy, które tylko pozornie są wspierane, bo nadal jest cała masa stałych w klasach(i, np. w developerce na Androida, nie udało mi się ich w switchach wykorzystać).

@EDIT:

Błąd w kodzie Javy.


(somekind) #13

No i tak jest, więc możesz już przestać płakać.

Nie ważne, co jest częściej, a co rzadziej. Ważne, żeby był wyścig pomysłów prowadzący do rozwoju.

Rachunek lambda to wynalazek sprzed osiemdziesięciu lat. Jest on podstawą w teorii programowania funkcyjnego. Języki funkcyjne, to np.: Lisp (1958r.), ML (1973r.), Scheme (1975r.), Erlang (1986r.) jak widać powstawały na długo zanim ktoś z Suna wpadł na pomysł nazwania języka na cześć indonezyjskiej kawy.

Uściślając - TY dziesiątki lat żyłeś bez lambd i nie potrafisz znaleźć jej zastosowania. Na szczęście inni ludzie potrafią, a cywilizacja tego potrzebuje.


(Kacper B Zuk) #14

Nigdy nie pisałem ani w Javie ani w C#, ale przykład z Javy wydaje mi się czytelniejszy :slight_smile:


(Fiołek) #15

Walnąłem babola w kodzie - brakuje metody w anonimowej klasie.

I masz rację, wydaje Ci się(choć to pewnie kwestia gustu, ale jeśli przyzwyczai się do lambdy z C# jest ona o wiele czytelniejsza). :wink: Zamiast jednej, krótkiej linijki masz długą, zawierającą w sobie wiele rzeczy(cała implementacja klasy, tworzenie nowego obiektu) lub rozbijasz ją na wiele linijek, co tylko ciężko ogarnąć. Nie Nie da się bezboleśnie oddelegować zdarzeń do metody obiektu, trzeba to robić przez klasę anonimową. Tworzony jest kolejny zakres, w którym mamy inne this - dla kogoś, kto stawia this. przed odwołaniem do pól/metod klasy(np. mnie), jest to uciążliwe. Takie rzeczy są przydatne, ale nie w tym wypadku - to jest tylko potrzeba napisania dodatkowego, długiego kodu. Nawet gdy IDE potrafi to samemu zrobić, nie jest to takie przyjemne jak w C#, gdzie sprowadza się do kilku-kilkunastu znaków)


(Razi) #16

Ja sobie napisałem małą klasę do obsługi zdarzeń i mam tak:

Connector.action(jButton1, this, "wykonaj");

I wykonuje metodę "wykonaj()", lub "wykonaj(String actionCommand)" w obiekcie this.

Trochę na wzór tego z Qt i Bean Bindera z JDK, tyle że pozwala wykonać dowolną metodę, a nie tylko metody ziaren get>set.


(Fiołek) #17

Co daje narzut w postaci dodatkowego kodu napisanego przez Ciebie, jest bardziej ograniczone, nadal mniej czytelne, nie jest przyjazne refaktoryzacji(ciągi znaków), nie jest sprawdzane w trakcie kompilacji, jest bardziej skomplikowane i wymaga mocy obliczeniowej(refleksja). :wink:


(Razi) #18

Tak, potrzeba 4-GHzowego procesora żeby płynnie obsłużyć samo zdarzenie naciśnięcia przycisku, które następuje co kilka(naście) sekund.Większą stratę robi maszyna wirtualna. Refleksja jest robiona tylko w momencie łączenia, w momencie naciśnięcia jest ta metoda tylko wykonywana przez invoke.

Fakt, nieprzyjazne refaktoryzacji, ale trudno. Jest jedna linijka zamiast 5.

Tą klasę se mogę wsadzić do każdego programu i używać bez przeróbek. Nakład jest więc jednorazowy.


(Fiołek) #19

Tu nie chodzi o to ile Hz potrzeba, ale o sam fakt tej potrzeby*. Nakład pracy, mimo iż jest jednorazowy, jest. Dodatkowo nie obsługuje wszystkich możliwości(a co, jeśli chcesz wywołać metodę z innymi parametrami? trzeba pisać kolejne). Nie próbuj bronić czy ukrywać tej ułomności Javy - to mija się z celem :wink:

* - nota bene invoke też ma swój narzut.


(Ydk2) #20

Wszystko ładnie pięknie tylko , C# powstał na bazie JAVA-y po tym jak MS przegrał z Sun-em w sądzie.

Jak ktoś pamięta to w XP przed SP1 był intrepretator JAVA-y marki MS i nazywało się to jscript.exe lub bardzo podobnie, a SP1 usuwał jedynie ten plik i nic więcej.

Co do C++ to za przeproszeniem burdel i ogromne braki, zresztą nie da rady napisać w żadnym OBIEKTOWYM języku niewadliwego kodu do sprzętu, ja piszę zwyczajowo pod scalaki i drobne układy np: wyświetlacze LCD lub LED i obiektowość nie dość, że nie daje pożądanego efektu to potraja obciążenie (?).

Co do ASP to może to być nawet pascal, perl, visualbasic również c++ i c#, oraz wiele innych, tylko co mi z tego impementacja CMS już tak wesoła nie jest.

Akurat tutaj powód jest prosty poza perlem żaden z tych języków nie był tworzony z myślą o sieci, jak np: php.

A i tak wszystko sprowadza się do assemblera. A ten obiektowy nie jest: