Scooby Ruby do (on Rails) kontra Java

Najpierw będzie przydługi wstęp, w którym popastwię się nad Rubim, a na końcu będzie interesujące porównanie wydajności czasu tworzenia aplikacji w Javie i Rubim na Rejlasach.

Ostatnio sporo szumu pojawiło się w związku z językiem programowania Ruby, a zwłaszcza frejmłorkiem do tworzenia dynamicznych stron WWW Ruby on Rails. Przypomina to bardzo przedostatni szum związany z językiem Python i serwerem Zope - te ostatnie dwie technologie jakoś popadły w niełaskę ostatnio u "trend seterów".

Przyjrzałem się ciepło Rubiemu, bardzo przyjemny język, bardzo obiektowy i można w nim bardzo dziki kod tworzyć. Na przykład dodawanie 2 + 3 można zapisać w postaci 2.+(3) itp. sztuczki. Kod można pisać w dowolnie niedbały sposób, co ma swoje wady i zalety.

Tak na serio, Ruby jest na prawdę fajny, tylko co z tego.

Grzebiąc w sieci na jego temat (zwłaszcza Ruby on Rails) znalazłem to . I własnym oczom nie mogłem uwierzyć. Tam jest napisane: "Please note that right now Rails basically knows nothing about Unicode and pretends everything is just bytes". Co? Cooo? Ten ficzer Rubiego faktycznie znakomicie ułatwia tworzenie aplikacji, które mają pecha i używają czegoś więcej niż US-ASCII.

Zwolennicy Rubiego, np. Bruce Tate, autor książki "Beyond Java" twierdzą, że podstawową zaletą Rubiego i Ruby on Rails jest dziesięciokrotne przyspieszenie czasu tworzenia aplikacji w stosunku do Javy.

10 razy robi wrażenie.

Jest nawet w sieci tutorial pokazujący jak szybko można w Rubym on Rails utworzyć aplikację WWW opartą o bazę danych z szybkością 10. Przetrawiłem ten tutorial i rzeczywiście, jedna godzina i prosta aplikacja dodająca i modyfikująca dane w bazie jest gotowa.

Tyle, że to samo w Javie można zrobić szybciej i przyjemniej, nie tracąc tego wszystkiego, co nam daje technologia Java EE: deklarowalną politykę bezpieczeństwa, deklarowalną transakcyjność, komponenty EJB, z którymi może rozmawiać klient GUI i wiele innych. Potrzebujemy do tego Netbeans 5.5 (narazie jest beta) i to w zasadzie wszystko. Demo we flashu jest tutaj.

Parę kliknięć i prosty CRUD w EJB 3.0 i JSF jest gotowy.

Comments

Opcje przeglądania komentarzy

Wybierz preferowany sposób wyświetlania komentarzy i klinij na "Zapisz ustawienia", aby aktywować zmiany.

Morał

A ja myślę, że w kwestii porównania języków Java, Python, Ruby powiedziano już wszystko. A morał jest następujący:

Java jest językiem niewygodnym, dalekim od ideału, tworzony kod jest niezwykle długi nawet przy prostych algorytmach. Miałem okazję wypróbować w życiu większość jezyków programowania (wysokiego i niskiego poziomu) i przyznam, że obecnie najlepszym jest Python (w sensie czystego języka programowania). Jednak Java posiada mnóstwo bardzo dobrych gotowych narzędzi, modułów, pakietów, frameworków, bibliotek itp. itd. I dlatego Java jest na topie. Języki takie jak Python czy Ruby pomimo swojej genialności nie nadają się za bardzo do tworzenia profesjonalnego oprogramowania. Pozostają daleko w tyle w zakresie dostępnych narzędzi oraz wsparcia dużych korporacji.

Gdyby połączyć Pythona ze wszystkimi dobrociami oferowanymi dla Javy (oprócz samego języka), to Java spłynęła by jak woda w kiblu. Ten serwis miałby domenę "pdn.pl" oraz hasło "Są różne języki programowania, lecz tylko jeden Język *P*rogramowania".

A tak niestety jesteśmy "skazani na Javę".

Są różne języki programowania, ale...

Jest kilka rzeczy, z którymi się nie zgodzę.
Po pierwsze, nie ma czegoś takiego jak idealny język programowania. A mielonka z jajkiem* nie jest nim w szczególności.
Co do Javy... owszem, też jest daleka od ideału. Ale jak zaczniemy kompilować na poważnie pythona i ruby, też okaże się, że pewnych rzeczy sie nie da i jest więcej roboty. Pewne zalety tych języków wynikają z tego, że są to języki skryptowe, dynamicznie typowane itp. Co w niektórych sytuacjach jest zaletą, a w innych wadą.
NA poziomie składniowym jako konkurencje dla papugi błękitnej norweskiej* moge wystawić choćby i C#, z kilku jasnych powodów:
1. Brak idiotycznej składni opartej na wcięciach (bez względu co na ten temat twierdzi Guido, mnie to najbardziej wpienia w Pythonie)
2. Bardziej przejrzyste definiowanie properties, konstruktorów i przeładowań opaeratorów (wersja w pythonie ciągle bardziej przypomina mi "hackowanie" języka niż rzeczywisty feature).
3. Ma większość tych rzeczy co Python, poza wielodziedziczeneim (które też uważane jest za mieszane błogosławieństwo).
4. Ma statyczne definiowanie typów
5. Ma wsparcie komercyjne (Microsoft, Novell, Borland).

Niestety, obecnie wygrywa p. 5. Pracowałem już jako progarmista Javy, C, C++, C# i znowy Javy, troche kodowałem na zlecenie w Delphi i PHP. Jak dotąd w pracy Pythona użyłem raz, dla siebie (do robienia porządku w template'ach dla Javy), Ruby ani razu (choć w naszym dziale jest niewielka garstka kultystów Rails, to i tak byli zatrudniani jako "programista Java").
Jest sporo fajnych języków programowania. Podoba mi się Nemerle i w ogóle języki funkcyjne. Nemerle ma nawet świetną bibliotekę (po prostu jako język dla .NET korzysta z jego biblioteki). W sumie podoba mi się Nice (taki język pod JVM). Jest jeszcze Jython, w sumie python z wszystkimi zaletami Javy. Poza tym Python nie ma się czego wstydzić jeśli chodzi o biblioteki a nawet narzędzia. I co z tego? Niestety, komercja zwycięża. Po co zajmować się językiem dla hobbystów, skoro na rynku pracy potrzebna jest (podobno paskudna) Java i (naprawdę paskudne) PHP?
Smutne lecz prawdziwe. Nie czuje się skazany, ale obawiam się że jescze d~ugo będę pisał w Javie...
-- Jiima --
*) Python oczywiście

Morał (continued)

Ja się nie zgodzę z kolei z tym, że "Python nie ma się czego wstydzić jeśli chodzi o biblioteki a nawet narzędzia". Na własnej skurze doświadczyłem (jako programista Pythona) ile to różnych funkcjonalności, które normalnie dla Javy mają dojrzałe realizacje w różnych bibliotekach, trzeba było napisać od podstaw albo co najmniej mocno doprogramować. Podobna sytuacja jest z narzędziami. To samo w kwestii produktów do Zope'a - jest ich mnóstwo, ale niewiele z nich jest dojrzałych na tyle, by je wykrzystać produkcyjnie.

I wreszcie morał główny - jak sam napisałeś: "niestety, komercja zwycięża". W naszej branży jest jak w supermarkecie. Klienci chcą wybierać te produkty, które są reklamowane, które są trendy. Java jest trendy. Pomimo tego, że nie "podobno" ale naprawdę jest paskudna.

Na szczeście nie wszyscy dają się porywać reklamom i sprytnemu marketingowi. Nie wszyscy płyną z nurtem trendu. Jest więc nadzieja.

--
skazany na Javę

co do pktu pierwszego, czyli

co do pktu pierwszego, czyli "idiotycznej skladni opartej na wcieciach", to rozumiem, ze swoj kod w Javie czy C# piszesz bez tych idiotycznych wciec? (-:

Idiotyczna skladnia

Grry.
Wiesz, bardzo mi podoba sie wnioskowanie, ze jesli jestem do czegos zmuszany i mi sie to nie podoba, to znaczy ze tego nie robie gdy nie musze...
Jakbym byl zmuszany do mycia sie co wieczor i dostawal mandat za nie umycie sie, to tez bym byl wk* co nie oznacza, ze generalnie sie nie myje. Po prostu czasem wole pasc spac (w czasach mojej mlodosci mowilo sie "robie sobie dzien dziecka" :P) i nie dostac za to mandatu.
Tu wlasnie jest problem z Pythonem. Wciecia sa ok, uzywam ich od czasu gdy skapowalem po co jest czytelny kod*. Ale robic z tego element skladni? Wystarczy popatrzec, jakie jazdy sa przy zmianie edytora tekstu...
Wciecia moglyby zostac, ale... pod warunkiem wprowadzenia jakiejs skladni opcjonalnej. Przykladem moga swiecic Haskell i YAML - tam tez jest skladnia "whitespace" ale mozna ja zastapic bardziej klasycznymi separatorami.
Z nonsensow pythona (przypomnialem sobie, bo wlasnie pisze skrypt :)), wkurza mnie jeszcze to cholerne self na poczatku kazdej metody... przypomina mi sie object ada, ktora bylem katowany na poczatku studiow...
Odpowiadajac na przyszle blyskotliwe pytania, tak, czasami uzywam this w swoich klasach, ale tez nie lubie byc do tego zmuszany.
-- Jiima --
*) mialem wtedy z 16 lat i po roku przerwy usiadlem do swojego projektu pisanego w assemblerze... po czym zapytalem sie siebie "co to do cholery robilo?", bo jako mlody i madrzejszy od wszystkich nie uzywalem oczywiscie komenarzy bo po co :P

no jakie sa jazdy? ja uzywale

no jakie sa jazdy? ja uzywalem eclipse, contexta, notatnika, ultraedita, vima i nie mialem zadnych jazd.

druga rzecz, to w pythonie _jest_ skladnia opcjonalna: rozdzielajac instrukcje srednikami mozesz je upychac w jednej linii do woli. mozesz tez pisac "if costam : zrob_costam(); zrob_cos_jeszcze()". zanim sie cos zacznie krytykowac, warto by sie z tym zapoznac.

a co do wciec, to rozumowanie GvR bylo takie: skoro praktycznie kazdy "powazny" programista ich uzywa, to dlaczego nie wykorzystac tego faktu dla uproszczenia skladni jezyka? dzieki temu mniej jest w niej znaczkow typu (){};, ktore tylko zwiekszaja szum na ekranie. a ze skladnia jest troche mniej tradycyjna, coz... IMHO warto sie przyzwyczaic.

Skladnia...

To akurat wiem. Zdziwie cię pewnie, ale pisuję w Pythonie, chociaż są to na ogół skrypty narzędziowe a nie "poważne" projekty, do tego używam Javy.
Moim zdaniem trudno to nazwać "składnią opcjonalną", o czym mówisz. Szkładnia opcjonalna by była, gdyby NIE trzeba było umieszczać tych instrukcji w jednej linijce.
Co do różnych edytorów, ja akurat miałem spore problemy, jak mi się to wszystko rozjechało, bo dwa edytory róznie interpretowały tabulacje (jeden wstawiał taby a drugi spacje). Odtąd do szybkiego klepania używam SCITE z włączonym wyswietlaniem białych znaków, tak na wszelki suczaj.
A co do przyzwyczajeń, przyzwyczaić się owszem można. Mimo to uważam to za dziwaczne :P
Zwłaszcza jak wczoraj musiałem napisac kawałek kodu w Perlu i notorycznie zapominałem o średnikach... Dzisiaj siadam do Pythona i co piszę? Oczywiście "from parslib import *;" :P

-- Jiima --

eclipse spring hibernate

Mnie bardzo ciekawi, czy istnieje coś na wzór wsparcia Netbeans dla J2EE w eclipsie, wiem, iż jest WTP ale to nie to samo:), a szczególnie jeśli chodzi o spring'a.... jeśli macie coś ciekawego na ten temat, proszę o info...

JEE5 i Eclipse

Niestety nie ma. Najbliżej jest JBoss IDE, które coś tam niby ma. Ale to niewiele.

Z drugiej strony, w zasadzie można obejść się bez "wsparcia". JEE 5 używa adnotacji, które o ile pamiętam obsługuje Eclipse 3.1. Wystarczy dodać odpowiednie runtime. Deskryptory wdrożenia są opcjonalne i dużo prostsze niż w J2EE, więc mając WTP możesz je napisać samemu.

WTP 1.5 ma mieć częściowe wsparcie dla JEE 5, ale z tego co widziałem chyba nie będzie miało. Dopiero następne wydanie (2.0) ma mieć je wbudowane. Jets też coś takiego jak projekt Dali, który zajmuje się warstwą Persistence z JEE5, ale na razie póki co słabo działa. Ma być wbudowany w WTP 2.0

Niestety, MyEclipse też tego nie obsługuje i następna wersja nadal nie będzie. Z drugiej strony używamy persistence (w postaci Hibernate Annotations) w robocie i jakoś brak wsparcia ze strony MyEclipse nam nie przeszkadza...

-- Jiima --

może MyEclipse IDE?

Ja używam do niektórych rzeczy MyEclipse IDE, kosztuje $30, ale dostaje się za to całkiem solidne narzędzie.

Generowanie kodu a wyższy poziom abstrakcji

To jest w ogóle ciekawy problem - jak połączyć wysoką abstrakcję z dużą elastycznością i swobodą poprawiania generowanego kodu.
Hunt Andrew i Thomas David w "Pragmatycznym programiście" zachęcają do stosowania nawet własnych języków wysokiego poziomu i generowania kodu. Wszystko po to, żeby programista pisał jak najmniej, a jak najwięcej pracy przerzucał na komputer.
Zarówno Ruby on Rails jak i różne zaawansowane IDE generują dużo kodu. Ale ten kod trzeba rozumieć, żeby dalej go zmieniać.
Problem polega na tym, że samo utworzenie szkieletu to dopiero początek. Potem program trzeba pielęgnować. Im więcej kodu, tym więcej trzeba czasu na jego czytanie i więcej okazji, żeby zrobić błędy.
Sprawa wygląda inaczej, gdy kod jest generowany za każdym razem podczas budowania aplikacji - wtedy operujemy cały czas na wyższym poziomie abstrakcji i nie musimy nic zmieniać w wygenerowanym kodzie, który traktujemy jako kolejny etap pośredni w kompilacji. Aby to było możliwe, ten "wyższy poziom abstrakcji" musi być wystarczający. Czy programiście wystarczą kreatory? Na pewno nie. Potrzebuje języka.

Ruby jest, jak sądzę, językiem wyższego poziomu niż Java. Czy jest wystarczająco "pojemny", aby dało się w nim zrobić tyle, co w Javie? Tego nie wiem, jeszcze w nim nie programowałem.

Zaletą Ruby jest na pewno zwięzłość. Krótszy kod to mniej do pielęgnacji. Ale, z drugiej strony, Prolog też jest bardzo zwięzły, a jednak mało programów w nim się tworzy...

Co do Unikodu, to być może po prostu Ruby jest jeszcze niedopracowany. Może twórcy języka to naprawią. Ale na razie, rzeczywiście, to jest krok wstecz w porównaniu z Javą, w której obsługa Unikodu jest bardzo elegancka.

Bruce Tate w jednym ma rację: żaden język nie jest wieczny.

jzabiello's picture

Unicode - może nie Ruby, ale.. Python!

Ruby ma kwestię Unicode jeszcze niedopracowaną. Operuje nadal na stringach wielobajtowych (ma to się zmienić w Ruby 2.0). Doskonałą implementację Unicode to ma Python. Ma doskonale zbalansowaną zwięzłość połączoną z czytelnością i elegancją kodu. No i ma konkurencyjny wobec Rails framework - Django. Także ma alternatywę wobec "cięższych" technologii - Zope3.

Python może tak, Zope is zopeless, tzn. hopeless

Co do unikodu, owszem, język Monty Pythona radzi sobie dobrze. Podoba mi się też w nim kompilacja do bytecode i moduły. Ruby tkwi tutaj jeszcze w średniowieczu języków skryptowych, tj. wszystko jest includowane do jednego gigantycznego skryptu, jak nie przymierzając w (tfu) PHP. Jest to o tyle dziwaczne, że Rubyma swój bytecode i prekompilator. Podobnie unicode, jak chcemy go to musimy sami pisać sekwencje utf-8.
Python ma jednak kilka innych wad. Jedną jest kompletny brak hermetyzacji. Drugą brak "cukru składniowego" dla operacji takich jak przeładowywanie operatorów czy tworzenie konstruktorów i właściwości. Wszystko to w Pythonie robi się niestety przez magiczne dwie podłogi jak nie przymierzając w (tfu) starszych wersjach Visual C++. Inne problemy jak brak metod statycznych na szczęście zostały rozwiązane.
Zope natomiast jest dziwaczny. Serwer aplikacyjny działający jak jedno wielkie wiki nie znajduje u mnie innego określenia. Widać wyraźnie, że Zope był tworzony z myślą o CMS-ach i wiki, a jakiekolwiek inne zastosowania są przy okazji. Tymczasem, świat aplikacji enterprise nie kończy się na CMS i wiki, a raczej dopiero zaczyna.
Jest kilka projektów serwerów biznesowych dla Pythona, nie miaŁem jednak czasu przyjrzeć im się bliżej, ale zapowiadają się ciekawie.

Ideałem byłby język łączący zalety Ruby i Pythona... jakby jeszcze dodać do nich opcjonalne silne typowanie (tak jak w JScript.NET, chociaż może nie na zasadzie "Albo silne typowanie albo beznadziejna wydajność" na co choruje ten język), co podobno Guido zapowiadał...
Było by fajnie...
Ale Java nadal będzie z przodu, głównie ze względu na dostęp do narzędzi i bibliotek...

-- Jiima --

jzabiello's picture

Python i Ruby są językami silnego typowania

Dla Rubiego jest tworzona wirtualna maszyna (w stylu javowej). To już działa testowo i daje znaczne przyśpieszenie. Implementacja jednak jest jeszcze niedojrzała, ale Ruby2 ma to posiadać (tak jak i lepszą implementację Unicode). Jest też projekt JRuby, który generuje czysty bytecode Javy (jak komuś mało).

Z tą hermetyzacją Pythona to też przesadzasz. Konwencje Pythona są wystarczające, aby izolować elementy kodu i się nie pomylić. Zasadnicza różnica dotyczy podejścia do programisty. Java na każdym kroku próbuje udowodnić programiście, że wie od niego lepiej, co ten powinien zrobić, żeby nie zrobić sobie krzywdy. Coś w rodzaju "dostaniesz strzelbę, ale bez nabojów, z plastikową lufą i pluszową kolbą, żebyś sobie przypadkiem kuku nie zrobił". Można się wściec, jak ktoś cię przez cały czas traktuje jak przedszkolaka. Z kolei Python zakłada, że "jesteśmy dorośli i jak programista bardzo chce, to po co mu robić pod górke? Niech ma dostęp do wszystkich obiektów". No, ale jak bardzo ktoś bardzo chce większych blokad, to Ruby oferuje wszystkiego co tylko się chce: zakresy, poziomy bezpieczeństwa, zamrażanie obiektów itp.

Co do Zope, to mnie zdziwił ten tekst. Zope jako Wiki? Tak może napisać tylko ktoś kto nie ma pojęcia o Zope. Popatrz sobie np. na Zope4Intranets.

Zaś co do silnego typowania, to też nie wiesz co piszesz, bo zarówno Ruby jak i Python są językami silnego typowania (tak jak Java). Jak byś nie wiedział, to przykładem słabego typowania jest C++ lub PHP.

Zope i inne takie...

Hmm. Maszyna wirtualna... Może, kiedyś... Testowe rozwiązania mnie nie interesują. Kiedyś pracowano nad maszyną wirtualną dla Perla (Parrot), ale projekt zdechł. Dopóki nie zaistnieje jako wydanie stabilne, z mojego punktu widzenia nie istnieje.
JRuby? O ile wiem (a sprawdzałem stronę projektu ze dwa dni temu) nie generuje on nic. To jak na razie jedynie interpreter skryptu i to też nie kompletny. Kompilator bajtkodu jest jak na razie w planach. Jak będzie, pogadamy.
Nie zrozum mnie źle. Lubę Ruby i Pythona. Ale jak na razie to dla mnie zabawki. Mają fajną składnę, miło się w nich pisze, ale jakoś nie widzę by zdobyły świat, za wyjątkiem takich geeków jak ja i (podejrzewam) Ty. Ewenementem jest tutaj koszmarny PHP, który się pomimo swoich wad sprzedał.

Java też ma wady, owszem. Niektóre dość dyskusyjne - np. ja lubie deklarowanie wyjątków i do cholery doprowadza mnie szukanie w MSDN co rzuca jakiś wyjątek w .NET albo C++.

Co do Ruby 2, to w Javie 7 też zapowiadają się rewolucyjne zmiany, więc czas pokaże co z tego wyjdzie.

Hermetyzacja jako wada? Hmm. Śmiała teza. Jakoś niezbyt popularna niestety poza środowiskiem "pytoniarzy", bo nawet fani javascriptu (który też nie ma hermetyzacji) narzekają na jej brak. Zwłaszcza że możliwość "prywatyzacji" części klasy jest wszędzie przedstawiana jako fundament programowania obiektowego...

Co do Zope, źle się wyraziłem. Może nie wiki, tylko CMS. Chodzi o to, że Zope *jest* CMS-em i tym CMS-em jest przesiąknięte do szpiku kości, co widać zwłaszcza po interfejsie administracyjnym. Wszystko robimy przez stronę internetową itd. Promuje przy tym antywzorce, głównie umieszczanie logiki biznesowej na stronie. W skrócie, nie jest to to, czego oczekuję od serwera aplikacyjnego. Na CMS, jak już wspomniałem świat aplikacji biznesowych sie nie kończy.

Co do silnego i słabego typowania, to istnieje wiele teorii, co te pojęcia oznaczają. Prawdę mówiąc, Python nie jest silnie typowany, zarówno pod względem tego, że zmienna może zmieniać typ, jak i pod względem tego, że do każdego obiektu można w dowolnym momencie zrobić jakieś "domieszki". Zgadzam się, że w Ruby jest z tym trochę lepiej. Ale to, czego mi brakuje w tych językach, to wyraźne deklarowanie zmiennych z narzuconym typem, lub z typem "wnioskowanym", jak np. w Nemerle. Czyli możesz napisać v = new String(); ale później nie możesz już pod to v przypisać uchwytu do integera.

C++ słabo typowany??? Gdzie?
Chodzi ci o możliwość zrzutowania dowolnego typu na dowolny? Tego typu numery to raczej C a nie C++ (wbrew pozorom to zupełnie różne języki), C++ podąża zupełnie w przeciwnym kierunku. Owszem, naleciałości C pozwalają traktować każdy obiekt jako tablicę bajtów, ale każdy guru C++ ogłosi przeciwko tobie Jihad jeśli będziesz tak postępować... (nie zaliczam się na szczęście do nich, więc póki co jesteś bezpieczny :P)

Poza tym, przepraszam jeśli uraziłem czyjeś uczucia :)

-- Jiima --

jzabiello's picture

Python, silna kontrola typów itp

Przeciez Python pozwala na prywatyzacje, tylko ze robi to za pomoca innych srodkow. A co do Javy to przeciez mozna zhackowac bytecode i to wszystko jej tez rozwalic jak komus zalezy (i chyba tak nawet jakies biblioteki do Javy robia, nie pamietam szczegolow). Python po prostu nie utrudnia: jesli ktos celowo chce pogrzebac w obiektach, to niech grzebie.

Zope wydaje sie byc przesiakniety CMS, ale nie zgodze sie ze miesza logike z prezentacja. Pewnie chodzi ci o stare szablony dtml. Nie sa zalecane. Zalecane sa ZPT. Poza ty, warto zwrocic uwage na Zope3 (w sumie tylko jego wzmiankowalem gdy napisalem, ze Python ma alternatywe dla ciezkich serwerow aplikacyjnych). Zope3 jest napisany kompletnie od zera i ma opinie znacznie lepszego i szybszego od Zope2.

Co do silnych i slabych typow, to Python ma tak samo silne typowanie jak Java, Ruby czy Smalltalk. Zobacz np. taki kod w Pythonie:

>>> x = 1
>>> print type(x)
<type 'int'>
>>> x = 'blah'
>>> x + 10
Traceback (most recent call last):
  File "<interactive input>", line 1, in ?
TypeError: cannot concatenate 'str' and 'int' objects

Python nie dopuści do koercji ciągu znakowego do obiektu int. To właśnie znaczy że kontrola typów jest ścisła.

Dla odmiany PHP ma słabą kontrolę typów:

$x = "1";
print $x + 2; #=> 3

C i C++ są również językami ze słabą kontrolą typów. Pełno na ten temat info znajdziesz w internecie. Nawet w wikipedii o tym piszą.

Śislej mówiąc: Python, Ruby i Smalltalk są językami z typizacją dynamiczną oraz ścisłą kontrolą typów. PHP jest jezykiem z typizacją dynamiczną i słabą kontrolą typów. C i C++ są językami z typizacją statyczną i słabą kontrolą typów. A Java jest językiem z typizacją statyczną i ściśłą kontrolą typów. Mam nadzieję, że teraz jest jaśniej.

Osobiście, nie lubię statycznego typowania od kiedy poznałem jak się pracuje w językach z typizacją dynamiczną. Właściwie to statyczna typizacja nic nie wnosi poza ułatwieniem optymalizacji kodu dla procesora. Więcej jest za to żmudnego pisania i nie bez powodu się obchodzi te ograniczenia za pomocą rzutowań. Gdyby tak dobrze było ze statyczną typizacją to by nikt nie potrzebował bawić się w rzutowania do innych typów. Poza tym wiadomo, że wszystkich błędnych rzutowań nie wyłapie nawet kompilator Javy. Efekt jest więc taki sam jak w języku z typizacją dynamiczną. O błędzie dowiesz się dopiero po uruchomieniu programu... W świetle coraz powszechniejszych testów jednostkowych, zalety statycznej kontroli typów zdają się wyraźnie blednąć. Wyłapują bardzo niewiele. Testy jednostkowe znacznie lepiej pilnują spójności kodu.

Tak lepiej :)

Oki. teraz sie rozumiemy

Przyznaje, ze Zope3 nie znam. Nawet nie wiedzialem ze istnieje, 2 mnie zniechecila tak ze nie sledze co sie tam dzieje. CMSy mnie po prostu nie interesuja. A w Zope2 nie bylo preferencji wobec dtml czy zpt, wrecz sugerowano ze dla wielu roziwazan dtml jest lepsze, bo pewnych rzeczy w zpt sie nie da.
Za to widzialem kilka innych serwerkow aplikacyjnych dla mielonki z jajkiem i generalnie milo sie rozczarowalem (zwlaszcza po zope i po koniecznosci napisania kolejnego EJB). Nazw w tej chwili nie pamietam, bo zadnego dluzej nie uzywalem - jak mowilem nie placa mi za Pythona...
Co do silnego / statycznego itp.
Owszem, tu masz racje. Jesli za "silne" typowanie uznamy istnienie typow (chocby niejawnych) to Python jest silnie typowany. I zgadzam sie, ze wielu autorow przyjmuje taka definicje. To chyba konczy sprawe. Kwestia, ze "typ" w takich jezykach jak python czy smalltalk (a zwlaszcza javascript) nie ma takiej sily wyrazu jak w Javie, bo w kazdej chwili mozna go zmodyfikowac, to zupelnie inna kwestia.
Co do bytecode engineering, no coz, to juz "wyzsza szkola jazdy" i nie zauwazylem by ktokolwiek robil to w innych celach niz zamierzone "wzbogacanie klas" glownie dla potrzeb J2EE. Hermetyzacja nie jest po to "by w ogole sie nie dalo".
Co do C++, nadal nie wiem, czy mozna mowic o slabym typowaniu. Z C sie zgodze. W C++ jednak istnieje RTTI i nawet po zrzutowaniu uchwytu obiektu na typ void* mozesz przez RTTI dowiedziec sie jakiego jest typu. Masz takie konstrukty jak safe_cast itp. Owszem, nie dotyczy to typow podstawowych, ale to nalecialosc z C.
Co do statycznych typow, akurat ja je uwielbiam. Pomijajac wygode uzywania IDE (ktore w jezykach dynamicznych wymagaja "pomagajek" by sensownie podpowiadac prototypy funkcji), jest wieksze bezpieczenstwo tworzenia kodu. Poza tym wiem, optymalizacja czasu wykonania to dawno zmarly i pogrzebany temat (za pol roku wyjdzie komputer na ktprym nawet to bedzie chodzilo szybko), ale nie dla wszystkich. Calkowicie dynamiczne typowanie mocno spowalnia zabawe, zwlaszcza jak nie bawimy sie interpreterem, a obiekty nie traktujemy jako hasze (co m.in. robia interpretery Pythona i Javascriptu), tylko jako pelnoprawne struktury danych.
Szzerze mowiac, skoro dynamiczne typy sa takie cool, to czemu sie od nich odchodzi - vide ecmascript, type hinty w php5 czy sugestie Guido na temat statycznego typowania w Pythonie? Jedyny jezyk idacy w przeciwna strone to C#, ale mam wrazenie, ze ten jezyk w koncu peknie od nadmiaru bajerow zaczerpnietych z innych jezykow...

unit testy sa OK, tylko kto je stosuje?
-- Jiima --

jzabiello's picture

Dużo się zmieniło

Miałeś do czynienia bardzo dawno w Zope. Bierzący Zope 2.9.3 bardzo się różni od starego. Po pierwsze, z każdą wersją coraz bardziej integruje się z Zope3. Np. Zope3 wchłonął interfejsy z innego, poważnego systemu: Twisted (to ci spece od protokołów, m.in. napisali asynchroniczny serwer www, który w ogóle się nie blokuje). Szablony ZPT od dawna sa promowane w miejsce DTML.

Jeśli chodzi o CMS, to świetnym przykładem możliwości Zope jest Plone. Używam go w kilku serwisach. Jest bardzo potężny i bardzo prosty zarazem. Instalacja to 5 minut. Od ręki dostaje się kompletny system z własnym systemem autoryzacji, obiegiem dokumentów, wyszukiwarką i innymi rzeczami. Plone to przykład możliwości Zope, bo Plone to tylko "produkt" (coś w rodzaju plugina) który dynamicznie się dorzuca do Zope. Takich produktów (o różnym poziomie jakości) jest setki. Zope to duża rzecz. Nie bez powodów korzystają z niego wielkie sieci, rządy, NASA, NATO itp.

Aktualnie z innych pythonowych frameworków na fali jest Django, Pylons i TurboGears. Nie wiem czy im się przyglądałeś. Guido wydaje się sympatyzować z Django. To niezły framework. Chodzi na tym od paru lat kilka cieżko obciążonych, złożonych portali.

Czy będzie odchodzić się od typowania dynamicznego? Raczej w to nie wierzę. Guido coś przebąkiwał o dodaniu opcji określania typów, ale to jest podyktowane tylko chęcią zwiększenia wydajności interpretera i chyba to ślepa uliczka, bo interpreter nigdy nie będzie tak szybki jak kompilator. Zresztą to ma mniejsze znaczenie wobec znacznie większej szybkości pętli sprzężenia zwrotnego interpretera. To jest ważniejsze do bardziej produktywnej pracy. Moc procesorów szybko się podwaja. tego samego nie da się powiedzieć o produktywności programistów. Jest to więc czynnik ważniejszy (zgadzam się tu z Bruce Tate) Poza tym, pośród pythonistas, nikt tych dodatkowych typów nie chce i mam nadzieję że Guido to uwzględni.

Co do Ruby, to Matz coś przebąkiwał o zmianie otwartych klas w Ruby2, ale mam nadzieję że to nie wprowadzi, bo to by wywróciło do góry nogami soft, który działa w Ruby. Wtedy tylko Smalltalk chyba już by pozostał z ideą otwartych klas (tzn. można modyfikować absolutnie wszystkie obiekty, ze stringami i integerami włącznie). Duża część sukcesu Rails wynika z dużej dynamiki Rubiego (nawet większa od Pythona).

Co do C i C++, to kiedyś lubiłem w tym pisać, ale teraz nie mam serca do tego wracać od czasu jak przestawiłem się na inny paradygmat. Przestawienie się z jezyków statycznie typowanych na dynamiczne to nie tylko składnia, to inna filozofia pracy. Od Javy wciąż mnie odrzuca składnia i uciążliwość deklarowania typów i mozolność konfiguracji. Ciężkie jest życie, jak zasmakujesz pracy w Pythonie i Ruby. Nawet na PHP też trudno patrzeć, bo ma koszmarną składnię, chaotyczne funkcje, brak przestrzeni nazw i w ogóle nędzną dynamike i obiektowość (nawet PHP5).

Co do type hints w PHP5... Rozwój tego języka jest jakiś taki chaotyczny, w dużej mierze inspirowany wpierw Perlem i C++m potem Javą, czyli językami z zupełnej innej (statycznej) bajki (poza Perlem, który nie jest statycznie typowany ale ma też paskudną składnię). Mogliby popatrzeć lepiej na Rubiego i Pythona, to by trochę elegancji do kodu prowadzili.

Jakby nie było, współczenie trzeba operować kilkoma językami. Ja równolegle piszę głównie w PHP, Pythonie i Ruby. Jak będę potrzebował dopalacza, to pewnie siądę do C++ aby napisać jakieś rozszerzenie. Na razie nie mam jednak takich potrzeb.

Od testów jednostkowych raczej nie ma odwrotu bo statyczne typowanie jest za słabe aby pilnować spójności kodu. (Rails kładzie na to silny nacisk, testy jednostkowe, integracji i funkcjonalne są częścią tego frameworka i są automatycznie budowane przy próbie tworzenia jakiegokolwiek modelu czy kontrolera). Oczywiście, unit testy znacznie wygodniej się pisze w językach dynamicznych. Jeśli ten trend na extreme programming i unit testing się utrzyma, to rola interpretowanych języków dynamicznych będzie raczej tylko rosła, a nie malała.

Hmm. Możesz polecić coś na

Hmm. Możesz polecić coś na temat tego nowego zope'a bo książki które mam są na etapie wychwalania DTML'a?

Przyglądałem się Django i TurboGear. Fajne, ale wciąż mi czegoś w nich brakuje. Podobnie jak w Rails.

Z resztą Rails i jego pomioty (Grails chociażby, ale nie tylko) są trochę irytujące i pretensjonalne w swojej "wizardyzacji" i generowaniu kodu na siłę. Prawdę mówiąc najlepiej dotąd mi się pracowało jak tworzyłem soft embedded na terminale płatnicze - wszystko pod moją kontrolą, żadnych wizardów i innych cudów pod tytułem "nie zmieniaj tu kodu bo cokolwiek zrobisz i tak kolejny update to skasuje". Nie lubię jak maszyna programuje za mnie, ot co :P

Co do otwartych klas, owszem, czasem się przydają. Ale zauważ, że znakomicie zaciemniają również kod. O debugowaniu nie wspomnę. Z resztą w językach "statycznych" też masz podobne wynalazki, chociażby pod postacią aspektów... które są genialne dopóki nie musisz tego debugować...

Jak dla mnie, jedyne co w Javie przydałoby się zmienić, to dodać kilka "cukierków syntaktycznych" które by skróciły kod i uczyniły go czytelniejszym. Chodzi o przeładowanie operatorów, properties, może jeszcze generatory (choć moim zdaniem więcej one zaciemniają niż ułatwiają), closures (anonimowe klasy to nie to samo...) i klasy częściowe z C#.

Wierzę, że ciężko Ci się przestawić na takie myślenie, widziałem twojego bloga :).

Zgadzam się, że PHP jest okropne. Niestety, zaczyna przypominać worek ze śmieciami, ewentualnie windows 95, gdzie jest wszystko włącznie z wersją 1.0... Składnia obiektowa nie jest taka zła, ale wiele rzeczy jest bez sensu - np. po cholerę interfejsy w języku dynamicznie typowanym???

Co do Perla, nie zgodzę się, że jest "paskudny". Ma swój klimat. Lubię go, może za "inność" w stosunku do mainstreamu. Z resztą Smalltalka i Objective C też lubię - za to samo.

Niestety, nikt mi nigdy nie oferował pracy przy tych językach. Za wyjątkiem Objective C ale za słabo znam środowisko MacOS X żeby sie załapać.

-- Jiima --

jzabiello's picture

Nowy Zope3, inne frameworki

Odnośnie książek do nowego Zope3, to znalazłem dla ciebie wątek na ten temat. TuboGears nie polecam, bo jest oparty na CherryPy, który daleki jest od solidności wykonania. Django jest szybki ale jest troszkę uprofilowany pod kątem dużych portali z elementami CMS. Najbardziej uniwersalny, b. szybki i wyposażony w prawie wszystkie helpery Railsów jest Pylons. Podobnie jak TurboGears, Pylons jest megaframeworkiem, ale zbudowany jest na Myghty. Pylons są b. elastyczne. Możesz wymienić resolver url, system szablonów, pracować w trybie wielowątkowym lub wieloforkowym. Znacznie solidniejszy framework od CherryPy/TurboGears, ma też świetny cache.

Rails nie generuje kodu za ciebie. Coś chyba źle zrozumiałeś. Jego twórcy mają obsesję na pkt. zasady DRY (Do Not Repeat Yourself). Kod jest bardzo krótki i elegancki i prawie nic się nie powtarza. Railsy mają budowe modularną, można łatwo dorzucić np. system autoryzacji lub obiektową obsługę szablonów za pomocą pluginu (ściagany i wkładany do odpowiednich folderów za pomocą generatorów). Rola generatorów ogranicza się do powkładania podstawowych plików w odpowiednie miejsca. Np. razem z kontrolerem czy modelem RoR ci od razu tworzy zalążek testów jednostkowych i funkcjonalnych. Poza tym, RoR ma wersjonowanie struktury bazodanowej. To b. fajna sprawa (migrations).

Co do klas otwartych, to Ruby potrafi zamrozić dowolne obiekty (klasy są też obiektami) tak, że nic nie jest w stanie ich zmienić. Ruby umie też za pomocą systemu zdarzeń kontrolować to, co się dzieje z obiektem. (zobacz jak to działa) Poza tym zarówno Rails, Pylons i Django pozwalają na interaktywną prace z całym frameworkiem. Możesz zatrzymać aplikację i na żywo ją testować z poziomu konsoli.

Perla też kiedyś lubiłem, dopóki nie poznałem Pythona. Perla możesz się uczyć latami i wciąż niewiele wiedzieć. Obiektowość w Perlu to jakaś czarna magia. Zupełnie nieintuicyjnie to tam działa. Wiem, że w Perlu można pisać wiersze. Może to ma swój urok, ale w praktyce jego składnia jest po prostu nieintuicyjna i kod trudny w utrzymaniu.

Mimo dosyć poważnego zainteresowania Ruby i Railsami, nadal uważam, że najbardziej produktywnym językiem jest Python.

Myślę, że znajomość dodatkowego języka dynamicznego typu Python/Ruby jest koniecznością nawet jak nie jest to główny język w jakim ktoś programuje. Jest tylko różnych sytuacji, kiedy jest jak szwajcarski scyzoryk, który szybko rozwiąże problemy do których nie ma sensu pisanie ciężkiej aplikacji.

Oki, kończmy bo wątek mi sie w oknie nie mieści :)

Oki, dzięki za pointery :)

Tak na marginesie, wszystkie te fajne rzeczy o których pisałeś, ja używam w Javie, dzięki aspektom. Polecam pod tym względem Springa, bo AspectJ ma niestrawną składnię. Poza tym jestem leniwy i wole jak IDE podpowiada mi składnię, zaś w Pythonie nie mogę znaleźć odpowiedniego środowiska (próbowałem m.in. Komodo, Erica, PyDev, że o prostszych zabawkach nie wspomnę), większość nie wie CO podpowiadać, ze względu na brak typów najprawdopodobniej... (dziwne, bo w PHP czy JavaScripcie jakoś sobie radzą). Eric jest tu najzabawniejszy - chodzi na jednym moim kompie (tym słabszym) a wywala się na drugim (mocniejszym).

J2EE też obecnie dąży do "don't repeat yourself", czasy 5 plików do opisania jednego enterprise beana mam nadzieję odchodzą w przeszłość, a zabawki takie jak seam potrafią być równie produktywne w prostych zastosowaniach jak rails czy... ASP.NET 2.0.

Co do Pythona, właśnie go tak używam, najczęściej do pisania skryptów które coś sparsują, przerobią czy wrzucą do bazy danych. Chociaż akurat do tego ostatniego częściej używam beanshella (skryptowa java). Do parserów lepszy jest wprawdzie perl, ale rzadko go mają zainstalowanego, a do tej pory instalator active perla był koszmarnie powolny co zniechęcało do instalacji.
Napisałem też kiedyś całkiem spora aplikacje w języku "dynamicznym", co więcej, był to TCL :) i nawet fajnie mi się pisało...

-- Jiima --

jzabiello's picture

WingIDE, ipython i szybka pętla sprzężenia zwrotnego

To prawda, że Python nie potrzebuje aż tak podpowiadania kodu jak Java. Po prostu kodu jest znacznie mniej i wszystko jest znacznie prostsze. Ale jak chcesz mieć lpesze podpowiedzi (od tych edytorów co widziałeś) to zobacz koniecznie co potrafi WingIDE. Zaś co do konsoli, to tylko ipython, który podpowiada metody na poziomie konsoli. Bardzo wygodne. Świetnie to działa np. w Django gdzie dostęp do interaktywnej pracy z całym środowiskiem automatycznie uruchamia ipythona. (wystarczy napisać "manage.py shell" katalogu z projektem) Można interaktywnie wszystko sprawdzać, podglądać obiekty. Doskonała, dynamiczna introspekcja każdego obiektu daje naprawdę duże przyśpieszenie w wyłapywaniu błędów i posuwania pracy naprzód.

Co do produktywności, to uważam, że produktywność Rails jest zupełnie poza mozliwościami ASP.NET czy Javy dla większości projektów małej i średniej skali. Tak szybka pętla sprzężenia zwrotnego jest możliwa tylko dla interpretera. Ilość konfiguracji jest zminimalizowa prawie do zera. Także taki poziom pracy interaktywnej jest praktycznie nie do osiągnięcia dla języków kompilowanych statycznie. Praca oparta na testach jednostkowych również jest naturalniejsza dla Pythona i Rubiego niż Javy czy C++.

Acha, porównywanie produktywności Railsów z Javą na podstawie kilku wbudowanych wizardów dla IDE Javy jest nieuczciwe, bo równie dobrze mogę w 30 sekund zainstalować panel admina Django i niech mi nawet najszybsi dłubacze javy zrobią to równie szybko. Albo jeszcze lepiej, minuta instalacji i mam pełnosprawny CMS (Plone). Takie prównania do niczego się nie nadają, jak się operuje gotowcami.

Nie zgodzę się że Perl jest lepszy do pisania parserów. Do niczego nie jest lepszy od Pythona czy Rubiego. Chyba tylko do tego, aby zamulić kod lub napisać wiersz, który będzie działającym programem.

Python, wszechświat i cała reszta

Dzięki za pointry, jeszcze raz. Przydają się.
Z WingIDE raczej nie skorzystam, szkoda mi kasy, prosze nie wspominać o crackach, wiem że istnieją, tylko co z tego :P. Poza tym interfejs w PyGTK jest takim sobie pomysłem, zwłaszcza że do dzisiaj GTK chodzi tk sobie pod winzgrozą.
Podpowiadanie składni niepotrzebne? Nie wiem. Mi tam jest potrzebne, może to lenistwo, ale... Ostatnio widziałem niezłe podpowiadanie składni w takim edytorku pyScripter. Jego główną zaletą jest to że napisano go w Delphi (cholera, czemu większość tfurców IDE upiera się by napisać je w języku do którego jest to środowisko??? Mam już dość IDE do javy w javie (w C++ byłoby ze 2 razy szybsze), a zwłaszcza IDE do języków skryptowych napisanych w tych językach...)
Widzisz, co do projektów małej i średniej skali, to co do małych to się nimi nie zajmuję. Nie ma z tego kasy. Zaś średnia jest trudna do zdefiniowania. Od jakiego poziomu "szybkość" konfiguracji Railsów zaczyna przegrywać z porządkiem w projekcie Springa? Nie wiem. Ja sobie nie wyobrażam tego co teraz piszę w jezyku skryptowym.
Co do Wizardów, to coś pomyliłeś. Seam i w ogóle JEE 5 to nie żadne wizardy. Podobnie programowanie aspektowe. To raczej próba (całkiem udana) przeniesienia zalet języków skryptowych do poważnych środowisk produkcyjnych. Rzeczy w seam możesz pisać w notepadzie czy scite - tak samo jak projekty w rails - i nadal będą działały bez żadnych wizardów w IDE. Nie są to też żadne gotowce jak plone, więc to porównanie też pada...
Owszem, w JSF fajne jest to, że są do nich edytory wizualne, ale ja tam tworzyłem stronki w JSF bez nich i nawet wyglądały lepiej :)

Co do perla, jesteś wyraźnie uprzedzony, tyle ci powiem. Mam wrażenie, że podobnie jak do Javy i innych profesjonalnych jezyków. Szkoda, bo to utrudnia dyskusję. "Wiersze" w Perlu są żartem i dowodem na elastyczność tego języka, podobnie jak w C istnieje konkurs Obfusated C Contest... tylko że na bogów Eterni nikt tak nie pisze jeśli robi coś profesjonalnego, a zwłaszcza jeśli pracuje w grupie!!! Owszem, w Perlu jest trochę "magicznych znaczków" ale są one też w Ruby i jakoś nikt nie płacze z tego powodu (ja osobiście nazywam je "perlizmami :)"). Zgadzam się, że nie jest to język obiektowy, ale dla małych prjektów jest to często zaleta a nie wada. To, że obiekty są modne, nie oznacza jeszcze, że są niezbędne.

Widzę, że dalej nie ma sensu tego ciągnąć :) Jak będę miał pytania do Pythona to się skontaktuję prywatnie, bo widzę, że sporo wiesz na ten temat, ale nie widzę powodu by zapychać tym forum było nie byŁo poświęcone Javie. Jeszcze ten nieszczęsny PHPowy engine się od tego pzregrzeje i co wtedy :)

Pozdrawiam
-- Jiima --

jzabiello's picture

Końcowe wyjaśnienia

Co do wizardów to miałem na myśli to, co zobaczyłem na demach we flashu odnośnie CRUD'a. Do Perla nie tyle jestem uprzedzony, co zniechęcony, bo wcześniej go nawet lubiłem. Wszystko, co potrafi Perl zrobię znacznie prościej w Ruby lub Pythonie, więc nie widzę powodu aby sobie utrudniać życie.
Zaś co do obiektowości, to nieźle to wygląda w Pythonie. Nie trzeba tworzyć żadnych klas. Piszesz sobie funkcjonalnie plik, który jednym ruchem możesz zamienić w moduł. A warto wiedzieć, że każdy moduł Pythona jest obiektem. Osoby z nawykami po Javie niepotrzebnie tworzą ciągle jakieś klasy. To w ogóle nie jest potrzebne i to jest złym stylem programowania w wypadku Pythona.

Rails bez wizardow

Sila Rails jest fakt, iz nie wymaga ono praktycznie zadnych wizardow ani poteznych narzedzi i srodowisk wspomagajacych programiste. Wystarczy zwykla linia komend i dowolny edytor, taki jaki kto lubi. Wynika to wlascnosci jezyka Ruby, ktore pozwalaja na metaprogramowanie.

W przypadku narzedzi bazujacych na wizardach bardzo prosto da sie rozwiazac pewne standardowe problemy. Jezeli jednak pojawi sie jakis mniej typowy, to mamy klopot, poniewaz nie bedzie sie dalo tego "wyklikac" w wizardzie a trzeba siegac do paskudnego kodu, ktory zwykle generuja wlasnie wizardy. W Rails jest inaczej -- kod jest przejrzysty i bardzo czytelny a jezeli juz cos sie generuje, to tylko po to, aby stanowilo to bardzo ogolna baze wyjsciowa, ktora da sie w prosty sposob zmienic.

Podejrzeam, ze Jiima mial na mysli tzw. scaffolding piszac o wizardach w rails. Osobiscie tylko raz z tego korzystalem i wydaje mi sie, ze mozna to traktowac jak pewna "reklamowke" mozliwosci Rails a nie ficzer, na ktorym to narzedzie jest oparte.

Pozdrawiam.

Generować i dziedziczyć

Mój pomysł na połączenie wysokiej wydajności przez generowanie kodu z elastycznością prawdziwego języka programowania to generowanie klas, z których dziedziczą klasy używane w aplikacji. Jeśli aplikacja pracuje na obiektach klasy np. samochód, to generujemy klasę samochod_gen, a w aplikacji korzystamy zawsze z klasy samochod, dziedziczącej z samochod_gen. Inicjalnie klasa finalna jest pusta, można przeładować te metody, które mają działać inaczej niż wygenerowane. Klasę wygenerowaną możemy zawsze wygenerować ponownie, bo nigdy w niej niczego nie zmieniamy. To nie jest czysta teoria, tak właśnie działa Joperis - generator oprogramowania, o którym będę opowiadał we wtorek na spotkaniu JUG-WAW.

seam

Myślę, że to też warto zobaczyć:
http://www.jboss.com/products/seam/SeamHBTools.html