블로그

  • 트랙백으로 소설 쓰기

    흥미로울 것 같지 않은가? 트랙백으로 소설을 쓴다는 것은?

    자, 복잡한 저작권문제는 모두 의식의 저편으로 날려 버리자. 이건 실제로 소설을 썼을 때 고민해 보도록 하고, 트랙백으로 스토리가 있는 글을 쓴다는 것이 어떤 걸까를 생각해 보았다.

    트랙백은 어떤 글을 읽고서, “내가 저거랑 관련된 글을 써놨으니까 내 글도 한번 읽어봐요”라는 뜻을 가지는 링크를 뜻한다. 즉, A라는 글이 있으면 B라는 글이 A에 트랙백을 보낼 수가 있고, 그럼 A에는 B로 갈 수 있는 링크가 생긴다. 만약 C라는 글도 A에 트랙백을 보낸다면 A에는 B와 C로 가는 링크가 생긴다.

    예전에 릴레이 소설이라는 것이 있었다. 그것은 여러사람이 돌아가면서 소설을 쓰는 것이다. 트랙백 소설은 이것보다 좀 더 열려있다고 보면 된다. 릴레이 소설은 앞사람이 적은 내용을 모두 이해한 후에 그 뒷얘기를 적어야하지만, 트랙백은 마음에 드는데서 갈라져 나올 수가 있는 것이다. 가령 A-B-C순으로 이야기가 되어서 D를 적어야 하는데, 누군가가 “난 A에서 B로 가기보다는 B’으로 갔으면 좋겠어”라고 한다면, A-B’으로 새로운 글이 되는 것이다.

    이 소설을 읽는 방법은 A를 먼저 읽고, 여기에 트랙백으로 달린 B와 B’의 제목이나 짧은 몇 문장만 읽고서 스토리 진행을 선택하는 것이다. 주인공이 죽는 시나리오냐, 살아남는 시나리오냐 하는 것이다. 그리고 둘 다 읽어봤는데 맘에 안들면 직접 B”를 써서 A-B”로 연결시키면 된다.

    비슷한 예로서, 예전에 “게임북”이라고 하는 하이퍼텍스트 소설이 있었다. 슈퍼마리오 게임북이라든가 등등.

    또한, 릴레이 소설은 순서가 된 사람이 쓰지 않으면 더이상 진행할 수 없지만, 트랙백 소설은 열려있다. 누구든지 글에 트랙백을 걸어서 스토리를 진행시킬 수 있는 것이다. 가장 처음에 시작한 1번 글만 제대로 시작한다면 된다.

    이 아이디어가 이미 블로그 세계에서 돌아다니고 있는지는 아직 조사해 보지 않았다. 단순히

    떠오른 아이디어이며 메모 차원에서 적어둔다.

  • 우리나라 웹 사이트가 화려한 이유

    우리나라 웹 사이트는 전 세계에서 가장 화려하다고 할 수 있다. 이것만큼은 아마 객관적 사실이라고 생각한다.

    그렇게 화려한 것이 좋고 나쁘고는 이 글에서 제기하고 싶은 문제가 아니다. 어째서 화려해진 것일까?

    이것을 공작이 화려하게 진화한 데서 이유를 찾고자 한다. 공작은 숫놈은 대단히 화려하고 암놈은 그냥 수수하다. 숫놈이 화려하게 진화한 이유는 깃털이 길고 화려할수록 암놈의 선택을 받기 때문이다. 이 사실은 실험에 의해서 증명된 사실이다.



    [각주:

    1

    ]



    즉, 이것은 자연 선택이고, 개체변이에서 화려한 표현형이 살아남은 결과라고 할 수 있다. 문제는, 화려하면 암놈의 눈에만 잘 뜨이는게 아니라 포식자의 눈에도 잘 뜨인다는 것이다. 따라서, 너무 화려한 숫놈들은 도태된다. 그 결과, 크고 화려한 쪽으로 발달하는 숫놈의 진화 경향이 멈춰졌다. 만약 포식자가 없었다면 엄청나게 길고 큰 꼬리깃털을 갖게 되었을 것이다.

    우리나라 웹 사이트도 마찬가지다. 화려하고 한눈에 확 들어오고 뭔가 북적북적대지 않으면 선택받지 못한다. 물론, 나처럼 아주 단순한 웹사이트를 사랑하는 사람들도 많겠지만, 현재 살아남은 대형 사이트들을 보면, 그들이 살아남았다는 것 자체가 그렇게 화려한 사이트들이 선택받았다는 것을 뜻하기도 한다.



    [각주:

    2

    ]



    따라서 우리나라의 웹 사이트들은 점점 화려하게 진화하고, 마치 숫놈 공작의 깃털처럼 웹 사이트의 빠른 움직임을 제한하게 되었다. 우리나라 웹 사이트는 일단 확실히 느리다.



    [각주:

    3

    ]



    그럼에도 불구하고 점점 더 화려해진다는 사실은 우리나라의 인터넷 연결속도가 사람들의 인내심 범위 내에서 웹 사이트를 읽어들일 수 있다는 것을 말해준다.

    문제는, 저사양 컴퓨터를 이용해서 웹 서핑을 하는 경우다. 플래시로 도배된 사이트의 경우, 1GHz이하의 CPU작동 속도를 가진 컴퓨터에서는 거의 정지해 버린다. 만약 플래시를 이용해서 메뉴 이동을 해야 한다면 그 사이트를 사용하려면 돈을 따로 내고 PC방을 가야 할 것이다.

    이 문제는 은근히 심각한데, 컴퓨터를 업그레이드할 돈이 없는 사람들은 차츰 화려해지는 웹 사이트를 이용하지 못하고, 인터넷의 영역에서 활동할 수 있는 범위가 좁아진다는 것이다. 이러한 문제를 해결하려면 웹 사이트 제작자들이 저사양 컴퓨터에서도 이용할 수 있는 페이지를 따로 제작을 해야 한다. 적어도 플래시로 메뉴를 만드는 일은 그만두어야 한다.



    [각주:

    4

    ]


    웹 사이트가 화려해지는 것은 가치중립적이지만, 그로부터 소외되는 사람이 있다는 것은 분명 나쁜 점이다. 이것은 우리나라의 인터넷 인프라가 고도로 성장해서 세계 최고 수준이기 때문에 나타난 부작용일 것이다.

    1. 눈먼 시계공에서 본 것 같다

      [본문으로]
    2. 물론, 공정한 비교는 아니다. 돈을 많이 들여서 만든 회사 사이트인데, 선택을 많이 받는다는 이유만으로 플래시나 그림 하나 없이 텍스트만 있다면 아마 회사 사장이 별로 좋아하지 않을 것이다. 이런것 역시 선택압이라고 볼 수 있다.

      [본문으로]
    3. 만약 당신이 인터넷 옵션에서 그림, 소리, 동영상 표시하기를 모두 꺼 놓고 웹 서핑을 하면 이 차이를 확실히 느낄 수 있다.

      [본문으로]
    4. 이 논의는 상당히 제한적인 논의일 수 있다. 좀 극단적으로 말했다는 생각도 들지만, 그냥 두기로 한다

      [본문으로]

  • 변수

    C언어에서 변수형은 대단히 중요하다. 왜냐하면, 자동으로 처리를 못하기 때문에 항상 그 변수가 어떤 형태를 가지고 있는지 처음에 정해놓고, 그것에 맞춰서 사용해야만 하기 때문이다.

    기본적으로 정수, 실수, 문자열 변수가 있다. 그리고 각각 그냥 쓰는 것과 긴(long) 형식이 있다. 또한, 부호를 붙인 것과 붙이지 않은 것이 있다 따라서, 다음과 같이 쓰면 된다

    int

    long int

    unsigned int

    unsigned long int

    float

    long float

    unsigned float

    unsigned long float

    char

    만약, long이 아니라는 것을 굳이 강조하고 싶다면 short int처럼 쓰면 된다. 이건 아무말 하지 않은 int와 똑같다.

    여기서, 흥미로운건 double형이다. double은 long float이랑 똑같다. 그리고 여기에long double형이 있다는 것. 따라서 long double형은 정말 정말 큰 숫자를 표시할 수 있다. long double은 자칫 잘못 쓰면 너무 긴 숫자가 나오므로 조심해서 쓰도록 하자. 출력할때는 long이 붙으면 %lf, %ld 등으로 l을 붙여줘야 한다는 점을 까먹지 말자.

    여기에, 굳이 뭔가 더 쓰자면 포인터 형이 있다. 포인터는 주소를 가르쳐 주는 변수형인데, 그건 다른 글에서 알아보도록 하겠다.

    이러한 변수들을 만약 한두개가 아니라 여러개를 쓰고 싶다면 어떻게 해야 할까? 가령, 100개정도의 변수가 있고, 그것들을 번호를 매겨서 관리하려면? 여기에 쓰는게 바로 배열(array)이다. 배열은 다음과 같이 선언하면 된다.

    int arrayname[100];

    그럼 정수형을 가지며 arrayname이라는 이름을 가진 공간 100칸이 메모리에 예약된다. 우린 이 예약된 공간을 마음대로 갖고 놀 수가 있게 되는 것이다. 사용할 때는 arrayname[번호] 형식으로 사용한다

    참고로, 번호는 0번부터 시작한다는 것을 절대 까먹지 말자. 정의할때는 arrayname[100]을 쓸 수 있지만, 어디서 실제로 사용할때 a=arrayname[100]처럼 쓰면 기어이 에러가 발생하고야 말 것이다.

    참고로, 배열명은 포인터 이름과 같다는 것만 일러두고 끝낸다. 따라서 arrayname은 포인터 이름이 된다.

  • 출력하기

    뭔가 화면에 글자가 나타나도록 하고 싶다면, Hello, world! 프로그램을 살펴봐라. 아무튼, C언어에서 출력하는 방법은 다음의 형식을 따른다.

    출력해라(“이거”);

    화면에 뭘 출력하라는 것도 함수가 담당하는데, 이에 해당하는 함수는 printf이다. f를 빼먹지 말자. printf는 인자를 받아서 그것을 화면으로 출력해 준다. 따라서, 다음과 같이 쓰면 된다.

    printf(“this”);

    이렇게 하면 출력 결과는 다음과 같다.

    this

    쉽다.

    하지만, 이것만으로는 내가 계산한 결과를 출력하는데 너무나 부족함이 많다. 가령, a+b를 계산해서 c=a+b라고 정해놨는데, c를 그냥 c라고 안에 넣어서

    printf(“result is c”);

    라고 쓴다면, 그 결과는

    result is c

    가 된다. 난 이런걸 원한게 아니다. 당신도 아마 원하지 않았을 것이다. 우린 a=10, b=20을 넣으면 result is 30이 되길 원하고, a=20, b=40을 넣으면 result is 60이 되길 원한다. 그렇다면, 다음의 형식을 따라해라.

    printf(“result is %d”,c);

    이렇게 하면 %d가 있는 자리에 c에 해당하는 값이 들어가서 출력된다. 응용하면 다음과 같은 것도 된다.

    printf(“%d plus %d is %d”,a,b,c);

    어떻게 쓰는지 감이 올 것이다. 뭔가 대입해야 하는 자리에 무조건 %d를 써 놓고, 대입할 순서대로 변수 이름을 적어주면 되는 것이다.

    문제는, %d는 정수 출력에만 쓸 수 있다는 것이다. 따라서, 정수가 아닌 다른 변수를 출력할 때는 그에 맞는 변수를 적어줘야 한다.

    %d 정수를 10진수로 출력

    %o 정수를 8진수로 출력

    %x 정수를 16진수로 출력

    %u 정수를 부호없는 10진수로 출력

    %c 정수를 문자로 출력(char 형 출력할때 사용)

    %s 포인터나 배열 출력할때 사용

    %f 실수를 소숫점 형식으로 출력 (xxx.xxx형식)

    %e 실수를 과학적 표현식으로 출력 (xxx+Eyyy 형식. 이건 xxx*10^yyy를 뜻한다)

    %g %e나 %f중에 문자수가 적은쪽으로 출력

    그리고 주의사항, % 자체를 출력하려면 %%라고 써야 한다.

    아무튼, 이대로만 적으면 변수에 적혀있는게 전부 출력된다. 그럼, 이걸 원하는대로 출력하라고 시킬 수도 있다. 가령, 소숫점 위로는 3자리를 출력하고, 소숫점 아래로 5자리까지 출력하는, 즉 xxx.xxxxx형식을 윈한다면, %와 f사이에 3.5를 쓰면 된다.

    기본적으로 출력은 오른쪽에 붙어서 나오지만, 만약 왼쪽부터 출력을 시키고 싶으면 %다음에 -를 붙이면 된다. 즉 %-3.5f는 실수를 왼쪽에서 붙여서 3자리.5자리 형식으로 출력하라는 뜻이 된다. 만약 f앞에 l을 붙이면, long형식을 출력할때 사용한다. 즉, long double 이나 long int를 출력할때 lf나 ld를 사용하면 된다.

    여전히 출력상의 문제는 발생한다. 왜? 위와 같이 하면 모든 출력물이 한줄에 붙어서 나오기 때문이다. 가령 a=10, b=20이라고 하고, 다음을 실행하면 어떻게 될까?

    printf(“%d%d”,a,b);

    그럼 출력은

    1020

    이 된다. 그렇다고, 구분을 짓겠다고

    printf(“%d %d”,a,b);

    와 같은 형식을 넣는것도 문제다. 왜? 한줄 넘길 수가 없으니까. 즉,

    10

    20

    형식으로 출력을 시키는 건 못한다는 거다. 어떻게 해야 할까? 다음과 같이 하자

    printf(“%d \n %d”,a,b);

    이렇게 하면 \n이 그 다음에 오는 문장을 한줄 아래로 보내주게 된다.

    여기에 \n만 쓸 수 있는건 아니다. \을 붙여서 쓰는 글자들을 Escape문자열이라고 하는데

    \n 한줄 넘기기(새로운 줄 시작)

    \t TAB띄우기

    \b 백스페이스

    \r 그 줄 처음

    \f 다음페이지로 넘어가기

    \\ 백슬래시기호 그 자체 \

    \’ 이건 ‘이다

    \” 이건 “이다

    따옴표는 printf등에서 안에 들어가는 내용과 밖에 변수 지정하는 부분을 구별하기 위해서 사용하기 때문에, 특별히 따옴표를 출력하려면 \을 붙여줘야만 한다는 것을 기억하자.

  • 포인터

    C언어를 배우면서 가장 헷갈렸던 건 포인터에 대한 개념이었다. 포인터는 메모리 주소를 알려준다는데, 대체 뭐냐 -_-;

    이걸 쓰려면 &와 *를 알아야 한다.

    포인터 이름을 p라고 하자.

    그럼, 일단 선언을 해야한다.

    int *p;

    이러면 뭐가 되냐하면, p라는 이름이 붙은 정수형 변수가 선언된다. 하지만, 여기서 중요한건 그냥 p=1이라는 식으로 쓸 수가 없다는 것이다. 왜냐하면 p는 변수가 아니라 변수 이름이기 때문이다. 즉, 우리는 노트에 기록을 할 수는 있지만 노트를 기록할 수는 없는 것이다!



    [각주:

    1

    ]



    내가 p라는 변수에 뭔가를 기록하고 싶으면 *p를 써야 한다. 만약, p라는 변수의 주소가 필요하다면, &p가 바로 그 주소를 알려주는 역할을 한다. 일단 아래의 소스를 분석해보자. 내가 포인터 공부를 할 때 만든 소스를 좀 개조했다.

    #include

    main()

    {

    char a, b;

    char *deathnote;

    a=NiceGuy;

    deathnote=&a;

    b=*p;

    printf(“1. a=%c, b=%c, *deathnote=%c \n”, a, b, *deathnote);

    a=HandsomeGuy;

    b=BadGuy;

    printf(“2. a=%c, b=%c, *deathnote=%c \n”, a, b, *deathnote);

    deathnote=&b;

    printf(“3. a=%c, b=%c, *deathnote=%c \n”, a, b, *deathnote);

    }

    이 소스는 어떻게 작동할까? 일단, deathnote라는 포인터를 하나 만들었다. 즉, 표지에 deathnote라고 적힌 노트를 한권 마련한 것이다. 일단 a=NiceGuy라고 집어넣어놨다. 이제, deathnote=&a라고 하면 뭐가 될까? &a가 알려주는 것은 a가 있는 주소이다. 즉, deathnote라는 노트를 꺼내서 펼치는 것은 a라는 노트를 꺼내서 펼친 것과 같은 내용이 적혀있다는 거다. 좀 더 정확히 얘기하자면, deathnote=&a라고 적는 순간, a라는 공책은 deathnote가 된 것이다. 이제 a를 바꾸든 deathnote를 바꾸든 둘 다 동시에 바뀌게 된다. 즉, 하나의 메모리 영역이 두개의 이름을 갖게 된 것이다. 이제, deathnote에 적힌 내용을 사용하고 싶으면, *를 이용하면 된다. 즉, *deathnote라고 쓰면, 그것은 곧 deathnote에 적힌 내용을 알려주는 것이다.

    자, 다음의 문장을 생각해 보는 것은 숙제이다.

    포인터의 포인터를 사용할 수 있다.

    물론 포인터의 포인터의 포인터 또한 사용할 수 있다.

    1. 노트를 기록하는게 불가능하지는 않다. 다른 노트에 적으면 되니까. 마찬가지로, 포인터의 포인터 역시 가능하다.

      [본문으로]

  • snowall이 추천하는 필독서

    나름 필독서다.

    “괴델, 에셔, 바하” 더글라스 호프스태터

    “생명의 느낌”

    “황제의 새 마음”

    “아하!”

    “이야기 파라독스”

    “이기적 유전자” / “확장된 표현형”

    “눈먼 시계공”

    “피의 역사”

    “죄수의 딜레마”

    “모모”

    “끝없는 이야기”

    “소피의 세계”

    “카드의 비밀”

    “삐딱이로의 초대”

    “도덕경”

  • 편견으로 세상 보기 수행법

    점점 복잡해져가는 현대 사회에서, 한쪽 관점으로만 현실을 바라본다는 것은 대단히 위험한 일이다. 하지만 사람이 처음부터 여러 관점에서 현실을 바라본다는 것 또한 쉬운 일은 아니다. 그렇다면, 여러가지 관점에서 현실을 바라보는 것은 어떻게 할 수 있을까? 문득 떠오른 생각이 있어 몇자 적어둔다.

    일단, 어떤 현상을 사실로 명확하게 진술한다. 다시말해서, 어떤 일이 일어났다면 누구도 아니라고는 말 못할만한 몇개의 문장으로 요약하는 것이다. 만약 현상을 진술하는 문장 중에서 단 한명이라도 이의를 제기할만한 부분이 있다면 그 문장은 고치거나 빼 버려라. 일단 그렇게 해 두자.

    그런 다음에, 그 현상을 완전히 나쁘게만 바라보는 거다. 그 현상이 일어났기 때문에 이러저러한 것들이 안좋아졌고, 누구누구가 피해를 보며, 완전 기분 나쁘다는 식으로 말이다. 즉, 모든 알고 있는 지식을 총 동원하고 억지까지 써 가면서 완벽하게 까대라. 그리고 이 내용들을 적당히 기록해 두거나 기억해 두자.

    그리고나서 앞에 한 논의는 완전히 기억속에서 삭제하고, 이번엔 반대로 해 보자. 완전히 좋게만 바라보는 거다. 마찬가지로, 누가 보면 푹 빠져서 미쳤다고 할 정도로 찬양해 보자. 그리고 이 내용들도 잘 정리해서 기록해 두자.

    이제, 두 종류의 메모를 놓고서 비교 분석해보면 된다.

    쉬운가?

  • 자동 업데이트에 관하여

    우리나라는 명실공히 세계 최고의 인터넷 인프라를 자랑하고 있다.



    [각주:

    1

    ]



    컴퓨터를 켜면 자동으로 인터넷에 접속되어 있다. 그로부터 태어난 안좋은 프로그램이 바로 자동 업데이트다.



    [각주:

    2

    ]



    자동 업데이트는 자기 맘대로 인터넷에 접속해서 새 버전이 나왔는지 확인하고 다운받아서 설치한다. 이건 윈도우즈 뿐만이 아니라 우리가 일상적으로 사용하는 프로그램들



    [각주:

    3

    ]



    에 모두 해당된다. 최신 프로그램을 사용하면 좋겠지만, 그건 유저가 그 프로그램을 업데이트 하고 싶어할 때의 얘기다. 게다가 그것들은 자주 업데이트 되는 것도 아니면서 말이다. 어도비 아크로뱃 리더의 경우, 자동 업데이트를 설치시켜놓고서 실제로 자동으로 업데이트 되는건 한달에 한번도 안된다. 다른 프로그램들도 대부분 한달에 한번 이상 업데이트 하지는 않을 것이다.



    [각주:

    4

    ]



    그럼 이건 사용자 편의의 문제가 아니라 시스템 자원을 갉아먹는 프로그램이 된다는 걸 뜻한다. 한달에 서너번 이상 업데이트 되어서 자동으로 해주지 않으면 사용자가 짜증을 내는 것도 아닌데 뭐하러 자동 업데이트를 만들어서 시스템 자원을 갉아먹는 것일까? 만드는 사람이야 시스템 자원을 아주 적게 차지하도록 만들었다고 주장하지만, 그런거 수십개가 모이면 무시 못할만한 리소스가 된다. 특히, 저사양 컴퓨터에게 자동 업데이트는 독약과 마찬가지다. 또한 자동 업데이트는 프로그램 설정 메뉴에서 어떻게 할 수도 없다. 몇몇 프로그램은 자동 업데이트 기능을 쓰지 않는 것을 설정할 수 있게 하지만 그런것이 되지 않는 경우가 많다. 따라서 이런 프로그램을 시작되지 않게 하려면 시스템 레지트리를 고치거나 해야 하는데, 이게 쉬운 일은 아니다. 따라서 그걸 고쳐주는 프로그램을 설치하면, 이 프로그램 역시 자동 업데이트를 사용한다. 공짜로 쓰는 주제에 이런 얘기를 하면 안되는 거라고 생각할 수도 있지만, 개발자들이 사용자의 목소리를 듣고 싶다면 이런 것 역시 사용자의 의견이라는 점을 알았으면 좋겠다.

    어떤 프로그램들은 실행시에만 업데이트 검사를 한다. 파이어폭스나 파일질라같은 프로그램들이 그렇다. 심지어 그조차도 옵션으로 조절할 수 있다. 사용하지 않는 프로그램의 업데이트가 과연 필요한 것일까? 내 컴퓨터는 후지츠의 노트북인데 기본적으로 후지츠 자동 업데이트 프로그램이 시작되도록 되어 있어서 정기적으로 드라이버 업데이트 여부를 체크한다. 그러나 내가 이 노트북을 구입해서 지금까지 사용하는 1년 10개월동안 단 한건의 사소한 마이너 드라이버 업데이트조차 이루어진적이 없다. 두세달에 한번정도 수동으로 업데이트 체크를 해주긴 하지만 매번 당연하다는 듯이 업데이트는 이루어지지 않는다.

    1. 자랑만 하고 있을지도 모른다

      [본문으로]
    2. 물론, 이걸 편리하게 잘 쓰는 사람도 있겠지만, 난 그저 내 관점에서 보기에 그다지 좋아하지 않는다는 점을 말하고 싶은 것 뿐이다

      [본문으로]
    3. MS오피스, 알툴즈, 아래한글, 어도비 프로그램들, 그리고 기타등등 모든 것!

      [본문으로]
    4. 그리고 그정도로 자주 업데이트를 하는 프로그램은 뭔가 문제가 많다는 것을 뜻한다

      [본문으로]

  • 컴파일러

    C언어는 컴파일러를 필요로 한다. 아무리 멋진 프로그램을 만들어라도 컴파일을 해야 작동한다. C언어를 컴파일 해줄 수 있는 컴파일러는 여러가지가 있는데, 이에 따라 C언어의 종류를 나눌 수 있다. 컴파일러를 만드는 회사는 여러곳이 있는데, 볼랜드의 Turbo C, 마이크로소프트의 MS C, 인텔의 Intel C complier, 그리고 GPL에 따라 자유롭게 쓸 수 있는 GNU C가 있다. 컴파일러의 실행화일 이름은 C complier를 따서 cc로 되어 있고, 각각 앞에 자기네 회사 첫 글자를 따서 tcc, mcc, icc, gcc등등으로 부른다.

    물론, 난 리눅스에서 기본적으로 자유롭게 사용할 수 있는 gcc를 기준으로 설명할 것이다. 다른 컴파일러들 사용하는 것도 그다지 어렵지는 않다. 컴파일러의 설치는 알아서 다들 해 보시기 바란다.

    컴파일하는 방법은 아주 쉽다. 예를들어, example.c라는 프로그램을 만들었다고 하자. example.c는 메모장에서 열어보면 그냥 생으로 보이는, 아직 요리가 되지 않은 날것이다. 이것을 컴퓨터의 메모리 속에 쑤셔넣기 위해서는 바이너리로 바꿔줘야 하는데, 그렇게 하려면 다음과 같이 명령하면 된다.

    gcc example.c

    그럼 a.out이라는 파일이 거기에 새로 생성될 것이다. 이제 a.out을 실행시키면 된다. 실행 방법은, 리눅스의 경우에는 ./a.out 이라고 해야 한다. 윈도우는 뭐 그냥 두번 클릭하면 되겠다. 하지만 맨날 a.out만 만들 수는 없잖은가. 그럼 목적지를 얘기해 주면 된다.

    gcc example.c -o example

    이렇게 하면 -o 뒤에 있는 파일 이름으로 컴파일 되어 출력된다.

    다른건 그다지 어려운게 없는데, 만약 수학 함수 헤더인 math.h를 include해서 컴파일 할 경우에는 에러가 뜰 것이다. 이 경우, link math 옵션을 붙여야 한다. 이것때문에 괜히 삽질하는 경우가 많다.

    gcc example.c -o example -lm

    그럼 에러가 안나올 것이다.

    C언어 프로그램을 컴파일 할 때 나오는 에러는 전부 의미가 있는 내용으로, 부디 에러가 아무것도 없는 프로그램을 만들 수 있기를 바란다.

    아래는 gcc –help 명령을 쳤을 때 나오는 내용이다.

    Usage: gcc [options] file…

    Options:

    -pass-exit-codes Exit with highest error code from a phase

    –help Display this information

    –target-help Display target specific command line options

    (Use ‘-v –help’ to display command line options of sub-processes)

    -dumpspecs Display all of the built in spec strings

    -dumpversion Display the version of the compiler

    -dumpmachine Display the compiler’s target processor

    -print-search-dirs Display the directories in the compiler’s search path

    -print-libgcc-file-name Display the name of the compiler’s companion library

    -print-file-name= Display the full path to library
    -print-prog-name= Display the full path to compiler component
    -print-multi-directory Display the root directory for versions of libgcc

    -print-multi-lib Display the mapping between command line options and

    multiple library search directories

    -print-multi-os-directory Display the relative path to OS libraries

    -Wa, Pass comma-separated on to the assembler

    -Wp, Pass comma-separated on to the preprocessor

    -Wl, Pass comma-separated on to the linker

    -Xassembler Pass on to the assembler

    -Xpreprocessor Pass on to the preprocessor

    -Xlinker Pass on to the linker

    -combine Pass multiple source files to compiler at once

    -save-temps Do not delete intermediate files

    -pipe Use pipes rather than intermediate files

    -time Time the execution of each subprocess

    -specs= Override built-in specs with the contents of

    -std= Assume that the input sources are for

    –sysroot= Use as the root directory for headers

    for headers and libraries

    -B Add to the compiler’s search paths

    -b Run gcc for target , if installed

    -V Run gcc version number , if installed

    -v Display the programs invoked by the compiler

    -### Like -v but options quoted and commands not executed

    -E Preprocess only; do not compile, assemble or link

    -S Compile only; do not assemble or link

    -c Compile and assemble, but do not link

    -o Place the output into

    -x Specify the language of the following input files

    Permissible languages include: c c++ assembler none

    ‘none’ means revert to the default behavior of

    guessing the language based on the file’s extension

    Options starting with -g, -f, -m, -O, -W, or –param are automatically

    passed on to the various sub-processes invoked by gcc. In order to pass

    other options on to these processes the -W options must be used.

    이게 정확히 뭔얘기인지는 나도 잘 모르겠다. 다만, 프로그램을 복잡하게 만들수록 위의 옵션들을 사용하게 될 일이 있을테니, 만약 프로그램이 완벽한데 컴파일이 이상하게 된다면 옵션을 잘 살펴볼 일이다.

  • 삶에 중독된다

    모든 인간이 중독된 것, 삶.

    반드시 가져야만 하고, 구하기도 쉽고, 끊을 수 없으며, 만약 끊는다면 그것으로 이미 죽음을 맞이해야만 하는 것. 바로 삶이다.

    새해를 맞이하면서, 삶에 중독되어 습관적으로 나이를 먹고 있는건 아닌지 생각해 보았다.