32
Python vs. Ruby Tobias Schlauch <[email protected]> Tech-Talk, DLR Braunschweig, 23.03.2010

Tech-Talk: Python vs. Ruby

Embed Size (px)

DESCRIPTION

Ein kleiner Vergleich beider Skriptsprachen

Citation preview

Page 1: Tech-Talk: Python vs. Ruby

Python vs. Ruby

Tobias Schlauch <[email protected]>Tech-Talk, DLR Braunschweig, 23.03.2010

Page 2: Tech-Talk: Python vs. Ruby

Folie 2The DLR Software Engineering Network > Schlauch, T.

Übersicht

MotivationDie Kontrahenten im ÜberblickSyntaxSpracheigenschaftenObjektorientierungStringsWerkzeugunterstützung PerformanceVerwendungFazit

Page 3: Tech-Talk: Python vs. Ruby

Folie 3The DLR Software Engineering Network > Schlauch, T.

Motivation

Eine Vielzahl so genannten Skriptsprachen – existiertBeispiele: Python, Ruby, Groovy, Perl, PHP, LISP, Tcl, …Gemeinsamkeiten:

Implizite VariablendeklarationDynamische TypisierungInterpretiertAutomatische Speicherbereinigung

Welche Sprache ist für mich die richtige?Hängt von der Anforderungen ab und erfordert Kenntnisse der jeweiligen Spezifika.Deshalb hier ein Vergleich der populären Skriptsprachen Python und Ruby

Page 4: Tech-Talk: Python vs. Ruby

Folie 4The DLR Software Engineering Network > Schlauch, T.

Die Kontrahenten im ÜberblickPython (1/2)

Entwicklung Anfang der 1990er Jahre durch Guido van Rossum am Zentrum für Mathematik und Informatik in Amsterdam als Ersatz der Programmierlehrsprache ABC

Philosophie - Auszug aus dem Python-Zen:Explicit is better than implicit.Simple is better than complex.Readability counts.There should be one -- and preferably only one --obvious way to do it.If the implementation is hard to explain, it's a bad idea.

Page 5: Tech-Talk: Python vs. Ruby

Folie 5The DLR Software Engineering Network > Schlauch, T.

Die Kontrahenten im ÜberblickPython (2/2)

Weiterentwicklung der Referenzimplementierung durch die Python Software FoundationReferenzimplementierung: CPythonAktuelle Version: 3.1.2 (21. März 2010)

2.6.5 (19. März 2010)

Weitere Implementierungen: Jython, IronPython, PyPy,Parrot, Stackless Python

Lizenz: Python License

Projektseite: http://python.org/

Page 6: Tech-Talk: Python vs. Ruby

Folie 6The DLR Software Engineering Network > Schlauch, T.

Die Kontrahenten im ÜberblickRuby (1/2)

Entwicklung Mitte der 1990er Jahre aus Unzufriedenheit über verfügbare Skriptsprachen durch Yukihiro Matsumoto

Verbreitung zunächst nur in Japan, seit 2000 Bemühungen zur Verbreitung über Japan hinaus ausgeweitet

Philosophie: Principle of Least Surprise

„ Ruby is two parts Perl, one part Python, and one part Smalltalk” - Colin Steele

Page 7: Tech-Talk: Python vs. Ruby

Folie 7The DLR Software Engineering Network > Schlauch, T.

Die Kontrahenten im ÜberblickRuby (2/2)

Weiterentwicklung durch Yukihiro Matsumoto und andere EntwicklerReferenzimplementierung: CRubyAktuelle Version: 1.9.1-p378 (10. Januar 2010)

1.8.7-p249 (10. Januar 2010)

Weitere Implementierungen: JRuby, IronRuby, Rubinius, Cardinal, MacRuby, Ruby Enterprise Edition, …

Lizenz: Ruby License, GPL

Projektseite: http://www.ruby-lang.org/de/

Page 8: Tech-Talk: Python vs. Ruby

Folie 8The DLR Software Engineering Network > Schlauch, T.

SyntaxGemeinsamkeiten

Anweisungen enden ohne Semikolon

Viele Schlüsselworte sind ähnlich

Erzeugung von Listen per []

Erzeugung von Hashes/Dictionaries per {}

Kürzere Quelltexte als vergleichbare Java/C++-Programme

Page 9: Tech-Talk: Python vs. Ruby

Folie 9The DLR Software Engineering Network > Schlauch, T.

Syntax„Hello World!“ - Python

knownGreetings = {"german": ["Hallo Welt!", "Super hier!"],"english": ["Hello World!", "Cool here"]}

def extendedGreetings(language):result = ""if language in knownGreetings:

for greet in knownGreetings[language]:result += greet + " "

return result

print extendedGreetings("german") liefert: "Hallo Welt! Super hier!"

print extendedGreetings("english") liefert: "Hello World! Cool here"print extendedGreetings("unknown") liefert: ""

Page 10: Tech-Talk: Python vs. Ruby

Folie 10The DLR Software Engineering Network > Schlauch, T.

Syntax„Hello World!“ - Ruby

$knownGreetings = {"german" => ["Hallo Welt!", "Super hier!"],"english" => ["Hello World!", "Cool here"]}

def extendedGreetings(language)result = ""if $knownGreetings.has_key? language$knownGreetings[language].each do |greet|result += greet + " "

endendresult

end

puts extendedGreetings("german") liefert: "Hallo Welt! Super hier!"

puts extendedGreetings("english") liefert: "Hello World! Cool here"puts extendedGreetings("unknown") liefert: ""

Page 11: Tech-Talk: Python vs. Ruby

Folie 11The DLR Software Engineering Network > Schlauch, T.

SyntaxUnterschiede zu Python

Einrückung ist freiwillig => Beendung mehrzeiliger Anweisungen durch end

Flexibel einsetzbare Code-BlöckeAufruf von Methoden ohne KlammernAlles ist ein AusdruckImplizites return

Erzwungene Namenskonventionen für Klassen, Variablen, …true, false, nil entspricht True, False, None

Nur nil und false werden negativ in Bedingungen ausgewertetKeyword-Argumente werden durch Hashes emuliertVerknüpfung von Namesspaces durch den ::-Operator

Page 12: Tech-Talk: Python vs. Ruby

Folie 12The DLR Software Engineering Network > Schlauch, T.

SpracheigenschaftenGemeinsamkeiten

MultiparadigmenunterstützungProzedural, Funktional, Objektorientiert

Durch und durch objektorientiert - Alles ist ein Objekt!Variablen sind Referenzen auf ObjekteDynamische, starke Typisierung – a.k.a „Duck Typing“Beliebige Erweiterbarkeit von KlassenDefinition von Methoden auf Klassen- und ObjektebeneUnterstützung von Introspektion und MetaprogrammierungException-Unterstützung (andere Syntax)

Page 13: Tech-Talk: Python vs. Ruby

Folie 13The DLR Software Engineering Network > Schlauch, T.

SpracheigenschaftenUnterschiede zu Python

Starke Unterscheidung der Realisierung der Konzepte Klasse, Attributund MethodeZugriff erfolgt ausschließlich auf Methoden

Python-artige Properties durch optionale KlammerungEinschränkung der Sichtbarkeit durch public, protected, private

Mixins anstatt von MehrfachvererbungUnterstützung von globalen Variablen - $globalVar

Existenz eines Listentyps, der als Tupel, Liste, Queue, Stack verwendet wirdModul- und Pakethierarchien existieren nur per Konvention

Page 14: Tech-Talk: Python vs. Ruby

Folie 14The DLR Software Engineering Network > Schlauch, T.

ObjektorientierungKlassen, Attribute, Methoden in Python (1/2)

class Test(object):

classVar = 1

def __init__(self, instanceVar):

self.__instanceVar = instanceVar

def doSomething(self):

print "I do it.. %i" % self.__instanceVar

self.__class__.classVar += 1

def _doSomething(self):

print "I am protected."

def __doSomething(self):

print "I am private."

Page 15: Tech-Talk: Python vs. Ruby

Folie 15The DLR Software Engineering Network > Schlauch, T.

ObjektorientierungKlassen, Attribute, Methoden in Python (2/2)

t1 = Test(1)

t2 = Test(2)

print Test.classVar liefert: "1"

t1.doSomething() liefert: "I do it.. 1"

t2.doSomething() liefert: "I do it.. 2"

print Test.classVar, Test.classVar liefert: "3, 3"

t1._doSomething() liefert: "I am protected."

t1.__doSomething() liefert: "AttributeError: 'Test' object has no attribute '__doSomething'"

Page 16: Tech-Talk: Python vs. Ruby

Folie 16The DLR Software Engineering Network > Schlauch, T.

ObjektorientierungKlassen, Attribute, Methoden in Ruby (1/2)

class Test@@classVar = 1

def initialize(instanceVar)@__instanceVar = instanceVar

end

def doSomethingputs "I do it.. %i" % @__instanceVar@@classVar += 1

end

def _doSomethingputs "I am protected."

endprotected :_doSomething

...

Page 17: Tech-Talk: Python vs. Ruby

Folie 17The DLR Software Engineering Network > Schlauch, T.

ObjektorientierungKlassen, Attribute, Methoden in Ruby (2/2)

def __doSomething

puts "I am private."

end

private :__doSomething

def self.classVar

@@classVar

end

end

t1 = Test(1)

t2 = Test(2)

print Test.classVar liefert: "1"

t1.doSomething() liefert: "I do it.. 1"

t2.doSomething() liefert: "I do it.. 2"

print Test.classVar, Test.classVar liefert: "3\n3"

t1._doSomething() liefert: "protected m...(NoMethodError)"

t1.__doSomething() liefert: "private m...(NoMethodError)"

Page 18: Tech-Talk: Python vs. Ruby

Folie 18The DLR Software Engineering Network > Schlauch, T.

ObjektorientierungMehrfachvererbung in Python

class A(object):def a(self):

print "Instance of A"

class B(object):def b(self):

print "Instance of B"

class C(A, B):def c(self):

self.a()self.b()

c = C()c.c() liefert: "Instance of A\nInstance of B"

Page 19: Tech-Talk: Python vs. Ruby

Folie 19The DLR Software Engineering Network > Schlauch, T.

ObjektorientierungEinfachvererbung und Mixins in Ruby

class Adef aputs "Instance of A"

endendmodule B

def bputs "Instance of B"

endendclass C < A

include Bdef cab

endendc = C.newc.c() liefert: "Instance of A\nInstance of B"

Mixin

Page 20: Tech-Talk: Python vs. Ruby

Folie 20The DLR Software Engineering Network > Schlauch, T.

Objektorientierung„Duck Typing“ in Python (1/2)

class Bird(object):

def __init__(self, name):self.name = name

def __str__(self):return self.name

class Duck(Bird):def quak(self):

print "quak"

Page 21: Tech-Talk: Python vs. Ruby

Folie 21The DLR Software Engineering Network > Schlauch, T.

Objektorientierung„Duck Typing“ in Python (2/2)

for duck in [Bird("Tweety"), Duck("Dagobert"), object()]:

try:

duck.quak()

except AttributeError:

print "Is not a duck: ", duck

Liefert:

Is not a duck: Tweety

quak

Is not a duck: #<Object:0xd1329>

Page 22: Tech-Talk: Python vs. Ruby

Folie 22The DLR Software Engineering Network > Schlauch, T.

Objektorientierung„Duck Typing“ in Ruby (1/2)

class Birddef initialize(name)

@name = nameend

def to_s@name

endend

class Duck < Birddef quak

puts "quak"end

end

Page 23: Tech-Talk: Python vs. Ruby

Folie 23The DLR Software Engineering Network > Schlauch, T.

Objektorientierung„Duck Typing“ in Ruby (2/2)

[Bird.new("Tweety"), Duck.new("Dagobert"), Object.new()].each do |duck|

begin

duck.quak

rescue NoMethodError

puts "Is not a duck: %s" % duck

end

end

Liefert:

Is not a duck: Tweety

quak

Is not a duck: #<Object:0xd1329>

Page 24: Tech-Talk: Python vs. Ruby

Folie 24The DLR Software Engineering Network > Schlauch, T.

Strings

PythonUnterscheidung von 8-Bit-(binär)- und Unicode-StringsStrings sind generell immutableUnicode-Support ist nativ implementiert

RubyUnterscheidung von Strings (mutable) und Symbols (immutable)Ab Version 1.9 encoding-Methode hinzugefügt und Behandlung von Strings mit unterschiedlichen Encodings verbessertSeparater Unicode-Support (Typ) als Zusatzmodul prototypisch realisiert

Page 25: Tech-Talk: Python vs. Ruby

Folie 25The DLR Software Engineering Network > Schlauch, T.

WerkzeugunterstützungLieferumfang der Referenzimplementierung

PythonInteraktiver Interpreter (python) – GIL!Umfangreiche Standardbibliothek (+)pydoc als Dokumentationswerkzeug (kaum akzeptiert)

Alternativen: Doxygen, EpydocDistutils als Paketverwaltungswerkzeug

Alternative: setuptoolsRuby

Interaktiver Interpreter (irb) – GIL, Garbage Collector!Umfangreiche StandardbibliothekRDoc und ri als Dokumentationswerkzeuge (+)RubyGems (gems) als Paketverwaltungswerkzeug mit Versionierungsunterstützung (+)

Page 26: Tech-Talk: Python vs. Ruby

Folie 26The DLR Software Engineering Network > Schlauch, T.

WerkzeugunterstützungIntegrierte Entwicklungsumgebungen

Für Python und Ruby existieren Integrationen in Eclipse, Netbeans, Komodo sowie weitere Thrid-Party-IDEs existierenTest der Eclipse-Plugins

Python (PyDev)Performance höherAutovervollständigung präziserDebugger-HandlingInteraktive Konsole

Ruby (Aptana RadRails)Refactoring-Unterstützung kompletterUnittest-Integration grafisch unterstützt

Insgesamt für beide zur professionellen Entwicklung geeignet

Page 27: Tech-Talk: Python vs. Ruby

Folie 27The DLR Software Engineering Network > Schlauch, T.

WerkzeugunterstützungUnittests / Code-Coverage / Code-Style

UnittestsEingebaute Unittest-Frameworks sind vorhanden und machen einen guten Eindruck

Code-CoverageVerschiedene Projekte existieren/existierten in Python

coverage.py mit Unterstützung von C0- und C1-Coverage und der Ausgabe in verschiedene Formate ist derzeit die beste Wahl

rcov mit Unterstützung der C0-CoverageCode-Style

Für Python ist derzeit pylint die beste WahlFür Ruby konnte ich kein Werkzeug finden

Hier aber ein paar „ähnliche“ Werkzeuge: http://devver.net/blog/2008/10/ruby-tools-roundup/

Page 28: Tech-Talk: Python vs. Ruby

Folie 28The DLR Software Engineering Network > Schlauch, T.

Performance

Generell ist die Performance von Python 2.X ähnlich einzuschätzen als die von Ruby 1.X bzgl. der Referenzimplementierung

Python 3.X verspricht weitere OptimierungSiehe auch: http://www.testfreaks.com/blog/news/python-and-ruby-performance/Und: http://blog.ianbicking.org/ruby-python-power.html#performance-environment

Für beide existieren JIT-Compiler zur OptimierungPython: psychoRuby: Ludicrous JIT Compiler

Performancekritische Programmbereiche können von beiden z.B. in C/ C++ ausgelagert werden

Page 29: Tech-Talk: Python vs. Ruby

Folie 29The DLR Software Engineering Network > Schlauch, T.

Verwendung und Verbreitung

PythonNutzung in Webframeworks: Django, Pylons, Zope, …Skriptsprache für C++-Programme100-Dollar-LaptopPyPi: 9382 Pakete

RubyWebframework: Ruby on RailsRubyForge und Ruby Application Archive: 7000

TIOBE Programming Community Index (März 2010):http://www.tiobe.com/index.php/content/paperinfo/tpci/index.htmlPython auf Platz 7Ruby auf Platz 11

Page 30: Tech-Talk: Python vs. Ruby

Folie 30The DLR Software Engineering Network > Schlauch, T.

Fazit (1/2)

Generell nehmen sich beide Sprachen nicht viel bzgl. ihrer grundlegenden „Ausdruckskraft“Ruby verletzt die Regeln des Python-Zen und kann Perl ähnlich sehen, was viele Pythonisten abschreckt. Bei genauerem Hinsehen wird deutlich, dass beide Sprache sehr ähnliche Ziele verfolgen, diese aber mit unterschiedlichen Mitteln erreichen. Die Communities von Python und Ruby sind deshalb oft in produktivem Kontakt.http://www.ruby-lang.org/de/documentation/ruby-from-other-languages/to-ruby-from-python/

Lesbarkeit und Wartbarkeit ist meiner Meinung nach bei Python wesentlich höher ausgeprägt!!

Page 31: Tech-Talk: Python vs. Ruby

Folie 31The DLR Software Engineering Network > Schlauch, T.

Fazit (2/2)

Werkzeugunterstützung ist ähnlich gutVorteil Ruby: Es gibt so etwas wie Standardwerkzeuge zur Dokumentation und PackagingVorteil Python: Stärkere Standardbibliothek und bessere Unterstützung im QS-Bereich (pylint!)

Performance ist in den Referenzimplementierungen ähnlich einzuschätzen

Vorteile in der Verwendung und Verbreitung liegen bei Python

Page 32: Tech-Talk: Python vs. Ruby

Folie 32The DLR Software Engineering Network > Schlauch, T.

Vielen Dank!Fragen??

Weitere Quellen:http://de.wikipedia.org/wiki/Python_%28Programmiersprache%29http://de.wikipedia.org/wiki/Ruby_%28Programmiersprache%29