Acme Editor for Windows
먼저 상기의 화면이 Acme 에디터이다!!
사전에 설명할것이 너무나 많은 에디터중 하나이며, 필자가 가장 좋아하는(?) 에디터이기도 하다.
데니스리치, 켄톰슨, 롭파이크… 이사람들이 익숙하다면 거의 이해한 것이다.
IT를 하는 사람이라면 누구라도 들어보았던 사람들이다.
바로 UNIX 운영체제와 C언어 를 만든 사람이기 때문이다.
1970년대 초반에 유닉스 운영체제를 C언어로 만들었던 사람들이며, 최근에 데니스리치씨는 유명을
달리하셨다. 갑자기 왜 이사람들 얘기를 하는지가 의문이 들 것이다.
바로, 이사람들이 벨연구소에서 Unix와 C언어를 만든 후에도 계속해서 무엇인가를 만들었기 때문이다.
대부분의 사람들이 UNIX, C언어를 밥먹듯이(?) 사용하면서 정작 당사자들이 만든 후에는 뭘하는지
별로 궁금해 하지 않는듯 하다. 벨연구소에서 루슨트 테크놀러지로 이름이 바뀌었다. (AT&T)
현재에는 대부분 Google.Inc에 소속되어서 Go언어 개발에 매진하고 있다.
이야기는 약간 과거로 가야한다. 최초에 UNIX 운영체제를 C언어를 이용해서 만든 후에 현재까지
여러가지 기술들이 포함되어서, 최초 개발자들 눈에는 UNIX 운영체제의 원래 취지가 많이 바뀌었다고
느끼게 된 듯 하다.
KISS(Keep It Simple, Stupid!) 라고 불리우는, 최대한 단순하고 간단하게 자기업무를 수행하는
시스템을 만들고자 UNIX 운영체제를 만들었으며, 유틸리티 또한 만들었다. KISS의 특징은 다음과 같다.
- 계층적 파일시스템을 가진다.
- 모든것이 파일이다.
- 모든 툴은 한가지일만 정확하고 확실히 수행 해야한다.
- 프로세스간 통신이 가능해야하며 파이프를 이용해서 교류가 가능해야 한다.
- 고급언어를 사용할 수 있어야한다.
1970년대에는 혁신적이이였다.!! 1990년대에 들어서 핵심개발자인 롭파이크는
Not only is UNIX dead, it’s starting to smell really bad
라는 말을 남기면, 변질된 UNIX정신에 대해서 비판했다.
현재에 적용하기에 너무 과거형 디자인이며 더이상 유닉스는 심플한 상태가 아님을 의미한다.
그래서 취지에 맞게끔 다시 운영체제를 만들게 된다. (유행에는 실패했음을 미리 말한다!!)
바로, Plan 9 라는 운영체제이다.!!
다음과 같은 유닉스 정신에 위배되는 것들을 모두 배제해 버렸다..!!
- root, suid
- tty, curses
- ioctl
- socket
- select/poll
- symlinks
- pthreads
- mmap
- dynamic linking
- loadable kernel modules
- locales
- gcc
- c++
- emacs ( vi )
- X11
- XML
- WEB 2.0
- ...
기가 막힌다. 현재 쓰는 대부분의 기술들을 나쁨으로 정의하고 새롭게 만드는 운영체제에서는
모두 배제한다!! 너무 강경해서 아마도 대중들의 선택을 못받은 듯 하다.
하지만! 이사람들이 새롭게 만든 운영체제는 너무나도 매력적이다.
완전히 새로운 방식으로 현대에 맞게끔 맨 밑바닥부터 완전히 새롭게 운영체제를 만들어버렸다.
- New Kernel : SMP와 코어를 지원하는 커널
- New Compilers : 작고, 빠르며, 포터블한 크로스 컴파일이 가능한 컴파일러
- New Library : 간단하고 에러를 거의 내지않은 안정적인 라이브러리
- New User Interface : 현재의 입출력 장치에 맞도록 새롭게 디자인된 사용자 인터페이스
- New Tools : 디버거, 텍스트 편집기, 메일시스템, 네트워크 데이터베이스.... 등
- 모든 컴포넌트들은 협업이 가능하ㅏ고 분산된 환경에서도 작동가능
- UNIX의 기본정신을 그대로 계승
이렇게 완전히 새로운 운영체제로 만들어버렸다. 그렇지만 가장무서운 적은 유사한 제품이다.!
기존의 Unix에 대한 지식이 새로운 Plan 9 운영체제를 배우는데 걸림돌이 될 것이다.
Plan 9 운영체제의 핵심 모토는 다음과 같은 3가지 이다.
- 모든것은 파일이다! (파일이 아닌것은 없다!!)
- 9P 라는 단일 통신 프로토콜만 가진다.
- Private Namespace
모든것은 파일이다
모든것이 파일이며, 계층적 구조로 접근하게 된다.
Purpose | Directory |
---|---|
Networking | /net/ |
Authentication | /mnt/factotum/ |
Encryption | /net/tls/ |
Graphics | /dev/draw/ |
Window System | /dev/wsys/ |
Process Control and debugging | /proc/ |
Environment | /env/ |
/mail/fs/ | |
Etc Stuff | cdfs, webfs, tarfs, ftpfs, etc…. |
Web Stuff | wikifs, gpsfs, sshnet, iostats and others. |
9P Protocol
초 경량 네트워크 파일시스템 프로토콜
- 바이트 기반의 넌블럭 기반
- 미니멀리즘 및 초경량 13개의 메세지만 존재 (NFSv3 : 22, NFSv4 : 42메세지)
- 안정적인 전송계층 사용(TCP, IL, RUDP,PPP, Shared Memory, Serial Port, PCI Bus...)
- 로컬 및 리모트에서 접근 가능 (synthetic & physical files)
- 인증과 암호화 지원
- 캐싱과 스태킹을 지원하는 구조
Private Namespace
프로그래밍 언어에서 사용하는 전역변수를 모든곳에 사용한다!
Namespace는 3가지 기능으로 사용합니다.
int bind(char *name, char *old, int flag)
int mount(int fd, int afd, char *old, int flag, char *aname)
int unmount(char *name, char *old)
/sys/src/libdraw/newwindow.c 파일에 사용예시가 있다.
% mount `{cat /env/wsys} /n/foo new
% cat /proc/$pid/ns
예를 들어서, 리눅스시스템의 커널의 경우는 300개의 시스템콜과 수백,수천개의 ioctl을 가진다.
또한 4,827,671라인의 코드로 구성되어 있다.
하지만, Plan 9의 경우에는 37개의 시스템콜과 148,787라인으로 구성된 코드에 추가적으로
실시간 스케줄러기능이 탑제되어있다.
또한, X 터미널의 경우에는 단순접속으로도 백만번의 통신을 내부적으로 사용하게 된다.
stty 명령어를 이용해서 X 터미널을 접속한 후 보드율(Baud Rate)을 살펴보기 바란다.
그래서, Plan 9에서는 윈도우 시스템도 완전히 새롭게 만들었다. (Rio Window System)
리오윈도우 시스템은 현재에 맞는 비트맵기반 디스플레이와 입력장비에 최적화 되어 있다.
비트맵 기반 화면 출력장치와 키보드 그리고…
3버튼 마우스를 적극 사용한다.*
리오 윈도우 시스템에서는 다음과 같은 특징을 가진다.
- 모든 텍스트는 편집이 가능하다
- 커서주소란 것은 존재하지 않는다
- 간단한 텍스트 편집기로만 사용한다
- 이전 명령의 출력은 언제든지 재사용할 수 있다. (검색 실행 ...)
- 모든 응용프로그램은 투명하게 서로 통신 할 수 있다 (Plumbing, chording, hold mode..)
- 리오윈도우 시스템에서 또다시 리오 윈도우 시스템을 호출 할 수 있다
만약 쉘의 히스토리가 궁금하다면 단순히 grep /dev/text
명령으로 알수 있게 된다.
출력을 편집할수도 있고 Send 명령으로 언제든지 실행할 수 도 있다.
요약하면, 기존의 키보드 기반의 환경에서 마우스를 최대한 사용하는 구조가 되었다.
프로그래머에게 최적화된 Acme Editor를 시스템 에디터와 쉘로 제공하며, 단순한 에디터를
넘어서 위키브라우저, 메일 뉴스 클라이언트 디버거 등으로 언제든지 용도변경해서 사용할 수 있다.
또한 , Plubing 이라는 기술을 통해서 응용프로그램끼리 입출력 데이터를 언제든지 보낼 수 있으며,
네트워크를 통한 원격지에도 보낼 수 있다.
컴파일러 또한, 대폭 개선되어서 한개의 소스코드를 이용해서 Motorola MC680x0, Strong ARM, Alpha,
i386, amd64, SPARC, SPARC64, PowerPC, MIPS등과 같은 다른 플랫폼에 별도의 수정없이 곧바로 컴파일해서
사용할 수 있으며, 아키텍처에 의존적인 코드는 7,000라인밖에 존재하지 않는다. (gcc는 150,000라인)
모든 텍스트는 UTF-8 기반으로 처리된다.!!!
단순한 예를 들어서 Unix에서 소켓 프로그래밍의 경우는 다음과 같다.
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
...
struct sockaddr_in sock_in;
struct servent *sp;
struct hostent *host;
...
memset(&sock_in, 0, sizeof (sock_in));
sock_in.sin_family = AF_INET;
f = socket(AF_INET, SOCK_STREAM, 0);
if (f < 0)
error("socket");
if (bind(f, (struct sockaddr*)&sock_in, sizeof sock_in) < 0){
error("bind");
host = gethostbyname(argv[1]);
if(host) {
sock_in.sin_family = host->h_addrtype;
memmove(&sock_in.sin_addr, host->h_addr, host->h_length);
} else {
sock_in.sin_family = AF_INET;
sock_in.sin_addr.s_addr = inet_addr(argv[1]);
if (sock_in.sin_addr.s_addr == -1)
error("unknown host %s", argv[1]);
}
sp = getservbyname("discard", "tcp");
if (sp)
sock_in.sin_port = sp->s_port;
else
sock_in.sin_port = htons(9);
if (connect(f, (struct sockaddr*)&sock_in, sizeof sock_in) < 0)
error("connect:");
}
전형적인 UNIX기반에서 작성한 소켓 프로그램의 소스코드이다. 이것을 Plan 9로 구현하면 다음과 같다.
#include <u.h>
#include <libc.h>
...
fd = dial(netmkaddr(argv[1], "tcp", "discard"), 0, 0, 0);
if(fd < 0)
sysfatal("can’t dial %s: %r", argv[1]);
별다른 설명이 필요없을 것이다. 네트워크 프로그래밍에 너무 많은 프로토콜에 의존적인 API와
혼동된 기술이 혼재된 것을 아주 간단 명료하게 처리하고 있음을 알 수 있다.
에디터 하나 설명하는데 너무 많은 얘기를 한 것 같이 보인다.
추후에 계속될 Plan 9 관련 강좌에 초석이 될 것이므로 억지스럽더라도 알아두면 좋을 것이다.
결론적으로 요약하면, UNIX개발자들이 현재에 맞도록 모든것을 다시 새롭게 만든 운영체제가 Plan 9라는
운영체제이다. 2002년 4판을 마지막으로 더이상 만들지 않고 있다!!! 2005년에 GUI를 가진 전화기를
만들기 위해서 Inferno 라는 운영체제를 Plan 9의 여러가지 사상을 투입해서 만들었다.
Inferno또한 할얘기가 많지만, Java와 같은 구조로 구성된 멀티플랫폼 가상운영체제이다란것만 알아두기
바란다. Acme Eidtor for Windows 파일이 바로 Inferno OS에 구현된 것을 윈도우에서 사용하게 된다.!!
2편에서 계속해서 Acme Editor for Windows 에 대해서 설명하도록 하겠다.