{"id":10515,"date":"2022-01-10T06:33:39","date_gmt":"2022-01-10T05:33:39","guid":{"rendered":"https:\/\/www.q-software-solutions.de\/blog\/?p=10515"},"modified":"2022-01-10T06:33:39","modified_gmt":"2022-01-10T05:33:39","slug":"mal-wieder-was-uebers-programmieren","status":"publish","type":"post","link":"https:\/\/www.q-software-solutions.de\/blog\/2022\/01\/mal-wieder-was-uebers-programmieren\/","title":{"rendered":"Mal &#8222;wieder&#8220; was \u00fcbers Programmieren"},"content":{"rendered":"<p>Wahrscheinich \u00fcberrascht es keinen, wenn ich schreibe, damit verbringe ich einen Teill meines Lebens. Mich haben Programmiersprachen schon immer interessiert und ich habe wirklich einiges auf mich genommen um in bestimmten davon arbeiten zu k\u00f6nnen. Zu meiner Zeit an der Uni war es die M\u00f6glichkeit eiffel zu benutzen.<br \/>\nhttps:\/\/de.wikipedia.org\/wiki\/Eiffel_(Programmiersprache)<\/p>\n<p>Die Idee dahinter scheint mir heute noch eine der wirkich besseren zu sein. Es gibt dort ein Prinzip, nennt sich CQS (command query separation) und es meint. Das nur Methoden den Zustand eines Objektes \u00e4ndern sollte, es in Abfragen aber nicht vorkommt.<\/p>\n<p>Beispiel set_x(some_Value)\u00a0 enth\u00e4lt nur x := someValue<br \/>\nAber get_x():someValue enth\u00e4lt nur result := x<\/p>\n<p>Bei dem einen \u00e4ndert man den Zustand einer\u00a0 Variiablen bei der anderen darf\/sollte man es nicht.<\/p>\n<p>C Programmierer kennen das Problem mit R\u00fcckgabewerten. Wo packt man den\/die hin? In C gibt es kein &#8222;Tupel&#8220; Konzept und man kann nur einen Wert zur\u00fcckgeben, dieser eine Wert kann aber auch ein void* sein und das kann wirklich alles sein. Auf der anderen Seite, wie informiert man den Benutzer, da\u00df etwas schief gegangen ist. Das wird in sehr vielen Bibliotheken eben \u00fcber den R\u00fcckgabewert erledigt. Darum findet man in C so etwas<\/p>\n<p>#define ERROR_SUCCESS 0<br \/>\n#define ERROR_WHATEVER 1<br \/>\nVielleicht in angenehmeren\u00a0 Code in einem enum. Der R\u00fcckgabewert gibt also an ob alles &#8222;glatt&#8220; ging oder nicht, damit ist dannn aber der R\u00fcckgabewert &#8222;weg&#8220; und man mu\u00df sich mit globalen Variablen oder ver\u00e4nderbaren Parmetern behelfen.<\/p>\n<p>Hier zwei L\u00f6sungen aus anderen Programmiersprachen:<br \/>\nhttps:\/\/doc.rust-lang.org\/book\/ch09-00-error-handling.html<br \/>\nhttps:\/\/go.dev\/doc\/tutorial\/handle-errors<\/p>\n<p>In Smalltalks gibt es nur Messages die etwas zur\u00fcckgeben&#8230;<\/p>\n<p>Aber nun kommen wir zu Programmiersprachen, die Seiteneffekte gar nicht leiden k\u00f6nnen und nur auf &#8222;pure&#8220; Funktionen setzen. Das bedeutet, wenn man diese aufruft ergeben die mit denselben Eingabedaten immer, diegleichen Ergebnisse. Die &#8222;dreckige&#8220; Arbeit von Seiteneffekten mu\u00df speziell gekennzeichnet werden. Prominentestes Beispiel d\u00fcrfte Haskell sein (dazu eines der besten B\u00fccher, was man auch online finden kann\u00a0 http:\/\/book.realworldhaskell.org\/read\/)<\/p>\n<p>In jedem Buch wird die &#8222;Reinheit&#8220; der Sprache gelobt, handelt es sich um eine &#8222;unreine&#8220; Methode also mit Seiteneffekten wird es immer irgendei IO type werden, das nennen die Monad.<\/p>\n<p>Nun, die Autoren behaupten es sei der gr\u00f6\u00dfte Vorteil. Ich stimme soweit durchaus mit ihnen \u00fcberein, aber ich behaupte auch es ist der gr\u00f6\u00dfte Nachteil, damit stimme ich als nicht mit Ihnen \u00fcberein.<\/p>\n<p>Ich bin immer mehr zur \u00dcberzeugung gekommen, da\u00df der ausbleibende Erfolg von funktionalen Sprachen damit zusammengh\u00e4ngt. Es sieht so aus als ob Zustand &#8211; Zustands\u00e4nderung -&gt; neuer Zustand f\u00fcr wirklich die allermeisten Programmierer einfacher verst\u00e4ndlich ist und dem normalen Denkmodell entspricht. Was man uns nicht verdenken kann. Sitzen Sie in einem Auto und wollen los fahren, m\u00fcssen Sie etwas tun. Einen Gang einlegen, Kupplung kommen lassen und entsprechend Gas geben, dann f\u00e4hrt ein Auto eben los, der Zustand \u00e4ndert sich von stehendem Auto -&gt; fahrendem Auto.<\/p>\n<p>Ich denke auch, da\u00df eben Zustandver\u00e4nderungen genau das sind was man in allen anderen Bereichen macht. Dieses hinter einem Monad zu verstecken, scheint f\u00fcr mich einer der Hauptgr\u00fcnde zu sein, warum\u00a0 man Funktionale Programmiersprachen nicht in gr\u00f6\u00dferen Bereichen kennt. Betrachtet man unsere gesamte Infrastruktur, dann wird man eher fr\u00fcher als sp\u00e4ter auf C treffen. Trotz aller Probleme damit, trotz der problematischen nebenl\u00e4ufigen Programmierung. So gut wie alle Betriebsysteme benutzen C als Basis und es gilt selbstredend speziell auch f\u00fcr jedes Unix, hei\u00dfe es LInux, BSD, Solaris, HP-UX, AIX. So gut wie jeder relationale Datenbank ist in C geschrieben und manche davon werden tats\u00e4chlich milliardenfach benutzt (z.B. sqlite)<\/p>\n<p>Ich pers\u00f6nlich kenne wirklich kein Programm, welches ich t\u00e4glich benutze, da\u00df in einer funktionalen Sprachhe implementiert wurde. Man kann behaupten, das derzeitige vorherrschende Programmiermodel basiert auf Klassen, Objekten und Messages.<\/p>\n<p>Ja, es ziehen funktionale Elemente in OO-Sprachen ein, aber Bl\u00f6cke sind in Smalltalk ein uraltes Konzept! Kurz die neuen PS m\u00fcssen sich an einer der \u00e4ltesten noch benutzen PS anlehnen. Das finde ich h\u00f6chst interessant und erkl\u00e4rt vielleicht zu einem Teil warum ich Smalltalk f\u00fcr eine der besten Programmiersprachen halte.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Wahrscheinich \u00fcberrascht es keinen, wenn ich schreibe, damit verbringe ich einen Teill meines Lebens. Mich haben Programmiersprachen schon immer interessiert und ich habe wirklich einiges auf mich genommen um in bestimmten davon arbeiten zu k\u00f6nnen. Zu meiner Zeit an der Uni war es die M\u00f6glichkeit eiffel zu benutzen. https:\/\/de.wikipedia.org\/wiki\/Eiffel_(Programmiersprache) Die Idee dahinter scheint mir heute [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[7878,8003,7758,8001,7979,7998],"tags":[],"class_list":["post-10515","post","type-post","status-publish","format-standard","hentry","category-bildung","category-computer","category-it","category-meinung","category-programmierung","category-software"],"_links":{"self":[{"href":"https:\/\/www.q-software-solutions.de\/blog\/wp-json\/wp\/v2\/posts\/10515","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.q-software-solutions.de\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.q-software-solutions.de\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.q-software-solutions.de\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.q-software-solutions.de\/blog\/wp-json\/wp\/v2\/comments?post=10515"}],"version-history":[{"count":0,"href":"https:\/\/www.q-software-solutions.de\/blog\/wp-json\/wp\/v2\/posts\/10515\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.q-software-solutions.de\/blog\/wp-json\/wp\/v2\/media?parent=10515"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.q-software-solutions.de\/blog\/wp-json\/wp\/v2\/categories?post=10515"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.q-software-solutions.de\/blog\/wp-json\/wp\/v2\/tags?post=10515"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}