- 자바 프로그래밍 언어는 제임스 고슬링 James Gosling, 마이크 셰리든Mike Sheridan, 패트릭 노튼
Patrick Naughton에 의해 1990년대에 썬 마이크로시스템즈Sun Microsystems에서 만들어졌다. 자바는 부분적으로는 당시 널리 쓰이던 C 프로그래밍 언어를 본떠 만들어졌다. C에는 메모리 자동관리가 없었고, 메모리 관리 오류는 당시 프로그래머에게 자주 두통을 일으키게 하는 오류였다. 자바는 언어 설계를 통해 이런 종류의 오류(메모리 관리 관련 오류)를 없앴다. 자바는 메모리 관리를 프로그래머가 볼 수 없게 감췄다. 이것이 자바가 초보자에게 좋은 언어가 된 이유 중 하나다. 하지만 좋은 프로그래머와 좋은 프로그램을 탄생시키려면 좋은 프로그래밍 언어 이상의 것이 필요하다. 그리고 자바로 인해, 디버깅하기 더 어려운 새로운 버그 종류가 생겨났음이 드러 났다. 이런 버그 중에는 감춰진 메모리 관리 시스템으로 인해 생긴 형편없는 성능이 포함된다.
여러분도 이 책을 통해 알게 되겠지만, 메모리를 이해하는 것은 프로그래머에게 핵심 기술에 속 한다. 처음 프로그램을 배울 때는 이후에 좀처럼 고치기 어려운 전형적인 습관이 생기기 쉽다. 소위 '안전한' 환경에서 자란 아이들이 그런 환경에서 자라지 않은 아이들보다 나중에 실제 삶 에서 더 큰 부상을 입을 확률이 높다는 연구 결과도 있다. 이는 아마도 이런 아이들이 추락하는 아픔이 뭔지 배우지 않았기 때문일 것이다. 처음 시작하는 프로그래머들에게는 안전한 프로그래밍 환경이 덜 두려울 테지만, 그들 또한 나중에 만나게 될 실제 세계를 미리 대비할 필요도 있다.
- 기술과 그 기술을 발명한 사람에 대해 배우기 위해 시간을 내보라. 이 책에서 언급한 사람들은 대부분 흥미로운 문제를 최소한 한 가지 이상 해결한 사람이며, 이들이 세계를 어떻게 인식했고 문제를 해결하기 위해 어떤 접근을 했는지 배워볼 만한 가치가 있다. 닐 스티븐슨Neal Stephenson 의 2008년 소설 『Anathem』에 좋은 대화가 나온다.
“우리의 적은 원자폭탄이 가득 들어 있는 외계 우주선이다. 우리한테는 각도기가 있다." "좋아. 집에 가서 자와 끈을 찾아오지.”
이들이 기초적인 것에 얼마나 의지하는지 명심하라. 이들의 대화는 '위키피디아에서 뭘 할지 찾아보자'나 '스택 오버플로 Stack Overflow에 질문을 올려보자', '깃허브GitHub에서 패키지를 찾아보 자'가 아니었다. 어느 누구도 해결하지 못한 문제를 푸는 방법을 배우는 것이 가장 중요한 기술이다.
- 덧셈 결과가 우리가 사용할 비트의 개수로 표현할 수 있는 범위를 벗어나면 어떻게 해야 할까?
이런 경우 오버플로가 발생한다. 오버플로란 말은 MSB에서 올림이 발생했다는 뜻이다. 예를 들어, 4비트 덧셈에서 1001 (9)과 1000(8)을 더한 결과는 10001(1710)이다. 하지만 MSB 왼 쪽에 사용할 수 있는 비트가 없기 때문에 결과가 0001(10)이 된다. 나중에 자세히 보겠지만 컴 퓨터에는 조건 코드(또는 상태 코드) 레지스터condition code register라는 것이 있어서 몇 가지 이상한 정보를 담아둔다. 이런 정보 중에는 오버플로 비트가 있고, 이 비트에는 MSB에서 발생한 올림값이 들어간다. 이 비트값을 보면 오버플로가 발생했는지 알 수 있다. 여러분은 한 수를 다른 수에서 빼는 것은 한 수에 다른 수의 음수를 더하는 것과 같다는 사실을 알고 있을 것이다. 다음 절에서는 음수를 표현하는 방법을 살펴본다. MSB 위쪽에서 1을 빌려오는 경우를 언더플로 underflow라고 부른다. 이에 해당하는 조건 코드도 컴퓨터에 들어 있다.
- 프로시저, 서브루틴, 함수
엔지니어들은 게으름에서 비롯된 이상한 습성을 가진 경우가 있다. 정말 하기 싫은 일이 있으 면 엔지니어들은 자신을 대신해 이 일을 해줄 무언가를 만든다. 심지어 이런 것을 만드는 데 걸 리는 노력이 원래 하기 싫은 일을 하는 데 드는 노력보다 훨씬 많이 들어도 굳이 이런 짓을 하고 는 한다. 프로그래머들이 피하고 싶어 하는 일 중 하나는 똑같은 코드를 두 번 이상 작성하는 것 이다. 이렇게 코드 반복을 피하는 데는 게으름 외에도 여러 가지 충분한 이유가 있다. 예를 들어 중복된 코드를 줄이면 코드가 메모리를 덜 차지하고, 코드에 버그가 있는 경우 여러 군데를 반 복해 고치지 않고 한 군데만 고치면 된다는 장점이 있다.
함수function(또는 프로시저procedure, 서브루틴subroutine)는 코드를 재사용reuse하는 주요 수단이다.
- 여러 프로그램을 동시에 실행하려면 어떻게 해야 할까? 우선, 각 프로그램을 서로 전환시켜 줄 수 있는 일종의 관리자 프로그램이 필요하다. 이런 프로그램을 운영체제 또는 운영체제 커널kernel('중심' 이라는 뜻)이라고 부른다. 우리는 OS와 OS가 관리하는 프로그램을 구분하기 위 해 OS를 시스템 프로그램이라고 부르고 다른 모든 프로그램을 사용자user 프로그램이나 프로세스 process라고 부른다.
- 프로그램의 각 명령어에 대한 비트 조합을 하나하나 알아내려면 아주 고통스럽다. 초기 컴퓨터 프로그래머들은 이런 작업에 신물이 나서 프로그램을 작성하는 더 나은 방법을 고안해냈다. 이 방법이 바로 어셈블리 언어assembly language다.
어셈블리 언어는 다음과 같은 놀라운 일을 해준다. 어셈블리 언어를 쓰면 프로그래머가 모는 비 트 조합을 외우지 않고 이해하기 쉬운 니모닉mnemonics을 통해 명령어를 쓸 수 있다. 어셈블리 언어에서는 주소에 이름, 즉 레이블을 붙일 수 있다. 그리고 코드에 주석comment을 달아서 다른 사람들이 프로그램을 더 쉽게 읽고 이해하도록 도와줄 수 있다.
어셈블리 언어로 작성된 코드를 읽어서 동등한 기계어 코드machine code를 생성해주는 프로그램을 어셈블러assembler라고 부른다. 이런 변환 과정에서 어셈블러는 레이블이나 심볼symbol의 값을 결정해 채워 넣어준다. 코드에서 명령어 위치가 바뀌면 생길 수 있는 바보 같은 오류를 예방해주기 때문에 심볼의 값을 결정해 넣어주는 기능은 아주 유용하다.
- 초창기 프로그래머들은 불가능한 일을 해야만 했다. 맨 처음 컴퓨터가 만들어졌을 때는 어셈블러도 없었다. 그래서 개발자들은 어려운 방식, 즉 직접 손으로 모든 비트를 알아내는 방법으로 최초의 어셈블러를 작성해야 했다. 첫 번째 어셈블러는 아주 원시적이었지만 제대로 작동하는 어셈블러가 생겼기 때문에 이 어셈블러에서 작동하는 어셈블리 언어를 사용해 더 나은(더 많은 의사명령어와 기능을 제공하는) 어셈블러를 어셈블리 언어로 작성할 수 있었고, 개선된 의사명령 어와 기능을 활용하는 어셈블리 언어로 다시 더 많은 기능을 제공하는 어셈블러를 만들 수 있었으며, 이런 식의 개선을 계속할 수 있었다
- 부트스트랩bootstrap 이라는 말이 있다. 종종 이 말을 부트boot라고 줄여서 부르기도 한다. 컴퓨터를 부팅하는 과정은 롬 등에 들어 있는 작은 프로그램을 메모리로 읽어오는 것부터 시작한다. 이 프로그램은 필요한 초기화를 진행한 후 더 큰 프로그램을 (보통은 하드 디스크, USB 등 대용량 저장장치에서) 읽어오고, 이 프로그램은 더 큰 운영체제 등을 불러올 수 있다. 초기 컴 퓨터에서는 사람이 직접 전면 패널의 스위치를 사용해 최초 부트스트랩 프로그램을 입력해야만 했다.
- 어셈블리 언어는 큰 도움이 됐지만 여러분도 알 수 있듯이 간단한 일을 할 때도 많은 작업이 필요하다. 좀 더 복잡한 작업을 묘사하기 위해 더 적은 단어를 사용할 수 있으면 정말 좋을 것 이다. 프레드 브룩스Fred Brooks는 1975년 애디슨 웨슬리Addison-Wesley에서 펴낸 『The MythicalMan-Month: Essays on Software Engineering』이라는 책(『맨먼스 미신』, 인사이트, 2015)에서 평균적으로 하루에 3~10줄의 문서화되고 디버깅이 이뤄진 코드를 작성한다고 주장했다. 따라서 코드 한 줄로 더 많은 일을 할 수 있다면 훨씬 더 많은 일을 완수할 수 있다.
고수준 언어high-level language 로 들어가자. 고수준 언어는 어셈블리 언어보다 더 높은 추상화 단계에서 작동한다. 고수준 언어의 소스 코드는 컴파일러 compiler라는 프로그램에 의해 실행된다. 컴 파일러는 소스 코드를 기계어로 번역, 즉 컴파일compile 해준다. 기계어 코드를 다른 말로 목적 코드 object code라고도 한다.
수천 가지 고수준 언어가 만들어졌다. 일부는 아주 일반적인 언어이고, 일부는 아주 구체적인 작업을 위한 언어다. 처음 생긴 고수준 언어 중에는 포트란FORTRAN이라는 언어가 있다. 포트란 이라는 이름은 '식변환기formula translator'를 줄인 말이다. 포트란을 사용하면 일차방정식 같은 수식을 계산할 수 있는 프로그램을 쉽게 작성할 수 있다.
- 포트란이나 베이직 언어는 비구조적unstructured 언어라고 불린다. GOTO와 레이블을 조합할 때 아 무런 구조를 강요하지 않기 때문이다. 구조적structured 프로그래밍은 이런 잘못된 GOTO 사용으로 인해 발생할 수 있는 스파게티 코드 spaghetti code 문제를 해결하기 위해 개발됐다. 몇몇 언어는 구조적 프로그래밍 개념을 극단까지 수용했다. 예를 들어 파스칼은 GOTO를 완전히 없했고, 이로 인해 기초적인 구조적 프로그래밍을 가르칠 때만 유용한 프로그래밍 언어가 됐다. 공정하게 말하자면 어차피 파스칼은 교육용으로 설계된 언어였으므로 자신의 목적에 맞는 역할을 한 것이다. C는 켄 톰슨Ken Thompson 이 만든 B 언어를 계승한 언어인데, 원래 벨 전화 연구소의 데니스 리치Dennis Ritchie에 의해 만들어졌다. C 는 아주 실용적인 언어이며 가장 널리 쓰이는 프로그래밍 언어 중 하나가 됐다. 나중에 나온 언 어 중 상당수가 C의 요소를 그대로 가져다 썼으며, 그와 유사한 언어로는 C++, 자바, PHP, 파이 썬, 자바스크립트 등이 있다.
'IT' 카테고리의 다른 글
어텐션 팩토리 (0) | 2021.08.21 |
---|---|
RPA의 습격 (0) | 2021.08.04 |
IT 좀 아는 사람 (0) | 2021.06.29 |
무자비한 알고리즘 (1) | 2021.05.15 |
세일즈 포스 디지털 혁신의 판을 뒤집다 (0) | 2021.05.06 |