Это все тянет на проект по сложности не уступающи zx like pascal
Это все тянет на проект по сложности не уступающи zx like pascal
С любовью к вам, Yandex.Direct
Размещение рекламы на форуме способствует его дальнейшему развитию
На гораздо сложнее тянет.
Есть ещё третий вариант - выводить не ассемблерный код, а уже скомпилированный, но в виде релоцируемого объектного модуля. Разумней всего в формате .rel от SDCC.
Тогда к нему можно будет прилинковывать ассемблерные вставки, собранные SDCC-шным же ассемблером.
Но вообще нет ничего странного в том, чтобы получать на выходе компилятора асмовый исходник. Более того, практически все компиляторы, которые я встречал, работали именно так. Вот прямо начиная с HITech C для CP/M и заканчивая gcc и clang. Просто у современных компиляторов этап ассемблирования скрыт.
Я, по мере доработки транслятора в Си, Ofront+, иногда ловлю себя на мысли, что сам бы так не написал. Да, увы, наши человеческие возможности ограничены. Кто-то развит лучше нас в какую-то свою сторону. Конечно TP сложнее, так и мощнее ведь.
Кроме того, я призываю не ограничиваться TP. Если в TP что-то плохо, нужно иметь смелость отказаться от этого, даже в ущерб совместимости, хотя бы в виде компромисса (ключики -oldSyntax, -newSyntax). Если в Паскале есть проблемы (лишние begin'ы), я не останавливаюсь на Паскале, а иду дальше. Если в Обероне есть проблемы (мало возможностей), я не останавливаюсь на Обероне, а иду дальше. Даже такой сравнительно простой проект как транслятор Оберона в Си (а есть мнение, что Оберон - почти Hello World в мире языков программирования) требует действительно большого ментального напряжения. Что уж говорить про компиляторы с более сложных языков.
Ты имеешь в виду первоначальный адрес паскалевской программы или чтобы можно было в любом месте вставить ORG несколько раз? Если хочешь вставить в свои асмовские процедуры после последнего END Паскаля, то смело можешь вставлять, кросс-ассемблер правильно скомпилирует. А если внутри паскалевского кода, то зачем? Сделать мне не трудно.
- - - Добавлено - - -
Это - пережиток от первой версии, когда быстро набросал, всё руки не доходят.
- - - Добавлено - - -
Это уже не буду делать, т.к. ухудшит быстродействие. Пусть будет на совести программиста ошибочный счетчик. У меня много где нет "защиты от дурака" - например, проверки выхода за границы массивов, строк. Проверка границ спрайтов - опционально по флагу. Просто, если делать проверки, ухудшит быстродействие.
- - - Добавлено - - -
Больше второе - поиграться. Особенно хочется создать самокомпилируемый компилятор. В ZX Like Pascal для этого не хватает всего лишь малость - процедуры с параметрами и локальными переменными. Тогда можно будет сделать нативный ZX Like Pascal на ZX Like Pascalе.![]()
После твоего компилятора получается ASM с первой командой "org 23900", вот чтобы его менять можно было из исходного PRG файла. Например, чтобы до первого begin поставить директиву {$ORG xxxxx} и чтобы это потом оказалось в ASM файле. А в середине паскалевской программы даже не знаю, надо ли это...
Вообще для двух последних, если я все верно помню, высказывание не является действительностью. Ни тот ни другой ассемблер не используют и не генерируют, причем давно. Оба генерируют некий промежуточный код, который унифицирован для всех используемых платформ. На его основе генерируется сразу компилированный код, без промежуточной трансляции в текст или еще какие промежуточные представления.
Код:$ sudo mv /usr/bin/as /usr/bin/as1 $ gcc a.c gcc: error trying to exec 'as': execvp: No such file or directoryНу да, именно так компиляторы и работают. Ещё Hitech C так работал. Там первым этапом был синтаксический разбор и преобразование в какой-то промежуточный код, вторым - запуск аллокатора регистров и всякого сопутствующего для получения ассемблерного исходника.Оба генерируют некий промежуточный код, который унифицирован для всех используемых платформ.
У clang так вообще два таких преобразования происходит. Сперва в LLVM, потом, когда станет нужно - в асм. Но у него это "стало нужно" может и после окончательной линковки уже случиться.
Andrew771, из мануала:
Random(x) - Случайное число от 0 до x включительно. x может быть также арифметическим выражением.
Может, правильнее выдавать не включительно, как делает тот же турбопаскаль от борланда? Тогда будет меньше проблем с переносом кода оттуда, например.
Процедуры допустимы только без параметров и локальных переменных.
Ждём их поддержки. По крайней мере, переменные цикла должны быть локальными, чтобы исключить повторное использование имени.
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)