컴파일러 과목을 배우는 이유가 뭘까요?

익명 사용자의 이미지

안녕하세요.
컴공3학년 생입니다.

컴퓨터공학도로서
컴파일러 과목을 배워야하는 이유가 무엇일까요?

세벌의 이미지

대학교를 수학과 갈지 아닐지도 모르는 초등학생, 중학생, 고등학생들이 수학을 배우는 이유는 뭘까요?

익명 사용자의 이미지

모든 학문의 베이스가 되기 때문이 아닐까요?
컴파일러 역시 컴퓨터공학의 베이스가 되는지요?

snowall의 이미지

베이스죠. 기초중의 기초 -_-

왜 기초냐면, 컴퓨터가 알아먹는 언어는 유일하게 기계어인데 사람은 기계어에 대해서 native speaker가 될 수 없어요.

그러니까 사람이 말하면 기계어로 바꿔주는 통역이 필요한데, 그 통역사가 바로 컴파일러라는거죠.

피할 수 있을때 즐겨라! http://melotopia.net/b

comafast의 이미지

추가하면, 운영체제 과목을 배워야 하는 이유가 무엇일까요?
형식언어
이산수학
데이타베이스

내가 학부생이었을때 이런물음에 스스로 답할수 있었다면 지금과 많은면에서 달라졌을것 같네요.

익명 사용자의 이미지

저도 학생이지만,
솔직히 왜 배워야하는지 아직 감이 잘 안옵니다. ㅠ-ㅠ

익명 사용자의 이미지

아... 충격적이면서
심난한 글이네요.

나빌레라의 이미지

컴파일러의 동작 방식을 조금이라도 아는 사람과,
아예 모르고 그냥 문법만 아는 사람이

실무에서 비슷한 일을 할 때의
결과물이나,
작업과정,

본인의 스트레스 차이는 엄청납니다.

당연히 컴파일러를 아는 사람의 결과물이 더 좋고 작업 과정은 더 우아하고,
본인의 스트레스는 더 적지요.

----------------------
얇은 사 하이얀 고깔은 고이 접어서 나빌레라

익명 사용자의 이미지

댓글 감사합니다.

lovewar의 이미지

저도 그때는 그냥 배웠지요. 이유없이.

돌이켜 보면, 관심이 없어서 그냥 배웠던것 같습니다.

익명 사용자의 이미지

컴파일러 기술이 컴퓨터 과학의 일부입니다. 기계어 생성에 기반이 되는 기술입니다. 그리고
파서 제작에 도움이 되는 기술이기도 합니다.
응용 프로그램만 하는 사람에게는 별로 도움되지 않습니다.

nthroot의 이미지

간단한 자바스크립트 코드를 짜도 머리속에 그려지는건 다르다고 할까용.

참 중요한데 .. 뭐라 설명하기가 힘드네요.

시간이 지나면 아시게 되겠죠..

------식은이 처------
길이 끝나는 저기엔 아무 것도 없어요. 희망이고 나발이고 아무 것도 없어.

익명 사용자의 이미지

해당 강의의 목적은 첫시간에 보통 알려줄텐데요. 아니면 교수가 글러먹었네요.

그리고 대체 컴공학도가 안 배우면 어느 전공자가 컴파일러를 배워야 할까요. 정말 궁금합니다. 질문자 분의 의견 부탁드립니다.

익명 사용자의 이미지

안녕하세요~
댓글 감사드립니다!^^
제가 요번에 이과목을 수강하면서
교수님이 '왜' 이과목을 배우는지 알려주는 대신에
저희한테 왜 이과목을 배워야하는지 스스로 생각을 해보라고 하셨습니다.

곰곰히 생각하고 있던 찰나의 KLDP 회원분들의 의견은 어떠하신지
궁금한 마음에 글을 올렸습니다.

neocoin의 이미지

교수님이 귀찮으신가봐요. 그럴수도 있죠.

익명 사용자의 이미지

그럼 컴퓨터 공학도에게 의학을 가르칠줄 알았냐?

익명 사용자의 이미지

^^; 컴파일러를 공부하는 '이유' 에 대한 질문입니다.

cleansugar의 이미지

프로그램 내부에 스크립트를 내장할 경우가 있어요.

사용자 함수같은 거요.

그 때 필요해요.

자기가 언어를 만들고 싶을 때도 좋아요.

재벌 2세가 재벌이 될 확률과
금메달리스트 2세가 금메달을 딸 확률이 비슷해지도록
자유오픈소스 대안화폐를 씁시다.

아이디의 아이디어 무한도전
http://blog.aaidee.com

귀태닷컴
http://www.gwitae.com

익명 사용자의 이미지

댓글감사합니다.

사용자함수라하면?
그냥 개인적으로 만들어 쓰는 함수 말씀하시는 건가요?

snowall의 이미지

예를 들어, 엑셀같은데 내장된 VBA script는 매우 유용하죠.

원래 없는 기능을 만들어서 쓸 수 있으니까요.

그런데 VBA같은 걸 그냥 만들 순 없고, 어쨌든 컴파일러의 원리에 대해 이해해야 적절히 만들 수 있거든요

가장 간단하게는, 윈도우즈 환경설정 저장 파일인 ini같은 파일만 보더라도, 변수와 값을 구분해서 적절히 넣어주는 부분이 필요할텐데, 이걸 파싱하는 파서를 만들려면 컴파일러의 원리를 알아야 합니다

피할 수 있을때 즐겨라! http://melotopia.net/b

rgbi3307의 이미지

자동차는 여러가지 기술의 집합체입니다.
컴퓨터 또한 여러가지 기술이 접목 되어야 합니다.
컴파일러는 자동차 엔진에 해당합니다.
컴퓨터 공학도라면 엔진에 해당하는 컴파일러를 배워야합니다.
그런데, 문제는 우리나라의 컴퓨터 공학도들은 학교에서 컴파일러를 배워도
제대로 써먹을데가 없다는 것이지요.
왜냐하면, 우리나라의 IT 생태계는 있는거 대충 가져다 붙여서 조립하는데 익숙하기 때문입니다.
우라나라에서 컴파일러를 연구한다고 하면 대우해 주는 기업이 없습니다.
S사, L사, H사... 모두 있는거 대충 가져다 붙여서 조립만 하니까요.
지금은 로열티, 특허문제에 걸려서 허득이다 보니... 이제야 그 필요성을 느끼는듯...

From:
*알지비 (메일: rgbi3307(at)nate.com)
*커널연구회(http://www.kernel.bz/) 내용물들을 만들고 있음.
*((공부해서 남을 주려면 남보다 더많이 연구해야함.))

익명 사용자의 이미지

비유가 너무 적절하네요.
댓글 감사드립니다.
큰 도움이 되었습니다!

creativeidler의 이미지

컴퓨터공학도로서 배워야 하는 이유는 커리큘럼에 포함되어 있기 때문이겠구요;;

학문이라는 관점에서 본다면 배워야 해서 배우는 게 아니라 배우고 싶으니까 배우는 거죠. 컴파일러가 어떻게 동작하는지 궁금하고, 내가 만들어보고 싶고, 그러면 컴파일러 배우는 겁니다. 본인의 흥미 외에 어떠한 이유도 학문을 해야 하는 이유가 될 수 없습니다.

실용이라는 관점에서 본다면, 컴파일러는 앞으로 개발자로 살아가기 위해 필수적으로 필요한 건 아닙니다. 까놓고 말해서 컴공에서 가르치는 과목 중 그 어떠한 것도 개발자에게 "필수"인 것은 없습니다. "배워두면 좋은 것"이죠. 절대 이 둘을 혼동하면 안됩니다. 사람들이 필수라고 말하는 것 다 배우다보면 스티브 잡스나 빌게이츠처럼은 절대 될 수 없습니다. 필수 따위 족구하라그래. 필수는 논리적으로 사고할 수 있는 능력이 필수라면 필수겠죠.

그렇다면, "컴파일러 과목을 배워야 하는 이유가 뭔가요?"보다는 "컴파일러를 배우면 뭐가 좋은가요?"가 적절한 질문이겠지요. 만약 교수가 전자와 같은 질문을 하고 답을 찾아오라 한 거라면 그닥 공학적 사고가 탑재된 분은 아닌 것 같구요. 국내에 은근 컴파일러 관련해서 세계적으로 인정 받는 교수님이 몇 분 있으신데, 그 분들은 대개, 흥미 없으면 컴파일러 듣지 말라고 이야기합니다. 컴파일러 인력은 이제 별로 필요도 없는데 너무 많이 생산된다는 이야기도 하구요. 우리나라만이 아니고, 세계적으로도 컴파일러 인력은 공급 과잉입니다. 컴파일러 전공해서 계속 컴파일러 할 수 있는 경우는 흔치 않습니다.

후자의 질문에 답한다면, 컴파일러를 배워두면 이득이 몇 가지 있습니다. 유용한 개념을 여러 가지 배웁니다. 정녕 필수는 이게 아닐까 싶은 정규식에서부터 복잡한 프로토콜을 설계할 때 도움이 많이 되는 finite state machine, DSL 설계할 때 도움 되는 context-free grammer, request descent parser를 제작하면서 배우게 되는 문제 해결 기법, synthesize 단계에서 배우게 되는 스택 구조, function call의 구조, C의 함수가 그렇게 생겨먹을 수 밖에 없었던 이유, 최적화 단계에서 배우는 다양한 휴리스틱 등등이죠.

그리고, 아마도 학부 수준에서 경험해볼 수 있는 몇 안되는 serious program을 작성해볼 수 있는 기회이기도 하구요. lex & yacc처럼 유용한 도구를 배우는 계기도 됩니다. 그리고, 자신 만의 언어를 만들어야 할 일이 생각보다는 멀지 않은 일일 수 있습니다. 업무상 필요한 DSL을 만들 수도 있고, 언어는 그냥 쓰지만 template language가 맘에 안들어서 새로 만들고 싶을 수도 있고, cucumber 같은 spec execution tool을 만들어야 할 때도 있습니다. 본격 프로그래밍 언어 제작 외에도 여러 가지로 쓰이는 기술이라는 거죠.

하지만, 사실 제가 가장 결정적으로 배우는 게 좋다고 생각하는 이유는 컴공에서 배우는 과목 중 가장 어려운 과목이기 때문입니다. 한 학기 강좌로 들으면서 최종 과제로 C의 subset 정도 되는 컴파일러 하나 만들어낼 수 있는지 어떤지, 자신의 능력을 시험해볼 수 있을 겁니다.

익명 사용자의 이미지

장문의 글, 감사드립니다!!

글을 읽으니, 제가 너무 부족한 학생이었네요.ㅠ
아는 용어가 거의 없습니다.

더 열심히 하겠습니다.

sql2의 이미지

전 컴공 1학년 2학기 C언어 배우면서 드래곤북을 같이 본지라...

컴공이라 하시니... 소프트웨어공학적으로..

컴파일러는 프로그래머에게 있어서 가장 중요한 도구(유틸)이죠.

대다수의 프로그래머는 자동차를 구조를 모르고도 자동차를 운전할 수 있듯이 컴파일러구조를 모르더라도 컴파일을 하는데도 몇가지 옵션과 구칙만 알면 되죠. 구조를 알면 더욱 좋겠죠.

어떤 분 표현으로 컴퓨터학문의 3대 몬스터(괴물?) OS, DATABASE, COMPILER 중 한 놈으로써... 소프트웨어공학의 결정체 중 하나죠.

대다수의 프로그래머 직면하는 소프트웨어 아키텍쳐, 설계, 알고리즘, 자료구조, 솔루션 ... 등에 대한 많은 방법과 답을 가지고 있는 놈중 하나죠.

암튼...

결론적으로 컴공 3학년이 이유를 모른다면 전직을 강추합니다!!

그러나, 현실에서는 많은 분들이 컴파일러 수업을 안들었어도 잘먹고 잘살고, 잘코딩하고 있습니다!!

만약에 컴파일러 수업 들으시면...

SIGPL 교수님들이 번역하신 Kenneth Lounden 교수님 책을 추천합니다. 그러나, 대세는 타이거북입니다. 그리고, 진도 안가는 Microsoft 의 피닉스 프로젝트도 추천하니다.!! ( LLVM 가 더 나을수도...) 혹은 MILEPOST, CTuning 도 강추!!

익명 사용자의 이미지

[냉무] 괴물중 네트워크 하나 추가요.

굉이의 이미지

왜 컴파일러가 전산 학문의 기초인지
어떤 경우에 컴파일러를 알면 더 결과물이 좋고 본인의 스트레스가 적은지
어떤 경우에 왜 나만의 언어를 만들어야하는지
이런게 설명되야할것 같습니다.

개발자가 OS,DATABASE,COMPILER를 다 공부하고 그 이론들을 늘 머리속에 넣고 일하는 것은 아닌것 같은데요.
(저만 그렇다면 제가 무지한 넘이겠지요.)
교수가 잘못됬다 수업을 제대로 안들었다 그냥 기본인거다 라는 대답은
미적분을 배우는 학생한데 그냥 배워놔 나중에 좋아 라고 말해주는 것과 뭐가 다르겠습니까.

저는 전자과를 나와서 하드웨어와 펌웨어를 주로 개발하다보니
OS를 배워야하는 이유는 조금 설명할 수 있겠지만
컴파일러와 데이터베이스는 전혀 배운적도 없고 배워야할 이유를 모르겠습니다.
아직은 관심도 없구요.
이 포스팅에 올라온 답변들을 봐도 왜 배워야할지 잘 모르겠습니다.
어려운 용어들이 나와서도 모르겠고 일하면서 언제 잘 써먹는건지도 모르겠습니다.
저만 못 알아들었겠지요. 죄송합니다.

나빌레라의 이미지

적절한 예가 될지는 모르겠지만,

일단 ARM 환경에서 임베디드 펌웨어를 C언어로 작성할 때,

"함수의 파라메터를 4개 이하로 하는 것이 성능상 좋다"

라는 말이 있습니다. 이것은 사실이지요. 왜냐하면 컴파일러가 파라메터 4개까지를 레지스터(R0~R3)에 잡고,
그 이후는 스택에 잡기 때문에 접근 속도에 차이가 납니다.
(설정을 바꿀 수 있긴 하지만 기본 설정은 이렇습니다.)

컴파일러의 구현을 모르면 이걸 그냥 외우던가, 아니면 모르는 채로 살아야 하죠.

이걸 아는 사람들은 코딩 가이드 등에 파라메터 개수 제한 같은게 적혀 있어도 금방 이해하죠. 그리고 코딩 가이드 위반도 적습니다. 하지만 이걸 모르는 사람은 실수로 코딩 가이드 위반 했을 때 "대체 왜!! 4개로 제한 하는 거야!" 하면서 스트레스를 받기도 합니다.

또,

일반적인 프로그래밍에서도
C++에서 팩토리 패턴으로 인터페이스 클래스를 구현할 때,
상위 클래스의 메소드를 호출 했을 때 실제 인스턴스의 하위 클래스 메소드를 자동 호출 하는 방식으로
virtual 키워드를 사용합니다.
이것은 컴파일러가 만드는 vtable 등의 기본 이론을 알고 있지 못하면,
무작정 외워야 합니다.
이해하는 것과 외우는 것은 학습하는 사람 입장에서 스트레스의 정도가 다르고..
이해하고 개발하는 것과 외워서 개발하는 것은 역시나 개발 퍼포먼스의 정도가 다를것입니다. (아니라면 할 말 없지요)

한가지 예를 더 들자면,
ARM 펌웨어를 C++로 작성하면 클래스 메소드의 파라메터로 r0에는 무조건 this 포인터가 넘어갑니다.
이것 역시도, 컴파일러의 구현을 이해해야지만 알 수 있는 내용이고,

C++에서 C처럼 심볼을 쓰려면 extern "C" 키워드를 사용하고 블럭에서 선언해야 합니다.
이것 역시도 C++과 C 언어의 컴파일러가 만드는 심볼테이블이 어떻게 다른가를 알아야만
보다 적절하고 유연하게 사용할 수 있습니다.

더 많은 예가 있겠지만,
그냥 막 생각나는 대로 적어 보았습니다.

임베디드 펌웨어 개발은 성능에 굉장히 민감한 부분이 많고,
또한 오류나 버그에도 매우 민감합니다.

이런 부분일 수록 컴파일러의 특징과 이론, 구현을 잘 이해해야만 직면한 문제들(성능 최적화 등)에 대응하기가 조금 더 수월해지고 문제 해결에 더 도움이 됩니다.

----------------------
얇은 사 하이얀 고깔은 고이 접어서 나빌레라

swirlpotato의 이미지

일 하면서 컴파일러 이론과 운영체제 이론을 엄청나게 많이 써먹고 있습니다.
업종 때문에 DB는 거의 쓸 일이 없긴 한데, 대학에서 배우는 과목은 말 그대로 기본이니 꼭 머리 속에 있어야 한다고 생각합니다.

익명 사용자의 이미지

정보처리는 입력을 받아서 출력을 내는 겁니다.
정보처리를 하지 않는 디지탈 시스템(HW, SW)은 없습니다.
그 대표적인 정보 처리 구현이 translator, 컴파일러죠.

익명 사용자의 이미지

개인적으로 컴파일러 수업은 정규식 하나만으로도 들어볼 가치는 충분하다고 생각합니다. (이미 알고있다면 gg)
lex, yacc라는 재미있는 도구도 컴파일러 수업에서 처음 접해봤네요. 저도 수업에 충실한 성실한 학생은 못되어서 별로 많이 배운건 없지만...
원래 아는만큼 보이고 보이는만큼 느끼고 느낀만큼 다시 배우는거 아닐까요.

익명 사용자의 이미지

창조할 수 있습니다. 컴퓨터 세계에서 인간이 창조주가 됩니다.
컴퓨터과학엑서 컴파일러는 핵심 기반 기술

--
저는 홍길동입니다. 홍길동을 믿으세요.
왜 예수는 믿고 홍길동은 안 믿는거죠?

JuEUS-U의 이미지

컴파일러 짜보면 알겠지만
Lisp의 문법은 정말로 아름다워요 /ㅅ/)3333

진짜 Java 컴파일러 짜다가 노이로제 걸릴 뻔 했습니다 - _-)

jachin의 이미지

많은 분들께서 좋은 비유과 설명을 해주셨습니다. 저는 '컴파일러 구조'이론을 어떻게 쓰는지 설명해보기 위해서, '소설'같은 이야기를 써보겠습니다.

컴파일러 이론을 공부하면서 오토마타도 익히고, Parsing 이론도 익혀서 실제 컴파일러를 설계할 줄 알고 있으면, 사람이 소프트웨어를 사용하는데 도움을 주는 프로그램을 만들 수 있습니다.

예를들면 Perl 모듈 중에는 소스코드를 정리해주는 모듈도 있습니다. 특정 언어 소스를 입력해서 스크립트를 돌리면, 정해진 문법 스타일로 변환하여 줍니다. 가령 탭을 4칸으로 쓰고 있었는데 8칸으로 바꾸거나, 토큰단위로 빈 칸을 삽입한다거나, 함수 인자로 받는 인자 변수들을 여러줄로 나누어서 정렬한다던가 하는 식으로 말이지요. 반대로 소스코드를 최대한 작게 만들기 위해서, 기존 탭들도 모두 제거하고, 최소한의 문법 요소 구분을 위한 빈칸만 쓰고, 빡빡하게 한 줄로 변환할 수도 있고요.

혹은 다른 언어로 변환하는 프로그램을 만들기도 합니다. 가령 '실질적인 (산업)표준'이 정의되지 않아서 애먹고 있는 언어 분야에서는, 한가지 소스를 가지고 다른 언어의 소스를 생성해낼 수도 있습니다. 이러한 방식은 '기계 번역기'와도 비슷한 부분이 많습니다.

몇몇 프로그램은 소스코드를 분석해서 그래프로 만들어주기도 하고요.

음... 더 글을 쓰고 싶은데... 시간이 없어서... ^^;;;
다른 분이 이어서 소설을 써주셨으면 합니다.

익명 사용자의 이미지

다만 프로그래머가 되려면 꼭 필요합니다. 그냥 있는 라이브러리 가져다가 알집같은거 만드려면 필요 없지만 DBMS나 인터프리터 같은거 아니면 이런 거창한게 아니고 알집같은거라도 속도빠르게하고 압축푸는 알고리즘을 제대로 공부하려면 필요하죠.
우리나라 컴퓨터 공학 교육에서 theory부분을 너무 낮게 취급하는 경향이 있습니다. 이산수학, 오토마타 이런것들말이죠. 하지만 이런 과목들이야 정말로 논리적 사고를 통해서 새로운것을 만들어내는 훈련을 하는 과목들입니다. 그냥 대강 자바할줄 아니까 SI가야지 라는 마음이 아닌, 좋은 컴퓨터공학자가 되어야지 하는 마음이면 이런 theory과목을 과소평가하는 실수를 하지 않으셨으면 좋겠습니다.