Denny Schierz <[EMAIL PROTECTED]> writes:
> Am Mittwoch, den 07.12.2005, 09:31 +0100 schrieb Christopher Ruehl:
>
> > Falsch:
> > Perl compiliert beim Aufruf den Perl-Code und führt ihn dann aus
> > und interretiert ihn nicht zeilenweise .. ist doch kein Basic :-)
>
>
> mir hat außerdem mal jemand gesagt, dass man Perl Programme auch
> vorkompelieren kann.
Die Frage ist, wozu wird kompiliert? In Perl ist das Byte-code, während
die meisten C Compiler zu Maschineninstruktionen kompilieren. Ist es
Byte-code, so /liest/ eine Virtual Machine diesen Byte-code ein und
führt ihn dann aus (sie spielt also Prozessor.)
Um das zu demonstrieren, nehmen wir beispielsweise eine einfache
Funktion, die die Fakultaet einer gegebenen Zahl berechnet:
(defun fact (n &optional (result 1))
(declare (type integer n result))
(if (= n 0)
result
(fact (1- n) (* n result))))
Clisp kompiliert diese Funktion zu Byte-code:
CLISP> (disassemble 'fact)
Disassembly of function FACT
(CONST 0) = 1
1 required argument
1 optional argument
No rest parameter
No keyword parameters
15 byte-code instructions:
0 L0
0 (JMPIFBOUNDP 1 L5)
3 (CONST 0) ; 1
4 (STORE 1)
5 L5
5 (LOAD&PUSH 2)
6 (CALLS2&JMPIF 146 L20) ; ZEROP
9 (LOAD&DEC&PUSH 2)
11 (LOAD&PUSH 3)
12 (LOAD&PUSH 3)
13 (CALLSR&PUSH 2 55) ; *
16 (JMPTAIL 2 5 L0)
20 L20
20 (LOAD 1)
21 (SKIP&RET 3)
Während CMUCL sie hingegen zu Maschinensprache kompiliert:
CMUCL> (disassemble 'fact)
; Compiling LAMBDA (N &OPTIONAL (RESULT 1)):
; Compiling Top-Level Form:
582232C0: .ENTRY "LAMBDA (N &OPTIONAL (RESULT 1))"(n &optional (result
1)) ; (FUNCTION
; (INTEGER ..))
2D8: POP DWORD PTR [EBP-8]
2DB: LEA ESP, [EBP-32]
2DE: CMP ECX, 4 ; [:NON-LOCAL-ENTRY]
2E1: JEQ L7
2E3: CMP ECX, 8 ; [:BLOCK-START]
2E6: JNE L6
2E8: TEST DL, 3 ; [:BLOCK-START]
2EB: JEQ L0
2ED: MOV EAX, EDX
2EF: AND AL, 7
2F1: CMP AL, 7
2F3: JNE L5
2F5: MOV AL, [EDX-7]
2F8: CMP AL, 10
2FA: JNE L5
2FC: L0: TEST EDI, 3 ; [:BLOCK-START]
; [:BLOCK-START]
302: JEQ L1
304: MOV EAX, EDI
306: AND AL, 7
308: CMP AL, 7
30A: JNE L3
30C: MOV AL, [EDI-7]
30F: CMP AL, 10
311: JNE L3
313: L1: MOV [EBP-12], EDX ; [:BLOCK-START]
316: MOV [EBP-16], EDI
319: JMP L12
31B: L2: L3:MOV EAX, [#x582232B8] ; 'INTEGER
; [:BLOCK-START]
321: BREAK 10 ; Error trap
323: BYTE #x05
324: BYTE #x21 ; OBJECT-NOT-TYPE-ERROR
325: BYTE #xFE, #xCE, #x01 ; EDI
328: BYTE #x0E ; EAX
329: L4: L5:MOV EAX, [#x582232B8] ; 'INTEGER
; [:BLOCK-START]
32F: BREAK 10 ; Error trap
331: BYTE #x03
332: BYTE #x21 ; OBJECT-NOT-TYPE-ERROR
333: BYTE #x8E ; EDX
334: BYTE #x0E ; EAX
335: L6: BREAK 10 ; Error trap
; [:BLOCK-START]
337: BYTE #x02
338: BYTE #x19 ; INVALID-ARGUMENT-COUNT-ERROR
339: BYTE #x4D ; ECX
33A: L7: TEST DL, 3 ; [:BLOCK-START]
33D: JEQ L8
33F: MOV EAX, EDX
341: AND AL, 7
343: CMP AL, 7
345: JNE L10
347: MOV AL, [EDX-7]
34A: CMP AL, 10
34C: JNE L10
34E: L8: JMP L11 ; [:BLOCK-START]
350: L9: L10:MOV EAX, [#x582232B8] ; 'INTEGER
; [:BLOCK-START]
356: BREAK 10 ; Error trap
358: BYTE #x03
359: BYTE #x21 ; OBJECT-NOT-TYPE-ERROR
35A: BYTE #x8E ; EDX
35B: BYTE #x0E ; EAX
35C: L11: MOV [EBP-12], EDX ; :OPTIONAL entry point
; [:NON-LOCAL-ENTRY]
35F: MOV DWORD PTR [EBP-16], 4
366: L12: CMP DWORD PTR [EBP-12], 0 ; No-arg-parsing entry point
; [:NON-LOCAL-ENTRY]
36A: JNE L13
;;; [7] (IF (= N 0) RESULT (FACT (1- N) (* N RESULT)))
36C: MOV EDX, [EBP-16] ; [:BLOCK-START]
; [:BLOCK-START]
36F: MOV ECX, [EBP-8]
372: MOV EAX, [EBP-4]
375: ADD ECX, 2
378: MOV ESP, EBP
37A: MOV EBP, EAX
37C: JMP ECX
;;; [9] (FACT (1- N) (* N RESULT))
37E: L13: MOV EDX, [EBP-12] ; [:BLOCK-START]
381: MOV EDI, 4
;;; [10] (1- N)
386: CALL #x1000024F ; #x1000024F: GENERIC--
; [:CALL-SITE]
38B: MOV ESP, EBX ; [:SINGLE-VALUE-RETURN]
38D: MOV [EBP-20], EDX
390: MOV EDX, [EBP-12]
393: MOV EDI, [EBP-16]
;;; [11] (* N RESULT)
396: CALL #x100002D0 ; #x100002D0: GENERIC-*
; [:CALL-SITE]
39B: MOV ESP, EBX ; [:SINGLE-VALUE-RETURN]
39D: MOV EDI, EDX
39F: MOV EDX, [EBP-20]
3A2: MOV EAX, [#x582232BC] ; #<FDEFINITION object for FACT>
3A8: MOV ECX, 8
3AD: PUSH DWORD PTR [EBP-8]
;;; [9] (FACT (1- N) (* N RESULT))
3B0: JMP DWORD PTR [EAX+5] ; [:CALL-SITE]
3B3: NOP
3B4: NOP
3B5: NOP
3B6: NOP
3B7: NOP
; No value
--
----------------------------------------------------------------------------
PUG - Penguin User Group Wiesbaden - http://www.pug.org