Den ersten Tipp, den ich dir geben würde, ist ersteinmal nüchtern zu bleiben. Setz dich ersteinmal mit den Grundlagen außeinander.
Eine Programmiersprache ist, abgesehen von Assembler, eine Abstrahierung von der Maschinensprache der jeweiligen Prozessorarchitektur. Jede Architektur verfügt über eigene Befehle und dementsprechend ist nicht ein System wie das andere. Beispielsweise kannst du keinen 80x86er code auf einem powerpc System ausführen und andersherum. PCs sind sogenannte 80x86er Systeme. Jede Prozessoraurchitektur verfügt über eine eigene Art und Weise Befehle zu erhalten. Dementsprechend verfügt jede Prozessorarchitektur über seine eigene Maschinensprache.
Nun gehen wir einen Schritt höher. Da reiner Maschinencode ziemlich unverständlich und tödlich auf das Gehirn eines Menschen wirken kann, wurden Assemblersprachen entwickelt. Diese sind prinzipiell genau dasselbe wie die Maschinensprachen, mit dem Unterschied, dass die Befehle nicht in hexadezimaler Form angegeben werden, sondern in kurzen und prägnanten Zeichenfolgen.
Grundsätzlich sieht es so aus, dass sämtliche Programmierung in gewöhnlichen Textdateien mit angepasster Dateiendung von statten geht. Diese Textdateien nennt man Quelltexte (auf Englisch "sourcecode"). Diese "sagen" dem Computer, was er tun soll. Assemblerquelltexte werden von sogenannten "Assemblern" in binären computerlesbaren Format übersetzt (das sind die schönen "einsen und nullen"

). Da Assembler eigentlich direkt die Prozessorsprache ist, übersetzt er den Quelltext quasi "eins zu eins". Dennoch ist es notwendig, da Textdateien nunmal eine Folge von Zeichen darstellen.
Für Genaueres kannst du dich ein wenig informieren, wenn es dich interessiert.
Nun gehen wir noch eine Stufe höher. Da Assemblercode recht kompliziert ist/wirkt und vor allem nicht auf andere Architekturen portierbar ist, gibt es die sogenannten "Hochsprachen", welche letztenendes genau das sind, was man heutzutage unter "Programmiersprache" versteht. Die Quelltexte dieser Programmiersprachen werden ebenfalls übersetzt, genauer "kompiliert". Dies übernimmt der sogenannte "compiler". Er übersetzt den Quelltext architekturspezifisch so, dass wiederum architekturangepasster binärcode herauskommt. Desweiteren sind die Hochsprachen um einiges einfacher, komportabler und effektiver.
Bei den Hochsprachen unterscheidet man wiederum zwischen zwei Dingen: Erstens, ob es sich überhaupt um eine Sprache handelt, deren Quelltexte man überhaupt übersetzen muss, oder ob es sich um eine interpretierte Sprache handelt. Die Quelltexte der interpretierten Sprachen werden von einem "interpreter" gelesen, welcher selbst jedoch kompiliert ist, und sagt dem System, was er nun machen soll.
Als zweites spielt der "Programmierstyle" eine Rolle. Man unterscheidet zwischen funktional, objektorientiert, prodezural etc. Die Sprache C ist prodezural, das heist das Programm ist wie eine Art Fluss. Das fängt an einem Punkt an, rattert die Funktionen durch und trifft irgendwann auf das Ende. Objektorientierte Programmierung geht einen anderen Weg, indem man sagt, alles sind Objekte, welche handeln können, über Eigenschaften verfügen etc. Man stellt sich also wirkliche Objekte vor und beschreibt sie virtuell. C++ ist eine objektorientierte Sprache, genauer gesagt eher eine hybride, da du mit C++ auch prodezural programmieren kannst, da es voll zu C kompatibel ist.
Desweiteren überschneiden sich Sprachen teilweise. Zum Beispiel ist es möglich, mit Assembler und C verschiedene Funktionen zu schreiben und diese mit C++ nutzen. Warum? Weil letztenendes alles wieder zum System zurückfließt. Desweiteren findest du bestimmte Konzepte in vielen verschiedenen Sprachen wieder, Syntax kann ähnlich sein etc.
Zwischen dir und dem System liegt im wesentlichen der "Kernel". Nur dieser ist in der Lage das System direkt anzusprechen und sämtliche Vorgänge auf einem modernen Betriebssystem sind auf ihn zurückzuführen. Außer dem Kernel ist beispielsweise keiner berechtigt, den physikalischen Speicher zu nutzen. Woher dein Programm Speicherplatz und Zugriff auf alles Mögliche erhält, darum musst du dir keinerlei Gedanken mehr machen. Das haben Andere für dich übernommen.
Gewisse Sprachen sind für Systemprogrammierung vorgesehen, wie beispielsweise C, C++ und D. Die meisten Kernel und Treiber sind mit C geschrieben. Dies gilt auch für Windows. Prinzipiell sind aber auch andere Sprachen möglich, auch wenn die falsche Meinung herumschwirrt, es sei nur mit C möglich.
Die Standardmöglichkeiten der Sprache C wird dir über die Standardbibliothek und den damit verbundenen zugrundeliegenden Systemfunktionen bereitgestellt. Bibliotheken (*.dll/*.lib -> auf Englisch library, kurz lib) beinhalten Funktionen, welche andere entwickelt haben, damit du sie leicht nutzen kannst, ohne wissen zu müssen, wie genau sie funktionieren, nicht jedesmal das Rad neu erfunden zu müssen oder sie einfach nicht jedesmal neu programmieren möchte. Durch dieses Prinzip wird das Programmieren an sich immer abstrakter, da Bibliotheken auf Bibliotheken aufbauen und zum letzendlich gewünschtem Ergebnis führen. Somit ist es über eine Game-Engine, die letztenendes nicht weiteres als eine Bibliothek ist, einfach möglich, eine Funktion zum rendern und anzeigen einer Quakemap oder anderen Formaten zu ermöglichen. Die Funtionen an sich kennt dein Programm nicht direkt, du sagst ihm lediglich, dass es sie gibt und wie sie zu handhaben sind. Dies geschieht über das Einbinden der header (*.h). Wenn du dein Programm nun kompilierst, hinterlässt er eine Referenz auf die Funktion und "sucht sie dann irgendwo anders". Es entstehen Objektdateien (*.o), welche in der Form jedoch noch nicht nutzbar sind. Das letzendliche Zusammensetzen des Projektes übernimmt der "linker". Er fügt alle übersetzten Teile zusammen und löst die Funktionsaufrufe auf. Zuletzt verpasst er den zusammengefügten Objektdateien ein Binärformat, sodass du die Bibliothek/das Programm auch auf deinem Betriebssystem ausführen kannst.
Prinzipiell benötigst du zum Programmieren folgendes:
- Editor
- Compiler
- Linker (oft mit dem compiler mitgeliefert und automatisch nach dem compiler aufgerufen)
- eventuell ein buildsystem
Zum letzten Punkt sei gesagt, dass es bei einer angemessenen Projektgröße extrem nervig ist, alles immer wieder manuell kompilieren zu müssen. An diesem Punkt setzen die buildsysteme an und haben folgende zwei Funktionen:
- Automatisierung des Übersetzungsprozesses
- Verhinderung, dass Dateien, die gar nicht geändert worden sind, noch einmal übersetzt werden
Unter Windows sind IDEs (Integrated Development Envoirment -> Entwicklungsumgebungen) üblich. Diese verbinden quasi die oben genanten Dinge in einem Programm. Viele Programmierer unter Windows sind sich gar nicht dessen bewusst, dass sie gar keine IDEs benötigen. Ob du welche nutzt oder nicht, hängt von dir ab. Ich würde es dir nicht raten, wenn jedoch doch, benutz nicht Visual Studio sondern besorg dir irgendetwas simples, dass dir einfach nur die nötigsten Funktionen mitliefert.
PS: Hoffe das war nicht zu viel xD