[듀나인] 문과생이 갖는 컴퓨터 언어에 대한 궁금증

1. 예전 컴퓨터 학원 다니면서 BASIC 배우고 C++ 조금 만지작 거린 문과생입니다.

컴퓨터 프로그램, 굉장히 재미있었어요. 문과생인데도 불구하고, 제가 조물조물 만져서 제가 원하는 어떤 프로그램이 탄생하는 게 신기하기도 했고요.

한 때 유행했던 심리테스트 (YES OR NO로 선택하는 질문을 몇 개 거치면 타입이 나오는, 여성 잡지에 자주 나오는 테스트)를 C++로 만들어 보고 얼마나 흥분했는지...

마치 제가 유명 프로그래머가 된 듯한 느낌이었습니다.

거기에 자신감이 생겨서 친구들한테 제가 만든 게임도 배포하고 그랬습니다. (텍스트 어드벤쳐 게임이었어요. 그림도 나오고... 아직도 제 하드에 간직하고 있어요 ㅋ)



2. 사설이 길었는데, 제가 궁금한 점은요.

C언어 같은 걸로 프로그램을 만들면 실행 파일이 되잖아요.

하지만 C 언어 자체도 하나의 실행 파일이라고 볼 수 있잖아요. 그렇다면 C언어 같은 건 어떻게 만드나요?


예전 제가 생각하기에 C언어는 하나의 '신神'이었어요. '빛이 있으라' 하면 빛이 생기는 격이니까. (프로그램아 생겨라, 하면 생기죠 ㅋ)

그럼 신은 누가 어떻게 만들었을까 하는 질문이 생기더군요. (프로그램을 생산하는 프로그램은 어떻게 만드는지...)



이 질문을 답하기 위해, 저는 EXE 파일을 텍스트로 읽어서 막 분석도 하고 그랬어요 ㅋㅋㅋ 만약 제가


printf("My name is...");


이렇게 쓴 걸 코딩하면 분명 EXE 파일에서는 이게 어떻게 변환된 형태로 있을 거다, 그 변환 공식만 알면 난 C 언어를 통하지 않고서 내가 텍스트 파일로 실행파일을 만들 수 있을 거다. 뭐 이런 엉뚱한 생각을 했던 기억이 나네요. 물론 몇 개월 끝에 실패했지만.



근데 이 궁금증은 아직도 풀리지 않고 있어요. 실행 파일을 만들 수 있는 실행파일(?)은 어떻게 만드는 건가요?

제 질문 자체가 잘못됐나요?

제가 전문가가 아니기 때문에 어휘 선정이 잘못되었을 수도 있는데, 제 질문의 요지가 제대로 전달되었기를 바랍니다...


아시는 프로그래머 분들이나 관련 전공인 분들 설명 좀 해주세요. 문과생이 이해할 수 있도록...

    • 가장 원시적인 컴퓨터 언어는 2진수조합 아닐까요(....) 어차피 전기를 껐다/켰다 하면서 2진수 조합을 만들어(=프로그램), 기계/회로를 동작케만 하면 되니... 그걸 좀 더 편하게 개량화한 툴이 기계어, 어셈블리, 포트란. 베이직... C까지... 다 라고 이해하는 문과생 1인입니다.
    • 현재는, 다른 언어의 컴파일러는 이미 나와있는 언어로 만듭니다. 그 전에는 어셈블리로 만들었을테고, C가 나온 이후로는 C로 만들었을테고, 요즘엔 이미 나와있는 아무 언어나 사용해서 만듭니다.
    • 저도 궁금해서 위키를 찾아 봤더니 C의 최초 컴파일러는 어셈블리로 만들었다고 되어 있네요. 그럼 어셈블리 컴파일러는 뭐로 만들었냐는 질문이 나올 수 있는데 어셈블리는 매우 원시적인 언어로 실행 파일과 일대일로 매핑된다고 이해하시면 됩니다.
    • 어셈블리요? 그럼 C는 어셈블리語로 만든 건가요? 그럼 어셈블리어는 어떻게 만든 거예요?
      전 사람이 읽을 수 있는 파일이, 이해 불능의 2진수 조합으로 바뀌는 그 과정이 너무 궁금합니다. 뭐가 됐든, 그 2진수 조합 실행 파일이야말로 프로그래밍의 핵심 같아요. 프로그래머가 프로그램을 짜는 것보다, OS와 그 OS에게 명령을 내리는 독특한 조합을 알고 싶어요. 내가 말해놓고 내가 지금 무슨 소리 하나 싶네요.

      덧) 앗. 써놓고 보니 답변이 달렸네요. 으음. 저도 한 번 구글을 해보면서 검색을 해야겠네요. 감사합니다!
    • 어셈블리 전에는 HEX코드로 된 기계어로 직접 작성을 했겠죠. 어셈블리도 컴파일은 필요하니까요.

      OS에 명령을 내리는.. OS도 결국은 여러 랭귀지로 작성된 겁니다. OS에서 인식할 수 있는 명령어셋을 각종 언어로 Text형태로 작성 후 컴파일 하면 되는 거죠.

      컴파일러 관련 책을 한 번 읽어보시면 조금 도움이 될 듯 하군요.
    • HEX 코드라는 건... 그 00부터 FF까지 16자리 숫자 2개의 조합 말씀하시는 건가요? 아. 제가 말하는 그 '2진수'니 '이해불능'이니 하는 건 전문용어로 HEX코드라고 하는 거였군요!
    • 네.. 보통 마이크로 프로세서를 사용하는 시스템에는 해석기가 달려 있는데 그 해석기는 HEX 코드를 마이크로 프로세서 자신이 가진 OP-code 및 operand로 인식할 수 있습니다. 그러니 인간이 볼 수 있는 가장 저수준의 기계어는 HEX 코드로 이루어져 있다고 보시면 됩니다.
    • 지금 몇 개 말씀해 주신 키워드로 검색하며 공부를 했습니다. 그럼 질문 하나만 더 드릴게요;;;
      콤파일러는 '원시 코드'를 '기계어'로 변환하는 도구죠. 그렇다면 '최초의 컴파일러'를 만든 사람은 '기계어'를 직접 만질 수 있는 사람이었겠네요? 그렇다면, 원론적으로는, 어떠한 컴파일러를 통하지 않고, 제가 HEX Editor 같은 프로그램을 써서 직접적으로 기계어를 만들어 EXE 같은 실행프로그램을 만들 수 있나요? 그리고 그러는 사람이 존재하나요?
    • 실행파일을 일반 텍스트에디터로 만드는게 불가능한 이유는 pe구조에 따라 실행부가 해석되어야하기 때문입니다.

      아래 링크를 보고 '이렇게 생긴 놈이구나'만 참조하세요.

      http://kkamagui.springnote.com/pages/401262
    • 점점 빠져드는 미궁... 그냥 전 문학작품이나 읽으면서 인간성을 탐구하는 문과생으로 남아야 할 듯;;;
    • ripa//.... 허어???
      죄송한데, 전혀 이해 안 돼요. 음. 그냥 이해를 포기해야겠어요. ^^

      다들 답변 감사드립니다.
    • HEX editor 로만 실행 가능한 프로그램 작성이 가능합니다. 물론 말씀하신 것 처럼 "최초의 프로그램(컴파일러)" 작성도 기계어로 작성했을 거고요..
      "OS 만들기 30일 완성" 류의 책을 보면 HEX 코드만 입력해서 간단한 메세지를 출력하는 프로그램을 만드는 것부터 시작하는 것을 볼 수 있죠.
    • 머루다래/ HEX 코드를 직접 에디팅 할 수 있다면 불가능한 건 아닙니다. 어차피 컴파일된 파일도 해석기를 통해야 최종적으로 프로세서가 알아 먹게 됩니다. 따라서 어떻게던 코드의 형태로 되어 있다는 의미죠. 그런데.. HEX 코드를 직접 에디팅 해서 실행 프로그램 만드는 건 아마... 통나무 깎아서 이쑤시개 하나 만들기 정도의 노력 대비 결과가 아닐까 합니다.
    • 계속 ripa님이 보내주신 링크를 보고, 다시 한 번 리플을 정독하니 대충 이해가 되긴 합니다.
      근데, 조금 이해가 되니까 질문이 더 많아지네요. '계산기는 어떻게 계산이 가능한가?'부터 시작해서 'CPU는 어떻게 만드는가'까지... 끝이 없군요. 수학을 워낙 못해서 문과를 왔는데, 혹시나 이과 갔으면 큰일 날 뻔 했네요;; ^^
    • C++ 이 C 로 만들어졌다는건 유명한 얘기죠. 당연하기도 하고.
      그러면 C 는 뭐로 만들어졌나? 정말 어셈블러로 만들어졌나? 이건 잘 모르겠네요.
      어디서 본 기억엔 C 로 C 를 만들었다고 하더군요. 뭔 말인지는 아직까지도 잘 모르겠지만 말이죠.
      아마 C의 가장 필수부분은 어셈블러로. 나머지 부분은 그때까지 만들어진 C 로. 이런식 아닌지...
      제가 본 글에서는 C를 비롯한 컴파일러 언어는 '마치 레고블럭을 쌓듯이' 만들어진다고 하더군요.
    • 최초로 컴퓨터 프로그램을 만든 것으로 알려진 아우구스타 에이다는 직접 회로 스위치를 온 오프시켜가면서 프로그램을 짰다고 하죠. mad hatter님이 말씀하신대로 통나무 깍아서 이쑤시개 만든거죠 ^^
    • 저도 가끔 궁금했던건데, 완전히 이해되진 않지만 대략 감이 오긴 하네요..
      재밌습니다ㅎ
    • 계산기가 어떻게 만들어지나를 또 찾아보니 재미있는 개념이 있더군요. 마치 건전지랑 램프, 그리고 스위치의 위치에 따라 AND, OR, NOR 같은 개념이 설명되는데, 아우구스타 에이다가 그렇게 해서 프로그램을 만들었다네요. (스위치를 누르면 1, 안 누르면 0, 이렇게 해서 두 개의 스위치를 다 눌러야 램프가 켜지게 한다거나, 둘 중 하나만 누르면 램프가 켜지게 한다거나, 두 개 다 안 눌러야 램프가 켜지게 한다거나...) 스위치를 누른 개수만큼 램프가 켜지게 하면 그게 + 개념이 되고...

      결국 이런 기술이 모이고 모여 CPU 하나가 만들어진 거겠죠? CPU가 이해할 수 있는 기계어는 그렇게 나온 걸 테고. 또 이렇게 말하면 '그렇다면 전기는 어떻게 램프를 켤 수 있는가' 같은 질문이 나올 수 있겠어요. 웬 프로그램 관련 이야기 하나가 전자의 흐름에 대한 이야기로까지 발전하는군요.
    • jethro 님 말씀에 동의. 머루다래님은 전산 쪽에 소질과 호기심이 있으시네요x2.
    • 머루다래/ 그걸 디지털 회로에서 flip-flop 이라고 부릅니다. 그걸 여러 개 연결하면 adder 를 구성할 수 있고, 그걸 다시 여러 개 연결해서 계산기를 만들죠. MUX 니 하는 것들로 다양하고 복잡하게 구성을 하고..

      에구, 다 잊어버렸네요. 지금 생각해 보니.
    • 호기심은 많은데 소질은 없습니다 :) 재미있다고 생각은 하는데 글쎄요, 막상 하라고 하면 울면서 도망칠 듯...
    • 이 문제에 관해서만 컴퓨터 구조(Computer Structure 혹은 Computer Architecture)란 과목이 따로 있죠..

      가장 기본적인 CPU의 기능은 저장되어 있는 논리값(0과 1로 구성되어 있는)을 가지고 계산을 하는 계산기인데요. 그 계산에 쓰이는 명령어가 opcode라고 하는 역시 0과 1로 된 특정 길이의 코드입니다. CPU의 아키텍쳐에 따라 이건 달라지는데, 보통은 32비트 길이이고 x86에선 가변길이도 있다고 들은것 같기도..
      기계어라는 것은 기본적으로 이 opcode와 메모리의 주소를 0과 1로 나타낸 것이지요. 다만 인간이 직관적으로 이해하기는 힘들기 때문에 어셈블리어라는 좀더 인간이 이해하기 쉬운 언어가 나왔구요. 다만 어셈블리어도 형식은 ADD $1 $2 $3 식.. C는 그 조상격인 B 언어로 만들어졌다고 들은것 같기도 한데...
      HEX라는 것은 다른게 아니고 2진수 4자리씩을 16진수로 나타낸거에요. 10110101보다는 B5가 좀더 효율적이겠죠?
    • 그런데, 컴파일러 언어에 너무 많은 환상을 가질 필요는 없다고 생각해요.
      컴파일러는 말 그대로 그냥 번역기에 불과하다고도 말할 수 있습니다.(근데, 그런거 제대로 만드는 나라는 몇 안됨...^^;)
      사실, 모든 기능은 언어가 아니라 하드웨어(인텔등...)와 소프트웨어 제작사(MS등...)에서 제공하죠.
      컴파일러는 거기서 제공해 주는 기능을 호출할 뿐.
    • 찰스 펫졸드가 쓴 "CODE : The Hidden Language of Computer Hardware and Software"란 책이 비전공자를 대상으로 기본적인 CPU와 컴퓨터의 구조에 대해 굉장히 쉽게 설명합니다. 번역판 제목이 그냥 코드였던것 같은데 번역도 좋고 한번 읽어보세요.
    • ㅠㅠ 아, 은혜로운 듀게...
      정말 말씀해 주신 것 + 여기서 나온 키워드 + 책소개까지... 오늘 정말 많은 거 배워가네요.
      고맙습니다~!
    • 그런데 문과생이라고 하시면 아직도 학생이신가요? 그렇다면 추후에 전산과로 편입을 심각하게 고려해 보심이 어떨런지요. 인문학 배경을 가진 개발자 멋지지 않습니까.
    • 간단한 경험법. MS-DOS 시절부터 파일, 메모리에 직접 값을 읽고 쓸 수 있는 프로그램인 debug를 사용하는 것입니다.
      윈도우즈키+R 을 누르고, CMD 라고 타이핑 하신후 엔터 치셔서 커맨드라인으로 가신 뒤에,

      DEBUG 타이핑 한 후 엔터 키를 치셔서, debug를 실행하시고, 실행해서 - 가 보이시면,
      a 100 이라고 타이핑 하신 후 엔터를 치십시오.

      그러면 입력할 주소가 나오고 뭐라고 입력할 지 쓰기 위해 기다리는 데,
      대략 아래와 같은 모양이 되도록 타이핑 합니다.

      22F3:0100 B400 MOV AH,00
      22F3:0102 B004 MOV AL,04
      22F3:0104 CD10 INT 10
      22F3:0106 B40C MOV AH,0C
      22F3:0108 B001 MOV AL,01
      22F3:010A B700 MOV BH,00
      22F3:010C B94500 MOV CX,0045
      22F3:010F BA3800 MOV DX,0038
      22F3:0112 CD10 INT 10
      22F3:0114 B44C MOV AH,4C
      22F3:0116 CD21 INT 21

      왼쪽의 주소 부분은 컴퓨터 마다 달라질 수 있으니, 오른쪽 MOV.. 로 시작하는 부분들만 한 줄씩 다 입력하면 됩니다.
      다 입력하고 나면 그냥 엔터를 한 번 눌러서 다시 - 만 보이는 모드로 넘어 가시고...

      RCX 라고 타이핑 하시고 엔터,
      그 다음에는 숫자로 18 이라고 타이핑하시고 엔터.
      그 다음은 N MINE.COM 이라고 타이핑 하시고 엔터.
      W 라고 타이핑하시고 엔터.
      Q 라고 타이핑하시고 엔터.

      하시면... MINE.COM 이라는 프로그램이 만들어져 있습니다.
      mine.com 이라고 타이핑 하시고 엔터 치셔서 실행해 보시면,
      이 프로그램은 저해상도 그래픽 모드로 화면을 바꾼 뒤에 점을 하나 찍는 겁니다.
      (컴퓨터에 따라서 화면이 이상하게 바뀔 수 있습니다. 그러면, ALT+ENTER 나 ALT+TAB 누르셔서 전체화면에서 빠져 나오시면 됩니다.)
    • 곽재식님 전공이ㅎㅎㅎ
      우리학교 컴퓨터학과 교수님 중에는 심리학과인가 철학과인가 졸업하신 분도 계셨었어요.
      사실 프로그래밍은 논리이니 소프트웨어 분야만 한정시킨다면 문과에서의 접근성이 그리 떨어지는 분야는 아니죠.
      오히려 맨날 미분방정식이나 풀고있는 기계과 학생보다는 더 유리할지도.
    • 곽재식//이...이게 뭔가요? 무슨 어셈블리어 같아 보이는데.
      제가 타이핑하는 게 무슨 작용을 하는지 알아야 체험을 해도 신기하죠 ㅎㅎㅎㅎㅎ
      곽재식 님, 근데 전공이 어떻게 되십니까? 이런 모습 처음이야.. ㅎㅎㅎ
    • 근데 아직 학생이시면 전산과 시스템프로그래밍 같은 것 찾아서 들어보시면 재밌을 거에요.
      제가 수강할 때는 위에 곽재식님께서 하신 것과 비슷한 내용으로 폭탄 해체도 하고 그러는 게임이 강좌 과제였던ㅋ
    • 어셈블리입니다. MS-DOS의 debug는 어셈블리 코딩이 가능하죠..
    • a 100 은 메모리 100번지 부터 써넣겠다는 이야기이고, 중간 부분은 써넣을 내용, RCX 부터는 18 바이트 크기로 파일로 저장하라는 것입니다.

      중간 부분을 좀 더 설명드리면, AH, AL, BH, CX, DX 등등의 이름을 가진 레지스터(CPU에 있는 기억장소)에 45, 38 같은 좌표라든가 호출할 기능 번호 등등의 값을 집어 넣으라는 명령(MOV)과, 컴퓨터에 장착된 롬에서 로드된 긴급 프로그램들을 실행시키라는 명령(INT)등 입니다.
    • 머루다래// 사실 곽재식님 전공은 구글링되기도 하는데 전공보다 놀라운 사실을 알게되실 듯. 무려 졸업을...

      ..아 쓰고보니 곽재식님께 실례이려나요 실례라면 삭제하겠습니다!
    • 저 학교 다닐 때 수업 과제로 유닉스에서 기초적인 컴파일러 만들어봤어요. 진짜 어려웠던 기억이...
    • 오오 저도 늘 궁금했던 부분인데 명쾌하게 이해되지는

      않아도 대충 윤곽은 잡히네요..



      크리스 소이어가 롤러코스터 타이쿤을 어셈블리어로만 게발했다는 소문이 있죠.
    • 맙소사 곽재식님.....
    • 저도 본문에서와 유사하게 실행파일을 가지고 작성언어나 구조 같은것을 알아낼 수 있을줄 알았는데 한컴 대 마이크로소프트 오피스 대전때 한컴의 소스를 MS는 봤지만 MS의 소스를 한컴은 못봤다면서 큰 차이라는걸 보고 실행파일은 어디까지나 실행파일일 뿐이구나... 하고 생각했던 적이 있었어요. MS보다 나은 기술력을 가진 소프트회사가 거의 없을텐데 그들조차도 소스를 실제로 보게 된건 큰 의미를 가진 것이었으니까요.
    • 더 관심있는 분들을 위해 곽재식님이 쓰신 내용을 풀어보면, 각 명령어로 cpu 레지스터에 값을 넣고 (윈도우 레지스트리가 아닙니다)
      그 값으로 인터럽트를 발생시키는 실행 코드입니다.

      22F3:0100 B400 MOV AH,00
      22F3:0102 B004 MOV AL,04
      22F3:0104 CD10 INT 10

      첫 세줄까지만 설명하자면 MOV는 특정 레지스터에 값을 넣는 명령어, INT는 뒤의 숫자에 따라 발생시킬 인터럽트를 말하는데
      여기서 사용한 10은 그래픽 관련 인터럽트니까 그쪽을 실행했을 때, 레지스터에 담긴 AL값이 0x00이면 AH값인 0x04에 따라 그래픽 모드를 변경하는 것을 말합니다.
      아래 링크에 INT 10 인터럽트에 대한 자세한 명세가 있습니다.
      http://nambaxa.springnote.com/pages/1593418
      어셈 명령어 : http://prodev.springnote.com/pages/5819781
      그나마 저건 어셈블리어지만 실행 파일로 만들어질땐 저게 기계어로 번역됩니다. (1:1로..)
      이런 명세를 hex code로 익히기가 매우 힘들기 때문에 에디터로 짜기가 불가능하다고 보는 거에요.
    • 정보통신쪽 전공인데 뭔소린지 모르겠 ^^;;;
      여전히 궁금증이 풀리지 않네요 ㄷㄷㄷ
      저도 그런거 되게 궁금해요
      우주가 빅뱅에 의해 생겼다면.. 빅뱅은 어디서 왔는가 뭐 이런 궁금증이죠 ㅇㅇ
    • 이렇게 나오는 것은 디스어셈블이라고 하고요.
      22F3:0100 B400 MOV AH,00
      22F3:0102 B004 MOV AL,04
      22F3:0104 CD10 INT 10

      이렇게 왼쪽처럼 쓰고 오른쪽 처럼 바꾸는 것을 어셈블이라고 하는데
      MOV AH,00 22F3:0100 B400
      MOV AL,04 22F3:0102 B004
      INT 10 22F3:0104 CD10

      시스템을 처음 만들면 이걸 손으로 직접 하는데 이걸 핸드 어셈블이라고 합니다.
      워즈니악 같은 사람들이 애플 만들 때 이런 식으로 했을 것입니다.
      전공자들은 시험볼 때 이런 것도 간혹 하는데 눈알/머리 빠집니다. -.-

      V3 같은 경우에도 안철수씨가 어셈블리로 만들었는데 베이직으로 만든 버전도 있습니다.
      베이직 버전은 V3 소스 코드가 .exe 파일을 생성하는 프로그램입니다. hex editor 가
      있다면 이것도 손으로 할 수 있지요. 포토샵으로 하는 변태도 있습니다. -.-

게시판 2012

번호 제목 글쓴이 조회 날짜
[공지] 게시판 규칙, FAQ, 기타등등 462,405 01-31
[공지] 게시판 관리 원칙. 147,940 12-31
제 트위터 부계입니다. 3 122,148 04-01
130354 새해복 많이 받으세요 10 186 12-31
130353 아바타 3를 보고 유스포 2 191 12-31
130352 [핵바낭] 올해 잉여질 결산 잡담 14 331 12-31
130351 아바타: 불 과 재 보고 왔어요 짤막 소감 6 227 12-31
130350 [영화강추] '척의 일생' 8 249 12-31
130349 흑백요리사 2 8~10회, 싱어게인 4 탑 4 결정 6 285 12-31
130348 Lacombe Lucien(1974) 7 131 12-31
130347 [관리] 25년도 보고 및 신고 관련 정보. 15 323 12-31
130346 Isiah Whitlock Jr. 1954 - 2025 R.I.P. 2 138 12-31
130345 [왓챠바낭] 우편배달부 말고 '포스트맨은 벨을 두번 울린다' 잡담입니다 12 267 12-31
130344 [넷플] 말 많고 탈 많은 '대홍수' 드디어 봤습니다 14 453 12-30
130343 [반말주의] 다들 올해 고생 많았어!! 새해 모두 건강하고 복 터지길 바래!! 12 186 12-30