Как видите знатоки 6502 (если такие, кроме Вас, ещё остались в России) не посещают этот форум. А со мной обсуждать подобные вопросы проблематично, т.к во-первых 6502 меня совсем не интересует, а во-вторых мне и сказать нечего, т.к я дилетант (или даже полный незнайка) в таких вопросах. Я не профессиональный программист и лишь любительским образом немного программировал когда-то, причём в основном на ассемблере. А в том, как работают, устроены и какой код генерят компиляторы ЯВУ и какие особенности микропроцессора для этого полезны, я уж точно не в курсе.
А ЯВУ (BAS-компилятор, Си и Паскаль) я изучил в начале 90-тых в CP/M. Оказалось, что эти ЯВУ для 8-ми разрядки не только дают тормозной код, но главное, код программ из под них нарастает слишком быстро, потому попытки использовать ЯВУ для создания программ 8-ми разрядок стали лишь пустой тратой времени (даже переписывание половины процедур и функций на ассемблер не спасало).
Потому на ЯВУ я программировал в основном на PC, причём используя лишь Турбо-Паскаль и Турбо-СИ для MSDOS. Да и на них написал всего лишь несколько более-менее серъёзных программ для собственных нужд (текстов редактор, аналог WD на TP, нортон и два эмулятора 8-ми разрядок на Си, причём в эмуляторах 95% ассемблера и менее 5% Си для доступа к файлам). И всё это было ещё в 90-тых. И лишь в последнее время попытался вспомнить Паскаль для 8-ми разрядки и буквально недавно освоил PL/M для 8-ми разрядки. Так, что про ЯВУ, так и про методы, как правильно использовать хитрые методы адресации 6502 ничего не знаю.
SAA wrote:Перейдем к адресной арифметике, наверное сразу к адресации массивов во всем адресному пространству
Да, и тут, как и в пересылках блоков, процессор 6502 возможно будет быстрее. Потому, что в Z80 индексные регистры хоть и есть и удобны для программиста, но они были добавлены в систему команд как расширение, а не присутствовали от рождения. Потому эти команды у Z80 тормозные, т.к префиксные. Но логичность и простота восприятия программы - однозначно лучше у Z80, он удобнее для человека, что и утверждалось.
6502 может и не уступает в ряде мест Z80 в скорости, но как я и писал, он неудобен, т.к больше напрягает мозг программиста, что важнее эффективности. Это значит, что быстрее и более сложную программу напишешь на Z80, чем на 6502. Ну а полное отсутствие 16-ти разрядности вообще лишает 6502 уважения в глазах "прогрессивного человечества", по крайней мере, того, что уже привыкло к Z80. Это никак не компенсировать большей скоростью программной петли.
Недостатки 6502 устраняет 65C816, у которого с 16-ти разрядностью и ограничением в 64К нет проблем, он оставляет по всем параметрам Z80 далеко позади. Но по сути доработок 65C816 отбрасывает, как неудобные программисту, все идеи применённые в оригинальном 6502 ради экономии транзисторов, - его архитектура в его "родном" режиме похожа на архитектуру 6809, а не 6502. С ассемблером 65C816 может быть было бы интересно познакомиться на практике. Но опять-таки, ассемблер, это уже не модно, т.е эффективно, но слишком трудоёмко. Если нет компиляторов специально для 65C816, то и смысла в нём нет. Кстати, в то же время Zilog тоже сделал апгрейд - Z180, но там почти нет в системе команд и архитектуре ничего нового (лишь в один флакон запихали CPU и периферийные БИС). Это потому, что у Z80 уже ничего нельзя было заметно улучшить, т.к он изначально хорош, в отличие от 6502.
Кому-то 6502 приглянулся т.к "органично вошёл в душу" и потому такие люди в восторге и визжат от удобства программирования на нём. Ну а мне 6502 не приглянулся, и я долго считал, что это для всех людей так. Потому был дико удивлен, когда несколько лет назад узнал, что на Западе 6502 был господствующим среди 8-ми разрядок.
SAA wrote:поскольку на две эти платформы Z80 и 6502 был портирован Small C, то вроде как есть на чем сверить эффективность компилятора по back-end
Я давно не в курсе программистского суржика, потому посмотрел в википедии, что значит back-end, но всё-равно не понял смысла. Ссылка с русской буквой "И" не выкладывается, смотрите вручную: [ru.wikipedia.org/wiki/Front_end_и_back_end]. По-видимому, имеется ввиду возможность странслировать один и тот же код и сравнить в реале.
Может я и не прав, но мне кажется, что справедливо сравнивать компиляторы написанные на ассемблере, потому что их писали программисты на ассемблере, хорошо знающие как по максимуму использовать возможности данного CPU. А все современные, да и некоторые из старых компиляторов написаны на самом Си и отражают лишь представление программиста на Си о архитектуре целевого процессора. А small-c как раз написан на самом Си.
Про SMALL-C вряд ли правильно применять термин портирование. Его лишь брали за основу, а затем существенно дорабатывали, так что в итоге от оригинала оставалось чуть-чуть. Для CP/M на базе статьи в ж.Dr.Dobbs 1980 года создана куча версий называемых SMALL-C (у меня в архиве их, как минимум, штуки 3, разной степени продвинутоси от small-c). Сделанный также на основе этой статьи CC65, был, кажется, чуть ли не единственным родным компилятором на 6502. Сейчас, естественно, используют кросс версию сделанную на основе того кода, ведь не проблема портировать написанное на ЯВУ.
Мне кажется, что версию компилятора написанную на Си под целевой процессор 6502 вряд-ли можно конвертировать под другой процессор. Конечно это можно сделать, но это будет иной компилятор, лишь с теми же процедурами анализатора строк и объёмом реализованных функций.
На ассемблере написаны AZTEC и BDS Си (и ещё куча других из 70-тых, начала 80-тых). Есть родные компиляторы и для 6502, хотя их-то как-раз намного меньше и написаны они позже. А для 6502 кажется реально известен только CC65, написанный для Атари в 1989 и не факт, что и он написан на ассемблере. Конечно были сделаны Си для Apple-II, а для Commodore-64 вряд-ли с учётом дикой тормознутости его флоповодов (там программа будет транслировать час).
Не важно какой компилятор использовать. Их же делали разные люди и сумели по разному догадаться, как выжать из архитектуры максимум. И не важно какой код был взят за основу при разработке компилятора. Надо сравнивать самый эффективный компилятор Си для 6502 на ассемблере с самым эффективным компилятором для Z80 на ассемблере. А т.к неизвестно, какой из компиляторов считать дающим лучший код, то надо транслировать программу на всех известных компиляторах и сравнивать лидеров. Но только, если в сравнении участвуют компиляторы написанные на ассемблере, а значит опытными в конкретном ассемблере программистами, можно доверять результатам.
Можно конечно, сделать допущение, что кросс-компиляторы максимально ориентированы на архитектуру процессоров, и странслировать код и прогнать его на реальных машинах, взяв поправку на разницу тактов. При этом нужны машины без WAIT и HOLD, т.к тогда скорость такой машины может зависеть от конкретного кода. Например, в ОРИОНЕ при сравнении КР580 и Z80 с WAIT один тест даёт одно соотношение скоростей, а другой - другое, хотя машины одни и те же. А лучше при сравнении вручную посчитать такты в дизассемблированном коде (некоторые ассемблеры это умеют) и с учётом такта пересчитать в (милли-)секунды. Но вряд-ли этим сейчас захочет кто-то заниматься и выяснять какой процессор лучше подходит для ЯВУ.
Кстати, похоже, только PL/M из ЯВУ реально пригодны для 8-ми разрядки. Eсли PL/M нет для 6502, то он скорее всего проигрывает даже КР580 в результативности программирования на ЯВУ. Жаль нет PLMX для Z80, он продавался и стоил $1000, но сейчас утерян.
Но это можно частично вручную компенсировать, т.к PL/M генерит ассемблерный исходник. Можно в нём исправить, где возможно JMP на JR. И ещё вручную оптимизировать передачу параметров, т.к PL/M, как и все другие компиляторы ЯВУ для КР580 передаёт байтовый параметр в процедуру в виде 16-ти байт, так что можно 16-ти разрядные загрузки заменить 8-ми разрядными.