Na era do desenvolvimento e programação de software moderno, o termo "tempo de execução" pode significar coisas diferentes dependendo do contexto e da linguagem em discussão. Estou aqui para esclarecer essas diferenças, focando em como os tempos de execução funcionam em C em comparação com linguagens mais modernas como Java ou Python. Pretendo manter este artigo voltado para programadores iniciantes, portanto evitarei me aprofundar em conceitos complexos.
Em sua essência, um tempo de execução é o próprio programa que lê e executa código escrito por um desenvolvedor. Mas fica confuso quando alguns desenvolvedores usam tempo de execução com linguagem C.
Em linguagens como Java ou Python, o runtime é um programa em si que lê seu arquivo myfile.js, é por isso que você executa programas nodejs como: node myfile.js e v8 engine( é o mecanismo JavaScript, ele analisa e executa JavaScript code.) gerencia tudo, quer você crie um novo arquivo, ative um processo filho e etc. e o mais importante, você não pode fazer nada que a v8 não permita.
Mas quando você executa um programa c você não faz c myfile.c você só precisa compilá-lo uma vez e agora você não precisa mais do gcc, apenas execute-o diretamente.
C é na verdade um conjunto de código inserido estaticamente e instruções adicionadas durante a compilação. É um conjunto mínimo de instruções incluídas no binário final para lidar com certas tarefas necessárias no nível da CPU/SO. Ele lida com a criação e desmontagem de stack frames para chamadas de função (usando instruções como PUSH, POP, CALL, RET em assembly). Mesmo isso pode ser substituído fornecendo sua própria função __start usando assembly embutido, dando aos desenvolvedores controle total sobre o ponto de entrada e inicialização do programa.
void__start(){ //Ponto de entrada personalizado, sem inicialização de biblioteca padrão // Você não tem acesso a argc e argv aqui, a menos que você os acesse manualmente a partir dos registros // você pode criar sua própria configuração de pilha personalizada, inicialização e etc aqui. // Sai diretamente usando um syscall asm("mov $60, %rax; mov $0, %rdi; syscall"); //exit(0)syscall }void __start() { // Custom entry point, no standard library initialization // You have no access to argc and argv here unless you access them manually from registers // you can create you own custom stack setup, initialization and etc here. // Exit directly using a syscall asm("mov $60, %rax; mov $0, %rdi; syscall"); // exit(0) syscall }Isso não se parece em nada com tempo de execução, é apenas um código em linguagem Assembly adicionado pelo compilador para que os desenvolvedores não precisem fazer isso.
O poder e a responsabilidade de C
Montagem embutida em C
asm volátil (
"syscall"
: "=a" (escrito)
: "0" (1),
"D" (fd),
"S" (amortecedor),
"d" (BLOCK_SIZE)
: "rcx", "r11", "memória"
);
asm volatile ( "syscall" : "=a" (written) : "0" (1), "D" (fd), "S" (buffer), "d" (BLOCK_SIZE) : "rcx", "r11", "memory" );Nota: *
(escrito) é uma variável criada dentro de main(), (1) é o número syscall para gravação, (fd) é onde o arquivo será gravado, ou seja, int fs = open("caminho .log",O_WRONLY; (BLOCK_SIZE) é outro nome de variável. É mais complexo que isso. A evolução dos tempos de execução
Conclusão
a menos que você não queira dirigi-lo em Marte.
Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.
Copyright© 2022 湘ICP备2022001581号-3