|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Mar 2007
Messaggi: 7863
|
[c++]risultato compilazione
Il risultato dell compilazione di un file cpp o piu in generale di un linguaggio compilato genera linguaggio macchina oppure istruzioni assembly che verrano poi interpretate dal livello virtuale 2?
|
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
|
Dipende esclusivamente dal compilatore e della piattaforma di riferimento.
Ad esempio è possibilissimo compilare un sorgente C++ in bytecode (o negli assembly di .NET) e NON in formato oggetto/eseguibile/binario.
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro @LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys |
|
|
|
|
|
#3 | |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Quote:
E' comunque possibile che in un passaggio intermedio della compilazione il compilatore generi codice assembly per poi poter applicare delle ottimizzazioni. Tra l'altro in molti compilatori è possibile ottenere il codice assembly equivalente del file oggetto passando un parametro durante la compilazione. |
|
|
|
|
|
|
#4 | |
|
Senior Member
Iscritto dal: Mar 2007
Messaggi: 7863
|
Quote:
|
|
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: Mar 2007
Messaggi: 7863
|
Si sapevo che era possibile compilare C++ per il runtime di .Net ma in byteCode da quale macchina virtuale lo si fa poi interpretare?
|
|
|
|
|
|
#6 | |
|
Senior Member
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
|
Quote:
Beh, in altre parole quando compili per .NET viene creato un bytecode in CIL, ovvero common integrate language. Quanto questo CIL viene eseguito, viene compilato al volo dalla CLR (Common Language Runtime), da parte del JIT Compiler, ovvero il Just-In-Time compiler. Questo compilatore compila e "impara", nel senso che puo' cambiare al volo il codice compilato, a seconda del flusso di esecuzione. Tipico esempio e' quello della impossibilita' di mettere funzioni __inline in C++.NET Ma perche' non serve. E' il JIT che al volo cerca di capire se una funzione deve (o deve diventare da un certo punto in poi) una funzione inline, e se del caso la rende tale. Occhio che il C++.NET e' un linguaggio diverso dal VC++, e richiedono compilatori diversi (Il primo produce il JIT, il secondo dopo il LINK produce un eseguibile classico) Il CIL e' un codice assembly, un assembly "inventato" da Microsoft, ma plausibile per un processore, tanto che ci sono progetti di hardware che potrebbero usarlo direttamente (.net Hardware)
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto. E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test. |
|
|
|
|
|
|
#7 | |
|
Senior Member
Iscritto dal: Jul 2002
Città: Reggio Calabria -> London
Messaggi: 12112
|
Quote:
![]()
__________________
|
|
|
|
|
|
|
#8 |
|
Senior Member
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
|
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto. E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test. |
|
|
|
|
|
#9 | |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Quote:
Comunque sotto Windows per i compilatore Gcc-style c'è sempre l'opzione -S. |
|
|
|
|
|
|
#10 | ||
|
Senior Member
Iscritto dal: Mar 2007
Messaggi: 7863
|
Quote:
ma questo intervento Quote:
Per quanto riguarda il Vc++ mi sembra sia anche possibile generare codice intermedio invece che binario ? |
||
|
|
|
|
|
#11 | |
|
Senior Member
Iscritto dal: Mar 2007
Messaggi: 1792
|
Quote:
Per esempio con Visual C++ puoi ottenere Codice:
; Listing generated by Microsoft (R) Optimizing Compiler Version 14.00.50727.762 TITLE test.c .686P .XMM include listing.inc .model flat INCLUDELIB LIBCMT INCLUDELIB OLDNAMES PUBLIC ??_C@_0M@DIMJODLI@CIAO?5MONDO?$CB?$AA@ ; `string' PUBLIC _main EXTRN _puts:PROC ; COMDAT ??_C@_0M@DIMJODLI@CIAO?5MONDO?$CB?$AA@ ; File test.c CONST SEGMENT ??_C@_0M@DIMJODLI@CIAO?5MONDO?$CB?$AA@ DB 'CIAO MONDO!', 00H ; `string' ; Function compile flags: /Ogtpy CONST ENDS ; COMDAT _main _TEXT SEGMENT _main PROC ; COMDAT ; Line 4 push OFFSET ??_C@_0M@DIMJODLI@CIAO?5MONDO?$CB?$AA@ call _puts add esp, 4 ; Line 5 xor eax, eax ; Line 6 ret 0 _main ENDP _TEXT ENDS END Codice:
/* prova.c */
#include <stdio.h>
int main(void){
puts("CIAO MONDO!");
return 0;
}
Ultima modifica di variabilepippo : 04-04-2008 alle 12:43. |
|
|
|
|
|
|
#12 |
|
Senior Member
Iscritto dal: Mar 2007
Messaggi: 1792
|
I file con estensione .cpp possono essere compilati anche con l'opzione /clr, in tal caso si ottiene:
Codice:
file "prova.cpp" .rdata $SG6926: .ascii "CIAO MONDO!\000" .bss .local $T6944,0 ; Function compile flags: /Odtp .text .global ?main@@$$HYAHXZ ; main ?main@@$$HYAHXZ: ; main ; .proc.def D:I() ; Function Header: ; max stack depth = 1 ; function size = 17 bytes ; local varsig tk = 0x11000001 ; Exception Information: ; 0 handlers, each consisting of filtered handlers ; .local.i4 0,"$T6943" SIG: i4 ; .proc.beg ; File prova.cpp ; Line 5 ldc.i.0 0 ; i32 0x0 stloc.0 ; $T6943 ldsflda $SG6926 call ?puts@@$$J0YAHPBD@Z pop ; Line 6 ldc.i.0 0 ; i32 0x0 stloc.0 ; $T6943 ; Line 7 ldloc.0 ; $T6943 ret .end ?main@@$$HYAHXZ ; main ; .proc.end.i4 _TEXT ENDS PUBLIC __mep@?main@@$$HYAHXZ PUBLIC _main ; COMDAT __mep@?main@@$$HYAHXZ data SEGMENT __mep@?main@@$$HYAHXZ TOKEN 0A000009 ; Function compile flags: /Odtp data ENDS ; COMDAT _main _TEXT SEGMENT _main PROC ; COMDAT jmp DWORD PTR __mep@?main@@$$HYAHXZ _main ENDP _TEXT ENDS END |
|
|
|
|
|
#13 |
|
Senior Member
Iscritto dal: Mar 2007
Messaggi: 7863
|
Grazie!Il file. asm è uguale al .s?
|
|
|
|
|
|
#14 | |
|
Senior Member
Iscritto dal: Mar 2007
Messaggi: 1792
|
Quote:
Ogni compilatore genera un codice binario diverso, quindi i file .asm/.s in generale non sono uguali se creati da compilatori differenti. Per esempio GNU GCC tira fuori (partendo dall'Hello World) il seguente file prova.s: Codice:
.file "test.c" .def ___main; .scl 2; .type 32; .endef .section .rdata,"dr" LC0: .ascii "CIAO MONDO!\0" .text .p2align 4,,15 .globl _main .def _main; .scl 2; .type 32; .endef _main: leal 4(%esp), %ecx andl $-16, %esp pushl -4(%ecx) pushl %ebp movl %esp, %ebp pushl %ecx subl $4, %esp call ___main movl $LC0, (%esp) call _puts addl $4, %esp xorl %eax, %eax popl %ecx popl %ebp leal -4(%ecx), %esp ret .def _puts; .scl 2; .type 32; .endef Codice:
.file "test.c" .intel_syntax .def ___main; .scl 2; .type 32; .endef .section .rdata,"dr" LC0: .ascii "CIAO MONDO!\0" .text .p2align 4,,15 .globl _main .def _main; .scl 2; .type 32; .endef _main: lea ecx, [esp+4] and esp, -16 push DWORD PTR [ecx-4] push ebp mov ebp, esp push ecx sub esp, 4 call ___main mov DWORD PTR [esp], OFFSET FLAT:LC0 call _puts add esp, 4 xor eax, eax pop ecx pop ebp lea esp, [ecx-4] ret .def _puts; .scl 2; .type 32; .endef Codice:
.386p
ifdef ??version
if ??version GT 500H
.mmx
endif
endif
model flat
ifndef ??version
?debug macro
endm
endif
?debug S "test.c"
?debug T "test.c"
_TEXT segment dword public use32 'CODE'
_TEXT ends
_DATA segment dword public use32 'DATA'
_DATA ends
_BSS segment dword public use32 'BSS'
_BSS ends
DGROUP group _BSS,_DATA
_TEXT segment dword public use32 'CODE'
_main proc near
?live1@0:
;
; int main(void){
;
push ebp
mov ebp,esp
;
; puts("CIAO MONDO!");
;
@1:
push offset s@
call _puts
pop ecx
;
; return 0;
;
xor eax,eax
;
; }
;
@3:
@2:
pop ebp
ret
_main endp
_TEXT ends
_DATA segment dword public use32 'DATA'
s@ label byte
; s@+0:
db "CIAO MONDO!",0
align 4
_DATA ends
_TEXT segment dword public use32 'CODE'
_TEXT ends
public _main
extrn _puts:near
?debug D "test.c" 14468 26281
end
Ultima modifica di variabilepippo : 04-04-2008 alle 12:57. |
|
|
|
|
|
|
#15 |
|
Senior Member
Iscritto dal: Mar 2007
Messaggi: 7863
|
No dicevo i file .asm e .s contengono codice assembly ma come mai alcuni compilatori utilizzano un' estensioni e alcuni l' altra?
Con quale comando hai ottenuto la sintassi intel? |
|
|
|
|
|
#16 | ||
|
Senior Member
Iscritto dal: Mar 2007
Messaggi: 1792
|
Quote:
Quote:
|
||
|
|
|
|
|
#17 |
|
Senior Member
Iscritto dal: Mar 2007
Messaggi: 7863
|
Esisterà qualche motivo nella scelta dell' estensione presumo!Probabilmente dipende dalla piattaforma?!
Ultima modifica di nuovoUtente86 : 04-04-2008 alle 13:21. |
|
|
|
|
|
#18 | |
|
Senior Member
Iscritto dal: Mar 2007
Messaggi: 1792
|
Quote:
|
|
|
|
|
|
|
#19 | ||
|
Senior Member
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
|
Quote:
Quote:
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro @LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys |
||
|
|
|
|
|
#20 | |
|
Senior Member
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
|
Quote:
Blitter.s ftp://ftp.scene.org/pub/mirrors/amig...Time/blitter.S
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto. E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test. |
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 09:40.





















