Erklärt mir die Faszination Go

Alles, was nicht direkt mit Python-Problemen zu tun hat. Dies ist auch der perfekte Platz für Jobangebote.
Antworten
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Hi,

Habe die Tage etwas über Go rumgelesen und ich verstehe nicht ganz was die Leute daran so toll finden. Letztens etwa auf HN:
  • Die Dokumentation ist komisch. Ich habe davor "The D Programming Language" gelesen was exzellent war, aber Mark Summerfields Buch überzeugt mich wenig und das Go Phrasebook ist an sich zwar gar nicht schlecht, wirkt aber teils eher die ein Repo mit Codesnippets und jeweils einer Seite Erklärung, ohne Struktur.
  • Die Fehlerbehandlung ist eigenwillig. Ich hätte gedacht wir hätten in den 34 Jahren seit C gemerkt dass unbehandelte Fehler schlecht sind. Die Tatsache dass Go-Funktionen mehrere Rückgabewerte via ner Slice haben können ist nett, aber ich finds letztendlich ähnlich schwach wie die (return_value, errorcode)-Callbacks in Node, die auch kaum einer sinnvoll behandelt.
  • Der Compiler ist seltsam. Google Go kann nur statische Executables und gccgo macht Goroutines zu OS-Threads, womit ein Teil des Vorteiles von Goroutinen verfliegt. Davor hießen die Compiler nach nem seltamen 5, 6, 8-Schema und es wirkt alles so etwas Plan 9-Fremdkörperartig, wie von Leuten geschrieben die Syntax Highlighting für ne schlechte Idee halten (sam anyone?)
  • Mutable Datenstrukturen. Gerade für ne Sprache die so auf Concurrency ausgelegt wird find ich die Handhabung von mutablen Datenstrukturen etwas lasch. Da hat man sich in D wie ich finde deutlich mehr Gedanken gemacht.
  • Die Syntax: ist meiner Meinung nach weder C noch irgendwas elegantes. Sie existiert halt, aber sonderlich viel mehr positives fällt mir da nicht auf.
  • Das Typsystem: ich weiß ehrlich nicht ob ich es gut finden soll. Es wirkt wie C mit dynamic typing irgendwo eingeworfen.
Kann mich jemand bitte aufklären warum so viele (auch Python)-Programmierer so darauf abfahren? Die Sprache wirkt auf mich eher verschroben als wie wenn sie reale Probleme lösen würde, so wie D. Wobei ich bei D auch vermute dass die Sprache trotz vieler Ideen die mir echt gut gafallen haben etwas zu kompliziert ist. Aber vielleicht hab ich ja einfach etwas übersehen? Ich war von Clojure anfangs auch nicht begeistert und nun ists mein Lieblingslisp :)

Vielleicht ist das was ich suche auch eher Rust, aber das hab ich mir bisher auch gar nicht angeschaut.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
BlackJack

@Leonidas: Es ist von Google, also muss es gut sein? Eine andere, handfeste Erklärung fällt mir auch nicht ein. Ich mag die Sprache jedenfalls nicht.
webspider
User
Beiträge: 485
Registriert: Sonntag 19. Juni 2011, 13:41

Ich vermute ebenfalls, dass die Go-Fans sich Rust nicht genauer angesehen haben. Nach meinen wenigen Erfahrungen mit Scheme, habe ich vor Clojure zu probieren da es am ehesten praxis-tauglich zu sein scheint. Und wegen Overtone natürlich. Solche Projekte ziehen Leute an und in Sachen Rust ist das bekannteste davon Mozillas Servo.
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Go ist halt 08/15 imperative Sprache irgendwie an concurrency genagelt. Das ist nicht schön, elegant oder sonderlich innovativ tut aber genau was es soll, lässt sich ernsthaft einsetzen und finden viele irgendwie besser als node.

D ist der kleine Bruder von Scala, viel zu kompliziert, weiß irgendwie selbst nicht so ganz welches Problem es konkret löst und kann im Gegensatz zu Scala und Go selbst Marketing nicht.

Rust hat andere Ziele als Go, ist jünger, wesentlich mehr low-level, hat effektiv keine standard library und lässt sich nicht ernsthaft einsetzen es sei den man arbeitet am Compiler oder ist bereit den Code ständig wegen Änderungen an der Sprache neuzuschreiben.

Fazit: Wenn man "web-scale" sein will und concurrency braucht nimmt man Go oder Node, deswegen ist Go populär.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Was mir jetzt noch aufgefallen ist, ist die etwas schwache String-Handhabung von Go. Das ist in etwa Python 2-Niveau. UTF-8 schön und gut, aber wenn man versucht Slices darüber zu machen geht es ebenso kaputt. Fürs Web wo man ja doch eher öfter als seltener mit exotischeren Codepoints zu tun hat find ich das sehr schade, da man durchaus die Chance hatte es von Anfang an "richtig" zu machen. Es macht halt den Eindruck C zu fixen, aber halt nicht so richtig. So ein wenig wie Python 3, dessen größte Konkurrenz eben Python 2 ist.

D kann halt kein Marketing weil es dafür keine akzeptablen Compiler gibt, also selbst wenn man es nutzen will ist man recht aufgeschmissen. ;) Aber Ähnlichkeinen zu Scala sehe ich da eigentlich nicht. Es wirkt wie ein low-level Java mit vielen, vielen zusätzlichen Features die aufgrund der Hardwarenähe nützlich sind. Aber ja, komplex ist es schon.

Aber gut, wenn die Faszination an Go einfach "Node ohne JavaScript" ist, dann versteh ich das dann, danke. Hatte eher nach einem besserem C gesucht, die Nische scheint immer noch frei zu sein. :?
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Naja die Nische besseres C bzw. C++ will Mozilla mit Rust füllen.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Vielleicht sollt ich mir Rust anschauen, aber was mich davon abhält ist eben der frühe Entwicklungsstand wie du bereits geschrieben hast.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
seishin
User
Beiträge: 87
Registriert: Montag 19. Dezember 2011, 16:42

Bei Go empfinde ich höchstens go...

Ich denke Rust lohnt sich um es mal zu beschauen, schließlich schmeißt Mozilla Gecko hin und entwickelt derzeit auf Rust Basis eine neue engine (names Servo), mit Samsung zusammen. http://blog.mozilla.org/blog/2013/04/03 ... er-engine/

Der Code liegt auf github: https://github.com/mozilla/servo

Da ich deine Meinung schätze, würden mich deine Erkenntnisse zu Rust sehr interessieren.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Also, ich habe mir das Tutorial angeschaut. Die Syntax ist ein wenig zusammengewürfelt aus C++ (::, Geschweifte Klammern), Python (ungeklammerte Conditions), Haskell (Compilerparameter in Sourcefiles, ähnlich zu GHC) und Ruby (Blöcke) aber eigentlich ganz ok. Eher unüberraschend, was ich aber gar nicht schlecht finde. Wenn sie noch so ein Tool wie `go fmt` mit in die Stdlib werfen dann wär das sogar recht positiv.

Gefallen tun mir natürlich Pattern Matching (muss man mal schauen ob mit oder ohne Guards, weil die finde ich ziemlich wichtig), Tupel, Traits, Expressions, eventuell der Ansatz zu Mutabilität aber das müsste man in der Praxis testen, das Konzept vom Besitz von Pointern ist interessant da das Idiom ja öfter anzutreten ist in C-Code (libpython, libarchive). Die Tatsache dass es keine Null-Pointer gibt ist interessant, ich bin ein Riesen-Fan von Option/Maybe-Typen. Von Concurrency sieht man im Tutorial nichts, aber "lightweight tasks with message passing, no shared memory" klingt recht gut, wenn das auf ne elegante Art gemacht ist so dass die Nutzung dieser Tasks einfach und natürlich gemacht ist, dann könnte auch das zu den positiven Seiten zählen. Exception handling sieht man auch nicht, aber "unrecoverable unwinding with task isolation" klingt wie Task-lokale Exceptions mit einem Feld-und-Wiesen-Exception-System wie man es aus den meisten modernen Sprachen kennt.

Das Implementieren von Methoden ist Go recht ähnlich, aber was etwas hässlich ist dass man da selbst drin matchen muss, da ist die Art wie Go das regelt gefällt mir an der Stelle etwas besser (Multimethod-Style). Im Tutorial wurde was von GC erwähnt, aber nicht genau ausgeführt, daher nichts dazu. Ebenfalls nichts zu Strings.

Von den Makros bin ich vom ersten draufschauen wenig begeistert. Erinnert etwas an CamlP4 und selbst in OCaml versucht man von CamplP4/CamlP5 wegzugehen zu etwas was normalsterbliche auch benutzen können. Wovon ich auch recht wenig begeistert bin ist dass man explizit wählen muss wo man Sachen allokiert. Da hat Go mit automatischer Detektierung was auf dem Heap soll die Nase vorne.

Das zu Rust, ohne jetzt damit gearbeitet zu haben. Momentan eignets sich für mich eher nicht für das was ich machen will, dafür ist das Ökosystem etwas zu klein und die Tatsache dass es nur einen Compiler gibt (der auf LLVM basiert also auch ewig und zwei Tage baut). Sehr lustig ist der Abschnitt zur Entwicklung des Klassensystems in Wikipedia :D Ich meine gehört zu haben, dass Mozilla 2013 eine "stabile" Version veröffentlichen will. Worauf ich besonders gespannt bin ist, wie das mit den Libraries in der Realität ablaufen wird - Go macht es ziemlich einfach Code zu nutzen, direkt von GitHub.

Generell: bisher bin ich eigentlich recht zufrieden was ich gesehen habe. Nicht so innovativ wie D, aber auch deutlich weniger komplex. Ich könnte mir jedenfalls vorstellen diese Sprache als besseren Ersatz für C oder C++ zu nutzen.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
seishin
User
Beiträge: 87
Registriert: Montag 19. Dezember 2011, 16:42

Dufte, herzlichen Dank dafür :)

Bleibt ab zu warten ob es die Performance von C schlagen kann, sonst denke ich eher eine Alternative als ein Ersatz.
C++ kenne ich dazu allerdings etwas zu wenig, weniger als C.

Würdest du denn sagen das man auf die stabile Version warten sollte? Auch bezüglich der Libraries?
Rein vom Gefühl her? Oder meinst du es lohnt sich es mal anstatt C zu nutzen, so sich eine Gelegenheit ergibt?

Derzeit schaue ich mir ab und an, so es meine Zeit zulässt Objectiv-C unter OSX an... so ganz sicher bin ich mir da allerdings auch noch nicht was ich davon halten soll. Aber für OSX Gedöns ja fast unumgänglich. Hast du damit mal etwas gemacht?


Gruß und Danke noch mal.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

seishin hat geschrieben:Bleibt ab zu warten ob es die Performance von C schlagen kann, sonst denke ich eher eine Alternative als ein Ersatz.
Das wäre mir nicht so wichtig. Solange es nah genug drankommt ist mir das egal. Performance ist auch ein Ziel von Rust, ich glaube daher wurde generelle TCO auch vom Plan gestrichen.
seishin hat geschrieben:Würdest du denn sagen das man auf die stabile Version warten sollte? Auch bezüglich der Libraries?
Rein vom Gefühl her? Oder meinst du es lohnt sich es mal anstatt C zu nutzen, so sich eine Gelegenheit ergibt?
Ich würde auf eine stabile Version warten. Also in letzter Zeit scheint sich einiges geändert zu haben so dass man seinen Quellcode öfter mal umbauen müsste. Und gerade da ne stabile Version am Horizont ist, würde ich einfach etwas warten (auch wenn natürlich auch nach einer stabilen Version erst noch Libraries erscheinen müssen und das Ökosystem sich erstmal etablieren muss).
seishin hat geschrieben:Derzeit schaue ich mir ab und an, so es meine Zeit zulässt Objectiv-C unter OSX an... so ganz sicher bin ich mir da allerdings auch noch nicht was ich davon halten soll. Aber für OSX Gedöns ja fast unumgänglich. Hast du damit mal etwas gemacht?
Dafür kenne ich Objective-C zu wenig, aber das was ich davon höre begeistert mich nicht sonderlich. Für OS X-Kram soll das Ruby-Binding relativ gut sein, ich meine mich zu erinnern das sma mit dem ObjC-Bindings für Ruby deutlich zufriedener war als mit PyObjC.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
snafu
User
Beiträge: 6738
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

@Leonidas: Kannst du mal nen Link zu dem von dir verwendeten Tutorial hier reinsetzen?

EDIT: Es war vermutlich dieses...?
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

snafu hat geschrieben:EDIT: Es war vermutlich dieses...?
Exakt.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
mkesper
User
Beiträge: 919
Registriert: Montag 20. November 2006, 15:48
Wohnort: formerly known as mkallas
Kontaktdaten:

seishin
User
Beiträge: 87
Registriert: Montag 19. Dezember 2011, 16:42

Habe ich mir neulich ebenfalls mal rein gezogen... finde die Sprache ebenfalls überaus interessant.
Zum Ende des Jahres soll wohl eine erste stabile Version heraus kommen, dies wäre sehr schön.

Hier mal ein Interview mit einem der Sprachentwickler: http://www.heise.de/developer/artikel/G ... 16345.html

Hier noch die Info zu ersten stabilen Version: http://www.heise.de/developer/meldung/M ... 11044.html


edit: Was mir noch eingefallen ist: RUST Eclipse Plugin: http://reidarsollid.com/2012/03/27/rust ... r-eclipse/
deamon
User
Beiträge: 63
Registriert: Mittwoch 8. Oktober 2008, 11:14

Ich habe eine Weile mit Go experimentiert, aber produktiv werde ich damit nicht. Man muss sehr viel "zu Fuß" erledigen und kann sich nicht so elegant ausdrücken wie in Python oder zum Beispiel Scala.

Meine Erfahrungen mit Go habe ich in dem Artikel Pro und contra Go zusammengefasst.
Benutzeravatar
snafu
User
Beiträge: 6738
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Falls es jemanden interessiert: Go unterstützt jetzt die Art von Slicing-Syntax, wie man sie von Python kennt (aber wohl nur für Arrays).
http://golang.org/doc/go1.2#three_index
derdon
User
Beiträge: 1316
Registriert: Freitag 24. Oktober 2008, 14:32

snafu hat geschrieben:Falls es jemanden interessiert: Go unterstützt jetzt die Art von Slicing-Syntax, wie man sie von Python kennt (aber wohl nur für Arrays).
http://golang.org/doc/go1.2#three_index
Ähm, du verlinkst etwas, wo steht, dass sowohl Arrays als auch Slices bei der neuen Syntax unterstützt werden behauptest aber, dass das nur mit Arrays geht? Beispielsatz aus dem verlinkten Artikel:
Go 1.2 adds new syntax to allow a slicing operation to specify the capacity as well as the length. A second colon introduces the capacity value, which must be less than or equal to the capacity of the source slice or array, adjusted for the origin.
Und es funktioniert nicht so, wie man es von Python kennt: In Python hat der dritte Wert die Bedeutung eines "steps", einer Schrittweite. ``range(1,11)[2:8:2]`` ist in Python gleich ``[3, 5, 7]``. In Go gibt solch ein Versuch dagegen einen Fehler: http://play.golang.org/p/l5fe7tdfPt. In Go ist der dritte Wert dazu da, die "capacity" (maximale Größe) des Slices anzugeben (Auch das steht in deinem verlinkten Artikel bzw. meinem eingefügten Zitat). Z.b. kann ich in Go mit ``slice[:5:8]`` die ersten 5 Elemente von `slice` bekommen und gleichzeitig sagen, dass dieser Slice maximal 8 Elemente enthalten darf (Slices können "wachsen").
Benutzeravatar
snafu
User
Beiträge: 6738
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Dann habe ich das wohl falsch verstanden... :oops:
Antworten