No,Squeak je reimplementacia Smalltalk-u 80, ktory vznikol v roku 1980…
1.je starsi ako C#
Takze „basnicka“ otazka je, naco niekto robi C# ked mame Smalltalk – taky pekny, cisty, dynamicky(ziadne typy) objektovo orientovany jazyk (v podstate prvy!) :-)
v principe mierna nevyhoda Smalltalkov je troska slabsia integracia s OS, a so systemovymi oknami (ale zasa napr. Squeak – bezi nezmenana rovnaka grafika na vsetkych OS, kde je portnuta virtualna masina, „podobne“ ako AWT v Jave)
Vyhody:
vsetko je objekt! :-) – aj cisla
a napriklad na ratanie s cislami je to uplne super:
kym sa da, tak to pouziva efektivnu reprezentaciu (plus minus napr. obycajny integer), ale ked treba, tak vysledkom operacie integer*integer je zrazu „big integer“; a vy sa o to nemusite starat, ci tam nie je pretecenie alebo co.(robi transparentu konverziu medzi typmi cisel podla potrieb operacie, ale pri zachovani kompatibility)
Alebo este krajsie je to pri deleni: 1/100 sa nemusi reprezentovat ako 0.01 ale moze to byt fakt zlomok; takze ani pri mnohych operaciach sa nestraca presnost
Alebo dalsi oblubeny priklad:
ako vyratate faktorial vo vasom C#, ci Jave? V Smalltalku/Squeaku uplne lahko:
10000 factorial.
V podstate objektu „10000“ co je cislo, integer, sa „posle sprava“ factorial == zavolanie metody factorial. a on to v pohode vyrata…
Treba si pockat este na dalsie diely serialu a nedivat sa nato zaujato..
Kdyby jste napsal skutečné výhody, tak to beru. Ale to co jste napsal lze s pomocí dodatečných knihoven zvládnout i v C#, v C++ i v javě.
A množství dodatečných knihoven se do úplnosti jazyka nepočítá. Nezáleží totiž, zda knihovny jsou nebo nejsou standardem jazyka. Vždycky jsou to knihovny. Naopak mě dost vadí, že součastí jazyka je nějaká zpráva „faktorial“. Tam vůbec nemá co bejt. To je věc knihovny, tam to patří.
Ona to byla v zásadě reakce na původní post. Vykřik typu, hele, tenhle jazyk je lepší, protože tenhle kód musím v tomhle jazyce napsat a v jiném jazyce na to zavolám funkci.
A já jen reaguju, že buď si pisatel neuvědomuje, že nesrovnává jazyky ale vybavenost standardních knihoven, a nebo opravdu platí, že součástí jazyka XX je funkce YY jako buildin (tedy ne knihovna), a pak si o takovém jazyku myslím své.
Například v Pascalu funkce write(), která, díky tomu, že Pascal neumí variabilní počet parametrů je buildin.
Máte špatné pocity, alespoň co se C++ týče. Tedy jestli jste myslel, že nahradíte všechny floaty zlomkama, tak to samozřejmě nejde, ale otázkou je, kdo by to měl chtít. Pokud chci plovoucí čárku, použiji float, pokud zlomky, použiji třídu rational. Ta třída má přetížení všechny matematické operátory, takže se s tím pracuje stejně jako s čísly
Jan Vraný dělá svým studentům demo, při kterém udělá pár úprav ve třídě Point a celé prostředí se mu pod rukama pěkně přeskládá. Pak řekne studentům, že pokud mu to předvedou v Javě, dá jim zápočet i bez toho, aby se museli učit Smalltalk.
Ale vážně, existuje celá řada věcí, která se ve Smalltalku dělá podstatně snáze, než v Javě něbo C# (ty jazyky jsou samozřejmě turingovsky úplné).
Ve Smalltalku lze používat kontinuace, což je nedocenitelná věc, pokud např. píšete pořádný webový nebo simulační framework. Má bohatší a rychlejší práci s výjimkami. Má lepší práci s uzávěry.
C#:
static void Main()
{
List<Action> actions = new List<Action>();
for (int counter = 0; counter < 10; counter++)
{
actions.Add(() => Console.WriteLine(counter));
}
foreach (Action action in actions)
{
action();
}
}
Smalltalk:
| actions |
actions := (1 to: 10) collect: [:i | [ Transcript show: i; cr.] ].
actions do: [:action | action value ].
V Javě ani C# si nepřenesete rozladěný program na jiný počítač jiné platformy a tam nedoladíte. Samotné spuštění vývojového prostředí je ve Smalltalku bleskurychlé.
Ve Squeaku ve veškerý kód pod BSD-like licencí. Aplikace ve Smalltalku mohou mít vč. virtuálního stroje třeba 2MB (nejmenší image, co jsem viděl, měla 1337 bytů). Existuje několik aplikací v Apple AppStore napsaných ve Smalltalku, ale asi žádná napsaná v Javě nebo C#.
Mnohem snáze se píší unit testy (všechny testovací frameworky jako JUnit dokonce vycházejí z původní SUnit pro Smalltalk) a vůbec zvráceností, které Smalltalk umožňuje a Java nebo C# prakticky nikoliv, je celá řada.
To je pravda, stale me neprestava prekvapovat, ze cely Squeak se nastartuje za par sekund, zatimco na te same masine se treba Eclipse (coz je rekl bych zhruba srovnatelne _POCTEM_ funkci) a i jeho GUI je takove ucesanejsi a rychlejsi nez AWT (fuj) nebo Swing (no po tech letech vyvoje taky zadna slava).
Rikam si, jestli to neni tim, ze proste Javisti a C++ ari radi delaji x-vrstev ( a pouzivaji uzavrene frameworky), zatimco Smalltalkeri stavajici objekty proste zmeni, takze to ve vysledku je cele mensi a rychlejsi.
To asi těžko. O srovnatelnosti počtu funkcí bych pochyboval, že umíte odhadnout. Nelze zahrnovat jen funkce, které vy používáte. Jen se někdy podívejte, kolik pluginů Eclipse natahuje, a spoustu jich ani nebudete tušit k čemu jsou. Eclipse také při startu kompiluje třídy, dělá to tedy JVM, takže to může být pomalejší. Jinak samozřejmě do Eclipse nevidím, ale jako C++ x-vrstev nepoužívám, nevezmu z internetu kdejaký bastl o kterým nevím, kolik má vrstev. Ale autoři Eclipse to možná dělají jinak…
Není ono AWT jen nativní mapování objektů konkrétního OS? Co vim, tak ve Windows se to mapuje na standardní okna, zatímco Swing si to maluje sám.
No je pravda, ze Eclipse znam o dost lip nez Squeak, takze se to tezko odhaduje. Pluginy Eclipse natahuje jen ty, ktere skutecne pouzivam, to je docela malo (krome SVN pluginu v podstate nic dalsiho). A to, ze Eclipse neco pri startu kompiluje (?) je asi chyba v navrhu ne, tady ma Squeak se svym .image docela vyhodu a mozna proto je i jeho startup o dost rychlejsi?
AWT je skutecne mapovani nativnich widgetu (nazyvaji je „heavyweight“ zatimco ty vetsi a pomalejsi Javovske „lightweight“ :-), tj. na Windows je to WinAPI, na Unixech nejake Motif-like widgety, hlavne se vsak jedna o par typu widgetu, takze napriklad tree nebo neco podobneho tam nenajdete.
To je jen malá špička ledovce ;-) Nějaké příklady…
Všechny metody, které používají řetězec s daným podřetězcem (obdoba je už dávno součást IDE):
CompiledMethod allInstances select: [:method | method hasLiteralSuchThat: [:lit | lit isString and: [lit includesSubstring: ‚browse it‘ caseSensitive: true]]]
Všechny třídy s definovanou instanční proměnnou #sender
Smalltalk allClasses select: [:class | class instVarNames includes: #sender ]
Diky, mozna ze me bude taky heretik :-) V kazdem pripade uz se par mesicu divam po nejakem trosku jinem pristupu k tvorbe webovek nez jak se to dela u „enterprise“ aplikaci, rikam si ze je dobra konkurencni vyhoda mit v zaloze nejakou uplne odlisnou technologii. Takze jeste jednou diky, jdu studovat.
Dynamicky typovaný (lépe říci třídovaný, typy samozřejmě nezná), silně typovaný (třídovaný), primitivní syntax bez zbytečného balastu dovolující krátký, přehledný a rychle psatelný kód bez významových záludností, bez syntaktických konstruktů pro podmínky, iterace, výjimky, výborné využití lambda-kalkulu pro blocks, reflexivní, …
Kdyby měl navíc jen tu blbou jednoduchou syntax, tak je to bomba.