Примеры не раздельной компиляции? - PullRequest
0 голосов
/ 25 февраля 2019

Из раздела 1.1 «Книги C»:

На самом грубом уровне очевидной особенностью является многофайловая структура программы.Язык допускает отдельную компиляцию, где части полной программы могут храниться в одном или нескольких исходных файлах и компилироваться независимо друг от друга.Идея состоит в том, что процесс компиляции создаст файлы, которые затем могут быть связаны вместе с помощью любого редактора ссылок или загрузчика, который предоставляет ваша система.Блочная структура Algol-подобных языков усложняет эту задачу, настаивая на том, что вся программа состоит из одного куска, хотя обычно есть способы обойти это.

Может кто-нибудь предоставить некоторые основные примеры / обзорпрограммирования в этой природе?

Ответы [ 4 ]

0 голосов
/ 29 мая 2019

Пример программы Algol, которая не делает ничего полезного, но здесь для иллюстрации смысла:

   begin
   int x; x:=3;

   procedure p;
       begin
       integer y; y:=4;

       procedure q(n);
          value n; integer n;
          if n > 0
          then q(n-1)
          else begin
              integer z; z:=x+y;
              print(z)
              end;

       q(1)
       end;

    p; comment a parameterless procedure call;
    end;

Основная проблема здесь - это вложенные области видимости.Процедура q зависит от окружающих блоков, которые определяют целые числа x и y.Процедура p также зависит (в силу содержания q) от блока, который определяет x.

Итак, вы увидите, что каждая часть этой глупой программы-примера неотделима отокружающий текст.Это естественный способ выражения для Алголеров;вкладывать процедуры так, чтобы это имело смысл для написанной программы.В целом это делает отдельную компиляцию довольно сложной.Это отличается от C-подобных языков, которые не имеют вложенных процедур (функций и т. Д.), Потому что единственные нелокальные идентификаторы, на которые они могут ссылаться, это область файла или глобальная область (если я правильно понимаю эти термины).

Здесьпеременные x и y являются локальными для некоторой процедуры и поэтому находятся в стеке.Просто чтобы сделать его более сложным, q является рекурсивным, что делает «расстояние вниз по стеку» от его самого внутреннего вызова до местоположений x и y переменной величиной, так что это не просто вопрос компиляциификсированное значение в некотором указателе стекового фрейма.

Тем не менее, были некоторые системы, которые допускали отдельную компиляцию.Насколько я помню, были ограничения, такие как единица компиляции (если хотите, файл), которая должна содержать только процедуры «на верхнем уровне».Возможно, им также понадобился некоторый расширенный синтаксис (например, «внешняя процедура foo»), чтобы сообщить компилятору, что в текущем файле не должно быть определено что-то, на что ссылаются.

0 голосов
/ 25 февраля 2019

Может ли кто-нибудь предоставить некоторые основные примеры / обзор программирования такого рода?

Есть один файл с именем add.c, который содержит следующий код:

int add(int a, int b){
    return a+b;
}

Скомпилируйте это с:

gcc -c add.c

Это создаст add.o.Теперь есть файл со следующим кодом, который называется main.c:

#include <stdio.h>
int add(int, int); // declares "add", but doesn't implement it!

int main( int argc, char **argv){
    printf("3 + 2 = %d\n", add(3,2));
    return 0;
}

Это объявляет add, но не реализует его.Он не будет работать сам по себе.Но вы все равно можете скомпилировать его с помощью

gcc -c main.c

И затем вы можете связать их с:

gcc add.o main.o 

Если вы запустите получившуюся программу (может называться a.exe` или что-то подобное) вы получите следующий результат:

3 + 2 = 5

Преимущество этого состоит в том, что вы можете изменить одну из частей, перекомпилировать ее, а затем связатьэто снова, не касаясь других частей.Если вам нужно более подробное объяснение по этому вопросу, я рекомендую прочитать этот ответ .

0 голосов
/ 25 февраля 2019

Я не уверен, что книга означает с «Блочная структура алголоподобных языков усложняет задачу, настаивая на том, что вся программа состоит из одного куска». Но я могу представить, что АлголПодобный язык допускает или требует, чтобы функции и процедуры были объявлены в главном программном блоке, подразумевая, что существует только один программный блок, и это не позволит разделить программу на скомпилированные блоки, как это делает C.Но опять же, я не знаю, что означает книга с этим утверждением.

Гипотетический пример:

AlgolMain
Begin
    procedure x
    Begin
        ....
    End
    ....
End
0 голосов
/ 25 февраля 2019

Самый маленький пример не раздельной компиляции, один файл m.c, содержащий:

int main() {}

компиляция: gcc m.c создание исполняемого файла a.out


В C мыВы можете свободно поместить все в один файл или в несколько файлов, а также скомпилировать в один или несколько шагов, если это ваш вопрос

Пример с двумя функциями в одном файле m.c:

#include <stdio.h>

void hw()
{
   puts("hello world");
}

int main()
{
   hw();
}

Компиляция, мы также можем выполнить один или несколько шагов

  • gcc m.c с получением исполняемого файла a.out
  • или gcc -c m.c с получением m.o затемgcc m.o производит исполняемый файл a.out

Одна и та же программа, использующая несколько файлов, hw.c, содержащая

#include <stdio.h>
#include "hw.h" /* not mandatory in current case but recommended to check signature compatibility */

void hw()
{
   puts("hello world");
}

и hw.h, содержащая

#ifndef _HW_H
#define _Hw_H
extern void hw();
#endif

и m.c содержит

#include "hw.h"

int main()
{
   hw();
}

Компиляция с использованием одного или нескольких шагов:

  • gcc m.c hw.c создание исполняемого файла a.out
  • или gcc -c m.c hw.c созданиеобъекты m.o и hw.o, затем gcc m.o hw.o для создания исполняемых файлов a.out
  • или gcc -c m.c для создания объектов m.o затем gcc -c hw.c создание объекта hw.o, затем gcc m.o hw.o для создания исполняемого файла a.out

Также возможно создать и использовать библиотеку, в данном случае статическую библиотеку, содержащую только hw.o:

  • gcc -c m.c hw.c создание объектов m.o и hw.o (или две команды gcc , одна за объектом)
  • ar rcs hw.a hw.o для создания статическогобиблиотека, содержащая hw.o
  • gcc m.o hw.a для создания исполняемого файла a.out
...