[Info-vax] Python for x86?

Arne Vajhøj arne at vajhoej.dk
Thu Apr 13 09:31:47 EDT 2023


On 4/13/2023 9:24 AM, Arne Vajhøj wrote:
> On 4/13/2023 8:26 AM, Simon Clubley wrote:
>> On 2023-04-13, Arne Vajhøj <arne at vajhoej.dk> wrote:
>>> On 4/13/2023 6:44 AM, Neil Rieck wrote:
>>>> And although python is used to do a lot of admin scripting on Linux
>>>> platforms (tools like "yum" and "firewall-cmd" are written in
>>>> python), python does a really good job supporting server-side
>>>> scripting under apache cgi-bin. I don't know how this is possible,
>>>> but python programs are faster than compiled DEC-BASIC programs
>>>> started via apache.
>>>
>>> That is unexpected. If both are run via CGI mechanism then
>>> script activation should be the same. And compiled code should be
>>> faster than interpreted code. And if libraries used are also the
>>> same then it is a mystery.
>>>
>>
>> Maybe. Maybe not. Based purely on some comments from people here who
>> know/use DEC Basic, it's quite possible that DEC Basic has a RTL which
>> imposes some serious runtime overheads.
> 
> VMS Basic is a language with a high level of abstraction
> so more "happens under the hood" than in C/Fortran/Cobol.
> 
> There are some overhead due to that.
> 
> Obvious example is strings. VMS Basic use dynamic
> strings. The RTL does some work there.
> 
> But Python is even more high level and does similar
> work - including the equivalent of dynamic strings.
> 
> But it is still interpreted (for standard Python
> implementation) while VMS Basic get compiled.
> 
> Only thing in Pythons favor is that there must
> be spent 1000 times more effort optimizing Python
> libraries than optimizing VMS Basic RTL.

One can do a little test.

VMS Alpha.

$ type app.c
#include <stdio.h>
#include <string.h>

void app(char *buf, int n)
{
     int i;
     for(i = 0; i < n; i++)
     {
         strcat(buf, "X");
     }
}

int main(int argc, char *argv[])
{
     char buf[100];
     strcpy(buf, "");
     app(buf, 10);
     printf("%s\n", buf);
     return 0;
}
$ cc app
$ link app
$ run app
XXXXXXXXXX
$ type app.bas
program appdemo

declare string buf
external sub app(string, integer)

buf = ""
call app(buf, 10)
print buf

end program
!
sub app(string buf, integer n)

declare integer i

for i = 1 to n
     buf = buf + "X"
next i

end sub
$ bas app
$ link app
$ run app
XXXXXXXXXX

C compiler generates:

              0000       APP::
EE200020     0000               BLE     R17, L$11 
                                                    ; 001948
23DEFFC0     0004               LDA     SP, -64(SP) 
                                                    ; 001945
B77E0000     0008               STQ     R27, (SP)
B75E0008     000C               STQ     R26, 8(SP)
B45E0010     0010               STQ     R2, 16(SP)
B47E0018     0014               STQ     R3, 24(SP)
B49E0020     0018               STQ     R4, 32(SP)
B4BE0028     001C               STQ     R5, 40(SP)
B7BE0030     0020               STQ     FP, 48(SP)
47FE041D     0024               MOV     SP, FP
47FF0405     0028               CLR     R5
47F10404     002C               MOV     R17, R4
47F00403     0030               MOV     R16, R3
47FB0402     0034               MOV     R27, R2
2FFE0000     0038               UNOP
2FFE0000     003C               UNOP
              0040       L$6: 
                                                     ; 001948
A7420020     0040               LDQ     R26, 32(R2) 
                                                    ; 001950
40A03005     0044               ADDL    i, 1, i 
        ; R5, 1, R5                                 ; 001948
47E30410     0048               MOV     buf, R16 
        ; R3, R16                                   ; 001950
22220030     004C               LDA     R17, 48(R2)
47E05419     0050               MOV     2, R25
A7620028     0054               LDQ     R27, 40(R2)
6B5A4000     0058               JSR     R26, DECC$STRCAT 
        ; R26, R26
40A409A0     005C               CMPLT   i, n, R0 
        ; R5, R4, R0                                ; 001948
F41FFFF7     0060               BNE     R0, L$6
47FD041E     0064               MOV     FP, SP 
                                                    ; 001952
A75D0008     0068               LDQ     R26, 8(FP)
A45D0010     006C               LDQ     R2, 16(FP)
A47D0018     0070               LDQ     R3, 24(FP)
A49D0020     0074               LDQ     R4, 32(FP)
A4BD0028     0078               LDQ     R5, 40(FP)
A7BD0030     007C               LDQ     FP, 48(FP)
23DE0040     0080               LDA     SP, 64(SP)
              0084       L$11:
6BFA8001     0084               RET     R26
2FFE0000     0088               UNOP
2FFE0000     008C               UNOP

Basic compiler generates:

              0120       APP:: 
                                                     ; 000011
23DEFF00     0120               LDA     SP, -256(SP)
473FF019     0124               AND     R25, 255, R25
B75E00C0     0128               STQ     R26, 192(SP)
B77E0000     012C               STQ     R27, (SP)
B7FE0008     0130               STQ     R31, 8(SP)
B45E00C8     0134               STQ     R2, 200(SP)
B47E00D0     0138               STQ     R3, 208(SP)
B49E00D8     013C               STQ     R4, 216(SP)
B4BE00E0     0140               STQ     R5, 224(SP)
B4DE00E8     0144               STQ     R6, 232(SP)
B7BE00F0     0148               STQ     FP, 240(SP)
63FF0000     014C               TRAPB
47FE041D     0150               MOV     SP, FP
47FB0402     0154               MOV     R27, R2
47F00403     0158               MOV     R16, R3
432059B0     015C               CMPLT   R25, 2, R16
B63E00B0     0160               STQ     R17, 176(SP)
F600003A     0164               BNE     R16, L$4
43205DB0     0168               CMPLE   R25, 2, R16
2FFE0000     016C               UNOP
E600003A     0170               BEQ     R16, L$5
A63BFF90     0174               LDQ     R17, -112(R27)
A75BFFA0     0178               LDQ     R26, -96(R27)
221E0008     017C               LDA     R16, 8(SP)
47E05419     0180               MOV     2, R25
A762FFA8     0184               LDQ     R27, -88(R2)
22310084     0188               LDA     R17, 132(R17)
2FFE0000     018C               UNOP
6B5A4000     0190               JSR     R26, DBASIC$INIT 
        ; R26, R26
A41D00B0     0194               LDQ     R0, 176(FP) 
                                                    ; 000016
2C200000     0198               LDQ_U   R1, (R0)
2E000003     019C               LDQ_U   R16, 3(R0)
482004C1     01A0               EXTLL   R1, R0, R1
4A000D50     01A4               EXTLH   R16, R0, R16
44300404     01A8               BIS     R1, R16, R4
43E40004     01AC               SEXTL   R4, R4
47E03405     01B0               MOV     1, I 
        ; 1, R5
EC800010     01B4               BLE     R4, L$8
24DF010E     01B8               LDAH    R6, 270(R31) 
                                                    ; 000017
20C60001     01BC               LDA     R6, 1(R6)
              01C0       L$10:
A7420030     01C0               LDQ     R26, 48(R2)
40481011     01C4               ADDL    R2, 64, R17
47E30410     01C8               MOV     R3, R16
225D00B8     01CC               LDA     R18, 184(FP)
B23D00BC     01D0               STL     R17, 188(FP)
B0DD00B8     01D4               STL     R6, 184(FP)
47E30411     01D8               MOV     R3, R17
47E07419     01DC               MOV     3, R25
A7620038     01E0               LDQ     R27, 56(R2)
6B5A4000     01E4               JSR     R26, STR$CONCAT 
        ; R26, R26
40A03805     01E8               ADDL/V  I, 1, I 
        ; R5, 1, R5                                 ; 000018
40A40DA0     01EC               CMPLE   I, R4, R0 
        ; R5, R4, R0
F41FFFF3     01F0               BNE     R0, L$10
40A03925     01F4               SUBL/V  I, 1, I 
        ; R5, 1, R5
              01F8       L$8: 
                                                     ; 000020
A742FFD0     01F8               LDQ     R26, -48(R2)
221D0008     01FC               LDA     R16, 8(FP)
63FF0000     0200               TRAPB
47E03419     0204               MOV     1, R25
A762FFD8     0208               LDQ     R27, -40(R2)
2FFE0000     020C               UNOP
6B5A4000     0210               JSR     R26, DBASIC$END 
        ; R26, R26
63FF0000     0214               TRAPB 
                                                    ; 000012
47FD041E     0218               MOV     FP, SP
A75D00C0     021C               LDQ     R26, 192(FP)
A45D00C8     0220               LDQ     R2, 200(FP)
47E03400     0224               MOV     1, R0 
                                                    ; 000020
A47D00D0     0228               LDQ     R3, 208(FP) 
                                                    ; 000012
A49D00D8     022C               LDQ     R4, 216(FP)
A4BD00E0     0230               LDQ     R5, 224(FP)
A4DD00E8     0234               LDQ     R6, 232(FP)
A7BD00F0     0238               LDQ     FP, 240(FP)
23DE0100     023C               LDA     SP, 256(SP)
6BFA8001     0240               RET     R26
2FFE0000     0244               UNOP
2FFE0000     0248               UNOP
2FFE0000     024C               UNOP
              0250       L$4: 
                                                     ; 000011
261F001B     0250               LDAH    R16, 27(R31)
2210830C     0254               LDA     R16, -31988(R16)
000000AA     0258               GENTRAP
              025C       L$5:
261F001B     025C               LDAH    R16, 27(R31)
221082CC     0260               LDA     R16, -32052(R16)
000000AA     0264               GENTRAP

That is:
* roughly 2.5 times as many instructions (looks like
   error handling is a part of those extras)
* STR$CONCAT does more work than DECC$STRCAT
* two extra calls for DBASIC$INIT and DBASIC$END

Arne






More information about the Info-vax mailing list