Wie können Kalkül und lineare Algebra für einen Systemprogrammierer nützlich sein? [geschlossen]


10

Ich fand eine Website, auf der stand, dass Kalkül und lineare Algebra für die Systemprogrammierung notwendig sind.

Soweit ich weiß, geht es bei der Systemprogrammierung um Osdev, Treiber, Dienstprogramme usw. Ich kann einfach nicht herausfinden, wie hilfreich Kalkül und lineare Algebra dabei sein können. Ich weiß, dass Kalkül in der Wissenschaft mehrere Anwendungen hat, aber in diesem speziellen Bereich der Programmierung kann ich mir einfach nicht vorstellen, wie wichtig Kalkül sein kann.

Die Informationen befanden sich auf dieser Website: http://www.wikihow.com/Become-a-Programmer

Bearbeiten: Einige Antworten hier erklären die Komplexität und Optimierung des Algorithmus. Als ich diese Frage stellte, versuchte ich, den Bereich der Systemprogrammierung genauer zu definieren. Die Komplexität und Optimierung des Algorithmus kann auf jeden Bereich der Programmierung angewendet werden, nicht nur auf die Programmierung des Systems. Das könnte der Grund sein, warum ich zum Zeitpunkt der Frage nicht in der Lage war, mir ein solches Denken auszudenken.


6
Es ist weniger eine direkte Anwendung als vielmehr eine Änderung Ihres Denkprozesses.
SomeKittens

3
Ich mache nicht viel Systemprogrammierung (ok - ich mache keine), aber ich stelle mir vor, dass, wenn Sie eine Reihe von Leistungstests durchführen und statistische Analysen der Ergebnisse durchführen möchten, Kalkül und lineare Algebra dies könnten komm in das Spiel. Sie werden möglicherweise auch für die Komplexitätsanalyse von Algorithmen benötigt.
FrustratedWithFormsDesigner

2
@ Telastyn: Wirklich? Das ist interessant. Wie funktioniert das?
FrustratedWithFormsDesigner

2
Können Sie einen Link zur Website bereitstellen? Möglicherweise wird ein Kontext hinzugefügt, der Ihnen hilft, eine genauere Antwort zu erhalten.
Caleb

2
@FrustratedWithFormsDesigner - Die Analogie von einem Wert zu einem Zeiger ist wie eine Ableitung. Sie beginnen mit einer Funktion und leiten sie ab, um eine neue Funktion zu erhalten, die etwas anderes bedeutet (ein int, das sich eher auf eine Speicheradresse als auf eine Zahl bezieht). Sie können sogar die zweite Ableitung (einen Zeiger auf einen Zeiger) erhalten, die irgendwie dasselbe bedeutet, aber unterschiedlich ist. Um dies rückgängig zu machen, müssen Sie integrieren (den Zeiger dereferenzieren), was einige Einschränkungen aufweist (die verlorene Konstante beim Ableiten einer Funktion im Vergleich zum Objekt-Slicing). Hoffentlich macht das Sinn, es ist Ewigkeiten her ...
Telastyn

Antworten:


6

Ich würde mir vorstellen, dass es nicht sehr wichtig ist, wenn Sie Nicht-GUI-Dienstprogramme auf ein modernes Betriebssystem schreiben, ohne an dessen Interna zu arbeiten. Es ist wahrscheinlich eine andere Geschichte, wenn Sie daran arbeiten, ein modernes Betriebssystem zu ändern oder ein neues zu entwickeln.

Wenn Sie mit Videohardware oder einem Bare-Metal-Fenstersystem arbeiten, benötigen Sie Kenntnisse der linearen Algebra, um Grafiken effizient zu aktualisieren. Ich habe selbst nicht nachgesehen, aber ich wette, Sie könnten Beispiele im Quellcode für X, KDE und Gnome finden.

Wenn Sie mit Hardware für die digitale Signalverarbeitung arbeiten, ist die Berechnung sehr wichtig. Ich stelle mir vor, dass es einige Geräte gibt, die ihr schweres Heben mit der CPU des Systems anstelle eines lokalen Mikroprozessors ausführen und diese häufig mit analogen elektrischen Systemen verbunden sind.

Neben der linearen Algebra spielt auch die Berechnung eine wichtige Rolle bei der Leistungsanalyse, wenn versucht wird, die Kurve an die Daten anzupassen.


Selbst wenn Sie nur DirectX- oder OpenGL-Programmierung durchführen, ist ein gewisses Verständnis der linearen Algebra erforderlich.
Rig

@ Rig: Lerne, wie du gehst, so habe ich es gemacht. Von der mathematischen Seite zu lernen, ist meiner Meinung nach Bass-ackwards.
Coder

8

SomeKittens' Kommentar ist direkt auf das Geld: Sie müssen Analysis und Linearer Algebra , da diese Kurse die Art und Weise , dass Sie denken , und die Art und Weise , dass man die Welt verstehen. Bei der linearen Algebra dreht sich alles um die Zuordnung von einer Domäne zu einer anderen. Kalkül deckt das Verhalten von Funktionen ab. Sie sind selbst mächtige Werkzeuge, aber die Techniken, die Sie beim Studium dieser Bereiche lernen, werden auch Teil Ihres mentalen Bildes von der Welt.

Sie brauchen diese Kurse auch, weil die Leute erwarten, dass Sie in diesen Begriffen denken können. Ich sehe meine Kollegen nicht oft, wie sie die Ableitung eines Polynoms auf ihre weißen Tafeln nehmen, aber ich sehe oft Skizzen von Funktionen, bei denen die Tangente an einem interessanten Punkt gezeichnet ist oder der Bereich unter der Kurve schattiert ist. Die tatsächlichen Werte sind uns nicht wichtig genug, um sie zu berechnen, aber es ist wichtig zu verstehen, wie sich die Werte ändern , und sie sind Teil alltäglicher Gespräche.

Jeder Bachelor-Abschluss in Informatik erfordert Kurse in Analysis, linearer Algebra, Statistik, Logik und anderen Mathematik, nicht weil Programmierer die Techniken regelmäßig direkt anwenden müssen (obwohl dies je nach ihrer Tätigkeit möglich ist), sondern weil Sie dies benötigen Wissen, um das Material zu verstehen, das später kommt.


2
Wenn ich das mehr als einmal positiv bewerten könnte, würde ich es tun.
Mr. Mindor

Eine nützliche Antwort, beantwortet aber die Frage nicht. ZB bin ich hierher gekommen, weil ich vor kurzem zum Spaß ein paar Hacker auf dem r600g-Treiber gemacht habe und auch daran interessiert bin, den schwachen mathematischen Hintergrund zu verbessern. Es wäre wirklich schön, eine Idee für den Treiber zu finden, die eine Erweiterung meiner mathematischen Kenntnisse erfordert, vorzugsweise etwas aus der abstrakten Algebra, der Topologie, aber nicht unbedingt beschränkt auf. Eine Reihe von Fragen wie "Treiberentwicklungsmathematik" haben kein einziges Papier geliefert. Diese Seite ist die nächste, die ich bekommen konnte.
Hi-Angel

@ Hi-Angel Ich bin anderer Meinung. Es beantwortet die Frage möglicherweise nicht so, wie Sie es erwartet haben, und es beantwortet möglicherweise nicht Ihre separate Frage "Woran kann ich arbeiten, um meine mathematischen Fähigkeiten zu verbessern?", Aber ich behaupte, dass fortgeschrittene Mathematik für einen Systemprogrammierer hauptsächlich insofern nützlich ist, als sie sich ändert Ihre Perspektive und bietet ein tieferes Verständnis. Grafikprogrammierer verwenden regelmäßig Kalkül und lineare Algebra, Systemprogrammierer weniger. Das Verständnis dieser Themen ist jedoch weiterhin wichtig.
Caleb

6

Ich werde weitermachen und sagen, dass ich nicht denke, dass Kalkül oder lineare Algebra für die Systemprogrammierung wichtig sind.

Ich denke, Kalkül und lineare Algebra sind es im Allgemeinen wert, gelernt zu werden - ich bin ein Mathematiker! Und wie andere Antworten zeigen, besteht eine gewisse indirekte Relevanz, da die Leistungsanalyse und das Algorithmusdesign fortgeschrittene Mathematik verwenden können. Ich glaube jedoch nicht, dass die Systemprogrammierung stärker von diesen Arten von Mathematik abhängt als die meisten anderen Bereiche, die im Allgemeinen nicht als mathematisch angesehen werden.


Schon mal eine GPU gesehen? :) Es ist ein bisschen mathematisch, insb. Treiber dafür zu schreiben ... aber es ist wahr: Wenn Sie nicht weiterkommen, können Sie immer math.stackexchange.com verwenden :))
Aadaam

Ich bin auch ein Computergrafiker; Ich ähnele dieser Bemerkung! Und Sie haben Recht: Jeder, der einen Grafikkartentreiber schreiben möchte, muss die Computergrafik (und die damit verbundene lineare Algebra und Grundrechnung) sowie die Systemprogrammierung verstehen.
Comingstorm

Soweit ich sehen kann, muss man Trigonometrie und lineare Algebra kennen, um etwas Nützliches aus der Grafik-API herauszuholen, aber diese API nicht in einem Grafiktreiber zu implementieren. Dort beschäftigen Sie sich hauptsächlich mit dem Umschalten einer Reihe von Registern basierend auf Anwendungsanforderungen. Der einzige Ort, an dem ich Mathematik im Grafiktreiber anwenden kann, sind Optimierungen des Compilers. Korrigieren Sie mich, wenn ich falsch liege - ich möchte es sein. Ich bin tatsächlich hierher gekommen, weil ich meinen mathematischen Hintergrund verbessern möchte und auch wenig Hacking auf r600g mache, und es wäre schön, beide zu kombinieren.
Hi-Angel

4

Ich vermute, dass es an den Rändern wahr ist. Systemprogrammierer müssen sich viel mehr Gedanken über Leistung und Zuverlässigkeit machen, daher kann die Algorithmusanalyse wichtig sein, und manchmal wird Kalkül für Beweise der Big-Oh-Analyse benötigt. Themen wie Warteschlangentheorie und diskrete Optimierung (das ist mathematische Optimierung, nicht Codeoptimierung) können ebenfalls eine Rolle spielen. Ich denke jedoch, dass dies hauptsächlich für Leute gilt, die an den neuesten Betriebssystemen und Netzwerkprotokollen arbeiten, nicht so sehr für die Person, die am USB 3.0-Treiber arbeitet.


⁺¹ für die diskrete Optimierung scheint interessant und verwandt zu sein.
Hi-Angel

1

Ihre Definition von Systemprogrammierung stimmt ziemlich gut mit der Antwort in Wikipedia überein.

Wenn Sie darüber nachdenken, was es bietet - dh. eine Software-Schnittstelle in Hardware, dann macht es Sinn, warum Kalkül und lineare Algebra handliche Fähigkeiten sind.

Um diese Low-Level-Schnittstelle zu abstrahieren, müssen Sie verstehen, wie das Gerät funktioniert. Elektronische Geräte sind immer noch an die Gesetze der Physik gebunden. Kalkül und lineare Algebra bieten ein Mittel zur Modellierung des Verhaltens des Geräts. Durch Modellieren des Geräts können Sie einen Dienst für seine Funktionalität bereitstellen.

Allerdings sind diese beiden Bereiche nicht das A und O für die Systemprogrammierung. Ich kenne einige EEs, die mit Kalkül und linearer Algebra nicht so gut zurechtkommen, aber trotzdem erklären können, was das Gerät ziemlich prägnant macht.


Ist diese Definition der Systemprogrammierung richtig oder falsch?
Victor

2
Das ist nicht sehr genau. Die Anbindung an eine CPU erfordert nur die Kenntnis der bereitgestellten Anweisungen.
DeadMG

@DeadMG - Ich kann im Fall einer CPU nicht streiten. Ich hatte mehr über Rohhardware wie einen Beschleunigungsmesser oder eine direkte E / A-Schnittstelle nachgedacht. Davon abgesehen sind die meisten von ihnen mit einer Art Chip ausgestattet, um die Schnittstelle bereitzustellen. Ich denke, meine Kommentare sind für die Logik innerhalb des Chips besser geeignet als vielleicht für die Gerätetreiberschicht.

1

Allgemeine Webanwendungen und / oder administrative Programmierung erfordern nicht viel Anwendung von linearer Algebra oder Analysis, aber viele Fachgebiete. Wenn Sie sich mit Geometrie beschäftigen, müssen Sie auf lineare Algebra stoßen. Die meisten Physikprogramme befassen sich auch sowohl mit Algebra als auch mit Kalkül. Sowie so ziemlich alles, was mit Wellenformmanipulation zu tun hat, wie z. B. Sound- und Radioprogramme. Im Allgemeinen ist es wichtiger, die diskrete Mathematik zu verstehen, die sich unter anderem mit Mengenlehre, Graphentheorie und formaler (boolescher) Logik befasst, was in vielen Anwendungen wie Informationsmanagement, Datenbanken und anderen Orten, an denen Daten und / oder Logik kombiniert werden, nützlich ist . Bei der Systemprogrammierung sehe ich nicht so viele Anwendungen.


2
Ich denke, Sie können "durchkommen", ohne jemals Kalkül oder lineare Algebra in den meisten Programmierbereichen zu verwenden. Wenn Sie jedoch mit den Konzepten vertraut sind, werden Sie überrascht sein, auf wie viele verschiedene Probleme Sie sie anwenden können. Das Messen und Vorhersagen der Taktdrift und der Batterielebensdauer fällt mir ein, was ich kürzlich für die Berechnung verwendet habe. Triangulation und Pfadvorhersage beinhalteten lineare Algebra für ein Problem, an dem ich letztes Jahr gearbeitet habe. Keines der Probleme, die erforderlich waren, um diese Themen als die zuvor extrem komplizierten und schlechten Approximationsmethoden zu verwenden, die andere verwendeten, zeigte ...
Dunk

2
(Fortsetzung) ... aber die Verwendung der fortgeschritteneren Mathematik führte zu viel prägnanteren und genaueren Implementierungen, die so funktionierten, wie sie sollten. IOW, Kalkül und lineare Algebra sind leistungsstarke Werkzeuge, wenn Sie erst einmal gelernt haben, wie man sie anwendet, und sie helfen Ihnen, im Vergleich zu den meisten anderen Programmierern an die Spitze zu gelangen, da die meisten in der Schule nicht ausreichend Mathematik lernen wollten. Für mich bedeutete es, an den wirklich coolen Projekten im Vergleich zum Alltäglichen zu arbeiten.
Dunk

0

Wie bereits erwähnt, können Mathematikkurse an der Universität Ihre Fähigkeiten zur Problemlösung und zum deduktiven Denken schärfen. Diese sind für fast jeden wichtig.

Manchmal kann es jedoch hilfreich sein, eine lineare Algebra zu kennen, insbesondere für einige ziemlich gute Geschäftsideen .


0

Soweit ich weiß, geht es bei der Systemprogrammierung um Osdev, Treiber, Dienstprogramme usw. Ich kann einfach nicht herausfinden, wie hilfreich Kalkül und lineare Algebra dabei sein können.

Mit Kalkül ist es ziemlich einfach, sobald man sich die Kursinhalte genauer ansieht . Es hängt eng mit der Komplexität des Algorithmus und der Big-O-Notation zusammen - solche Dinge, die in der Programmierung ziemlich grundlegend sind.

Gleichungen erhalten Sie, wenn Sie die Komplexität des Algorithmus abschätzen. Verschachtelte Schleifen mit drei Ebenen von 0bis Nsind N 3 , verschachtelte Schleifen mit zwei Ebenen sind N 2 , eine ist N. Die Bewertung, die Sie erhalten, könnte wie folgt aussehen (N 3 + 2 * N 2 + N) - das ist eine Gleichung.

Wenn Sie nun besser verstehen möchten, wie schnell die Ausführungszeit mit zunehmendem N zunimmt, hängt dies eng mit Ableitungen / Differenzierung zusammen. Andere Teile des Kalküls, die Sie möglicherweise hilfreich finden, sind Grenzwerte und asymptotische Analysen. Diese führen Sie zum Verständnis der Big-O-Notation, zu einer besseren Bewertung bei Programmierinterviews und möglicherweise zu einer besseren Systemprogrammierung.

  • Sie sind der Zuordnungsdatei-Zuordnungstabelle zugeordnet. Welche Datenstruktur werden Sie verwenden? Angenommen, es gibt viele kleine Dateien, die selten geändert werden. Was wäre vorzuziehen? Wenn Sie eine relativ kleine Anzahl großer Dateien annehmen, die immer am Ende angehängt werden, werden Sie dieselbe Struktur verwenden? Wie würden Sie sich entscheiden?

Was die lineare Algebra betrifft , so schießen hier Programmieranwendungen vom ersten Bild an auf Sie.

http://pad1.whstatic.com/images/thumb/c/c4/LaTeX-2m.jpg/251px-LaTeX-2m.jpg

Wenn Sie jemals mit Rastergrafiken zu tun haben (z. B. in Videotreibern), werden Bilder wie oben in Ihren schlimmsten Albträumen auf Sie zukommen.

  • Wie kommt es, dass dieser Test # 12345 fehlende Pixel zeigt? Habe ich etwas falsch gemacht, als ich Bresenham implementiert habe ? Könnte es nur ein Fehler im Testdesign sein, der Rundungsfehler nicht richtig berücksichtigt?

Es gibt einen Trend, bei dem sich CS an jeder Universität, die ich kenne, von den mathematischen Abteilungen abspaltet. Ich denke, es ist ein sehr kluger Schachzug. Darüber hinaus wird von CS-Studenten angenommen, dass sie Lösungen aus vorhandenen Lösungen herausfinden. Ein guter CS-Student würde ein Dokument über den Container lesen, ein O (nsomething) sehen, die Wikipedia öffnen, die Grafik sehen und entscheiden, ob der Container geeignet ist. Dies würde 2 Minuten dauern, genau wie das Überprüfen der Wiedereintritts- und Parameteranforderungen für einen API-Funktionsaufruf. Und meiner Meinung nach ist ein Profiler fast immer eine bessere Lösung als theoretische Mathematik.
Coder

2
@Coder, natürlich sind einige Informatikstudenten diejenigen, die die Container und Algorithmen überhaupt erst entwerfen müssen. Für sie sind die Mathematik und der Profiler komplementäre Werkzeuge: Die Mathematik liefert keine funktionierende Implementierung, und der Profiler warnt Sie nicht, dass Ihre Testdaten nur ein Zufall sind.
Charles E. Grant
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.