Est-ce que c++ est dépendant de la plateforme?

peut-on dire que C++ est dépendant de la plate-forme?

je sais que C++ utilise des compilateurs, et ces compilateurs sont différents pour différentes plateformes. Lorsque nous compilons du code C++ en utilisant le compilateur par exemple: sous Windows,.EXE format fichier créé.

Pourquoi .EXE dépendant de l'OS du fichier/de la plate-forme?

Quel est le format à l'intérieur de .Les fichiers EXE<!--4?

pourquoi ne peut-on pas l'exécuter sur d'autres plateformes?

18
demandé sur Sanjaya Pandey 2012-08-04 21:14:40

7 réponses

il s'agit en fait d'un sujet relativement vaste. Pour simplifier, il s'agit de deux choses: le système d'exploitation et l'architecture CPU.

tout d'Abord, *.exe n'est généralement que Windows puisqu'il est binaire code que le système d'exploitation windows sait exécuter. En outre, le système d'exploitation sait comment traduire ce que le bon code pour l'architecture (c'est pourquoi Windows est "compatible"). Notez que beaucoup plus qui se passe, mais c'est un (très) abstraction de haut niveau de ce qui se passe.

maintenant, les compilateurs vont prendre le code C++ et générer le code d'assemblage correspondant pour l'architecture (c'est-à-dire x86, MIPS, etc.). En général, le compilateur a aussi un assembleur (ou un assembleur sur lequel il peut compter). L'assembleur code les liens et génère le code binaire que le matériel peut exécuter. Pour de plus amples renseignements sur ce sujet, veuillez consulter le site Web de co-generation.

Supplémentaires Remarque

considérons Java qui n'est pas dépendant de la plate-forme. Les compilateurs Java génèrent un bytecode Java qui est exécuté sur la machine virtuelle Java (JVM). Il est important de noter que tout moment vous souhaitez exécuter une application Java, vous devez exécuter la machine virtuelle Java. Puisque le JVM précompilé sait fonctionner sur votre système d'exploitation et l'architecture CPU, Il peut exécuter son bytecode Java et exécuter efficacement les actions correspondantes pour votre système particulier.

Dans un fichier binaire compilé (i.e. un à partir du code C++), vous avez le bytecode système. Ainsi, le type d'instructions que Java simule pour vous est directement codé en dur dans le .exe ou quelque soit le format binaire que vous utilisez. Considérons l'exemple suivant:

notez que ce code java doit éventuellement être exécuté dans la JVM et ne peut pas être autonome.

Java Code:
System.out.println("hello") (To be compiled)

Compiled Java bytecode:
Print "hello" (To be run in JVM)

JVM:
(... some translation, maybe to architecture code - I forget exactly ...)
system_print_code "hello" (JVM translation to CPU specific)

Contre le C++ (qui peut être exécuté en mode autonome):

C++ Code:
cout<< "hello";

Architecture Code:
some_assembly_routine "hello"

Binary output:
system_print_code "hello"

Un exemple

si vous êtes curieux de savoir à quoi cela ressemble dans la réalité, j'en ai inclus Un ci-dessous.

C++ Source Je l'ai mise dans un fichier appelé bonjour.rpc

#include <iostream>

int main() {
  using namespace std;
  cout << "Hello world!" << endl;
  return 0;
}

Assemblée (Générée à partir de sources C++) Généré à l'aide de g++ -S hello.cpp

    .file   "test.c"
    .section    .rodata
    .type   _ZStL19piecewise_construct, @object
    .size   _ZStL19piecewise_construct, 1
_ZStL19piecewise_construct:
    .zero   1
    .local  _ZStL8__ioinit
    .comm   _ZStL8__ioinit,1,1
.LC0:
    .string "Hello world!"
    .text
    .globl  main
    .type   main, @function
main:
.LFB1493:
    .cfi_startproc
    pushq   %rbp
    .cfi_def_cfa_offset 16
    .cfi_offset 6, -16
    movq    %rsp, %rbp
    .cfi_def_cfa_register 6
    leaq    .LC0(%rip), %rsi
    leaq    _ZSt4cout(%rip), %rdi
    call    _ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc@PLT
    movq    %rax, %rdx
    movq    _ZSt4endlIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_@GOTPCREL(%rip), %rax
    movq    %rax, %rsi
    movq    %rdx, %rdi
    call    _ZNSolsEPFRSoS_E@PLT
    movl    , %eax
    popq    %rbp
    .cfi_def_cfa 7, 8
    ret
    .cfi_endproc
.LFE1493:
    .size   main, .-main
    .type   _Z41__static_initialization_and_destruction_0ii, @function
_Z41__static_initialization_and_destruction_0ii:
.LFB1982:
    .cfi_startproc
    pushq   %rbp
    .cfi_def_cfa_offset 16
    .cfi_offset 6, -16
    movq    %rsp, %rbp
    .cfi_def_cfa_register 6
    subq    , %rsp
    movl    %edi, -4(%rbp)
    movl    %esi, -8(%rbp)
    cmpl    , -4(%rbp)
    jne .L5
    cmpl    535, -8(%rbp)
    jne .L5
    leaq    _ZStL8__ioinit(%rip), %rdi
    call    _ZNSt8ios_base4InitC1Ev@PLT
    leaq    __dso_handle(%rip), %rdx
    leaq    _ZStL8__ioinit(%rip), %rsi
    movq    _ZNSt8ios_base4InitD1Ev@GOTPCREL(%rip), %rax
    movq    %rax, %rdi
    call    __cxa_atexit@PLT
.L5:
    nop
    leave
    .cfi_def_cfa 7, 8
    ret
    .cfi_endproc
.LFE1982:
    .size   _Z41__static_initialization_and_destruction_0ii, .-_Z41__static_initialization_and_destruction_0ii
    .type   _GLOBAL__sub_I_main, @function
_GLOBAL__sub_I_main:
.LFB1983:
    .cfi_startproc
    pushq   %rbp
    .cfi_def_cfa_offset 16
    .cfi_offset 6, -16
    movq    %rsp, %rbp
    .cfi_def_cfa_register 6
    movl    535, %esi
    movl    , %edi
    call    _Z41__static_initialization_and_destruction_0ii
    popq    %rbp
    .cfi_def_cfa 7, 8
    ret
    .cfi_endproc
.LFE1983:
    .size   _GLOBAL__sub_I_main, .-_GLOBAL__sub_I_main
    .section    .init_array,"aw"
    .align 8
    .quad   _GLOBAL__sub_I_main
    .hidden __dso_handle
    .ident  "GCC: (GNU) 7.2.1 20171128"
    .section    .note.GNU-stack,"",@progbits

sortie binaire (générée à partir de l'assemblage) Il s'agit de la forme non liée (c'est-à-dire non encore entièrement remplie avec des emplacements de symboles) de la sortie binaire générée via g++ -c sous forme hexadécimale. J'ai généré la représentation hexadécimale en utilisant xxd.

00000000: 7f45 4c46 0201 0100 0000 0000 0000 0000  .ELF............
00000010: 0100 3e00 0100 0000 0000 0000 0000 0000  ..>.............
00000020: 0000 0000 0000 0000 0807 0000 0000 0000  ................
00000030: 0000 0000 4000 0000 0000 4000 0f00 0e00  ....@.....@.....
00000040: 5548 89e5 488d 3500 0000 0048 8d3d 0000  UH..H.5....H.=..
00000050: 0000 e800 0000 0048 89c2 488b 0500 0000  .......H..H.....
00000060: 0048 89c6 4889 d7e8 0000 0000 b800 0000  .H..H...........
00000070: 005d c355 4889 e548 83ec 1089 7dfc 8975  .].UH..H....}..u
00000080: f883 7dfc 0175 3281 7df8 ffff 0000 7529  ..}..u2.}.....u)
00000090: 488d 3d00 0000 00e8 0000 0000 488d 1500  H.=.........H...
000000a0: 0000 0048 8d35 0000 0000 488b 0500 0000  ...H.5....H.....
000000b0: 0048 89c7 e800 0000 0090 c9c3 5548 89e5  .H..........UH..
000000c0: beff ff00 00bf 0100 0000 e8a4 ffff ff5d  ...............]
000000d0: c300 4865 6c6c 6f20 776f 726c 6421 0000  ..Hello world!..
000000e0: 0000 0000 0000 0000 0047 4343 3a20 2847  .........GCC: (G
000000f0: 4e55 2920 372e 322e 3120 3230 3137 3131  NU) 7.2.1 201711
00000100: 3238 0000 0000 0000 1400 0000 0000 0000  28..............
00000110: 017a 5200 0178 1001 1b0c 0708 9001 0000  .zR..x..........
00000120: 1c00 0000 1c00 0000 0000 0000 3300 0000  ............3...
00000130: 0041 0e10 8602 430d 066e 0c07 0800 0000  .A....C..n......
00000140: 1c00 0000 3c00 0000 0000 0000 4900 0000  ....<.......I...
00000150: 0041 0e10 8602 430d 0602 440c 0708 0000  .A....C...D.....
00000160: 1c00 0000 5c00 0000 0000 0000 1500 0000  ....\...........
00000170: 0041 0e10 8602 430d 0650 0c07 0800 0000  .A....C..P......
00000180: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000190: 0000 0000 0000 0000 0100 0000 0400 f1ff  ................
000001a0: 0000 0000 0000 0000 0000 0000 0000 0000  ................
000001b0: 0000 0000 0300 0100 0000 0000 0000 0000  ................
000001c0: 0000 0000 0000 0000 0000 0000 0300 0300  ................
000001d0: 0000 0000 0000 0000 0000 0000 0000 0000  ................
000001e0: 0000 0000 0300 0400 0000 0000 0000 0000  ................
000001f0: 0000 0000 0000 0000 0000 0000 0300 0500  ................
00000200: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000210: 0800 0000 0100 0500 0000 0000 0000 0000  ................
00000220: 0100 0000 0000 0000 2300 0000 0100 0400  ........#.......
00000230: 0000 0000 0000 0000 0100 0000 0000 0000  ................
00000240: 3200 0000 0200 0100 3300 0000 0000 0000  2.......3.......
00000250: 4900 0000 0000 0000 6200 0000 0200 0100  I.......b.......
00000260: 7c00 0000 0000 0000 1500 0000 0000 0000  |...............
00000270: 0000 0000 0300 0600 0000 0000 0000 0000  ................
00000280: 0000 0000 0000 0000 0000 0000 0300 0900  ................
00000290: 0000 0000 0000 0000 0000 0000 0000 0000  ................
000002a0: 0000 0000 0300 0a00 0000 0000 0000 0000  ................
000002b0: 0000 0000 0000 0000 0000 0000 0300 0800  ................
000002c0: 0000 0000 0000 0000 0000 0000 0000 0000  ................
000002d0: 7100 0000 1200 0100 0000 0000 0000 0000  q...............
000002e0: 3300 0000 0000 0000 7600 0000 1000 0000  3.......v.......
000002f0: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000300: 8000 0000 1000 0000 0000 0000 0000 0000  ................
00000310: 0000 0000 0000 0000 9600 0000 1000 0000  ................
00000320: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000330: ce00 0000 1000 0000 0000 0000 0000 0000  ................
00000340: 0000 0000 0000 0000 0901 0000 1000 0000  ................
00000350: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000360: 1a01 0000 1000 0000 0000 0000 0000 0000  ................
00000370: 0000 0000 0000 0000 3201 0000 1002 0000  ........2.......
00000380: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000390: 3f01 0000 1000 0000 0000 0000 0000 0000  ?...............
000003a0: 0000 0000 0000 0000 5701 0000 1000 0000  ........W.......
000003b0: 0000 0000 0000 0000 0000 0000 0000 0000  ................
000003c0: 0074 6573 742e 6300 5f5a 5374 4c31 3970  .test.c._ZStL19p
000003d0: 6965 6365 7769 7365 5f63 6f6e 7374 7275  iecewise_constru
000003e0: 6374 005f 5a53 744c 385f 5f69 6f69 6e69  ct._ZStL8__ioini
000003f0: 7400 5f5a 3431 5f5f 7374 6174 6963 5f69  t._Z41__static_i
00000400: 6e69 7469 616c 697a 6174 696f 6e5f 616e  nitialization_an
00000410: 645f 6465 7374 7275 6374 696f 6e5f 3069  d_destruction_0i
00000420: 6900 5f47 4c4f 4241 4c5f 5f73 7562 5f49  i._GLOBAL__sub_I
00000430: 5f6d 6169 6e00 5f5a 5374 3463 6f75 7400  _main._ZSt4cout.
00000440: 5f47 4c4f 4241 4c5f 4f46 4653 4554 5f54  _GLOBAL_OFFSET_T
00000450: 4142 4c45 5f00 5f5a 5374 6c73 4953 7431  ABLE_._ZStlsISt1
00000460: 3163 6861 725f 7472 6169 7473 4963 4545  1char_traitsIcEE
00000470: 5253 7431 3362 6173 6963 5f6f 7374 7265  RSt13basic_ostre
00000480: 616d 4963 545f 4553 355f 504b 6300 5f5a  amIcT_ES5_PKc._Z
00000490: 5374 3465 6e64 6c49 6353 7431 3163 6861  St4endlIcSt11cha
000004a0: 725f 7472 6169 7473 4963 4545 5253 7431  r_traitsIcEERSt1
000004b0: 3362 6173 6963 5f6f 7374 7265 616d 4954  3basic_ostreamIT
000004c0: 5f54 305f 4553 365f 005f 5a4e 536f 6c73  _T0_ES6_._ZNSols
000004d0: 4550 4652 536f 535f 4500 5f5a 4e53 7438  EPFRSoS_E._ZNSt8
000004e0: 696f 735f 6261 7365 3449 6e69 7443 3145  ios_base4InitC1E
000004f0: 7600 5f5f 6473 6f5f 6861 6e64 6c65 005f  v.__dso_handle._
00000500: 5a4e 5374 3869 6f73 5f62 6173 6534 496e  ZNSt8ios_base4In
00000510: 6974 4431 4576 005f 5f63 7861 5f61 7465  itD1Ev.__cxa_ate
00000520: 7869 7400 0000 0000 0700 0000 0000 0000  xit.............
00000530: 0200 0000 0500 0000 fdff ffff ffff ffff  ................
00000540: 0e00 0000 0000 0000 0200 0000 0f00 0000  ................
00000550: fcff ffff ffff ffff 1300 0000 0000 0000  ................
00000560: 0400 0000 1100 0000 fcff ffff ffff ffff  ................
00000570: 1d00 0000 0000 0000 2a00 0000 1200 0000  ........*.......
00000580: fcff ffff ffff ffff 2800 0000 0000 0000  ........(.......
00000590: 0400 0000 1300 0000 fcff ffff ffff ffff  ................
000005a0: 5300 0000 0000 0000 0200 0000 0400 0000  S...............
000005b0: fcff ffff ffff ffff 5800 0000 0000 0000  ........X.......
000005c0: 0400 0000 1400 0000 fcff ffff ffff ffff  ................
000005d0: 5f00 0000 0000 0000 0200 0000 1500 0000  _...............
000005e0: fcff ffff ffff ffff 6600 0000 0000 0000  ........f.......
000005f0: 0200 0000 0400 0000 fcff ffff ffff ffff  ................
00000600: 6d00 0000 0000 0000 2a00 0000 1600 0000  m.......*.......
00000610: fcff ffff ffff ffff 7500 0000 0000 0000  ........u.......
00000620: 0400 0000 1700 0000 fcff ffff ffff ffff  ................
00000630: 0000 0000 0000 0000 0100 0000 0200 0000  ................
00000640: 7c00 0000 0000 0000 2000 0000 0000 0000  |....... .......
00000650: 0200 0000 0200 0000 0000 0000 0000 0000  ................
00000660: 4000 0000 0000 0000 0200 0000 0200 0000  @...............
00000670: 3300 0000 0000 0000 6000 0000 0000 0000  3.......`.......
00000680: 0200 0000 0200 0000 7c00 0000 0000 0000  ........|.......
00000690: 002e 7379 6d74 6162 002e 7374 7274 6162  ..symtab..strtab
000006a0: 002e 7368 7374 7274 6162 002e 7265 6c61  ..shstrtab..rela
000006b0: 2e74 6578 7400 2e64 6174 6100 2e62 7373  .text..data..bss
000006c0: 002e 726f 6461 7461 002e 7265 6c61 2e69  ..rodata..rela.i
000006d0: 6e69 745f 6172 7261 7900 2e63 6f6d 6d65  nit_array..comme
000006e0: 6e74 002e 6e6f 7465 2e47 4e55 2d73 7461  nt..note.GNU-sta
000006f0: 636b 002e 7265 6c61 2e65 685f 6672 616d  ck..rela.eh_fram
00000700: 6500 0000 0000 0000 0000 0000 0000 0000  e...............
00000710: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000720: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000730: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000740: 0000 0000 0000 0000 2000 0000 0100 0000  ........ .......
00000750: 0600 0000 0000 0000 0000 0000 0000 0000  ................
00000760: 4000 0000 0000 0000 9100 0000 0000 0000  @...............
00000770: 0000 0000 0000 0000 0100 0000 0000 0000  ................
00000780: 0000 0000 0000 0000 1b00 0000 0400 0000  ................
00000790: 4000 0000 0000 0000 0000 0000 0000 0000  @...............
000007a0: 2805 0000 0000 0000 0801 0000 0000 0000  (...............
000007b0: 0c00 0000 0100 0000 0800 0000 0000 0000  ................
000007c0: 1800 0000 0000 0000 2600 0000 0100 0000  ........&.......
000007d0: 0300 0000 0000 0000 0000 0000 0000 0000  ................
000007e0: d100 0000 0000 0000 0000 0000 0000 0000  ................
000007f0: 0000 0000 0000 0000 0100 0000 0000 0000  ................
00000800: 0000 0000 0000 0000 2c00 0000 0800 0000  ........,.......
00000810: 0300 0000 0000 0000 0000 0000 0000 0000  ................
00000820: d100 0000 0000 0000 0100 0000 0000 0000  ................
00000830: 0000 0000 0000 0000 0100 0000 0000 0000  ................
00000840: 0000 0000 0000 0000 3100 0000 0100 0000  ........1.......
00000850: 0200 0000 0000 0000 0000 0000 0000 0000  ................
00000860: d100 0000 0000 0000 0e00 0000 0000 0000  ................
00000870: 0000 0000 0000 0000 0100 0000 0000 0000  ................
00000880: 0000 0000 0000 0000 3e00 0000 0e00 0000  ........>.......
00000890: 0300 0000 0000 0000 0000 0000 0000 0000  ................
000008a0: e000 0000 0000 0000 0800 0000 0000 0000  ................
000008b0: 0000 0000 0000 0000 0800 0000 0000 0000  ................
000008c0: 0800 0000 0000 0000 3900 0000 0400 0000  ........9.......
000008d0: 4000 0000 0000 0000 0000 0000 0000 0000  @...............
000008e0: 3006 0000 0000 0000 1800 0000 0000 0000  0...............
000008f0: 0c00 0000 0600 0000 0800 0000 0000 0000  ................
00000900: 1800 0000 0000 0000 4a00 0000 0100 0000  ........J.......
00000910: 3000 0000 0000 0000 0000 0000 0000 0000  0...............
00000920: e800 0000 0000 0000 1b00 0000 0000 0000  ................
00000930: 0000 0000 0000 0000 0100 0000 0000 0000  ................
00000940: 0100 0000 0000 0000 5300 0000 0100 0000  ........S.......
00000950: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000960: 0301 0000 0000 0000 0000 0000 0000 0000  ................
00000970: 0000 0000 0000 0000 0100 0000 0000 0000  ................
00000980: 0000 0000 0000 0000 6800 0000 0100 0000  ........h.......
00000990: 0200 0000 0000 0000 0000 0000 0000 0000  ................
000009a0: 0801 0000 0000 0000 7800 0000 0000 0000  ........x.......
000009b0: 0000 0000 0000 0000 0800 0000 0000 0000  ................
000009c0: 0000 0000 0000 0000 6300 0000 0400 0000  ........c.......
000009d0: 4000 0000 0000 0000 0000 0000 0000 0000  @...............
000009e0: 4806 0000 0000 0000 4800 0000 0000 0000  H.......H.......
000009f0: 0c00 0000 0a00 0000 0800 0000 0000 0000  ................
00000a00: 1800 0000 0000 0000 0100 0000 0200 0000  ................
00000a10: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000a20: 8001 0000 0000 0000 4002 0000 0000 0000  ........@.......
00000a30: 0d00 0000 0e00 0000 0800 0000 0000 0000  ................
00000a40: 1800 0000 0000 0000 0900 0000 0300 0000  ................
00000a50: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000a60: c003 0000 0000 0000 6401 0000 0000 0000  ........d.......
00000a70: 0000 0000 0000 0000 0100 0000 0000 0000  ................
00000a80: 0000 0000 0000 0000 1100 0000 0300 0000  ................
00000a90: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000aa0: 9006 0000 0000 0000 7200 0000 0000 0000  ........r.......
00000ab0: 0000 0000 0000 0000 0100 0000 0000 0000  ................
00000ac0: 0000 0000 0000 0000                      ........

ces instructions correspondent à une machine x86_64. Si vous êtes intéressé à suivre le long et l'appariement des codes op, vous pouvez regardez cette référence ou télécharger le manuel Intel pour être complet. De même, il est un elfe fichier de sorte que vous pouvez observer que nous voyons les choses que nous attendons (c.-à-d. le nombre magique de départ de 0x7f, etc.).

dans tous les cas, une fois lié au système (c'est-à-dire exécuter g++ test.cpp ou g++ test.s ou g++ test.o), cet exécutable tourne directement sur votre système D'exploitation. Il n'y a pas de couches de traduction supplémentaires entre ceci et L'OS. Même ainsi, le système d'exploitation fait encore des choses comme l'Abstraction des interfaces matérielles, la gestion des ressources du système, etc.

en liant cela à la question d'origine, le binaire de sortie aura l'air très différent sur une machine windows (pour le même code C++). À l' moins, sur une machine windows, vous pouvez vous attendre à voir le fichier dans le Portable Executable (PE) format ce qui n'est clairement pas elfe.

cela ne ressemble pas à L'exemple Java suivant qui nécessite L'exécution D'une JVM:

Fichier Source Java Ceci est placé dans un fichier appelé Test.java

package mytest;

public class Test {
  public static void main(String[] args) {
    System.out.println("Hello world!");
  }
}

Java Byte Code (Générée à partir de sources Java) Ceci est généré en exécutant javac -d . Test.java et l'exécution du fichier de sortie (i.e. mytest/Test.class)xxd

00000000: cafe babe 0000 0034 001d 0a00 0600 0f09  .......4........
00000010: 0010 0011 0800 120a 0013 0014 0700 1507  ................
00000020: 0016 0100 063c 696e 6974 3e01 0003 2829  .....<init>...()
00000030: 5601 0004 436f 6465 0100 0f4c 696e 654e  V...Code...LineN
00000040: 756d 6265 7254 6162 6c65 0100 046d 6169  umberTable...mai
00000050: 6e01 0016 285b 4c6a 6176 612f 6c61 6e67  n...([Ljava/lang
00000060: 2f53 7472 696e 673b 2956 0100 0a53 6f75  /String;)V...Sou
00000070: 7263 6546 696c 6501 0009 5465 7374 2e6a  rceFile...Test.j
00000080: 6176 610c 0007 0008 0700 170c 0018 0019  ava.............
00000090: 0100 0c48 656c 6c6f 2077 6f72 6c64 2107  ...Hello world!.
000000a0: 001a 0c00 1b00 1c01 000b 6d79 7465 7374  ..........mytest
000000b0: 2f54 6573 7401 0010 6a61 7661 2f6c 616e  /Test...java/lan
000000c0: 672f 4f62 6a65 6374 0100 106a 6176 612f  g/Object...java/
000000d0: 6c61 6e67 2f53 7973 7465 6d01 0003 6f75  lang/System...ou
000000e0: 7401 0015 4c6a 6176 612f 696f 2f50 7269  t...Ljava/io/Pri
000000f0: 6e74 5374 7265 616d 3b01 0013 6a61 7661  ntStream;...java
00000100: 2f69 6f2f 5072 696e 7453 7472 6561 6d01  /io/PrintStream.
00000110: 0007 7072 696e 746c 6e01 0015 284c 6a61  ..println...(Lja
00000120: 7661 2f6c 616e 672f 5374 7269 6e67 3b29  va/lang/String;)
00000130: 5600 2100 0500 0600 0000 0000 0200 0100  V.!.............
00000140: 0700 0800 0100 0900 0000 1d00 0100 0100  ................
00000150: 0000 052a b700 01b1 0000 0001 000a 0000  ...*............
00000160: 0006 0001 0000 0003 0009 000b 000c 0001  ................
00000170: 0009 0000 0025 0002 0001 0000 0009 b200  .....%..........
00000180: 0212 03b6 0004 b100 0000 0100 0a00 0000  ................
00000190: 0a00 0200 0000 0500 0800 0600 0100 0d00  ................
000001a0: 0000 0200 0e                             .....

comme on pouvait s'y attendre, la sortie du code octet commence avec 0xCAFEBABE.

la distinction critique ici, cependant, est que ce code ne peut pas être exécuté directement. C'est encore une sortie binaire, mais elle n'est pas destinée à être exécutée directement par le système d'exploitation. Si vous essayiez d'exécuter ceci sans JVM sur votre système, vous obtiendriez juste une erreur. Toutefois, ce code peut être exécuté sur système qui contient un compatible JVM. L'ensemble des JVM compatibles dépend de la façon dont vous avez définissez votre source et votre cible. Par défaut, c'est l'équivalent de la version Java que vous utilisez pour compiler. Dans ce cas, J'ai utilisé Java 8.

la façon dont cela fonctionne est que votre JVM est compilé spécifiquement pour chaque système (similaire à L'exemple C++ ci-dessus) et traduit son code binaire Java byte en quelque chose que votre système peut maintenant exécuter.

a la fin de la journée, il n'y a pas de repas gratuit-- comme DanielKO l'a mentionné dans les commentaires, la JVM est toujours une "plate-forme" mais c'est un niveau plus élevé que L'OS donc il peut sembler un peu plus portable. Finalement, quelque part en cours de route, le code doit se traduire en instructions valides pour votre famille de système d'exploitation spécifique et l'architecture CPU. Cependant, dans le cas de Java et de la JVM, vous n'avez qu'à compiler une seule application

comme je l'ai déjà mentionné, cette information comporte de nombreuses mises en garde :) il s'agit d'un exemple assez simple destiné à illustrer ce que vous pourriez réellement observer. Cela dit, Nous ne nous sommes pas mis à appeler du code natif, en utilisant des agents JVM personnalisés, ou quoi que ce soit d'autre qui peut affecter légèrement cette réponse. En général, cependant, ces cas entrent plus souvent dans la catégorie des "cas spéciaux" et vous n'utiliseriez pas souvent ces choses à moins que vous compreniez pourquoi et (espérons-le) leurs implications pour la portabilité.

33
répondu RageD 2017-12-11 14:36:20

C++ n'est pas dépendant de la plate - forme-en fait, il y a une norme que tous les fournisseurs essaient d'implémenter. Ce que vous voulez dire, c'est que l'exécutable produit dépend de la plate-forme. C'est parce que chaque OS a une définition et des exigences différentes de ce qui constitue un fichier exécutable valide. De plus, chaque OS a un ensemble différent d'API utilisées pour implémenter les services de base qui doivent être liées par le linker et le compilateur C++. Mais cela n'a rien à voir avec C++ en tant que langage.

24
répondu Lubo Antonov 2012-08-04 17:22:37

en fait C++ n'est pas dépendant de la plate-forme, mais la sortie qu'il produit est en .exe ou autre format qui dépend de la plate-forme que vous utilisez. donc le code de C++est tout simplement indépendant de la plate-forme, juste la sortie vient après la compilation est dépendante.

6
répondu Ramesh Karna 2012-08-12 03:49:24

ce qui rend un langage, comme C++, "indépendant de la plate-forme", c'est qu'il ne s'appuie pas sur des constructions de langage fortement favorisées par une architecture CPU donnée. Le langage d'assemblage, par exemple et en contraste, est tout à fait spécifique à une architecture CPU et à un jeu d'instructions. Le devant d'un compilateur C++ (analyse sémantique et parsing) peut être le même ou essentiellement le même pour n'importe quelle plate-forme informatique visée. Cependant, il faut encore qu'il y ait un code spécifique à la plateforme ou au CPU. générateur (par exemple, pour x86, ARM, etc).

un EXE est un fichier binaire spécialement compilé et généré par code pour la plate-forme DOS/Windows. Sa structure est connue par le système DOS / Windows et il contient des informations sur la façon de localiser l'exécutable en mémoire ainsi que tous les codes d'instruction spécifiques au CPU/plate-forme pour qu'il tourne. Comme indiqué par Oleksandr, son format spécifique peut être trouvé, par exemple, sur Wikipédia.

5
répondu lurker 2012-08-04 17:32:53

C++ n'est pas dépendant de la plate-forme en soi, mais il est possible d'écrire du code dépendant de la plate-forme avec C++ en appelant Windows et/ou Linux uniquement des API. Il est également possible d'être bloqué sur une plate-forme particulière si vous utilisez uniquement des extensions C++ de Microsoft, etc.

le format exécutable pour une plate-forme donnée est une ligue complètement différente.

4
répondu Kent 2012-08-04 17:22:54

C++ ne dépend pas de la plate-forme.

il y a d'autres plates-formes dehors que Windows.

il y a d'autres processeurs à part le X86 ou le Pentium que Windows utilise.

The est un domaine appelé "Embedded Systems" qui utilise le langage C++ sur de nombreux autres types et marques de systèmes d'exploitation et de processeurs. Par exemple, il y a le DSPs, le bon vieux 8051 et la série ARM.

la raison pour laquelle les langues de haut niveau étaient inventé est de sorte qu'un programme peut être écrit une fois mais compilé (traduit) à d'autres plates-formes. Par exemple, un programme C++ indépendant de la plate-forme peut être compilé pour une machine PDP, Windows, Mac, Unix, Vrtx, Windriver, ARM processeur, le tout sans changer le programme.

en général, les exécutables dépendent de la plate-forme.

2
répondu Thomas Matthews 2012-08-04 18:19:03

il y a deux aspects importants à tout langage de programmation (tel que C++) que cette question touche:

  1. Comment vous dire à l'ordinateur de faire ce que vous voulez.
  2. Comment l'ordinateur fait ce que vous lui avez dit.

le second aspect sera toujours dépendent de la plate-forme, parce que l'ordinateur doit utiliser les codes machines, les bibliothèques de système, et ainsi de suite qui travaillent sur l'architecture de processeur particulière et le système d'exploitation de cet ordinateur.

le premier aspect peut dépendre ou non de la plateforme, selon le langage et la façon dont vous l'utilisez.

Donc un *.le fichier exe est une chose dépendante de la plate-forme, parce qu'il dit exactement comment l'ordinateur va faire ce que vous lui avez dit de faire. Mais l' *.le fichier exe n'est pas c++; il aurait pu être compilé à partir d'un autre langage de programmation.

un programme C++ peut ou non dépendre de la plate-forme. Si vous appelez des fonctions qui sont fournies par le compilateur sur Windows et pas dans les autres systèmes d'exploitation, alors votre programme C++ compilera seulement sur Windows. C'est une plate-forme de dépendance. Mais si vous évitez d'appeler des fonctions dépendantes de la plate-forme tels que ceux, vous pouvez compiler le programme C++ n'importe où.

0
répondu David K 2017-12-11 14:41:32