프로그래밍 언어

sith-call.dev·2022년 9월 13일
0

간격

컴퓨터는 기본적으로 기계어만을 이해한다. 왜냐하면 컴퓨터는 부울 논리를 통해 설계된 전자 스위치 회로이기 때문이다. 이때 전자 스위치 회로는 데이터를 저장하는 장치의 구성으로 플립플롭이란 것을 사용한다. 이것은 전자 스위치의 on, off만을 이용해서 정보를 표현하는 기계이다. 이때 on, off가 각각 0과 1에 대응할 수 있기 때문에 모든 데이터는 2진수로 표현되며, 컴퓨터는 오직 2진수만을 처리할 수 있다. 즉, CPU는 플립플롭으로 구성된 RAM에 저장된 2진수만을 처리할 수 있다. 그리고 이러한 2진수 체계를 기반으로 만들어진 컴퓨터의 명령어를 기계어라고 한다. 그러나 이러한 기계어는 사람이 이해하기 어렵다. 따라서 인간과 컴퓨터 사이에는 간극이 존재한다.

번역사슬

기계어가 어렵다는 특성을 해결하기 위해 고안된 것이 바로 "상위 언어"이다. 즉, 컴퓨터의 명령어를 사람이 이해하기 쉬운 언어로 작성하고, 이를 다시 기계어로 번역하자는 아이디어이다. 이런 식으로 기계어와 상위 언어 간의 계층이 존재하고 또한 중간에 번역이란 과정이 있기에 이러한 관계를 번역 사슬이라고 표현할 수 있다. 그리고 번역 과정은 소프트웨어를 통해 수행할 수 있다.

표현력

튜링 기계는 이 세상 모든 기계를 대변할 수 있을 만큼의 보편성을 지니고 있다. 그리고 튜링 기계 하나는 하나의 소프트웨어로 대응된다. 그렇기에 튜링 기계의 언어는 이 세상 모든 소프트웨어를 표현할 수 있다고 볼 수 있다. 그러나 번역 사슬이란 개념이 도입되면서 여러 언어들이 탄생했다. 그리고 이 언어들은 튜링 기계의 언어만큼의 표현력을 가진 것과 아닌 것으로 구분할 수 있다. 그리고 이러한 특징을 각각 '튜링-완전'이라고 한다. 그래서 튜링 완전한 언어로만 언어 체계를 만들었을 때 번역 과정을 거친다고 해도 문제가 없다. 그러나 튜링 완전하지 못한 언어가 중간에 끼여 있다면, 상위 언어에서 표현한 개념이 번역되지 못해 의미를 잃게 되는 경우가 생길 수 있다.

자동 번역

번역 사슬에서 다음 언어로 넘어갈 때 번역 과정이란게 존재한다. 그리고 이러한 번역은 소프트웨어가 자동으로 알아서 해준다. 그리고 이러한 소프트웨어를 컴파일러라고 한다. 이 번역 과정에서 중요한 규칙은 다음과 같다.

  1. 부품에서 전체로
  2. 불변성질 유지하기

즉, 어떠한 언어로 서술된 명령어를 먼저 부품 단위로 쪼갠다. 그리고 그 부품에 대한 해석을 내놓는데, 그 해석이 전체의 관점에서도 동일하게 해석되어야 한다는 뜻이다. 예시로 대한민국 전체 인구수를 측정하라는 명령어를 수행한다고 해보자. 그렇다면 도시 단위로 인구수를 측정하고 합쳐나갈 것이다. 이 과정은 '부품에서 전체로'라는 규칙이 적용된 부분이다. 그리고 도시 단위의 인구수와 대한민국 전체 인구수가 모두 10진수여야 한다는 점은 '불변성질 유지하기'가 적용되는 부분이다.

실행

컴퓨터는 기본적으로 명령어를 실행할 수 있는 기계이다. 그래서 컴퓨터를 해석 실행기(interpreter)라고도 한다. 그런데 이때 컴퓨터가 명령어를 실행하는 방식은 크게 두 가지가 존재한다.

  1. 번역기 사용 방식
  2. 해석실행 중첩 방식

번역기 사용 방식은 한 마디로 상위 언어로 작성된 명령어를 번역기가 기계어로 번역한 뒤에 이를 컴퓨터가 직접 실행하는 방식을 말한다. 그래서 해석 실행은 컴퓨터 그 자체에서만 일어난다.

해석실행 중첩 방식은 번역기가 아닌 해석실행기를 사용한다. 그러면 해석 실행기는 해당 상위 언어를 해석하면서 해석 실행하고, 컴퓨터는 이 메모리에 올라온 해석실행기란 소프트웨어를 해석 실행한다. 그래서 해석 실행기가 총 2개가 사용되기에 중첩 방식이라고 한다.

언어의 두 철학

프로그래밍 언어는 그 종류가 매우 다양하다. 그럼에도 불구하고 이 수십가지의 언어들을 꿰뚫는 철학이 두 가지 있다.

  1. 튜링 기계 언어 - 기계 중심 언어
  2. 람다 계산식 - 논리 중심 언어

기계 중심의 언어는 컴퓨터 메모리 상에서 데이터가 올라가고 CPU의 상태가 변화함에 따라서 명령이 동작한다. 반면에 논리 중심 언어는 함수의 변수와 함수값을 단위로 명령이 이루어진다.

그리고 각각의 언어는 모두 튜링 완전하다. 따라서 서로 호환이 가능한데 이 점은 문제 해결에 있어서 좋은 장점을 제공한다. 어떤 문제를 해결하고자 할 때 기계 중심 언어로 접근한 것이 실패했을 때, 또 다른 관점인 논리 중심 언어로 접근할 수 있기 때문이다. 물론 이 반대도 가능하다. 그래서 다양한 접근법을 제공한다는 것이 두 관점을 모두 아는 것의 장점이다. 덧붙여 논리 중심 언어와 기계 중심 언어가 서로 완전히 대응된다는 것은 커리 하워드 동치에 의해서 밝혀졌다.


(표 출처:컴퓨터과학이 여는 세계)

- 타입 -

프로그램의 타입은 논리 언어에서 이미 증명된 논리식을 뜻한다. 그러나 이것은 차치하고 타입의 용도를 보면 다음과 같다.

  1. 프로그램 테스트 및 검증
  2. 프로그램 요약
  3. 프로그램 설계

타입을 정해두면 이미 그 데이터에 대한 명세가 정해지기 때문에 실행 전에 프로그램의 설계를 파악할 수 있고, 또한 타입은 명세의 축약이기 때문에 프로그램을 요약하여 표현할 수도 있다. 그리고 명세를 통해서 실행 전에 미리 파악된 설계를 바탕으로 논리적 결함을 알아낼 수 있는 것이다. 또한 타입을 통해 축약된 프로그램을 검증하는 것이기 때문에 검증 비용 또한 줄일 수 있다.

profile
Try again, Fail again, Fail better

0개의 댓글