C언어 객체지향 프로그래밍

태훈의 이미지

안녕하세요. 태훈 입니다. ^^

이번에 프로젝트로 '운영체제 만들기'를 하고 있습니다. 그런데, 기존의 많은 운영체제와 뭔가 차별성을 두어야 할 것 같아서 그 중 하나로 C언어로 객체지향으로 개발하려고 합니다.

프로젝트 팀원 전원이 C언어에 대해서 어느정도 스킬을 가지고 있기 때문에 struct와 function pointer를 활용하면 된다는 것쯤은 다들 알고 있습니다. 혹시 이러한 기법에 대해서 참고 할만한 코드가 없을까요? 최대한 깔끔한 구조로 작성된 코드면 좋을것 같네요.

shint의 이미지

왠지. 오늘은 우리 운영체제나 만들어 볼까? 같은
분위기네요;;;;; 부럽;;;

----------------------------------------------------------------------------
젊음'은 모든것을 가능하게 만든다.

매일 1억명이 사용하는 프로그램을 함께 만들어보고 싶습니다.
정규 근로 시간을 지키는. 야근 없는 회사와 거래합니다.

각 분야별. 좋은 책'이나 사이트' 블로그' 링크 소개 받습니다. shintx@naver.com

bootmeta의 이미지

gtk ?

emptynote의 이미지

저두 gtk에 한표

태훈의 이미지

감사합니다. gtk 코드 좀 봐야겠네요.

Just do it!

winner의 이미지

C의 함수포인터를 가지고 C++의 가상함수를 표준에 부합하게는 구현할 수 없다는 것이 맞을 겁니다. C의 표준을 일부 위반하면서 C++ 가상함수스타일을 지향할 수도 있겠지만 동적객체지향언어처럼 구현해보시는 것도 좋지 않을까 하네요. 성능은 좀 떨어지겠지만 차별성(?)은 있을 것 같네요.
객체지향을 해보겠다는 것을 보면 프로그래밍 스타일에 관심이 많을 거라고 생각하는데 아예 C++보다도 추상화수준이 높은 고급언어로 OS를 만드는 것도 재미있을 것 같습니다.

태훈의 이미지

두가지 문제가 있습니다.

첫번째 문제는 고급언어를 할 줄은 알지만 C언어처럼 능숙하지 못한다는 점이고, 두번째 문제는 프로젝트 특성상 C언어가 가장 적합하다고 판단하고 있습니다. 물론, 고급언어로 OS 개발하는 것이 가능하지만 익숙하지 못한 환경에서 삽질을 해가면서 하기에는 리소스가 부족해요.(시간, 인력)

Just do it!

cleansugar의 이미지

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

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

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

gurugio의 이미지

굳이 c로 객체지향을 하실 필요가 있을까요?
부팅부분만 어셈과 c약간으로 작성하면 나머지는 C++로 가능할것 같습니다.
C++로 커널 만들기 문서도 많이 있었던걸로 기억납니다.

태훈의 이미지

시스템 타겟으로 한 프로젝트에서는 C++을 해본 적이 없어요.^^;;

객체지향을 하려면 객체지향에 적합한 언어를 쓰는 것이 당연하지만, 프로젝트가 'OS 개발'이라서 C언어라는 언어 제약을 벗어나기에는 아직 내공이 부족하네요.

Just do it!

하승수의 이미지

Linux 같은 경우 C 기반이면서도 Virtual File System Layer(vfs)는 OO 코드로 짜여있습니다.
C로써 필요한 만큼만 적합하게 OO를 쓰는 것의 대표적인 예라고 하네요. 참고해보시면 좋겠습니다.

C에 주안점을 두시는게 아니라면,

1. 고안정성, verifiability(검증 가능성?),
Haskell 같은 Functional Language로 운영체제를 짜보는 것도 괜찮겠네요.
Ada 같은 언어로 짜서 안정성을 극대화시켜보는 것도 나을것 같구요.

2. 최신!!
Java 등의 GC 내장 언어를 통해, 커널 수준에서 GC를 구현한 운영체제는 어떨까요?
물론 유저랜드 프로그램 수준에서 포인터를 제대로 안쓰거나 메모리를 제대로 사용하지 않는 것에 대응하는 데는 한계가 있지만,
그것을 위한다기보다는 개별 프로그램의 GC 운영을(C/C++ 같은 malloc free과 같은 수동적인 조절이든, Java같은 완전GC든 )를
운영체제 자체의 GC와 연동하여 속도, 메모리 사용, 스왑 등 의 최적화를 노릴수 있다고 합니다.

3.걍고
go는 어떤가요?(golang.org)
개발을 보면서 느끼는게,
C를 하던 사람들도 쉽게 다가갈수 있는게,
C보다 커질 잠재력이 있지만 아직 누가 깨워주질못한것 같아요.
운영체제와같은 프로젝트에 사용되면 go의 유저베이스도 커지고 go언어 자체의 성숙도 될것 같습니다.

ㅎㅎ
여기까지는 언어 수준의 생각들이구요.

운영체제 커널 자체의 수준에서는 마이크로 커널도 떠오르네요.

아이디어는 많아요!

태훈의 이미지

감사합니다. linux kernel의 VFS 코드 좀 봐야겠네요.

Just do it!

neocoin의 이미지

저도 보고나니, VFS 보고 싶은 생각이 드네요. 보고 있다가, 좋은 정보 얻어갑니다.

태훈의 이미지

접근성을 위해서 GTK+ source code 링크 남겨둡니다.

http://www.gtk.org/download.html

Just do it!

JuEUS-U의 이미지

근데 OOP라고 하면 굉장히 어렵고 복잡한거라고 보는 경향이 있는데
단순하게

struct Array
 
array_create
array_destroy
array_insert
array_pop
....

이런식으로 짜도 OOP에 들어갑니다.
리눅스 커널도 거의가 이런식으로 짜여있죠
gurugio의 이미지

차별성을 원하시니 한가지 더 사족을 붙이자면요
구조체에 함수 포인터와 상태 변수를 가지는 것도 객체지향이지만
다형성이나 상속등의 특성을 가져야 좀더 차별성을 가질것 같습니다.

예를 들면 메모리 관리자를 구현할때
썬에서는 슬랩관리자와 슬랩생성자 파괴자 등을 만들어서 슬랩을 관리하도록 하고 있습니다.

이처럼 어떤 모듈들이 있으면 기본 기능(인터페이스만 가지거나)을 가진 모듈이 있고,
이것을 팀원들이 각자 구현해서 여러가지 모듈을 가지고 선택해서 사용하는 등의
객체를 가진 커널이 되도록 하면 어떨까 생각합니다.

저도 작은 커널을 만들면서 여러가지 공상(공상만...)을 하다가
생각해본거라 참고가 되실까 해서 적어봤습니다. ;-)
즐거운 개발이 되시길 빌겠습니다.