4-Oct-03 07:23 Alex Kouznetsov wrote to Oleksandr Redchuk:
OR>> Я ещё не слышал, что после хорошего С-компилятора программа для OR>> AVR|MCS51|PIC|MSP430 работает быстрее, чем написанная на ассемблере. OR>> Про форт такое слышал. Впрочем, заодно с тем, что "у него ядро 17 байт, OR>> а вот у С!!!!"
AK> придет в голову обычному эмбедеру, настолько же и Форт-система организована AK> в определенном смысле необычно и во многих смыслах эффективно. Никогда с этим не спорил.
AK> Поэтому человеку, AK> незнакомому с принципами работы Форта, тоже в голову не придет писать на AK> ассемблере так, как написан Форт. Хотя вообще говоря его, казалось бы, AK> никто в этом не ограничивает. Имеется ввиду шитый код? Или сразу вместе со стековой машиной :-)? Или ещё с организацией подпрограмм в словарь и с компилятором новых слов на этот словарь? Подпрограммный шитый код я на "СОУ-1" и на "Э-60" применял, ещё не зная ничего про форт. Года за 3 до издания "Баранова-Ноздрунова" и лет за 12 до заглядывания в него. Поэтому я лично не считаю, что если использован шитый код - то это сразу "по мотивам форта". Это естественный способ сэкономить объём, думаю, родился задолго до форта. Просто очень удачно лёг на стековую машину, но если посмотреть на мой asm-модуль работы с I2C из-под КейлC51, то "верхний" слой этого модуля, непосредственно вызывающийся из C, выглядит в духе
_RTCreadCheck: ;;;;;; ; bit RTCreadCheck( void idata *ptr, u8 rtcaddr, u8 len); mov DPH,R3 acall _RTCread ajmp CheckCsum_a
_EEreadCheckParam: ;;;;;;;;;;;;;;; ; bit EEreadCheckParam( u8 paramnum); ; EE_CFG[ee_table[paramnum]] -> union t acall prepare_ee_table _EEreadCheck: ;;;; ; bit EEreadCheck( void idata *ptr, u16 eeaddr, u8 len); mov DPH,R3 ; DPH not changed by I2C functions acall _EEread ; R7 (ptr) not changed in I2C functions ajmp CheckCsum_a
_EEread: ;;;; ; bit EEread( void idata *ptr, u16 eeaddr, u8 len); ; > R7 -> buffer in idata ; R5R4 = hi,lo bytes of address in EEPROM ; R3 = data length ; < C = 1 error acall ee_prepare_addr sjmp i2c_read_block ; это где-то внутри RTCread
_EEwrite: ;;;; ; bit EEwrite( void idata *ptr, u16 eeaddr, u8 len); ; arguments and return value as in EEread acall ee_prepare_addr sjmp i2c_write_block
А внутри i2c_read_block и i2c_write_block вызыается i2c_start_exchange, которая вызывает i2c_start и i2c_put. По сравнению с собственно soft-i2c передачей эти задержки пренебрежимо малы, а код вышел очень компактный, что было важно. Кстати, Баранова-Ноздрунова я читал после того, как сдал этот проект и впервые за несколько лет (перед этим проектом тоже было "давай-давай") спокойно поехал в отпуск не беря с собой схем и распечаток :-)))
Т.е. код шьётся и вне стековой модели, в упомянутом коде регистры как загрузились ещё вызовом из C, так и с минимальными копированиями используются до конца. А с учётом глобальной регистровой оптимизации в кейле и при том, что этот код специально не трогает R7 - указатель на буфер, во многих случаях сгенерённый кейлом код выглядел в духе mov lcall _EEreadCheck jc lcall _OtherFunction без перезагрузки регистров
AK> Если же, паче чаяния, он знает как устроен Форт, то, имхо, вряд ли будет AK> относится к нему с той фанатической ненавистью, которую некоторые тут AK> выказывают ;-) А я могу сказать, что люди, реально и много работающие с фортом (тоже имхо :-) не очень-то шумят на тему самой кртуизны форта. Они просто работают и им не нужно доказывать (в том числе, если не в основном, себе :-) что они пользуются самым крутым инструментом и вааще (что регулярно бывает у неофитов, причём не только в программировании).
Чтобы "два раза не вставать":
4-Oct-03 04:12 Alex Kouznetsov wrote to Yuriy K:
AK> Например, стековый процессор Нейрон, о котором я упоминал, в качестве AK> фронт-энда использует компилятор Си. Тем не менее, сгенерированный им AK> код исполняется Форт-процессором.
Вот что мне нравится в фанах форта... Если только где-то стековая архитектура (и всё, больше ничего) - это форт. Если шитый код - это тоже форт (или его эмуляция вручную :-).
Похоже, что я тут вот регулярно пользуюсь форт-калькулятором "Электроника МК61", до этого много работал на форт-калькуляторах Б3-21 и Б3-19. А более серьёзные рассчёты мне выполняет форт-сопроцессор с плавающей запятой в моём атлоне.
IMO: Скомпилированный для "Нейрона" из "Нейрон-C" код выполняется ПРОЦЕССОРОМ СО СТЕКОВОЙ АРХИТЕКТУРОЙ.
Или есть исторические сведения, что стековая архитектура вообще родилась только после появления форта и в результате воздействия оного на умы архитекторов ЭВМ?
wbr,