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

Antwort per Email an