hoewel er wel universele assembler/compilers zijn zoals TASM (table driven assembler)
Voor een assembler is dat meer voor de hand liggend dan voor een compiler...
Ongeacht de taal, het moet omgezet worden naar dezelfde instructies.
Ja... nou... zo werkt het dus niet helemaal. Talen zijn best verschillend. En de gemiddelde compiler heeft ook nog wel een 'runtime library'. Die van basic is doorgaans een stuk groter dan die van C.
ijn code zal lang niet zo efficient zijn
Tsja... Dan zul je eerst 'efficiënt' moeten definiëren. Als in: als performance / memory geen enkel punt is, dan is jouw code (in basic) waarschijnlijk 'efficiënter' dan assembly (botweg omdat het sneller te schrijven en wellicht ook makkelijker aan te passen is).
Wat heel veel scheelt (of het nou basic of C is) is kennis van assembly en de onderliggende hardware architectuur. Daarmee voorkom je 'nare' constructies en lost de compiler / optimizer de rest op.
Basic heeft als groot nadeel dat het 'by design' minder geschikt is om in compacte code 'complexe' dingen te doen. Als je mijn eerder beschreven suggestie in basic schrijft, dan zal (bij een behoorlijke compiler) de object code niet serieus hoeven te verschillen van die in C of assembly. Maar de source kan wel eens lastiger leesbaar zijn.
[offtopic]Ik heb ooit eens een stukje 'serieel' voor een 8051 geschreven. Dat ding moest zo her en daar naar wat andere hardware luisteren en zo nu en dan wat uitbraken. Dat maak je generiek, dus in een soort van library.
Wie de 8051 een beetje kent (de kennis hier is inmiddels ook stoffig... te lang niks meer mee gedaan), die weet dat het een Harvard architectuur is met ROM, iRAM en XRAM. De iRAM is 'intern', de XRAM doorgaans extern en optioneel (al zal het tegenwoordig wel op dezelfde die zitten). Effectief zijn het 3 verschillende opcodes in assembly - met dezelfde mnemonic - de assembler mag de juiste erbij zoeken.
Goed, ik schrijf dat in C. En aangezien ik niet vooraf weet waar mijn uit te braken stukkie data woont, werk ik met void pointers. En vervolgens performed het voor geen meter (WTF... die core draait op een whopping 1MHz, waarom kan ik niet interrupt-driven 19k2 binnen lepelen??). Dat zijn een l*llige 2000 interrupts per seconde... Waar zit te pijn?
Afijn, het was dus ff zoeken, maar... compile-time weet de compiler niet waarmee de library wordt aangeroepen - in welk stukkie memory de boel staat. De pointer is 16 bits, maar blijkt als je de gegenereerde assembly bekijkt opeens een extra byte te krijgen. Die byte vertelt in welk soort memory de boel staat. Vervolgens wordt een stukje runtime library(!!) aangeroepen met als argumenten (oa) de pointer en die extra byte. Daarachter zit een if-boompje om naar de juiste opcode te jumpen en daarmee het gewenste resultaat te returnen of te schrijven (slimme compiler... bij een write naar ROM werd het een NOP
). En dat gebeurt dus bij elk character.
Ofwel: functioneel werkt dat, maar het is rete-duur qua performance (en in de praktijk dus onbruikbaar). 'Alles' naar XRAM pointer omkrikken leverde natuurlijk wel de gewenste code op...
En ja, ik weet, naar huidige maatstaven is een 8051 natuurlijk wat eh... 'achterhaald'. Maar het geeft wel aan dat wanneer je een klein beetje kennis van de onderliggende architectuur hebt, je je code veel efficiënter kunt krijgen.
Nog zo'n aardige... locatie van locals. Een 8051 heeft nou eenmaal geen (nou ja, nauwelijks) stack. Locals hebben - een beetje afhankelijk van de compiler - een 'fixed' locatie (doorgaans link time bepaald). Grappig als je wat recursief gaat doen
[/offtopic]