Kaeru Gaman hat geschrieben:
dass du in C die string.h und die stdio.h brauchst, liegt einfach daran,
dass C an sich nur ca. 10-20 befehle hat, dar rest ist als funktionen implementiert,
u.a. eben durch string.h und stdio.h
du könntest auf diese auch verzichten, wenn du alles selbst codest.
zum vergleich dürftest du dann auch nur 5-10% der PB-Befehle verwenden.
der grosse befehlsumfang von PB entspricht praktisch dem includen von ner menge billiotheken (.h) in C
PureBasic kann ja nicht zaubern, es macht dies nur alles
automatisch.
Bei C/C++ sage ich dem Compiler welche Dinge ich im Source
verwendet habe, so daß er nur diese Header einbindet und somit
die Funktionsdeklarationen lesen kann.
Der PB-Compiler macht das automatisch bei Start. Da werden
die Libs auf Funktionen gescannt und die .res (Strukturen, Konstanten,
Interfaces) geladen, so daß der Compiler das alles kennt.
Der Nachteil dabei: Umso mehr Libs/Funktionen, Interfaces,
Konstanten, Strukturen usw. eingelesen werden müssen,
desto langsamer wird dadurch auch der einzelne Kompiliervorgang
an der Konsole.
PB nutzt da noch eine gute Möglichkeit um die Kompilierung
von einer IDE aus zu beschleunigen: Der Compiler wird beim
starten der IDE in den Hintergrund geladen und liest dann seine
Informationen ein, also Libs/Funktionen, Strukturen, Interfaces,
Konstanten.
Beim kompilieren von der IDE aus muss das nun nicht jedesmal
wiederholt werden, wodurch man sich so die Zeit zum einlesen
jedesmal spart.
Beim kompilieren von der Konsole aus hilft das aber nicht, da
PB nicht mehrere Module/Sourcen zur gleichen Zeit kompilieren
kann.
In C/C++ sagt man dem Compiler also was man verwenden
möchte. Das hat den Nachteil das man es immer hinschreiben
muß, und den Vorteil das somit nicht alle bekannten Strukturen,
Funktionen, Konstanten usw. eingebunden werden, obwohl sie
nicht gebraucht werden.
Die .res in PB kann man mit vorkompilierten Headern in C/C++
vergleichen. Viele Leute nutzen aber auch diese Möglichkeit in C/C++
nicht um das kompilieren zu beschleunigen.
Eine PureBasic-Lib ist einfach nur ein vorkompilierter Header
und die eigentliche Lib zusammen. Und es wird automatisch
eingebunden.
PB ist da halt auch eher ein Minimal-System mit Standard-Funktionen.
Würde man alle Strukturen, Konstanten, Funktionen und Objekte
aus dem P-SDK, DX-SDK usw. in PB durch .res und Libs einbinden,
dann würde der Startvorgang von PB erheblich langsamer werden.
Man denke dabei nur an hunderte Interfaces & Interface-IDs (IID)
zur modernen WinAPI-Programmierung.
Der nächste wichtige Punkt ist die Erweiterbarkeit. In C/C++
kann man so beliebig neue Libs einbinden und sagt dem Compiler
einfach welche Funktionen sich darin befinden (durch das einbinden
des Headers für die entspr. Lib).
Damit im Zusammenhang steht das PB nicht zu z.B. C und C++ Libraries
kompatibel ist, d.h. man muß entweder einen Wrapper dafür
schreiben oder den Source direkt ändern und daraus extra
eine PB-Lib machen.
In freeBasic wurde das IMO etwas besser gelöst. Dort kann
man auch C-Libs einfach dazulinken und deklariert dazu einfach
nur die in der Lib enthaltenen Funktionen.
Auch kann man in freeBasic einzelne Module kompilieren die dann
alle zusammengelinkt werden können. Somit muss man nicht jedesmal
komplett das große Projekt kompilieren, sondern nur das geänderte
Modul.
Mal angenommen ich programmiere mit C++ unter Windows
viele Programme. Konsoleprogramme und GUI-Programme.
Da kann ich mir doch ganz einfach 2 Header machen, die die
Header und Macros/Define einbindet die ich immer dafür
brauche.
Für GUI-Programme binde ich z.B. immer den Header <DK_Win> ein,
und für Konsoleprogramme <DK_Console>.
Im Header "DK_Win" wird dann alles eingebunden was ich immer
zur WinGUI-Programmierung brauche, so z.B. Windows.h,
und mein eigenes Klassensystem DCS.hpp wo Klassen für
Fenster, Gadgets usw. deklariert werden.
Wenn Jemand das "&&" und "||" nicht gefällt, oder er es unleserlich
findet, dann braucht er in seinen persönlichen Header nur hinzufügen:
...und schon kann er schreiben:
Man kann sich also selbst die Arbeit sehr erleichtern indem
man sich einen eigenen Header macht und dort ein paar Sachen
deklariert und einbindet die man immer braucht.
Wäre doch Quatsch immer wieder alles in jeden Source
reinzuschreiben.
Aber dazu genug.
Was ich für sehr wichtig halte ist die Offenheit und Erweiterbarkeit
der Sprache, was speziell für fortgeschrittene Programmierer
unbedingt nötig ist.
Wenn Xin nicht nur so eine kleine "Anfängersprache" entwerfen
will, wird er das sicherlich mit beachten.
Die Macros, Templates, verbunden mit dem großen OOP-System
bei C++ geben dem Programmierer sehr viele Möglichkeiten
von denen Anfänger nicht die geringste Ahnung haben.
Es sind einfach zu viele Möglichkeiten der Sprache, die Anfänger
natürlich noch nicht kennen können. Während man PB locker in
2 Monaten lernen kann, dauert das in C++ meist einige Zeit
länger, da es viel mehr Möglichkeiten und Techniken zu lernen
gilt.
Das meinte ich auch bei Dir, 125. Die Genialität von C++ kann
man erst verstehen wenn man auch die fortgeschrittenen Dinge
davon gelernt hat. Dazu gehören nunmal Templates und die STL
und das ganze OOP-System.
PureBasic kann da IMO auch noch einiges von anderen Systemen
und Compilern lernen. Auch ist PB ist zu verschlossen und inkompatibel
zu anderen Compilern. Dadurch kann man C-Libraries nicht ohne
Umwege einbinden, und andersrum keine Libraries für C mit PB
schreiben.
@Xin: Möchtest Du es "richtig anpacken" und eine größere
Sprache und einen entspr. Compiler dazu entwickeln, oder
eher ein "kleines Ding" wie z.B. PB oder BlitzBasic, wodurch
es Anfängern zwar einfach gemacht wird, fortgeschrittene
Techniken für erfahrene Power-Programmierer aber auf der
Strecke bleiben? Oder ein Mix aus beidem?
