오늘 C언어 역사에 대해 배웠다. C언어를 처음 배우는게 아니기 때문에, 이전에 무심코 지나쳤던 부분에 대해 알아보고자, 주제를 선정해보았다. [2탄]

 

이것은 무엇일까? from https://en.wikipedia.org/wiki/Punched_card

 

1940년대, 세계 전쟁 중 주류를 이루던 컴퓨터들이다.

 

2차대전 중에는 독일군은 내부적으로 암호를 사용하기 위해 <애니그마>를 발명하여 자기네 통신을 암호화했다.

애니그마, 독일군 암호화 장치. 그날의 암호표를 보고 선과 내부 톱니바퀴를 셋팅하면, 해독하기 어려운 언어로 변환된다.

이를 해독하기 위해, 영국 첩보국은 "앨런 튜링"이라는 미국 프리스턴 박사를 고용하여 이 암호들의 해독을 지시했다. 그리고 그 해독의 끝에 완벽하진 않지만

 

"튜링 봄브" 라는 해석기를 만들었다. 거의 독일군의 암호를 풀어낸 와중에 전쟁이 끝나버렸다고 한다.

아직은 프로그래밍 언어보단 전자, 전기에 더 관련있어 보인다.

그러던 중, 최초로 프로그래밍 가능한 컴퓨터가 발명된다 in 1941, German

뮌헨 국립 독일 박물관에 전시된 추제 Z3 모형. from https://upload.wikimedia.org/wikipedia/commons/4/4c/Z3_Deutsches_Museum.JPG

천공 카드(punch card)를 통해 데이터 연산을 했다고 한다.

 

이런 타입의 기계들이 계속 발전을 거쳐 많은 컴퓨터들이 발명되었고, Mark1, ENIAC, UNIVAC.. 그런 것들이다.

 

필연적으로 만들 수 있는 프로그램들의 크기가 작을 수 밖에 없었다..

 

 

 

이를 해결하기 위해 작은 프로그램들을 모아 큰 프로그램을 만든다는 뜻으로 1949년 어셈블리어가 등장한다.

section	.text
   global _start     ;
	
_start:	            ;
   mov	edx,len     ;
   mov	ecx,msg     ;
   mov	ebx,1       ;
   mov	eax,4       ;
   int	0x80        ;
	
   mov	eax,1       ;
   int	0x80        ;

section	.data
msg db 'Hello, world!', 0xa  ;
len equ $ - msg     ;
 

무슨 프로그램을 실행시키기 위한 것일까? 실행 결과를 보자.

Hello, world!
 

아직 무슨 뜻인지는 모르겠지만, 맨 밑단에 msg 와 중간 _start 의 ecx,msg 가 뭔가 관련있어 보인다.

 

그정도까지만 알고, 일단 넘어가도록 한다.

 

 

이후 Auto Code 라는 프로그래밍 언어가 나왔고,

c@VA t@IC x@½C y@RC z@NC
INTEGERS +5 →c           # Put 5 into c
      →t                 # Load argument from lower accumulator
                         # to variable t
   +t     TESTA Z        # Put |t| into lower accumulator
   -t
          ENTRY Z
SUBROUTINE 6 →z          # Run square root subroutine on
                         # lower accumulator value
                         # and put the result into z
  +tt →y →x              # Calculate t^3 and put it into x 
  +tx →y →x
+z+cx   CLOSE WRITE 1    # Put z + (c * x) into
                         # lower accumulator
                         # and return
 

Mark1 을 돌리기 위한 최초의 컴파일 언어라고 하는데 아직도 무슨 뜻인지 전혀 감도 안온다.

 

 

이후, 1957년 Fortran 이라는 언어가 나오게 된다. IBM에서는 자신들의 최신 컴퓨터를 사용하기 위해 컴파일 언어를 만들었다.

 

program hello
  ! This is a comment line; it is ignored by the compiler
  print *, 'Hello, World!'
end program hello
 

이 소스코드를 컴파일을 거치면,

$> gfortran hello.f90 -o hello
 
Hello, world!
 

드디어, 뭔가 눈에 보이는 프로그래밍 언어의 계보가 보인다.

 

 

 

이후 1년 뒤 Algol이라는 언어가 나오게 되는데, Algorithm language란 뜻이다.

BEGIN
FILE F (KIND=REMOTE);
EBCDIC ARRAY E [0:11];
REPLACE E BY "HELLO WORLD!";
WHILE TRUE DO
  BEGIN
  WRITE (F, *, E);
  END;
END.
// 이상은 'hello world' 출력, 이하는 문자 비교 코드
BEGIN
INTEGER p, q;
y := 0; i := k := 1;
     for p := 1 step 1 until n do
         for q := 1 step 1 until m do
             if abs(a[p, q]) > y then
                 begin y := abs(a[p, q]);
                     i := p; k := q
                 end
 END Absmax
 

 

배열이나 변수, 반복, 분기 모습이 보이기 시작한다.

 

실제로 ALGOL은 이후로 나오는 PHASCAL, BC에 영향을 주었다.

 

 

이후엔 우후죽순 늘어나는 프로그래밍 언어를 통합 대체하기 위해 1959년 COBOL이란 단어가 등장하였고, 상업용으로 광범위하게 쓰였고, 비교적 최근까지 이용했다고 한다.

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLOWRD.

PROCEDURE DIVISION.
DISPLAY "SIMPLE HELLO WORLD".
STOP RUN.
 

같은 연도, MIT에서는 LISp (list proccessing) 라는 언어를 발표한다.

(format t "Hello, World!")

(list 1 5 2 1)
(lambda (arg) (* arg 2))
 

주목할 것은 리스트의 사용과 람다의 사용이다. 어? python? 이 생각나게 한다. 인공지능에 영향을 주었다고 한다.

 

 

1964년엔 BASIC이라는 언어가 나왔다. 우리가 C 이전에 부르는 B를 의미한다.

BASIC의 의미는 무엇인가?

 

이 시기엔 개인용 컴퓨터가 속속 등장하면서, 선풍적인 인기를 끌었고, Microsoft 사에서 주력 언어로 사용하게 된다.

PRINT "Hello World!"
 

간단한 코드를 보라.

 

이후 1970년, 포트란보다 익히기 쉬운 교육용 언어 PASCAL이란 코드도 나오고 이는 나중에 구조적 프로그래밍, 모듈화에 영향을 주었다고 한다.

 

1972년, smalltalk-80 이란 코드의 등장은 OOP(객체지향 프로그래밍), python같은 dynamic typing, GUI, IDE에 영향을 끼쳤다고 한다.

당시 사용되었던 SMALLTALK-80

그리고 같은 연도, Bell 연구소에서 C 언어를 발표하게 된다.

 

 

 

얕고 넓게 C 언어 이전의 프로그래밍 언어들에 대해 훑어보았다. 지금 주력으로 사용되는 언어들의 근간이 되는 언어들로 공부하면서 흥미로웠고, 현재는 이전에 비해 프로그래밍 언어의 개발은 많지 않지만, 대신에 framework와 npm 같은 library 들이 무궁무진하게 늘어나면서, 개발 생태계는 다채롭고 풍요로워지고 있어 감사하다.

 

이상으로, 1964년도에 사용하던 체신 컴퓨터의 작동 모습을 보며 안도의 한숨을 쓸어내리며 또 공부하러 가야겠다.

https://youtu.be/YnnGbcM-H8c

+ Recent posts