Direi di si.
La domanda nasce da due diversi tipi di programmazione, o forse tre.
La programmazione aperta nata dalle cpu antiche basate sulla Harvard architecture, quando codice e dati erano in memorie separate e la programmazione parallela dove dati, codice e risultati si ottengono contemporaneamente ad ogni fetch. La terza è la pseudo-parallela. Cioè la simulazione tramite CPU basate sullo stile Harvard ma con programmi che implementano la parallelizzazione.
Per intenderci i PLC usano degli ASICS o dei RISC apposta per gestire la memoria in modo quasi-parallelo. Mi spiego meglio.
Le istruzioni IF THEN ELSE GOTO JUMP JUMP ON CALL CALL ON ecc... non servono in quel tipo di programmazione perchè ogni condizione è il risultato della singola operazione. Per esempio:
x/y notazione americana o x.y notazione europea.
START
AND x/y ;Il dato yn contenuto nella memoria xn viene moltiplicato per
AND x/y' ;il dato y' della stessa memoria.
OR x/y" ;sommato con il dato y" sempre della stessa memoria
ORNOT x/y' ;il risultato viene sommato all'inverso del dato y'
OUT x'/y" ;e ciò che si ottiene viene messo nella memoria x' nel dato y".
END ;fine di questa operazione, seguono altre migliaia di
;operazioni simili.
È scontato che esistono accumulatori dove i risultati di volta in volta vengono posti e di un program counter che indirizza di volta in volta le singole istruzioni. Ma non serve di solito, eseguire jump o call di ogni sorta. I dati che ho generalizzato x e y possono essere definiti localmente o globalmente come bit, byte, word, double word, single, o float. Ma possono essere anche definiti come elementi speciali di input analogici, o parti dei risultati di operazioni complesse, come timer counter, PID, posizioni di encoder ecc...
Alla fine del programma, dopo l'ultimo END il program counter riparte dall'inizio e ripete l'elaborazione all'infinito dello stesso programma.
Tra fine ed inizio, oppure durante l'elaborazione del programma, nelle CPU Più avanzate, si eseguono le operazioni invisibili. Si aggiornano gli I/O, si aggiornano i Timers ed I counters, si calcolano le variabili dei PID ecc...
Con questo sistema è difficile se non impossibile che il programma vada a cadere in loop a tempo indeterminato e si blocchino tutte le altre attività. Nelle macchine pseudo parallele più processori di vario tipo si occupano di interpretare in modo normale con le solite istruzioni, in modo da parallelizzare il codice ovvero che appaia come se fosse eseguito da macchine parallele.
Nelle macchine parallele, questo avviene effettivamente in un solo ciclo macchina.
Quindi, abbiamo scoperto che i PIC sono RISC ma eseguono il programma come gli altri processori normali con antica architettura Harvard o Harvard modificata.