[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