여차저차 하다가 이런 홈페이지가 또 있는지 알게되었습니다.
현재 주로 연구 ?! 하고 있는 분야가 Compiler쪽이므로 ... 이번에 하는 것이 끝나게 된다면,
Open Source Foundation에 대한것과 관련하여 Compiler와 관련된 Issue라든지
Compiler에서 필요로 하는 Mathmatics의 Mechanism에 대한 지식을 전달 해보도록 하겠습니다.
간간히 이쪽 분야에 대한 생각과 이슈도 올리겠습니다 ^^
예전에는 스터디를 운영도 해 보고 참석도 해보고 해서 드는 생각인데 "스터디란 같이 공부해서 정보를 서로 공유하는 것"이 아닌 "한명이 알고 있는 내용을 다른 사람들에게 일방적으로 전달하는 것"으로 전락되는 경우를 많이 봐 왔습니다.
이게 참 안타까운 현상인데, 현실적으로 스터디 운영을 할 때에는 참여자들에게 당근과 채찍을 골고루 배합을 잘 해야만 합니다. 뭔가 output을 내어서 공개적인 발표를 가끔씩 하는 것도 괜찮을 것 같구요.
직접 도와 드리지 못하는 점은 아쉽네요, 아는게 별로 없어서... ㅎ
그리고 Linux-H4acker님이 잘 아시겠지만, 국내에서 기초 학문에 대한 기반은 외국에 비해서 열악합니다. Computer Science만 해도 OS, Compiler, DBMS, Network에 대한 기반은 상당히 부족한 것이 현실이며, 실제 필드를 나가도 회사들 대부분이 응용(Application)부분이 치중을 하지, 기반 산업을 중점적으로 하는 곳은 찾아 보기가 어렵습니다.
1. 쉽지가 않다고 생각한다.
2. 정보 공유가 제대로 되지 않기 때문에 접하기도 힘들다.
3. 해봤자 성공하기 어렵다. Major 벤더들에 의해 이미 다 되어 있다고 생각한다.
4. 국내 IT 정책은 단기적 성과 중심이기 때문에 이러한 기초 학문을 기반으로 하는 산업 육성을 정부에 기대하기 어렵다.
예전에도 말씀을 드렸지만, Linux-H4acker님은 한국에 머무르지 않았으면 합니다.
한국은 Linux-H4acker님의 실력을 인정해 줄 만한 환경이 아닙니다.
진정으로 하는 말입니다.
진심 어린 gilgil님의 조언 잘 받겠습니다.
외국에서 빡시게 공부하고, 실력을 보다 갈고 닦아 ...
언젠가 한국에 돌아와 OSF(Oepn Source Foundation)을 만들고 싶습니다.
외국에서 수입하는 모든 OS, Compiler, Debugger등이 전부 국산화되어
실질적인 이익을 창출 할 수 있는 날이 왔으면 좋겠습니다.
전에 이런 프로젝트가 있었던 것 같습니다.
인하대 대학생분들을 모아서 항공기에 들어가는 OS를 국산화 할려고 했답니다(인하대 쪽에서 박사 논문 쓰고 계신분이 알려주심)
이 프로젝트는 정부에서 지원해준 프로젝트인데, 2년인가 3년만에 정부가 손을 뗏다고 하더군요 ...
이유는 Compiler가 없기 때문에 OS 자체를 국산화 시킬 수 없다는 결론이였습니다.
저는 원래 OS를 만드는 것에 목적을 두고 있었기에 ... 이 말을 듣고 Compiler가 엄청난 것이구나라는 것을 느꼇죠 ㅎㅎ
그러면서 공부를 하다보니, Compiler의 Optimization Skill이라든지 Computer Architecture에 기반한 Instruction Set,
그리고 버그를 해결하기 위한 Compiler의 정 반대 녀석인 Debugger ... 최종적으로
이 모든것을 총괄하는 Kernel ... 이 모였을때, 정말 OS라고 부를 수 있다는 것을 느꼇습니다.
(Compiler는 Decoder, Debugger는 Encoder)
저는 사실 Kernel을 막 공부하고 났을때는 Kernel을 OS라고 불렀었습니다.
지금 느낀 솔직한 감정으로는 그때 당시 한 말은 수정될 필요가 있다고 생각합니다.
Kernel은 Process, Memory, File System, Device Driver, Network를 관리하는 1개의 Core System Softwar이고,
OS는 Compiler, Library, Binary File Descriptor(BFD), Debugger, Kernel이라는 5개의 Core System Software의 집결체로 말이죠 ...
언젠가는 이 꿈을 꼭 이루고 싶습니다 ^^
이런 말을 하면 제가 나온 학교 욕인것 같지만 국내 대학교에 Compiler나 OS에 대한 기반 지식을 요구하는 기대를 한다는 자체는 아직 무리라는 생각이 듭니다.
전 OS에 대해서는 잘 몰랐습니다(지금도 잘 몰라요 ㅋ). 학교 다닐 때 3학년때 OS라는 수업을 들었는데, 시험이 오픈 테스트였고 "책 몇줄에 있는 소스 코드를 없애 버리면 OS 부팅 과정이 어떻게 변하느냐" 식으로 시험 문제가 나왔었습니다. 한마디로 교수님이 얘기해 주시는 OS에 관한 지식 하나 하나를 이해하지 못하면 제대로 된 점수를 따기 힘들었죠. 나름 빡셌습니다. ^^ 그런데 수업 막바지에 가서 교수님께서 그러시더라구요.
"너네는 OS를 책으로 배우기만 하지, 버클리에서는 OS 하나 만들어 오는게 리포트야."
상용에 접근한 OS는 둘째 치고라도 Micro Kernel 구현도 제대로 못하는게 현재 한국의 IT 기술의 현실입니다. 입학이 쉽고 졸업이 어려워야 제대로 된 대학 교육이 이루어 질 수 있는데, 우리나라는 정반대이죠. 국내에서 아무리 잘 해 봐야 우물안의 개구리입니다.
그리고 가급적이면 군대는 가지 마세요. 군대 가서 좋은 점은 나중에 술자리에서 할 수 있는 얘기 거리가 좀 더 생긴다는 정도? 아직 미필이라면 병특으로 가서 한국 IT 실정을 피부로 느끼는 것만으로도 충분합니다. 반드시 외국으로 나가세요. 오히려 그게 애국하는 길입니다. ^^
Free BSD는 확실히 박수쳐 줄만 합니다. 이후 대부분의 socket programming에 지대한 영향을 미쳤으니까요.
허나 쫄거 없습니다. 학부 레벨에서 OS 만드는 리포트라 해 봤자 Bootloader 만드는 정도? 그래도 국내 대학생들에게 이러한 리포트를 낸다면 몇명정도가 리포트를 제출할 수 있을런지... ^^ 태어날 때부터 Von Neumann Architecture를 알고 태어 나는 사람이 있을까요? 외국인들이 무조건 잘 할 거라고 생각하지 않아도 됩니다. 국내에서도 훌륭한 사람들 많습니다. 다만 대학 교육 과정뿐만 아니라 사회에 나와서도 개발자로서 올바른 길을 갈 수 있도록 경력을 쌓을 수 있는 문화를 만들어 줄 수 있는 회사가 한국에서는 드문 것이 문제이죠. ^^
C만해도 끔찍하죠 ㅋㅋㅋ
이제부터 Linux 기반이시니 ㅡ_ㅡㅋ
GCC Expansion과 관련하여 __attribute__(); 를 많이 보시겠군요 ㅎㅎ
또, 분기 예측과 관련해서 unlikely(), likely() 같은 GCC의 사기 기술?!이 있습니다.
(주로 Kernel 코드에 많이 사용되는데, Performence를 높이고자 ... ㅎㅎ)
참고로, 이것은 100% 보장이 아니라 99%의 보장성을 지니고 있습니다.
즉, 이 코드는 100번중 1번 꼴로 참, 100번중 1번 꼴로 거짓 ... 이냐에 따라 쓰시면 될겁니다.
(잘못 쓰게되면, 프로그램의 성능에 지대한 영향을 미치기도 하니 ... 조심하셔서 쓰시길 바랍니다 ㅎㅎ)
또, Compiler를 어떤것을 쓰시느냐에 따라 다르겠지만,
GCC의 중간 표현(IR)인 RTL(Register Transfer Language)를 알아두실 필요가 있습니다.
최근 GCC-4.4.0로 올라가면서 Gimple Tree라는 것에 RTL의 역할을 약간 분담했습니다.
그리고 현재 C++0x의 지원과 관련하여 GCC-4.5.0에서는 이와 관련된 것들도 추가되었습니다.
본격적으로 GCC-4.6.0부터 C++0x를 지원한다고 하니, 참고하시길 바랍니다.
또, 분기 예측과 관련해서 unlikely(), likely() 같은 GCC의 사기 기술?!이 있습니다.
오, 찾아 봤습니다. http://kerneltrap.org/node/4705
코드의 실행을 프로그래머가 예측해서 분기(branch)가 가급적이면 일어 나지 않도록 하여
CPU- Memory(Instruction) pipe 처리에 도움이 될거 같네요.
완전 사기 기술인데요? ㅋㅋ 좋은 정보 감사합니다. 나중에 회사 가서 써먹어 봐야 겠습니다. ㅋㅋ
이런거 좋아라 합니다. ^^
이외에도 유용한 GCC Built-in Function들이 존재하니,
적절하게 사용하시면, 상당한 양질의 프로그램을 만드실 수 있을 거라 믿습니다 ㅎㅎ
그리고 개인적으로 개발툴은 vi나 emacs를 추천해드리고 싶습니다 ㅋㅋㅋ
Unix의 설계 철학을 고대로 담고 있는 친구들이기에 ... 더욱 추천드리고 싶네요.
vi, gcc, gdb, binutils(as, ld, objdump, nm, addr2line등)들은 알아두시면,
Linux 환경의 개발에서 굉장한 Performence를 발휘할 수 있습니다.
참고로 전 윈도우쪽에서의 개발은 잘 모릅니다 ㅋㅋㅋ
대충 보니까 아마 #pragma인가 하는게 GCC의 __attribute__()와 유사하더군요.
기능은 GCC가 더 많을 겁니다(2010이 나오면서 어떻게 됫을지는 ... ?!)
built-in function... 아, 별게 다 있군요.
일부는 MS 컴파일러 macro로 처리가 가능한 것들도 있고,
일부는 processor(CPU) 와 관련된 것들도 있고(생소하네요), ...
http://gcc.gnu.org/onlinedocs/gcc/Other-Builtins.html
코드 최적화를 위해서는 반드시 알고 있어야 할 것(달달 외우고 있어야 할 것)들도 많네요.
아, 안돼... 자야 하는데. 이런거 보느라 잠을 못자겠네. ㅠㅠ
위에 말씀드린 ld와 관련해서는 Linker Script라는 것이 있습니다.
Windows CE에서도 이와 비슷한 것을 봤던것 같은데, 잘 기억이 안나네요 ㅡ_ㅡ;;;ㅎ
확장자는 *.lds이고, gcc로 컴파일할때, 같이 던지면, 알아서 링킹시에 처리합니다.
물론, gcc로 다이렉트로 컴파일 할 일은 거의 없고, make라는 녀석을 이용해서 ... make 눌러놓고 놀 수 있습니다 ㅋ
사실 예전에 이걸 악용한 적이 있는데, make에다가 이상한 스크립트 무한 루프 돌려놓고,
아 ... Kernel Compile 너무 오래걸려요 ... 했었던 기억이 ... ㅋㅋㅋ
그러고 플래시 게임했었다는 ;;;
RTL이라... 실제 machine에서 돌아갈 수 있는 object code로 변환되기 이전 단계로 보이는데... 코드 최적화를 분석하기 위해서 assembly보다가 RTL을 보는게 더 편리할 거 같군요. 맞나요? ㅎㅎ
고전적인(classical) C/C++ 언어만 알고 있는 상태에서, 평소 컴파일러의 최적화만 믿고 중간 과정의 최적화에 대해서는 별로 신경을 쓰지 않았는데, 공부를 좀 해 둬야 겠군요. 아, 좋은 정보들 너무나 감사합니다. ^^
스터디 한번 하면 불러 주세요. 저같은 linux-newbie에게 도움이 될 수 있는 정보를 줄 수 있는 자리가 있다면 정말 좋겠군요. ^^
GCC의 경우 Cache Prefetch Skill이 있어서
-march=i686 이런식으로 지정해주는 순간 오히려 더 좋은 성능을 얻을 수 있습니다.
물론 Hardware에 대한 지식과 RTL, Gimple 수준의 분석이 가능하다면, 더더욱 좋겠지요 ...
벤치마킹의 결과 성능 향상이 거의 6배 가량 좋아졌지요 ;;;
Intel Architecture의 경우 Speculation, Dynamic Scheduling등 ... hardware 차원에서 지원해주는 기능이 많습니다.
그래서 Compiler가 이녀석의 Dynamic Scheduling과 Speculation을 더더욱 지원해줄 수 있는 일종의 Tag를 만들어줍니다.
그래서 CPU와 Compiler가 서로 뗼레야 뗼 수 없는 관계에 놓여있습니다.
결론 : 위의 이유로 CPU 제작시 Compiler를 같이 설계하게 됨
물론 성능면에 있어서는 ...
상용 컴파일러들이 훨씬 최적화가 뛰어날겁니다 ?!
뭐, 어떻게 만들었을지는 모르겠지만, 이쪽 부분의 알고리즘들이 전부 NP-Complete이기 때문에
근사치 알고리즘 형태인 Greedy Algorithm, Heuristic Search등을 사용하는데, 결국 상용 컴파일러의 가격은 Binary의 최적화 수준에서 결정됩니다.
가령 나로호에 들어가는 RTOS를 컴파일해야 했다면, Binary 최적화 수준을 거의 99% 수준으로 했어야 ...
현존하는 상용 컴파일러중 Super Optimizer를 탑재하고 있는 컴파일러는 없습니다.
(컴파일 시간이 1년이 걸릴 수도 있는데, 중간에 컴파일 에러나면, 미칩니다 ㅋㅋㅋ)
CPU에 VHDL, FPGA등의 코딩을 할 때도 옛날엔 3일 걸리던 것이 이제야 겨우 1일만에 컴파일 하는데,
1일동안 아 ... 하는데, 이 하루만 해도 컴파일 에러가 나면, 환장합니다 ㅠㅠ
만약 컴파일 6개월동안 하는데, 에러나면 ... gg치고, 접싯물에 코박아야죠
이래서 하드웨어 코딩하시는 분들 성격이 상당히 ;;;
나쁘게 말하면, 까다롭고, 좋게 말하면 꼼꼼합니다.
미국 항공 우주 연구소(NASA)의 경우 VxWorks라는 현존하는 최강의 RTOS와 ...
현존하는 최강의 Compiler, 그리고 Math, Science Library를 보유하고 있습니다.
정말 무서븐 놈들이죠 ㅎㅎ
3축 GPS의 경우 사람 손등에 점을 찍어놓고, 거기에 미사일을 맞출 수 있다고 합니다 ㅡ_ㅡ;;;
(머지 않아 이것이 언젠가 상용화되면, 암살용으로 건물로 미사일이 날라올 삘)
빛을 압축할 수 있는 기술이 구현된다면,
스타워즈에서 보던 광선검도 ... 실현화 됩니다.
실제 핵폭탄이 터지게 되면, 빛을 엄청난 속도로 응축시키게 됩니다.
순간적으로 응축되었다가 발산하게 되는데,
이때 이 응축된 빛을 맞으면, 형채도 남아있지 않고, 그냥 승화해버리죠 ...
저 멀리서 그 빛을 본사람은 눈이 멀게 됩니다.
이렇게 강력한 응축된 빛으로 구성된 광선검에 스치면, 그 부위는 그냥 싹둑하고 잘리겠죠 ...
이런 핵 기술에 대한 공식이 바로 E=(dm)c^2라는 아인슈타인의 공식이죠 ㅋ
핵이랑 빛이랑 뭔 상관이냐 하실 수 있는데,
위 공식에 보이는 c가 빛의 속도 30만 km/s입니다.
(1초에 지구를 7바퀴 반이나 돌죠 ㅎㅎ)
자세한 것은 현대물리학중 핵물리학을 공부하시면, 좀 더 깊은 내용을 아실 수 있습니다.
실제 GCC 소스 코드를 분석하게 되면, lang_hooks.parse_file();이라는 것을 볼 수 있습니다.
주로 이렇게 멤버 참조, "->" 포인터 참조등을 하는것은 Pointer of Function이죠 ㅎㅎ
저걸 까보면, c_common_parse_file()함수가 동작하는데, 저기서부터 translation_unit()이 들어와서 Generic Tree -> Gimple Tree를 형성합니다.
그리고 막판쯤에 pass -> execute()라는 녀석이 rest_of_handle_final() 함수의 포인터로 저부분에서 RTL Code를 Assembly Language로 변환합니다.
이때, 변환 과정과 그 전에 cgraph_init()에서 CFG(Control Flow Graph)에 대한 것을 생성하는 것을 볼 수 있는데,
실제 GCC의 최적화가 최고의 최적치가 아니라는 것이죠 ㅡ_ㅡㅋ
그래서 Gimple, RTL 수준에서 최적화를 해야합니다.
구글같은 경우에는 Gimple, RTL + 알파(기계어) 수준에서 최적화를 하더군요 ㅎㅎ
물론, 대한민국에서는 Gimple Tree와 RTL, 여기에 추가적으로 기계어 수준까지의 최적화를 기대하기엔 ...
빨리 빨리의 병패가 남아 있죠 ;;; (최적화는 꿈도 못 꾼다고 하네요 ㅋㅋㅋ)
안녕하세요, 가끔 카페 들어가서 눈팅만 하고만 있습니다.
예전부터 종종 카페에 들어서 Linux-H4cker님의 글들을 죽 보아 왔는데요,
지금 Linux-H4akcer님의 레벨은 이미 일반 개발자나 웬만한 IT 종사자들도 커버할 수 없는 레벨인 것 같습니다. ^^
제가 도와 드리고 싶어도 그럴 실력이 되질 않으니... ㅎㅎ
열심히 하셔서 좋은 결과 있기를 바라겠습니다. ^^