Twórca Javy – James Gosling opuszcza Oracle

  • Home
  • /
  • Blog
  • /
  • Twórca Javy – James Gosling opuszcza Oracle

Data: 12 kwietnia, 2010

James Gosling – zwany „ojcem Javy” – ogłosił na swoim blogu, że kończy swoją współpracę z firmą Oracle. Gosling był długoletnim pracownikiem korporacji Sun, która niedawno została przejęta przez Oracle.

Gosling rozpoczął, wraz z zespołem badawczym, którym kierował, prace nad eksperymentalnym środowiskiem obiektowym działającym na maszynie wirtualnej już w roku 1991. Projekt rozwinął się i dał podwaliny pod technologię Java, która na dobre zadomowiła się na rynku aplikacji klasy “enterprise”, a także z mniejszym lub większym powodzeniem gości na stronach internetowych, urządzeniach przenośnych i wbudowanych. Gosling był aktywnym działaczem społeczności Java i wpływał na kształt i rozwój języka Java i całej platformy.

Gosling nie podał dokładnych powodów odejścia. Napisał jedynie, że wszystko co mógłby napisać, przyniosłoby większą szkodę niż pożytek. Nie jest jednak tajemnicą, że jest to kolejny znany weteran Sun, który odchodzi po przejęciu przez Oracle.

Ciekawe w jakim kierunku rozwijać się będzie Java w przyszłości bez Goslinga… Ciekawe czasy.

Update: końcówka wypowiedzi na blogu Goslinga daje sporo do myślenia:

Sun’s blogging policy gave bloggers rights to their own works. The few more recent blog entries that I did at blogs.sun.com were written under somewhat more strict policies 🙂

Podobne wpisy

Twój adres email nie zostanie opublikowany. Wymagane pola są oznaczone


  1. Lashlo pisze:

    Jak ja nie lubię javy 😛 sama myśl o tym że program jest wykonywany przez coś innego niż CPU pobudza we mnie dziwne emocje :/

    1. krakers pisze:

      Ta… ja za to wole programy wykonywane przez dysk.

      1. Lashlo pisze:

        Chyba nie zrozumiałeś tego co napisałem albo napisałem to dla ciebie w zbyt trudny sposób 😛

        1. jarek pisze:

          @Lashlo Obawiam sie, ze Ty sam nie zrozumiales co napisales.

        2. el.pescado pisze:

          sama myśl o tym że program jest wykonywany przez coś innego niż CPU pobudza we mnie dziwne emocje

          Oczywiście, pojęcia można nie mieć żadnego, zdanie wygłosić jednak trzeba. Wystarczy poczytać o JIT [1] a już można się nie kompromitować. Poza tym, programy mogą być wykonywane przez inne układy, np. shadery są wykonywane na GPU, co w większości ludzi nie budzi bynajmniej dziwnych emocji.

          [1] http://en.wikipedia.org/wiki/Just-in-time_compila…

        3. Królik pisze:

          Hmm, ciekawe, a my teraz będziemy się bawić w instytucie 384-rdzeniową maszynką wykonującą sprzętowo bajtkod Javy. Łyso?

        4. vampire pisze:

          powiesz o tym cos wiecej? Brzmi interesujaco.

        5. Królik pisze:

          Można o tym poczytać na stronie:
          http://www.azulsystems.com/products

          W ofercie mają jeszcze mocniejsze sprzęty, niż ten, który będziemy testować 😉

    2. Itachi pisze:

      Wiesz… formalnie to CPU też ma w tym swój udział 😉

    3. iron_irony pisze:

      @Lashlo domyślam się, że chodzi Ci o programowe maszyny wirtualne. Tak czy inaczej – maszyny tego typu są wszędzie, mniej lub bardziej skomplikowane. Nazywane szumnie "Virtual Machine" albo nie. Większość języków interpretowanych ma taki wewnętrzny parser, który przekłada reprezentację wewnętrzną na wykonanie. Ten wewnętrzny parser w Javie jest ustandaryzowany i nazwany JVM.
      Podobne mechanizmy, chociaż może niestandardowe i nieznane bliżej ma dowolny język interpretowany: Bash, JavaScript, Flash, Perl, Awk, …

      Już interpreter Basica, wbudowany w ROM 8-bitowego Atari, kod programu trzymał w tzw. tokenach, a wykonanie polegało na interpretacji tych tokenów. Te tokeny były ściśle określone, a inne implementacje np. Microsoft Basic rozszerzały te tokeny (tak MS napisał jeden z fajniejszych implementacji Basic na małe Atari).

      Co najwyżej można nie lubić Java VM za zbyt skrupulatne testowanie przed wykonaniem poszczególnych klas i nie buforowanie tych informacji na później, co może przełożyć się na wolny start aplikacji, ale to już zupełnie inna historia – zależna m.in. od implementacji konkretnego JRE.

      1. Reddie pisze:

        Nie no, nie mieszajmy. Wirtualizacja to zupełnie co innego od interpretacji. Taki Perl nie ma maszyny wirtualnej, bo do wykonania na takowej kod musi zostać skompilowany, co w językach dynamicznych jest… Dość ciężkie do osiągnięcia. Właśnie dlatego powstał Parrot.

        Mechanizm tokenów to także nie jest jakaś wczesna wirtualizacja, choć oczywiście cel ten sam – wykonanie programu.

        1. Bzdura. Właśnie zniknąłeś pliki pyc zawierające skompilowane do bajtkodu moduły Pythona.

        2. Reddie pisze:

          Nie wiem jak działa Python, ale to nie zmienia tezy: wirtualizacja != interpretacja 🙂

  2. abcman pisze:

    Być może weterani Suna odeszli z Oracle, bo korporacje są przeważnie sztywne, dużo jest tam formalnych i nudnych procedur (tickety i te sprawy). Sun też był korporacją ale widocznie nie tak sztywną skoro został w końcu przejęty przez Oracle.

    1. Zahariash pisze:

      Ludzie, którzy przeszli z mysql'em do suna też narzekali na sztywną korporacyjność suna. No ale widocznie są różne stopnie wielkości 😉

    1. norbert_ramzes pisze:

      <code>DELETE FROM wp_users WHERE user_name='Theq' LIMIT 1;
      DELETE FROM wp_comments WHERE user_name='Theq';
      DELETE FROM wp_posts WHERE user_name='Theq';
      iptables -I INPUT -s 93.x.y.z -j DROP</code>

      👿

      1. j23tom pisze:

        Nie ma co się obrażać .net to lepsza java, z kilku powodów:
        – bo twórcy uczyli się na błedach javy.
        – bo za C# stoi Anders Hejlsberg (twórca sukcesu Delphi)
        – bo MS ma większy potencjał niż miał Sun

        Ale .net może się stać nową java, tylko jeśli MS bardziej otwarcie i zdecydowanie zezwoli na otwartoźródłowe implementacje. Inaczej na *nixach, to zawsze będzie nisza.

        1. norbert_ramzes pisze:

          Przecież żartowałem. Nie banuję użytkowników za takie żarty.

        2. jarek pisze:

          Oh, dziekujemy Ci laskawco!

        3. Kwant pisze:

          .net i C# są tylko na platformach zaczynających się na W więc są mocno ograniczone (Mono nadaje się do HelloWorld).

          Poza tym środowisko i język nie definiuje jakości kodu i powstałego produktu. W języku Basic można napisać bardzo ładny kod i funkcjonalną rzecz a w najfajniejszym (według Ciebie) C# można pisać stylem Fortrana i spłodzić potworka niedającego się używać.

        4. j23tom pisze:

          banshee, tomboy, f-spot, monodevelop – to helloworld ?

        5. abcd pisze:

          Hmm, twórca sukcesu Delphi brzmi co najmniej źle 😉

          Z drugiej strony .NET to teraz najlepsza platforma do tworzenia _normalnych_ aplikacji pod Windows, jeśli będzie naprawdę wielosystemowe (Mono ma już obsługę np. XAML – wprowadzonego z .NET3 języka opisu interfejsu?)

    2. Theq pisze:

      Ej no co, przecież jest mono 😛

      1. Królik pisze:

        Mono jest wolne (w znaczeniu powolne). I to jak żółw.

        BubbleMark:

        SilverLight 3.0 Mono: 11 fps
        SilverLight 3.0 Windows: 400 fps
        Java 6: 330 fps

        Na innym sprzęcie:
        SilverLight 3.0 Mono: 5 fps
        SilverLight 3.0 Windows: 102 fps
        Java 6: 212 fps

        1. Magnes pisze:

          A masz jakieś porównanie zwykłego Mono, a nie Moonlighta? Bo Moonlight to taka na szybko poskładana zaślepka, Mono powinno być lepsze.

        2. Królik pisze:

          Samo Mono wg Great Language Shootout już tak nie odstaje (choć jest wyraźnie wolniejsze od Javy). Wniosek – coś w Moonlight chyba jest zrypane z grafiką…. Brak akceleracji sprzętowej?

        3. j23tom pisze:

          @królik spójrz na zużycie pamięci – jak na nie spojrzeć to java wyraźnie odstaje ( a i nie zawsze java jest w tych benchmarkach szybsza). Mono i Java6 są porównywalne, jeśli chodzi o wydajność.

        4. Królik pisze:

          Java żre tyle RAMu ile jej dasz. Co jest DOBRĄ RZECZĄ ™. RAM nieużywany to RAM zmarnowany.

        5. mikolajs pisze:

          A masz jakieś porównanie zwykłego Mono, a nie Moonlighta? Bo Moonlight to taka na szybko poskładana zaślepka, Mono powinno być lepsze.

          Mono jest sporo wolniejsze zobacz: debian benchmark

          Faktycznie Java ma kryzys, ale jeszcze nie umiera. Mono nie stanie się nigdy tym co Java, nie po to Microsoft stworzyło .NET aby było dobrze użytkownikom innego systemu. Nowelowi pozwala robić tylko gorszą wersję, a jak chcecie lepszą to weźcie Windows Serwer i .NET Na tym polega ich polityka.

        6. Reddie pisze:

          @Królik: byłoby dobrą gdyby ten RAM chętnie zwalniała gdy chcę włączyć inny proces.

        7. Królik pisze:

          I tak nie podchodziłbym zbyt serio do tych benchmarków. Takie benchmarki zwykle mierzą szybkość najlepszej możliwej implementacji danego algorytmu przy założeniu, że ma się nieograniczoną ilość zasobów i czasu (w końcu te benchmarki są cały czas ulepszane – każdy może wysłać lepszy kod). W praktyce jednak zasoby są ograniczone. W praktyce nikt nie pisze "optymalnego kodu". I wtedy często języki, w których łatwiej zakodować szybszy, ale trudniejszy algorytm wychodzą na prowadzenie.

          Niedawno miałem okazję zmierzyć się z zadaniem oryginalnie zakodowanym w C++, które było kosmicznie powolne (jakaś koszmarna złożoność). Przepisałem na Scalę w pół godziny uzyskując coś co działa w sensownej złożoności, podpierając się bardzo mocno biblioteką standardową, i dałem oryginalnym developerom, żeby sobie przetłumaczyli na C++ (boosta znają, to powinni dać radę, nie?). I o zgrozo, nie są w stanie… A nawet jeśli by się wzięli za to, to rozwiązanie byłoby pewnie 5-10x dłuższe, debugowanie zajęłoby masę czasu, a optymalizacja żeby ostatecznie działało szybciej niż wersja wysokopoziomowa, zajmie kolejne 5x.

        8. j23tom.openid.pl pisze:

          czyli jeśli RAM jest ważny to benchmarki są be ? 😉

        9. Królik pisze:

          Psst. .NET żre tak samo dużo RAMu, więc bym się na Twoim miejscu nie wychylał. A na maszynach 64 bitowych żre jeszcze więcej. No chyba, że MS zdążył skopiować już technologię kompresji wskaźników stosowaną w 64-bitowych JVMach.

          Te konkretnie benchmarki mają skopaną metodykę pomiaru RAMu, bo dla każdego języka mierzą co innego. Uruchamiają program, który potrzebuje 100B RAMu na stercie, a do zużycia pamięci liczą zapotrzebowanie na środowisko uruchomieniowe, biblioteki i wow… wychodzi 30x więcej niż dla statycznie zlinkowanej aplikacji w C.

          Dodatkowo opcja -server w JVMie zakłada, że ma do dyspozycji bardzo dużo RAMu i wydajność jest priorytetem. Parę drobnych ustawień i można zużycie zredukować wielokrotnie, zmniejszając wydajność o raptem kilka %.

        10. mikolajs pisze:

          I tak nie podchodziłbym zbyt serio do tych benchmarków. Takie benchmarki zwykle mierzą szybkość najlepszej możliwej implementacji danego algorytmu przy założeniu, że ma się nieograniczoną ilość zasobów i czasu (w końcu te benchmarki są cały czas ulepszane – każdy może wysłać lepszy kod). W praktyce jednak zasoby są ograniczone. W praktyce nikt nie pisze “optymalnego kodu”. I wtedy często języki, w których łatwiej zakodować szybszy, ale trudniejszy algorytm wychodzą na prowadzenie.

          I bardzo dobrze, bo pokazują jak łatwo pisze się w danym języku. Co z tego że teoretycznie maszyna wirtualna jest szybka, jak nikt nie ma czasu na to żeby walczyć z optymalizacją.
          Wystarczy zobaczyć jak w tym benchmarku wypada C# w stosunku do F#.

    3. hipertracker pisze:

      Java jako platforma trzyma się mocno i jest, w przeciwieństwie do .NET, faktycznie MULTIPLATFORMOWA. Także JVM jest dużo bardziej zaawansowana technologicznie od CLR. Co do samej Javy jako języka, to jest to kompletnie nieistotna sprawa. Istnieje ponad 240 języków zgodnych z JVM, w tym tak dobre jak statycznie typowana, hybrydowa (OOP+FP) Scala czy dynamicznie typowany Clojure. C# to badziew. Już ciekawszy jest F# jak już…

      1. Magnes pisze:

        Z ciekawostek: Mono nie jest w pełni multiplatformowe, porobili na niego biblioteki, które nie mają windowsowej wersji (chociażby biblioteki wywodzące się z Gnome).

        1. el.pescado pisze:

          Z ciekawostek: Java nie jest w pełni multiplatformowa, porobiono dla niej biblioteki, które nie mają windowsowej wersji (chociażby biblioteki wywodzące się z Gnome).

          http://java-gnome.sourceforge.net/

        2. Królik pisze:

          Ale biblioteka standardowa Javy jest wieloplatformowa.
          Biblioteka standardowa .NET nie jest, jedynie pewne jej części.

      2. j23tom.openid.pl pisze:

        Java jako platforma trzyma się mocno

        Nikt nie mówi, że tak nie jest

        Także JVM jest dużo bardziej zaawansowana technologicznie

        C# to badziew

        nie ma to jak merytoryczna nienacechowana złymi emocjami wypowiedź.

        C# jest składniowo dużo bogatszy od javy, przez co ma większą siłe wyrazu. Tyle i tylko tyle.

        1. Królik pisze:

          Nie zawsze. Zmusza np. do jawnego specyfikowania niskopoziomowych aspektów czy alokować obiekty na stosie czy na stercie (value types vs reference types). Java nie zmusza, rozstrzyga to automatycznie.

          A tej większej siły wyrazu znowu w innych miejscach tak bardzo nie widać. Większość różnic to syntactic sugar jak np. propertiesy.

          Większą siłę wyrazu z języków .NETowych ma dopiero F#, ale IMHO do innowacyjności Scali mu daleko.

        2. j23tom.openid.pl pisze:

          A tej większej siły wyrazu znowu w innych miejscach tak bardzo nie widać. Większość różnic to syntactic sugar jak np. propertiesy.

          properties to 'nowość' z .NET 1.0.
          Teraz nowością jest słowo np. kluczowe var, dynamic. Nie masz w tej sprawie racji – nie brnij.

        3. Nie zawsze. Zmusza np. do jawnego specyfikowania niskopoziomowych aspektów czy alokować obiekty na stosie czy na stercie (value types vs reference types). Java nie zmusza, rozstrzyga to automatycznie.

          Bzdura piramidalna, wszystkie obiekty ląduje na stercie.

        4. Królik pisze:

          @ja: sprawdź, zanim napiszesz (hasło klucz: Escape Analysis)

          @j23tom.openid.pl: A ja pisałem gdzieś, że to nowość? Pisałem większość różnic to syntactic sugar nie wnoszący nic do ekspresywności języka. I napisałem większość, a nie wszystkie. Co oznacza, że nie ma sensu dla tych niewielkich drobiazgów migrować z Javy na C#.

        5. mikolajs pisze:

          Jako język programowania C# podoba mi się bardziej niż Java (ale jeszcze fajniejsza jest Scala). Jednak w mojej opinii .NET i Mono nie są godne uwagi bo nie są w pełni wieloplatformowe, ani w pełni wolne (patenty). Tak więc niezależnie od samego języka i tak nie będę pisał w C#.

  3. krzabr pisze:

    Tim Bray też odszedł

    Tak czy siak java nie będzie tak dynamicznie zmieniania , stanie się językiem dla nudnych wielkich biznesowych aplikacji .

    Może też dzięki tym przetasowaniom wsparte zostaną inne języki ? Albo nastąpi odwrót do starych i dobrych rozwiązań jak ADA ?

    1. revcorey pisze:

      A czy wam ludzie brakuje języków wykorzystujących jvm? Java od lat rozwija się jak się rozwija, wielu zainteresowanych jest ,kłótnie sun z innymi o sposób implementacji mechanizmów lub co innego były na porządku dziennym(patrz. foch apache fundation). Moim zdaniem sun twardo chciał trzymać jave(i dobrze). Co do piania na temat .NET i C# dynamiczny rozwój tylko czy nie za dużo rzeczy na raz wrzucają?(zaznaczam mało korzystałem z net raczej tylko rozwój śledziłem). Zobaczymy co java se7 pokaże.

      1. zamoyski pisze:

        Tysiące postów typu "[język] Java się nie rozwija" nie zmienią faktu, że Java to nie tylko gramatyka. Wystarczy popatrzeć na to co robi SpringSource, Redhat i podobni.
        Za to dynamicznie rozwijający się C# (nie twierdzę, że tylko w zakresie gramatyki) zmusza programistów do uczenia się platformy .NET na nowo z każdym wydaniem. Z punktu widzenia studenta / pasjonata nie jest to wada. Ale z punktu widzenia biznesu, który jednak gromadzi jakąś bazę istniejących aplikacji nie jest to z kolei zaleta. Zawsze znajdzie się jakiś nowy pracownik po studiach z certyfikacikiem MSXYZ, który powie – ale przydałoby się tutaj LINQ over byte array!
        Podsumowując – może gramatyka Javy jest dość konserwatywna, ale innowacja nadal jest po stronie społeczności Java!

        1. j23tom pisze:

          Innowacyjna java była 20 lat temu i nie jest to jakaś złośliwość – taki jest cykl życia tego typu platform. Teraz .NET rządzi (wyrażenia lambda czy LINQ, to są rzeczy których odpowiedników w javie nigdy nie będzie)

        2. zamoyski pisze:

          Ale to społeczność Java tworzy takie narzędzia jak Spring, Hibernate, czy nawet JUnit. LINQ, czy lambdy mogę mieć w innych językach JVM.

        3. Królik pisze:

          wyrażenia lambda czy LINQ, to są rzeczy których odpowiedników w javie nigdy nie będzie)

          LOL. Gdyby jeszcze C# miał wyrażenia lambda… Metody anonimowe + delegaty to nie jest dokładnie to samo, co pełnoprawne wyrażenia lambda.

          A prawdziwe wyrażenia lambda są w językach na JVM już dosyć długo, tyle że nie w Javie. M.in. w takich językach jak Closure i Scala. Java 7 też będzie mieć wyrażenia lambda.

        4. j23tom.openid.pl pisze:

          if(króliki.FirstOrDefault(krolik => !krolik.IsIgnorat) != null){
          sprawdzZanimNapiszesz();
          }

        5. mikolajs pisze:

          Ale czy LINQ to taki wielki wynalazek? Czemu tak się nad nim zachwycają?
          W Javie jest wiele interfasów dostępu do baz danych.

        6. j23tom.openid.pl pisze:

          LINQ to nie interfejs dostępu do baz danych tylko jakby standardowy sposób prztwarzania danych w kolekcjach. Jak zobaczę coś podobnego w javie (tak łatwo używalne) to chętnie powiem, że nie jest innowacyjne.

          Tu kilka przykładów:
          http://msdn.microsoft.com/en-us/vcsharp/aa336746….

        7. j23tom.openid.pl pisze:

          prawie, gdyby tylko było silnie typowane (siła LINQ to między innymi intellisense w tych zapytaniach)

        8. Królik pisze:

          if(króliki.FirstOrDefault(krolik => !krolik.IsIgnorat) != null){
          sprawdzZanimNapiszesz();
          }

          Cytat z dokumentacji C#:

          A return statement in a lambda expression does not cause the enclosing method to return

          To jest poważne ograniczenie. Nie mówiąc o tym, że nie jest zgodne z ogólnie przyjętym działaniem wyrażeń lambda w programowaniu funkcyjnym.

        9. j23tom.openid.pl pisze:

          To jest poważne ograniczenie. Nie mówiąc o tym, że nie jest zgodne z ogólnie przyjętym działaniem wyrażeń lambda w programowaniu funkcyjnym.

          czy ja gdzieś pisałem że w javie nie ma wyrażń lambda rozumianych w sensie "ogólnie przyjętym działaniem wyrażeń lambda w programowaniu funkcyjnym"? Ja pisałem że w javie nie ma nawet odpowiednika tej 'prymitywnej' formy wyrażeń lambda która jest w C#.

          Zmieniasz definicje pojęć w trakcie dyskusji tak jak Ci wygodnie. Też mogę powiedzieć że w javie nie ma generics takich jak są C# więc java 'a to poważne ograniczenie'

        10. jedi1 pisze:

          LINQ to nie interfejs dostępu do baz danych tylko jakby standardowy sposób prztwarzania danych w kolekcjach. Jak zobaczę coś podobnego w javie (tak łatwo używalne) to chętnie powiem, że nie jest innowacyjne.

          LINQ to właściwie 3 różne technologie. LINQ dla kolekcji to to o czym piszesz. Jest jeszcze LINQ to SQL czyli taki ORM oraz LINQ to XML. Z czego LINQ to SQL to martwy projekt, ot taka fanaberia MS.

          A coś podobnego dla kolekcji w Javie http://quaere.codehaus.org/

          Pewnie trochę czasu minie aż powstanie finalna wersja, ale jakaś wersja już jest.

        11. Królik pisze:

          @j23tom: ależ w Javie jest prymitywna forma wyrażeń lambda – klasy anonimowe. I to od Javy 1.1. Poza tym Java 7 będzie mieć wyrażenia lambda conajmniej na poziomie tych, które są w C#. A wyrażenia lambda "done right" oraz zylion innych ważnych rzeczy, których nie ma w C# ani F# i raczej nie będzie, są w Scali. Nie widzę powodu, dla którego ktoś kto umie sensownie używać wyrażeń lambda miałby używać Javy zamiast Scali.

        12. Królik pisze:

          A co do genricsów, to zarówno te C#, jak i Javowe to badziew, w porównaniu z tymi ze Scali. I to najciekawsze, że w Scali zrobili coś co się wydawało niemożliwe, tj. ominęli problem "erasure".

        13. j23tom.openid.pl pisze:

          @Królik

          ależ w Javie jest prymitywna forma wyrażeń lambda – klasy anonimowe.

          cieszę się, że wreszcie zauważyłeś, że java jest uboższa od C#.

          Co do Scali i F# itp. to żaden język funkcyjny do mainstreamu póki co się nie przebił, choć jest tendencja żeby z nich podbierać różne "features"

        14. soft pisze:

          @Królik

          Nie mówiąc o tym, że nie jest zgodne z ogólnie przyjętym działaniem wyrażeń lambda w programowaniu funkcyjnym.

          to ja poprosze o przyklad takiego funkcyjnego jezyka programowania, oraz jakies zapisane w nim niezalezne odwolawczo (referentially transparent) wyrazenie wymagajace uzycia non-local return. najchetniej kod idiomatyczny, napisany deklaratywnie i charakterystycznie dla tego jezyka np. pochodzacy z implementacji kawalka biblioteki standardowej, a nie jakis imperatywny koszmarek-wydumek majacy udowdnic, ze sie da.

          hint: cos ci sie pozajczkowalo.

          return-from i makro return z common lispa oraz smalltalkowy ^ w zestawieniu z wyrazeniami lambda maja niewiele wspolnego z programowaniem funkcyjnym…

        15. Królik pisze:

          Problem jest taki, że jak napotkasz na return, to nie jest łatwe stwierdzenie, co on takiego robi. Musisz przeanalizować cały kod na zewnątrz i zobaczyć, czy aby nie jest przekazywany jako metoda anonimowa. Podobnie jak opakowujesz kawałek kodu w metodę anonimową, musisz uważać na return.

          Przykład:
          def f() {
          using(new Resource()) { z =>
          // …
          if (error)
          return;
          }
          // more code…
          }

          Natomiast zgadzam się, że generalnie, non-local return to zła praktyka. Dokładnie tak samo jak poleganie na typach w runtime. Więc można powiedzieć, że C# ma podobnie skopane lambdy jak Java genericsy (erasure). Jedno i drugie tak bardzo nie przeszkadza, jak się umie programować, ale jedno i drugie wprowadza "niespójność". Dlatego wolę język, gdzie jedno i drugie działa zgodnie z oczekiwaniami.

          A co do popularności, to Scala ma spokojnie potencjał znaleźć się o tam gdzie Python lub Ruby (a C# nie jest wcale popularniejszy). Na razie jednak za krótko istnieje, aby powiedzieć coś pewnego.

        16. Królik pisze:

          cieszę się, że wreszcie zauważyłeś, że java jest uboższa od C#

          Miałbyś rację, gdyby że klasy anonimowe były bardziej ograniczone funkcjonalnie niż wyrażenia lambda. Ale tak się składa, że część wspólna nie pokrywa się z żadnym ze zbiorów. W tym sensie dopiero C# 3.0 dogonił Javę… zrzynając z niej wsparcie dla klas anonimowych. Zresztą, co tu dużo mówić, M$ zerżnął 90% Javy, dodał kilka słabo przemyślanych udogodnień (value-types, lambdy z problematycznym return), poprawił kilka drobnych bugów (generics), okraszył cukrem syntaktycznym i udaje wielkiego innowatora. Jeśli przez tyle lat nie przebił popularnością Javy, mając przewagę, że mógł się uczyć na błędach Suna, to już raczej nie przebije. Nawet na dekstopach, gdzie Java nie jest konkurencją, .NET też kuleje. Prędzej pojawi się coś nowego, bardziej rewolucyjnego. Ze wszystkich nowych rzeczy Scala ma w sumie największe szanse, choć niekoniecznie musi się jej udać.

        17. soft pisze:

          @Królik:

          Problem jest taki, że jak napotkasz na return, to nie jest łatwe stwierdzenie, co on takiego robi.

          z punktu widzenia czlowieka ze specjalizacja w logice stosowanej (teoria typow) – return nie jest elementem rachunku lambda i jako taki nie ma zastosowania w programowaniu funkcyjnym. to imperatywny element kontroli przeplywu… 😉

          z punktu widzenia praktyka, uzywajacego 'pragmatycznych' jezykow programowania pozwalajacych na swobodne mieszanie paradygmatow i stylow – lambda wyrazenie tworzy domkniecie leksykalne. moja intuicja podpowiada, ze 'return' powinien opuscic najbardziej 'wewnetrzne' domkniecie leksykalne, w ktorym ten 'return' sie znajduje. wiec powinien sprawic, ze ewaluacja takiego wyrazenia powinna dac wartosc wskazana jako argument 'return'.

          tak sie zachowuja wyrazenia lambda w c#, javascripcie, czy rubym (w przeciwienstwie do Proc.new, ktore nie tworzy domkniecia leksykanego). takie zachowanie jest dla mnie normalne, naturalne, oczekiwane i 'logiczne'. non-local return w kontekscie programowania funkcyjnego ma tyle samo sensu, co iteracyjny quicksort in situ.

        18. Królik pisze:

          Z punktu widzenia praktyka, return w językach imperatywnych opuszcza najbardziej wewnętrzną metodę / funkcję, a nie najbardziej wewnętrzny blok / domknięcie leksykalne. Różnica jest np. wewnątrz pętli for. For/synchronized są domknięciem leksykalnym (a zawartość w klamerkach można traktować jako wyrażenie lambda). Dlatego return powinien opuszczać najbardziej wewnętrzną nazwaną funkcję – zgodnie z przyzwyczajeniami programistów imperatywnych. Dlaczego konstrukcja imperatywna miałaby się zachowywać inaczej w połączeniu z użyciem konstrukcji funkcyjnych?

          Natomiast kwestię czy elementy programowania imperatywnego w językach funkcyjnych i vice versa to ZŁO, zostawmy filozofom.

        19. j23tom.openid.pl pisze:

          A co do popularności, to Scala ma spokojnie potencjał znaleźć się o tam gdzie Python lub Ruby (a C# nie jest wcale popularniejszy).

          chyba kpisz:
          1. popatrz ile jest ogłoszeń o pracę związanych C# a ile ze Scala.
          2. http://langpop.com/

        20. soft pisze:

          @Królik:

          Z punktu widzenia praktyka, return w językach imperatywnych opuszcza najbardziej wewnętrzną metodę / funkcję

          tradycyjnie, w jezykach imperatywnych tylko funkcja/procedura/metoda tworza (zazwyczaj) domkniecie leksykalne…

          , a nie najbardziej wewnętrzny blok / domknięcie leksykalne.

          ale w typowym, tradycyjnym jezyku imperatywnym bez elementow funkcyjnych to jedno i to samo…

          Różnica jest np. wewnątrz pętli for. For/synchronized są domknięciem leksykalnym (a zawartość w klamerkach można traktować jako wyrażenie lambda).

          oczywiscie, ze nie sa (oczywiscie, ze nie mozna) domknieciem jest wylacznie funkcja, a nie dowolny blok (klamerki).

          a wracajac do tematu:

          Nie mówiąc o tym, że nie jest zgodne z ogólnie przyjętym działaniem wyrażeń lambda w programowaniu funkcyjnym.

          no wlasnie. wyrazenia lambda w c# zachowuja sie _dokladnie_ tak, jak powinny. i dokladnie tak, jak przyjelo sie o nich myslec w niemal wszystkich innych jezykach laczacych imperatywnosc z funkcyjnoscia (z malym wyjatkiem smalltalka)…

        21. Królik pisze:

          "C# nie jest wcale popularniejszy" odnosiło się do Pythona.
          W TIOBE są bardzo blisko siebie.

          Scala jest nowa. Ma jeszcze dobrych kilkanaście lat przed sobą, zanim osiągnie wiek, jaki obecnie ma C#. C# jak na swój wiek i kasę jaką MS ładuje w jego promocję (zwłaszcza na uczelniach technicznych) i tak trzyma się… przeciętnie. Javy nie przebił i raczej nieprędko to nastąpi.

          Poza firmami, które zainwestowały mocno w systemy od MS, praktycznie nie istnieje (no dobra, wiem, jest kilka fajnych aplikacji w mono i parę banków zrobiło na tym swoją bankowość internetową i aplikacje wewnętrzne – ale czy to jest powód do dumy?).

        22. Królik pisze:

          Jak definiujesz domknięcie leksykalne?
          Bo chyba jakoś inaczej niż ja.

          Java:

          synchronized(x) {
          // blablabla
          }

          Scala:
          x.synchronized {
          // blablabla
          }

          W pierwszym – konstrukcja wbudowana w język. W drugim, wywołanie metody synchronized i przekazanie metody anonimowej. Działanie obu: IDENTYCZNE. To jest domknięcie leksykalne czy nie?

        23. soft pisze:

          @Królik:

          to pierwsze oczywiscie nie tworzy domkniecia leksykalnego, jedynie nowy zakres leksykalny.

          co do drugiego – nie wiem, nie znam scali, nie znam jej semantyki. nie podoba mi sie kierunek, w ktorym rozwinely sie zainteresowania martina oderskiego… system typow i skladnia sa dla mnie na tyle obrzydliwe, ze mnie ten jezyk po prostu nie interesuje.

        24. j23tom.openid.pl pisze:

          @soft

          skladnia sa dla mnie na tyle obrzydliwe, ze mnie ten język po prostu nie interesuje.

          Odniosłem identyczne wrażenie składnia Scali jest po prostu…brzydka.
          Ze znanych mi języków Ruby ma najładniejszą składnie.

          @Królik

          fakty są takie że dzisiaj na TIOBE C# jest na 6 miejscu a Scala na 27 i nie ma żadnej poważnej przesłanki żeby to mogło się zmienić. Pomijam brak dobrego IDE, dużej organizacji, która stałaby za Scalą i brzydotę składni.
          Brutalne fakty są takie, że to niszowy język.

        25. Królik pisze:

          Czym się w takim razie wg Ciebie różni domknięcie leksykalne od zakresu leksykalnego?

          Obie konstrukcje, które podałem mają identyczną semantykę. Jedna jest realizowana przez "język", druga jest konstrukcją czysto biblioteczną używającą właśnie domknięcia leksykalnego.

          system typow i skladnia sa dla mnie na tyle obrzydliwe, ze mnie ten jezyk po prostu nie interesuje.

          Nie ma to jak merytoryczny argument.

          Niestety zmartwię Cię: C# idzie dokładnie w tym samym kierunku (patrz nowość: "var" i inferencja typów – szczególnie to var to jest baaardzo udana i elegancka składniowo konstrukcja, lol).

        26. Królik pisze:

          "brak dobrego IDE"

          IntelliJ ma obecnie lepsze wsparcie niż miało Visual Studio do C# 10 lat temu. Działa nawet refactoring.

          "dużej organizacji,"
          Lol. Tak jak by było warunkiem koniecznym by coś zdobyło popularność. PHP, Perl, Python, Ruby są na to świetnymi przykładami…

          "brzydotę składni."
          Kwestia gustu. Trudno nawet porównywać, bo w C# nie da się wyrazić połowy tych rzeczy co w Scali.

          "nie ma żadnej poważnej przesłanki żeby to mogło się zmienić"
          Wystarczy, że duże firmy zaczęły realizować projekty w Scali.

          "system typów"
          System typów Scali jest kompletny w sensie Turinga. System typów C# nie, więc znowu, nie ma nawet co porównywać. Nie ta liga.

        27. soft pisze:

          domkniecie leksykalne to funkcja, wraz ze srodowiskiem (zasiegiem leksykalnym), w ktorym zostala zdefiniowana, ktorej zmienne wolne sa zwiazane w tym srodowisku. nie wiem jak zachowuje sie funkcja biblioteczna w scali, bo jej nie znam 🙂 wiem, ze blok synchronized w javie nie jest wartoscia funkcyjna, nie moze byc wiec domknieciem. jak wiekszosc innych klamerek w tym jezyku tworzy jedynie nowe srodowisko (lexical scope).

          Nie ma to jak merytoryczny argument.

          to nie argument. to jedynie uzasadnienie-wymowka dlaczego nie znam scali. i dlaczego nie potrafie odpowiedziec na pytanie czy/czym rozni sie javowy blok synchronized, od jego bibliotecznego odpowiednika w scali.

          C# idzie dokładnie w tym samym kierunku

          ok. przyjalem do wiadomosci 🙂 c# jest dla mnie rownie interesujacy co scala. czyli wcale.

        28. mikolajs pisze:

          A co do popularności, to Scala ma spokojnie potencjał znaleźć się o tam gdzie Python lub Ruby (a C# nie jest wcale popularniejszy).

          chyba kpisz:
          1. popatrz ile jest ogłoszeń o pracę związanych C# a ile ze Scala.
          2. http://langpop.com/

          A jaka była popularność c++ na samym początku po powstaniu języka?

        29. Królik pisze:

          domkniecie leksykalne to funkcja, wraz ze srodowiskiem (zasiegiem leksykalnym), w ktorym zostala zdefiniowana, ktorej zmienne wolne sa zwiazane w tym srodowisku

          Każdy blok oznaczony klamerkami w języku imperatywnym takim jak Java/C++ można podciągnąć pod tę definicję. Zasięg leksykalny jest dobrze zdefiniowany, dziedzina jest zdefiniowana poprzez dostęp do zmiennych na zewnątrz bloku, przeciwdziedziną w Java/C++ będzie po prostu zawsze void, a w Scali dowolny typ. Proste i spójne. Każde klamerki to jeden i ten sam byt.

          Ale jeśli pójdziemy Twoim tokiem rozumowania, to mamy w języku 2 rodzaje bytów oznaczonych klamerkami: domknięcia leksykalne i "zwykłe bloki". Zwykły blok to takie niedorobione domknięcie, które określa tylko zasięg i zmienne wejściowe, ale nie ma określonej przeciwdziedziny (żeby nie stać się funkcją). Ponieważ jedne i drugie czasem bardzo trudno odróżnić wizualnie, to które rozwiązanie jest lepsze i prostsze? No, i co zrobić z tym fantem, że możemy chcieć mieć domknięcia leksykalne nie zwracające żadnej wartości (tj. void)?

          Gdyby nie niewielkie rozróżnienie składniowe, bylibyśmy w cz****ej d***ie. Ale tak ratujemy się, komplikując składnię i wprowadzając sztuczny podział na "zwykłe bloki" i "domknięcia". Paskudztwo.

        30. Królik pisze:

          2. <a href="http://langpop.com/

          ” target=”_blank”>http://langpop.com/

          Pewnie nie doczytałeś do końca, ale w kategorii "Discussion sites" Scala jest całkiem wysoko i zdecydowanie nie można powiedzieć, żeby była niszowa. Teraz się dużo o niej mówi, dużo ludzi się zastanawia, czy się jej uczyć, dużo ludzi już coś sobie prywatnie pisze. Co oznacza, że niedługo będzie wysyp projektów… Tak jak było z Rubym, z tą różnicą, że nie trzeba czekać na biblioteki – dla programistów Scali wszystkie biblioteki Javy stoją otworem.

        31. j23tom.openid.pl pisze:

          No na 17-stym miejscu. Rozbłyśnie zaraz po n apisaniu worda w Lispie który jest na 9. Argument, że może się rozwinąć jest wzięty z czapki.

        32. Królik pisze:

          Ty patrzysz cały czas na miejsce, a ja patrzę na długość słupka, która w niektórych kategoriach jest ok. 1/3 – 1/2 długości słupka dla C# 😉 Zresztą, od kiedy to popularność świadczy o "lepszości"?

          Poza tym rozkład inteligencji wśród programistów języków funkcyjnych jest inny niż wśród programistów Javy, C++, C# i PHP. Kiepskich programistów języków "mainstreamowych" znam na pęczki (wystarczy też poczytać jakie języki się przewijają na TheDailyWTF i zestawić to z twierdzeniem Jeffa Atwooda, że większość programistów nie umie programować). Kiepskich programistów języków niszowych nie znam wcale, ani nawet o takowych nie słyszałem.

        33. Królik pisze:

          BTW: Zapomniałeś dodać, że C# jest na 7. miejscu. A ponieważ jest obecny znacznie dłużej i znacznie bardziej promowany, to argument o tym, że to jest język przyszłości jest jeszcze bardziej z czapki 😛

    2. Magnes pisze:

      Javę będzie sobie zawsze rozwijało Google, bo potrzebuje jej dla Androida.

      1. krzabr pisze:

        Rowniez wiele korporacji finansowych 😉

  4. alex pisze:

    Im wieksze mozliwosci i roznorodnosc konstrukcji w danym jezyku, tym wieksze prawdopodobienstwo nieporozumiem w duzym projekcie.
    Zawsze znajda sie ludzie, ktorzy proste instrukcje napisza jak najkrocej tak, by za miesiac sie sami zastanawiac, co dana instrukcja robi.

    W niektorych projektach specjalnie stosuje sie kod dluzszy, ale bardziej czytelny (lopatologiczny), zeby uniknac zastanawiania sie w przyszlosci, co dana linia robi. Zwlaszcza, ze bardzo czesto krotszy kod w zapisie wcale nie przeklada sie na kod efektywniejszy w wykonaniu, bo kompilatory potrafia byc bardzo sprytne.

    Rozwoj wielu jezykow programowania przebiega ogolnie rzecz ujmujac tak:
    1. Wymyslmy nowy jezyk: prosty, zwiezly i czytelny.
    2. Spopularyzujmy go wsrod zapalencow.
    3. Spopularyzujmy go wsrod wiekszej grupy programistow dodajac konstrukcje upraszczajace pisanie i skracajace kod, zeby zwiekszyc grupe programistow zen korzystajacych.
    5. Dodajmy do niego wyrazenia lambda, programowanie funkcyjne, refleksje, dynamiczne typowanie i wiele innych rzeczy, ktorych mialo w jezyku nie byc.
    6. Wymyslmy nowy prosty jezyk programowania, spelniajacy warunki jak w pkt.1

    Jedna z najwiekszych zalet jezyka Java na poczatku byla mala liczba slow kluczowych i prosta skladnia, ze kod byl prosty i czytelny. Im wiecej rzeczy do niego jest wkladanych, tym gorzej z ta akurat zaleta.

    1. Królik pisze:

      I dlatego lepiej by było, gdyby wyrażeń lambda do języka nie dokładali i pozostawili to językom "dla zaawansowanych".

      1. krzabr pisze:

        Inna opcja języki wąskiej specjalizacji 😉

{"email":"Email address invalid","url":"Website address invalid","required":"Required field missing"}

Newsletter OSnews raz w tygodniu. Bez reklam.