Pascal vs. C++
Napsal: 17.5.2020 17:08
Rozdíly mezi C++ a Pascalem jsou velké, ale zase ne tak moc, jako mezi Pascalem a jinými jazyky, ve kterých programuji (C#, Python, TypeScript).
Ve zdrojových kódech PC FANDu se objevují často ukazatele a assembler. K přepisu mi tedy C++ přišlo jako nejvhodnější.
Problémy začínají u syntaxe a pokračují k "vnitřním funkcím" Pascalu, práci s DOSem (přerušení) a končí u zmiňovaného assembleru.
Se syntaxí jsem se vypořádal vcelku rychle. Napsal jsem si v C# kód, který transformuje pascalovský kód do něčeho bližšího C++.
Není to sice dokonalé, stále je potřeba spousta ruční práce, ale ušetří to tak 80% času.
Pascal pro práci s řetězci používá mimo jiné i string, což je pole dlouhé 256B (pokud při inicializaci nezadáte menší). V 1. Byte je uložena délka řetězce. Jelikož se v původním kódu vyskytuje velice často, napsal jsem si třídu pstring, která se snaží chovat stejně.
Dalším problémem je číslování polí v Pascalu od "1". Zrovna u těch stringů s tím počítám, takže tam změny není třeba provádět. Jinde už ale ano.
Další perličkou je používání vnořených funkcí a procedur, což v C++ dost dobře nejde. Proto je potřeba proměnné z "nadřazených" funkcí vytáhnout ven, aby k nim měli přístup i ostatní funkce. Nebo předávat vše přes parametry, což by bylo mnohem čistší, ale to bych přepisoval ještě další měsíce.
Největší radost mám ale z assembleru. Protože jen velmi obtížně se snažím rozluštit, co tím původně básník chtěl říct. Někdy alespoň trochu pomůže název samotné funkce a také její parametry, jindy jsem ale úplně bezradný, protože komentáře v původním kódu jsou spíše raritou. A pak zjistím, že je to třeba něco, co není v C++ potřeba vůbec řešit.
Nebo to vyřeším metodami z Win Api (práce s konzolou, klávesnicí, soubory atp.).
Specifickým problémem je práce s pamětí (memory.pas). S tím se původní autoři museli neuvěřitelně nadřít. V C++ si vystačím s new a delete. Zbytek vyřeší systém.
Ve zdrojových kódech PC FANDu se objevují často ukazatele a assembler. K přepisu mi tedy C++ přišlo jako nejvhodnější.
Problémy začínají u syntaxe a pokračují k "vnitřním funkcím" Pascalu, práci s DOSem (přerušení) a končí u zmiňovaného assembleru.
Se syntaxí jsem se vypořádal vcelku rychle. Napsal jsem si v C# kód, který transformuje pascalovský kód do něčeho bližšího C++.
Není to sice dokonalé, stále je potřeba spousta ruční práce, ale ušetří to tak 80% času.
Pascal pro práci s řetězci používá mimo jiné i string, což je pole dlouhé 256B (pokud při inicializaci nezadáte menší). V 1. Byte je uložena délka řetězce. Jelikož se v původním kódu vyskytuje velice často, napsal jsem si třídu pstring, která se snaží chovat stejně.
Dalším problémem je číslování polí v Pascalu od "1". Zrovna u těch stringů s tím počítám, takže tam změny není třeba provádět. Jinde už ale ano.
Další perličkou je používání vnořených funkcí a procedur, což v C++ dost dobře nejde. Proto je potřeba proměnné z "nadřazených" funkcí vytáhnout ven, aby k nim měli přístup i ostatní funkce. Nebo předávat vše přes parametry, což by bylo mnohem čistší, ale to bych přepisoval ještě další měsíce.
Největší radost mám ale z assembleru. Protože jen velmi obtížně se snažím rozluštit, co tím původně básník chtěl říct. Někdy alespoň trochu pomůže název samotné funkce a také její parametry, jindy jsem ale úplně bezradný, protože komentáře v původním kódu jsou spíše raritou. A pak zjistím, že je to třeba něco, co není v C++ potřeba vůbec řešit.
Nebo to vyřeším metodami z Win Api (práce s konzolou, klávesnicí, soubory atp.).
Specifickým problémem je práce s pamětí (memory.pas). S tím se původní autoři museli neuvěřitelně nadřít. V C++ si vystačím s new a delete. Zbytek vyřeší systém.