Hallo Martin,
Die ersten beiden Punkte zu erklären, halte ich noch für sinnvoll, die anderen beiden wiederum nicht. Programmflusssteuerung auf Assembler-Ebene ist nichts, was ich Anfängern beibringen will, weil man da außer Funktionsaufrufen wirklich nur Sprünge und nichts weiteres hat.
und schon allein diese Erkenntnis ist doch interessant.
Bezweifle ich ja nicht. Aber ich halte es für falsch, einen Anfänger mit zu viel Detailwissen über einen spezifischen Prozessor zu überhäufen. Sich mit einem Prozessor auseinandersetzen kann man später immer noch, wenn man mal programmieren kann.
Ich kann mich des Eindrucks nicht erwehren, dass du viel zu sehr auf hochkomplexe, leistungsfähige Systeme und entsprechend entwickelte Programmierkonzepte fixiert bist. Unterschätze nicht die Bedeutung und Verbreitung von kleinen und kleinsten Controllern!
Ich glaube eher, Du bist viel zu sehr auf den Embedded-Bereich fixiert. ;-)
Nichts für ungut, aber die Mehrzahl der Menschen, die was mit Programmierung zu tun haben, sind nunmal nicht im Embedded-Bereich angesiedelt. Der ist zwar enorm wichtig in der Anwendung, aber es arbeiten dort trotzdem viel weniger Programmierer, als in anderen Bereichen (Webentwicklung, Business-Software, ...). Und in eben diesen Bereichen spielen die abstrakteren Ideen der theoretischen Informatik eine größere Rolle, als im Embedded-Bereich.
Zudem bin ich der Auffassung, dass jemand, der eine Hochsprache gut programmieren kann und die Konzepte dahinter verstanden hat, sich viel leichter in Lowlevel-Programmierung einarbeiten kann, als umgekehrt. (Was nicht heißt, dass so jemand keine Schwierigkeiten hat, aber ich bin mir sehr sicher, dass jemand, der mit Lowlevel-Kram angefangen hat, sehr viel mehr Schwierigkeiten hat, wenn er dann später was anderes macht.)
Aber einen Integerwert, der einmal vorzeichenlos deklariert wurde, an einer anderen Stelle vorzeichenbehaftet zu interpretieren, kann oft lästige Fallunterscheidungen und Offset-Jonglage ersparen.
Ja, aber dann bist Du wieder am Mikrooptimieren Deines Algorithmus. Ist für Microcontroller natürlich sehr wichtig. Aber der Programmcode wird dadurch auch um einiges schwieriger zu lesen, d.h. dann darf man gleich wieder anfangen, extrem ausführlich zu kommentieren, wenn man in 6 Monaten noch verstehen will, was der Code da genau macht. Zudem: Compiler sind heute schon extrem gut, würde mich nicht wundern, wenn die das teilweise schon selbst hinoptimieren können mit der Integer-Uminterpretations-Geschichte.
Und auch bei einzelnen Zeichen wird es in Zeiten von Unicode immer sinnloser, da irgend etwas direkt uminterpretieren zu wollen, denn nicht mal UTF-16 kann alle Unicode-Zeichen mit einer Einheit (2 Byte) darstellen, ...
Das ist einer der Gründe, warum ich Unicode nicht mag.
Und was willst Du stattdessen nehmen? Es gibt nunmal extrem viele Schriften (engl. "script", nicht "font") auf diesem Planeten, irgendwie muss man die ja organisieren.
Ich glaube, hier kommt einfach ein anderes Paradigma durch: Du willst, wenn Du programmierst, möglichst genau beeinflussen können, was bei der Hardware ankommt.
Richtig. Ich bin sozusagen eher der Embedded-Programmierer, der diese Philosophie aber gern auch auf größeren Systemen fortsetzt.
Und meine Auffassung ist es, dass diese Philosophie bei komplexeren Systemen zu schlechtem Design führt.
mir ist es viel wichtiger, in einer Programmiersprache einen Algorithmus ausdrücken zu können ...
Das eine schließt doch das andere nicht aus!
Ich finde es unheimlich spannend, für einen PIC eine Divisionsroutine zu schreiben, wenn man weiß, dass man wegen des begrenzten Programmspeichers gerade noch 38 Byte dafür zur Verfügung hat.
Spannend ja, keine Frage (ich interessiere mich ja auch für alles mögliche). Aber wenn ich ein größeres Projekt programmiere will ich mir eben keine Gedanken darüber machen müssen, wie eine Division in der Programmiersprache genau funktioniert, ich will sie einfach nutzen können. Ein Algorithmus fängt bei mir dann erst bei sowas wie Quicksort an, alles darunter muss die Programmiersprache für mich erledigen (und selbst für sowas wie Sortieren erwarte ich eigentlich schon vorimplementierte Algorithmen in der Standardbibliothek der Programmiersprache).
Ich finde es zum Beispiel bei Haskell extrem geil, dass man beliebig große Zahlen als Integer-Werte nutzen kann. Wie das intern umgesetzt wird, weiß ich nicht, ist mir auch vollkommen egal, ...
Siehste, das finde ich unbefriedigend - ich "muss" wissen, wie es gemacht ist, will das Prinzip durchschauen, nicht nur anwenden.
Du verstehst mich vielleicht falsch: Ich habe selbst auch eine inhärente Neugierde, wie etwas funktioniert und halte das nicht für falsch. Mich interessieren Algorithmen, mit denen man beliebig große Zahlen effizient darstellen kann, auch. Allerdings ist dieses Interesse meinerseits rein akademischer Natur: Wenn ich dann tatsächlich ein Programm schreibe, das etwas tun soll, dann will ich vor allem, dass das Programm funktioniert - unabhängig von der Frage, wie genau.
Umso mehr wundert mich bei dieser Einstellung ("der daraus resultierende Code ist mir egal"), warum die gleichen Leute dann bei der Erstellung von Webseiten den Code möglichst komplett von Hand schreiben, anstatt auf die ach so bequemen Tools zurückzugreifen.
HTML programmiert man ja auch nicht. ;-)
(Und ich meine das durchaus ernst, da ist IMHO wirklich ein Unterschied.)
Weil sie Grundlagenwissen schaffen, das der angehende Programmierer eben in vielen Bereichen *doch* wieder braucht.
Real Mode und Segmentierung?
Nu' klammer dich doch nicht an dieser komischen Real-Mode-Segmentierung als Besonderheit der x86-Architektur fest.
Hier hast Du mit dem Zitieren was durcheinander gebracht, wenn Du eine ebene höher Schaust, war das mit "Grundlagenwissen" eine Antwort auf die Frage »Wieso also Konzepte lernen, mit denen man sich während der Lernphase EXTREM ins Knie schießen kann, im praktischen Leben aber in der Form nicht mehr vorkommen?« - und die Frage meinerseits bezog sich schon auf Real Mode und Segmentierung. Und wenn Du darauf mit "Grundlagenwissen" antwortest, dann frage ich halt schon mal nach. Aber gut, dass wir uns einig sind, dass Real Mode nicht zu den Dingen gehört, die man als Anfänger wissen muss. ;-)
Es geht ums Prinzip. Ebenso wie ich bedaure, dass in der Fahrschule heutzutage kaum noch auf die Technik eingegangen wird [...weitere Beispiele...]
Achtung, Du vermischst hier ja zwei Dinge. Mir ging es hier um folgendes: Wie lernt man am geschicktesten überhaupt erst einmal das Programmieren, d.h. womit fängt man an? Es ging mir hier nicht um die Frage: Was wäre ein geeignetes Wissen, was man zum Beispiel aus dem Informatikunterricht in der Schule mitnehmen könnte?
Ich bin nunmal der Auffassung, dass man das Lowlevel-Zeug für das Erlernen der Programmierfertigkeit an sich erst einmal weglassen sollte. Das heißt im Umkehrschluss nicht, dass man das gar nicht lernen soll, nur ist es in meinen Augen ein extrem ungeeigneter Startpunkt. Ich könnte mir daher gut vorstellen, dass man in der Schule in Jahr X im Informatikunterricht "Einfache Algorithmen und Datenstrukturen" and Hand einer Hochsprache lernt und dann im Jahr X+1 erst Lowlevel-Kram macht und sich dann zum Beispiel mal auch Assembler oder C-Derivate auf einem µC ansieht - aber halt eben erst, wenn die Schüler schon programmieren können. Aber mit Assembler anzufangen halte ich für einen großen Fehler, es dürfte extrem wenig Schüler geben, die auf diesem Weg richtig Programmieren lernen können.
Viele Grüße,
Christian