[Crash Course: Computer Science] #11 최초의 프로그래밍 언어

이민선(Jasmine)·2023년 1월 7일
0
post-thumbnail

지금까지는 거의 대부분 하드웨어에 초점을 맞춰왔다.
(컴퓨팅의 물리적 구성 요소: 전기 및 회로, 레지스터, RAM, ALU, CPU 등등)

하지만 하드웨어 수준에서의 프로그래밍은 번거롭고 융통성이 떨어지기 때문에 컴퓨터 프로그래밍에는 소프트웨어가 필요하다.

00101110

"위치 14에 있는 값을 레지스터A로 로드하라."

마치 영어와 모스부호와의 관계와 비슷하다.
인코딩도 다르게 되고 복잡한 정도는 서로 다르지만, 동일한 정보를 전달한다.
(영어는 26개의 알파벳이있고 다양한 사운드가 가능한 반면,
모스부호는 오직 점과 대시(-)만 있다.)

컴퓨터 하드웨어는 원시 이진 명령어를 처리하는데,
이는 기계어(machine Language 또는 Machine code)이며, 컴퓨터 프로세서의 "네이티브 언어"이다.

컴퓨팅 초기에는 사람들이 전체 프로그램을 기계어로 작성해야 했다.
먼저 아래처럼 영어로 종이에 프로그램을 작성하는데 이를 의사 코드(pseudo-code)라고 한다.

retrieve the next sale from memory,
then add this to the running total for the day, week ans year,
then calculate any tax to be added

종이에 프로그램을 모두 파악해낸 이후에는 opcode 표를 사용하여 손으로 직접 번역했다.

사람들은 싫증을 냈고, 1940년대 말과 50년 대에 이르러 좀 더 높은 수준의 언어가 개발되었다.
opcode에는 니모닉(mnemonics)라는 간단한 이름이 지정되었다.
0,1 무더기가 아닌 "LOAD_A 14" 같은 것들을 쓸 수 있게 된 것이다.

물론 CPU는 "LOAD_A 14"가 무슨 말인지 모른다.
텍스트 기반 언어는 몰루~ 오직 이진수만 이해한다.
reuseable helper program을 이진 형식으로 만들었는데,
"LOAD_A 14"와 같은 문자 기반의 명령을 읽고, 자동으로 이진 명령과 일치하는 것을 조합했다.
이 프로그램을 어셈블러라고 부른다.
어셈블러 언어로 된 프로그램을 읽고 원래의 기계어로 전환하는 것이다.

시간이 지남에 따라 어셈블러는 새로운 기능을 얻었고,
프로그래밍은 훨씬 쉬워졌다.
심지어 자동으로 JUMP 주소를 파악하는 것도 가능해졌다.

프로그램 초반에 코드들을 추가하면?
모든 주소들이 변경된다.
프로그램을 업데이트하고 싶다면 아주 고통스러울 것이다.

어셈블러는 원래 JUMP 주소를 사용하지 않고 JUMP할 수 있는 작은 레이블을 삽입할 수 있었다.
이 프로그램이 어셈블러로 전달되면, 모든 점프 주소를 알아낸다.
이제 프로그래머는 후드 아래에 있는 기본 메커니즘보다는 프로그래밍에 더 집중할 수 있게 되어
덜 복잡하면서도 정교한 작업을 수행할 수 있게 된다.

일반적으로, 각 어셈블리 언어 명령어는 해당 기계 명령어로 직접 변환하는 일대일 매핑이다.
ex) "LOAD_A 14" -> 00101110
그래서인지 본질적으로는 기본 하드웨어에 묶여 있었다.
그리고 어셈블러는 여전히 프로그래머에게 어떤 레지스터와 메모리를 사용할지 생각하도록 강요한다.
갑자기 추가할 값이 필요하면 코드를 무더기로 변경해야할 수도 있다.

2강에서 다룬 Harvard Mark 1 당시, 프로그램은 펀치 종이테이프에 저장되어서 컴퓨터에 입력되었다.
그리고 버그를 패치할 때 실제로 펀치 테이프의 구멍에 종이 패치를 두었다.
Mark1 명령 세트는 아주 원시적이었고, JUMP 명령어도 없었다.
동일한 작업을 여러번 반복하는 코드를 작성하려면 펀치테입의 끝을 붙여 물리적으로 루프를 만들었다.

컴퓨터의 첫 프로그래머였던 그레이스 호퍼 박사는 전쟁 후에도 컴퓨터 업계 최전선에서 계속 일하며
컴퓨터의 잠재력을 최대한 발휘하기 위해 높은 수준의 프로그래밍 언어를 설계했다.
이를 Arithmetic Language Version 0 (A-0)라고 불렀다.

어셈블리 언어는 직접 기계 명령어에 1대1 매핑되었던 반면,
높은 수준의 프로그래밍 언어로 수십가지 명령이 CPU에 의해 실행될 수 있었다.
복잡한 번역을 수행하기 위해 호퍼 박사는 1952년에 최초의 컴파일러를 만들었다.
프로그래밍 언어로 작성된 '소스코드'가 어셈블리 또는 이진 기계 코드와 같은 낮은 수준의 언어로 변환하여
CPU가 직접 처리할 수 있다.

곧 새로운 프로그래밍 언어를 만들기 위한 많은 노력이 진행되었고, 오늘날에는 수백가지의 프로그래밍 언어가 있다.

어셈블리 코드와 파이썬을 비교하여 예를 들어보자.
두개의 숫자를 추가하고 그 값을 저장하자.

어셈블리 코드에서는 메모리값, 레지스터 등 세부사항을 처리해야 하지만,
파이썬에서는 처리할 레지스터도 없고 처리할 메모리 위치도 없다.
컴파일러가 대신 다뤄주고, 불필요한 복잡한 작업은 추상화된다.

프로그래머는 단지 변수에 이름을 붙이고 두 수의 합을 저장하기만 하면된다.
컴파일러가 Register A를 후드 아래에 할당하여 a값을 저장했을 수도 있다.
하지만 그러한 것들은 이제 프로그래머에게 굳이 알 필요 없는 것이 된다.

하지만 그 이후에 A-0는 널리 사용되지 않았고, 1957년에 IBM이 "Formula Translation"에서 파생된 FORTRAN을 발표하여 초기 컴퓨터 프로그래밍을 지배하게 되었다.

FORTRAN 프로젝트 디렉터인 John Backus는 말했다.
"제 작업의 대부분은 게으름에서 비롯되었습니다. 프로그램 쓰는 것을 좋아하지 않았고, 프로그램 쓰는 것을 쉽게 만들기 위해 프로그래밍 시스템에서 작업을 시작했습니다."

평균적으로, Fortran으로 작성된 프로그램은 손으로 쓴 어셈블리 코드보다 20배 더 짧았다.
그런 다음 FORTRAN 컴파일러는 이를 변환하여 원시 기계 코드로 확장한다.

IBM은 컴퓨터 판매 사업을 하고 있었고, 초기의 FORTRAN 코드는 IBM 컴퓨터에서만 컴파일되고 실행될 수 있었다.
1950년대 대부분의 프로그래밍 언어와 컴파일러는 단일 유형의 컴퓨터에서만 실행 가능했다.
컴퓨터를 업그레이드했다면 종종 모든 코드를 다시 작성해야했다.

이에 산업, 학계의 컴퓨터 전문가들과 정부가 1959년에 협회를 구성하여 데이터 시스템 언어위원회 (The Comittee on Data Systems Languages)를 만들었다.(그레이스 호퍼 박사님이 고안.)
다른 컴퓨터에서도 사용할 수 있는 공통 프로그래밍 언어 개발을 안내하기 위함이었다.
사용하기 쉽고 높은 수준인 공통 비즈니스 지향 언어(COBOL : Common Business Oriented Language)를 만들었다.
서로 다른 기본 하드웨어를 다루기 위해, 각 컴퓨팅 구조 자체에는 자체 COBOL 컴파일러가 필요했다.
이 컴파일러는 어떤 컴퓨터에서 실행되는 동일한 COBOL 소스 코드를 수용할 수 있었다.
이러한 개념은 "Write Once Run Anywhere"라고 불렸다.

이처럼 어셈블리와 기계코드에서 멀어지는 이점은?(여전히 CPU와는 관련이 있지만)
컴퓨팅에 대한 진입 장벽을 줄이는 것!!
고급 프로그래밍 언어가 존재하기 이전에는 프로그래밍은 종종 전임 직업이었다.
컴퓨터 전문가 및 애호가들에게 독점적인 영역이었던 것이다.

그러나 이제는 과학자, 기술자, 의사, 경제학자, 교사 및 많은 다른 사람들이 컴퓨테이션을 그들의 작업에 통합시킬 수 있었다.
컴퓨팅? 성가시고 난해한 학문 => General Purpose로 접근 가능한 도구로 발전!!

동시에 컴퓨터 전문가들은 점점 더 정교해지는 프로그램을 만들 수 있게 되었다.

프로그래밍 언어의 황금 시대가 시작되고 컴퓨터 하드웨어의 획기적인 진보 또한 거듭되어 왔다.

1960s : ALGOL, LISP, BASIC
1970s : 파스칼, C언어, Smalltalk
1980s : C++, Objective-c, Perl
1990s : PYTHON, RUBY, JAVA
2000s : Swift, C#, Go

물론 이것들은 빙산의 일각이다.

핵꿀잼인 Most Popular Programming Languages - 1965/2022 영상
https://www.youtube.com/watch?v=G-0kiQImaV8

새로운 언어들은 프로그래밍을 다방면에서 보다 쉽고 강력하게 만들거나, 신기술 및 플랫폼을 활용하여 더 많은 사람들로 하여금 더 많은 일들을 더 빨리 할 수 있도록 하였다.

profile
기록에 진심인 개발자 🌿

0개의 댓글