moderne programmiersprache mit intuitiven gleichzeitigen programmierabstraktionen
<p>ich interessiere mich für das erlernen der gleichzeitigen programmierung, wobei ich mich auf die anwendungs-/benutzerebene konzentriere (nicht auf die systemprogrammierung). ich suche eine moderne programmiersprache auf hoher ebene, die intuitive abstraktionen zum schreiben gleichzeitiger anwendungen bietet. ich möchte mich auf sprachen konzentrieren, die die produktivität steigern und die komplexität der gleichzeitigen programmierung verbergen.</p><p>um einige beispiele zu nennen, halte ich es nicht für eine gute option, multithread-code in c, c++ oder java] zu schreiben, da meiner meinung nach meine produktivität verringert ist und das programmiermodell nicht intuitiv ist sprachen, die die produktivität steigern und intuitivere abstraktionen bieten, wie python und das multiprozessor-modul, erlang, clojure, scala usw.), sind gute optionen.</p><p>was würden sie aufgrund ihrer erfahrung empfehlen und warum?</p><p>edit: vielen dank an alle für ihre interessanten antworten. es ist schwer, eine schlussfolgerung zu ziehen, ohne es tatsächlich zu versuchen, da es viele gute kandidaten gibt: erlang, clojure, scala, groovy und vielleicht haskell. ich habe die antwort mit den überzeugendsten argumenten bewertet, aber ich werde alle guten kandidaten ausprobieren, bevor ich mich für einen entscheide :)</p>
<p>sie sollten sich mit ziemlicher sicherheit <a href="http://clojure.org/">clojure</a> ansehen - meiner meinung nach ist es die beste moderne sprache für multi-core-programmierung und äußerst produktiv.</p><p>hauptmerkmale:</p><ul> <li>es ist eine <strong> funktionale sprache </strong>, die sowohl für die parallelität als auch für ihre fähigkeit, sich mit höheren abstraktionen zu entwickeln, von vorteil ist. es verfügt über vollständig unveränderliche persistente datenstrukturen und verzögerte sequenzen, die jedem bekannt sind, der erfahrung mit funktionalen sprachen wie haskell hat.</li> <li>es verfügt über ein sehr neuartiges <strong> software-transaktionsspeichersystem </strong> für den gleichzeitigen sperrenfreien zugriff auf den veränderlichen zustand. das gleichzeitige sicherstellen von code ist oft so einfach wie das einschließen in einen (dosync ....) block.</li> <li>es ist ein <strong> [~ # ~] lisp [~ # ~] </strong> - was es extrem leistungsfähig für die makrobasierte metaprogrammierung und codegenerierung macht. dies kann signifikante <a href="http://www.paulgraham.com/avg.html">produktivitätsvorteile</a> bringen (aufsatz von paul graham - "beating the averages")</li> <li>es ist eine <strong> jvm-sprache </strong> - so erhalten sie nicht nur zugriff auf die große auswahl an bibliotheken und tools in java ökosystem profitieren sie auch von dem enormen technischen aufwand, der dazu beigetragen hat, die jvm zu einer effektiven plattform für gleichzeitige serverseitige anwendungen zu machen. aus praktischen gründen bietet dies einen großen vorteil gegenüber sprachen, die nicht über diese grundlage verfügen auf.</li> <li>es ist <strong> dynamisch </strong> - was zu sehr präzisem code und viel produktivität führt. beachten sie jedoch, dass sie bei bedarf optionale statische typhinweise für die leistung verwenden können.</li> <li>die sprache <strong> basiert auf abstraktionen </strong>, was etwas schwer zu erklären ist, aber der nettoeffekt besteht darin, dass sie eine reihe relativ orthogonaler merkmale erhalten, die sie kombinieren können, um sie zu lösen deine probleme. ein beispiel wäre die sequenzabstraktion, mit der sie code schreiben können, der sich mit jedem "sequentiellen" objekttyp befasst (der alles aus listen, zeichenfolgen, java arrays, unendlich faulen sequenzen, zeilen) enthält aus einer datei gelesen werden etc.)</li> <li>es gibt eine <strong> großartige community </strong> - hilfreich, aufschlussreich, aber vor allem sehr pragmatisch - der fokus in clojure liegt im allgemeinen auf "dinge erledigen".</li> </ul><p>einige mini-codebeispiele mit einer nebenläufigkeit:</p><pre><code>;; define and launch a future to execute do-something in another thread (def a (future (do-something))) ;; wait for the future to finish and print its return value (println @a) ;; call two functions protected in a single stm transaction (dosync (function-one) (function-two)) </code></pre><p>insbesondere lohnt es sich, eines oder mehrere dieser videos anzusehen:</p><ul> <li> <a href="http://www.infoq.com/presentations/value-identity-state-rich-hickey">http: //www.infoq.com/presentations/value-identity-state-rich-hickey</a> </li> <li> <a href="http://www.infoq.com/presentations/are-we-there-yet-rich-hickey">http: //www.infoq.com/presentations/are-we-there-yet-rich-hickey</a> </li> <li> <a href="http://www.infoq.com/presentations/clojure-the-art-of-abstraction">http: //www.infoq.com/presentations/clojure-the-art-of-abstraction</a> </li> </ul>
Ich würde auch gleich mit Java anfangen, wenn du es im Endeffekt sowie so lernen willst. 


Wenn man sich vernünftig dransetzt kann man eigentlich mit jeder Sprache anfangen. was du suchst nennt sich „block based programming“. gibts für arduino auch:

<https://learn.sparkfun.com/tutorials/alternative-arduino-interfaces/all> <p>c hat den vorteil, dass es eine relativ <strong> <em> kleine sprache</em> </strong> ist, was es <strong> macht ) <em> einfach einen c-compiler zu implementieren</em> </strong> (während ein c++ - compiler ein monster zum schreiben ist), und macht es <strong> = <em> leichter die sprache zu lernen</em> </strong>. siehe auch <a href="https://www.tiobe.com/tiobe-index/">tiobe-index</a> , wonach c etwas vor c++ liegt.</p><p>in (imo) abnehmender reihenfolge der rechtfertigung wird c immer noch häufig verwendet</p><ul> <li> <p>eingebettetes zeug<br> es ist viel einfacher, einen c-compiler auf eine kleine plattform zu portieren, als einen c++ - compiler zu portieren. außerdem behaupten c-befürworter, dass c++ "hinter ihrem rücken zu viel tut". allerdings imo das ist fud.</p> </li> <li> <p>systemprogrammierung<br> auch dies ist normalerweise auf die behauptung zurückzuführen, dass es einfacher ist, "zu wissen, was der compiler tut". viele eingebettete programme würden jedoch beispielsweise von vorlagen und anderen c++ - schlüsselfunktionen profitieren.</p> </li> <li> <p>quelloffene software<br> das ist jedoch meistens ein einstellungsproblem: oss hat c immer c++ vorgezogen (während es in großen teilen der branche das gegenteil ist). torvalds irrationaler hass könnte tatsächlich der wichtigste grund dafür sein <em> unter linux</em>.</p> </li> </ul> bei uns kommen stets die modernsten technologien zum einsatz. die meisten webanwendungen programmieren wir mit c# und javascript sowie diversen frameworks. darüber hinaus haben wir webanwendungen mit php und mit der programmiersprache typescript auf der basis von node.js entwickelt. das hosting der webanwendung kann unter windows und unter linux erfolgen. Wenn es etwas mehr sein darf, dann finde ich "Design Thinking" oder auch "Design Sprints" sehr passend. Das ist allerdings beides nichts, was man mal eben in ein kurzes Meeting einbindet, sondern eine komplette Methodik in der es in beiden Fällen auch darauf ankommt, dass man ein möglichst interdisziplinäres Team zusammenstellt, um von den verschiedenen Sichtweisen zu partizipieren und dann in einem strukturierten Prozess zuerst einmal daran arbeitet, eine sinnvolle / lösenswerte Problemstellung zu erarbeiten. Im weiteren Verlauf werden konkrete Lösungsideen erarbeitet, ein Prototyp entwickelt, der dann an echten Kunden verprobt wird. 

Zum Start der Zusammenarbeit eines neuen Teams, bzw. beim Projekt-/Produktentwicklungsstart finde ich das super passend.

Nähere Infos dazu gibt's im Teamprove Blog: [Design Thinking](https://www.teamprove.de/blog/design-thinking-1-innovation-mit-methode?highlight=WyJkZXNpZ24iLCJ0aGlua2luZyIsImRlc2lnbiB0aGlua2luZyJd) oder [Design Sprint](https://www.teamprove.de/blog/design-sprint-mach-s-wie-google?highlight=WyJkZXNpZ24iLCJ0aGlua2luZyIsImRlc2lnbiB0aGlua2luZyJd)

Innerhalb dieser Methoden wird dann durchaus auf andere Elemente wie z.B. verschiedene Brainstorming Techniken gesetzt. Es ist weniger ein Problem, wenn **die Sprachen verschieden** sind, z.B. Spanisch und Chinesisch. Lernst Du aber z.B. Spanisch und Italienisch gleichzeitig, wird das Gehirn sich sehr schwer tun, Gelerntes abzugrenzen.


Japanisch, Norwegisch und Spanisch sind sehr verschieden, einen Zusammenhäng zu Gälisch sehe ich nicht.


Wichtig ist primär, dass die Sprachen **sich abgrenzen**, ansonsten errichtest Du Dir eine zusätzliche Lernhürde, eine Zusatzschwierigkeit, die das Lernen ineffizient macht.


Die **Lerneffizienz für eine Sprache** leidet natürlich dadurch, dass Du noch eine andere Sprache mit ins Boot nimmst. Aber der Gesamtnutzen kann steigen. Insbesondere ist das Nacheinanderlernen nicht besser, da die zweite Sprache die Fähigkeiten und Fertigkeiten der ersten Sprache überdecken kann, wenn man erste nicht wiederholt. Und dann geht es ja wieder in das Parallellernen. In der Schule hatte ich einmal vier Sprachen gleichzeitig, das war sehr anstrengend. Geschadet hat es dem Spracherlernen nicht. 


Bei **asiatischen Sprachen** habe ich aber gemerkt, dass diese schon sehr viel Ressourcen ziehen. Respekt, wenn Du neben einer asiatischen Sprache noch weitere Sprachen lernst.


**Man kann schnell an die Grenzen seiner Aufnahmefähigkeit stoßen**. Also überprüfe Dich immer, dass Du Dich nicht übernimmst, ansonsten geht die Effizienz insgesamt in den Keller. <p>ja, es ist einfach eine wiederkehrende phrase im titel mehrerer artikel, beginnend mit einem paar in den 70er jahren, in dem sussman und steele die verwendung der lambda-rechnung für die programmierung anhand eines minimalistischen lisp-dialekts mit dem namen " <a href="http://en.wikipedia.org/wiki/scheme\_%28programming\_language%29">schema" demonstrieren</a> "sie haben für diesen zweck entwickelt. sie finden <a href="http://library.readscheme.org/page1.html">die papiere selbst hier</a> ; sie sind interessant und überraschend relevant.</p><p>ich bin mir nicht sicher, ob dies jemals explizit angegeben wird, aber es ist klar (aus dem kontext, nachdem ich die artikel gelesen habe und den allgemeinen hintergrund und die forschungsinteressen der autoren kenne), dass der satz einfach ein eingängiger slogan für ihre behauptung ist, dass lambda-abstraktionen sind als rechnerisches grundelement nicht nur universell im formalen sinne (in der lage zu sein, ein programm auf irgendeine weise zu codieren, wie umständlich es auch sein mag), sondern universell in einem <em> praktischen </em> spüren, dass jedes in anderen sprachen vorhandene konstrukt, auch solche, die von grund auf eingebrannt wurden, in einer sprache auf lambda-basis auf eine weise implementiert werden kann, die sowohl effektiv als auch natürlich zu verwenden ist.</p><p>der wiederholte satz führt zu der offensichtlichen verallgemeinerten form "für alle x ist lambda das ultimative x", was der sinn ist, den ich allgemein als "lambda the ultimate" als blognamen verstanden habe, wobei ich feststelle, dass sich ltu mit der programmiersprache befasst design und theorie. ironischerweise wäre ltu wahrscheinlich auch einer der besten orte, um jemanden zu finden, der ihnen etwas erzählen könnte, für das lambda <em> nicht </em> die ultimative implementierung ist. :]</p><p>beachten sie auch, dass sussman einer der autoren von <a href="http://mitpress.mit.edu/sicp/"> sicp </a> ist, einem sehr einflussreichen lehrbuch, das auch die schemasprache verwendet und viel zeit damit verbringt, lambda-abstraktionen als einzuführen ein konzept.</p> Jython Compiler bietet nicht viel Optimierungs Entscheidungen. Da jedoch die Java Virtual Machine (Java) und vielleicht Compiler (javac) im Backend oder zur Laufzeit aufgerufen zu werden, sollten Sie einen Blick auf sie nehmen.


Java hat unterschiedlichen Laufzeitschalter je nach verwenden, ob Sie es als Server-Prozess starten wollen, Client-Prozess, etc. Sie können auch, wie vielen Speicher sagen zuzuteilen. <p>wenn dies meine entwurfsentscheidung wäre, würde ich wahrscheinlich eher eine option c (modifizierte option a) wählen.</p><h3>erstens, warum nicht 'option b':</h3><p>zum einen gefällt mir die klarheit, dass jedes produkt seinen eigenen tisch hat. wenn es sich nur um eine große tabelle mit einem feld zur bestimmung des typs handelt, ist die beziehung nicht so klar.</p><p>zum anderen würde die indizierungsstrategie immer erfordern, dass dieses typfeld aufgelistet wird. da es sich nur um 4 typen handelt, ist die indexkardinalität extrem niedrig (<code>select * from product\_table where type='x'</code> führt im grunde sowieso einen vollständigen tabellenscan durch)</p><h3>option c.</h3><ul> <li>erstellen sie eine übergeordnete tabelle, die nur die spalten enthält, die alle typen gemeinsam nutzen</li> <li>erstellen sie jeden produkttyp als eigene tabelle mit ihren einzelnen spalten, mit einem zusätzlichen: ein link zur übergeordneten tabelle</li> <li>erstellen sie jede 'link'-tabelle: product\_option, model\_option usw. mit links zu den jeweiligen schlüsseln.</li> <li>für diejenigen mit wechselseitigen links (model\_option, option\_model) erstellen sie auch diese tabellen. dies erhöht die klarheit ihrer joins für alle, die sich das ansehen.</li> </ul><p>der nachteil ist die komplexität, sicherzustellen, dass waisen vermieden werden, wenn dinge aktualisiert/gelöscht werden, und zunächst die abfragen zu entwerfen, die diese tabellen verwenden.</p> <p>ein standard-fortschrittsbalken und eine anzahl von karten wären wahrscheinlich ausreichend. ich bin jedoch der meinung, dass dies etwas ist, bei dem sie ein bisschen kreativ sein könnten: der effekt eines streudiagramms könnte nizza sein, sie könnten auch die neuesten pixel am hellsten machen und die älteren verblassen lassen.</p><p>wenn sie das generierte pixelplot in bezug auf die leistung speichern, sodass es nicht jedes mal berechnet werden muss, wenn es angezeigt wird, sollte dies wirklich kein problem sein. ich denke, ich würde nicht das canvas-tag verwenden, sondern ein vom server generiertes image. die aktualisierungsaktion selbst sollte nicht zu kompliziert sein: sie müssen nur das bild abrufen, das sie bereits haben, und das letzte update (oder aktualisierungen seit dem letzten rendern des bildes) abrufen und genau diese pixel ändern. wenn sie sie nach zeit verblassen möchten, verblassen sie zuerst das bereits vorhandene bild und fügen sie dann den neuesten zeitstempel der überblendungsaktion hinzu, sodass sie dies nur einmal am tag oder einmal pro stunde oder was auch immer tun. (sie können es auch bei jedem schritt tun.)</p><p>jetzt ist es weitaus komplexer als nötig, um nur fortschrittsinformationen bereitzustellen. aber es könnte eine sehr nette funktion sein und interessant zu bauen sein! und ich denke, es ist sehr machbar, es so zu implementieren, dass es ihre ressourcen nicht belastet.</p>