자랑 좀 해도 될까요?

HDNua의 이미지

안녕하세요. 컴공과 2학년 1학기까지 다니다가 반년 휴학하고 입대해서 군 생활 11달 한 공군인입니다.
프로젝트 시작은 2013년 12월 1일(실제론 그 이전이겠지만)입니다.

1. 먼저 링크.
(131201. 10:09) HTML과 Javascript를 이용한 가상 IDE를 개발해보려고 합니다.
> http://kldp.org/node/140925
(140217. 14:20) C 인터프리터를 Javascript로 구현하는 도중에... 뭔가 메모리에 대한 종합적인 궁금증이 생겼습니다.
> http://kldp.org/node/141821
(140419. 18:35) 컴퓨터의 개론적인 부분이 궁금합니다. 한 것 같습니다?
> http://kldp.org/node/142489
(140430. 13:51) 힙 메모리 영역은 이진 트리가 아니어도 괜찮나요?
> http://kldp.org/node/142690

2. 계기.
위 질문에도 적혀있지만, 부대는 기본적으로 프로그래밍이 금지되어있어서
프로그램을 빌드하는 것 자체가 마음에 걸리는 일입니다.
그래서 코드를 입력하면 결과만 출력해주는 가짜 해석기를 만들고 싶었습니다.

3. 진행 상황.
3-1. dcl: C 프로그래밍 언어의 선언을 분석하는 모듈입니다.
"The C Programming Language - Dennis M. Ritchie & Brian W. Kernighan"에서 영감을 얻었고
개발 완료하였습니다.

3-2. rdx: Javascript의 eval 메서드와 비슷한 기능을 하는 모듈로, 프로그래밍 수식을 입력받으면
후위 연산식으로 변환한 다음 올바르게 해석하는 모듈입니다.
개발 완료하였습니다.

3-3. Javascript: 원하던 가상 IDE는 아직 만들지 못했지만, 부대에 있던 자습서 chm 파일과
인트라넷 커뮤니티에 남아있던 정보들을 모으고 모아서
보다 개발을 편리하게 하는 HtmlMaker를 만들었습니다.
(이름이 거창하지만 보면 코드를 파일로 저장한 다음 iframe의 src 속성을 변경하는 프로그램입니다)
파일을 관리하는 FileManager 객체, 프로그램 전체를 관리하는 Program 객체 및
프로그램 개발에 관한 전반적인 형식과 객체를 정의하고 운용해봤습니다.

3-4. 메모리: 스택 메모리와 힙 메모리를 구현하였습니다.
스택 메모리는 '윤성우 저 열혈 자료구조 - 윤성우'의 배열 스택을 보고 아이디어를 얻어 간단하게 개발했고
힙 메모리는 3-4달 정도 고민한 끝에 1.3의 링크에서 아이디어를 얻어 해결하였습니다.
이를 통해 메모리가 어떻게 관리되는지와 undefined behavior가 무엇인지에 대해 어느 정도 이해하였습니다.

3-5. 컴파일, 링크: 이전에는 컴파일과 링크가 프로그램을 만드는 중간 과정이라고만 이해했다면,
이 프로젝트를 통해 컴파일이 소스 코드를 링킹 가능한 오브젝트 파일로 만드는 과정이며
오브젝트 파일에 어떤 정보가 들어가야 하는지를 나름대로 구상해보았고,
링크 과정이 오브젝트 파일을 서로 대조하면서 어떻게 프로그램 파일을 만들어내는지도 생각해보게 됐습니다.

3-6. 프로세스, 프로그램: 프로그램에는 데이터와 코드에 대한 정보가 들어가고
이것을 실행했을 때 운영체제가 메모리에 프로그램에 담긴 정보를 복사하여
프로세스를 만드는 것임을 이해하였고 제 가짜 해석기에 적용하였습니다.

3-7. 파일 시스템: 이 부분은 막연하게만 생각해놓고 아직 완전히 이해는 못했습니다.
공룡책을 추천받아 일단 사뒀으니 읽어보면서 이해할 생각입니다.
후에 가짜 해석기에 파일 API를 구현할 때 가짜 출력 스트림을 구현하기 위한 용도로 쓸 예정입니다.

3-8. CPU: 레지스터와 즉시 값 등에 대해 이해하게 된 것 같습니다.
아래에도 나와있지만 HASM이라고 제가 만든 어셈블리 언어가 있는데,
CPU는 여기서 이 HASM을 읽어낸 다음 run 메서드를 통해 명령을 수행하는 모듈입니다.

3-9. HASM: Handy Assembly의 약어로 가짜 해석기가 변환하는, 제가 정의한 어셈블리 언어입니다.
아주아주 단순해서 call 004A와 같이 입력하면 메모리에 실제로 call 004A를 갖다박습니다.
MASM이나 NASM에서 사용하는 명령어 중 일부만 구현해놓고
필요할 때마다 명령어에 추가해서 사용하고 있습니다.

4. 목표와 결론.
저는 이와 같이 순수 Javascript 기술을 이용해 가짜 프로그래밍 언어 해석기를 거의 개발하였습니다.
개인적으로 이 정도면 제법 열심히 머리를 굴렸다고 생각합니다...만
역시 여기처럼 온갖 것을 다 개발하는 분들 앞에 자랑이라고 내놓기엔 아직 부족할까요?

글 쓰고 싶은데 질문을 할라치면 검색하면 다 나와서 아쉽던 차에 심심해서 남겨봅니다.
써놓고 보니 반년 동안 생각보다는 많은 양을 공부한 것 같지 않아 아쉽네요.
시간 내서 자랑 글 같은 걸 읽어주셔서 감사합니다. 좋은 하루 되세요.

세벌의 이미지

글 잘 읽었습니다. 님께서 쓰시는 아바타는 어떤 뜻인지 궁금.

HDNua의 이미지

나눔고딕 폰트를 이용해
ㅅ으로 머리를
큰 ㅇ으로 얼굴
(ㅇ, ㅇ)로 양쪽 눈을 만들고
ㅠ로 입을 만들었습니다.

문득 프로그래밍 관련해서 얼굴의 뜻을 설명할 수 있지 않을까 했는데 무리수네요 ㅎㅎ

저는 이렇게 생각했습니다.

raphael4의 이미지

가짜 해석기 라는게 컴파일 후 출력을 대신 해주는 건가요?
아니면 컴파일러를 가상으로 해주는 컴퓨터를 구현했다는 건가요?
어찌됬든 둘다 진짜 컴파일러 같은데
제가 지식이 부족해서 이해가 잘 안됩니다.

HDNua의 이미지

1. 적당한 프로그래밍 언어로 코드를 작성합니다.
2. '컴파일'하면 작성한 코드가 HASM이라는 어셈블리 언어로 작성된 가짜 목적 파일로 바뀝니다.
3. '링크'하면 링커에 연결된 가짜 목적 파일 모두를 하나의 가짜 실행 파일로 바꿉니다.
4. '실행'하면 가짜 실행 파일을 실행하여 그 출력을 보여줍니다.
다 만들면 가짜 목적 파일도, 가짜 실행 파일도 모두 메모리에만 올리고 실제 파일로 나오지는 않게끔 할 것이라
컴파일러이기도 하고 인터프리터이기도 합니다.
설명이 제대로 되었는지 잘 모르겠네요. 관심 가져주셔서 감사합니다 ㅎㅎ

저는 이렇게 생각했습니다.

raphael4의 이미지

실행파일이 생성되지는 않지만 실행되는 도구 라는 건가요?

HDNua의 이미지

그렇습니다.

저는 이렇게 생각했습니다.

kaeri17의 이미지

파싱은 recursive descent parser로 구현하신 건가요? C문법중에 아마 저걸로 파싱 안되는게 좀 있던걸로 기억하는데 이걸 어찌 하셨나 궁금하네요.

HDNua의 이미지

1. recursive descent parser를 검색해서 찾아보니... 재귀하향 파서? 뭐 이런 게 나오네요..
컴파일러 관련해서 개발할 때 쓰이는 전문 용어같은데, 제가 컴파일러 과목은 배운 적이 없습니다.

recursive라는 단어와 '뒤로 되돌림 없이 해석하는 프로그램'이라는 설명만으로 추측해보자면, C 선언 분석 도구인 dcl은 그렇게 만들었습니다.
(애초에 The C Programming Language에 그렇게 구현이 되어있기 때문에)

개발중인 프로그램이고 아직 불완전한 부분도 많기 때문에, 어떤 것이 파싱하기 어려운 부분인지를 알려주시면
그걸 어떻게 처리했는지 설명해보겠습니다.

그리고 아마 처리가 안 되는 거면 아예 따로 뜯어내서 처리했을 거에요.

저는 이렇게 생각했습니다.