컴퓨터 개론

Codeit_프로그래밍 언어의 스펙트럼

AngeRay 2021. 6. 2. 20:51

프로그래밍 언어의 스펙트럼


 

프로그래밍 언어를 분류할 수 있는 두 가지 기준을 알아봤다.

첫 번째는 객체 지향 프로그래밍 언어인가? (객체를 지향하는 언어 VS 객체를 지향하지 않는 언어)

두 번째는 코드 변수의 데이터 타입을 어떻게 사용하는가? (Dynamic Typing 언어 VS Static Typing 언어)

 

이 두 가지 기준으로 현재 사용되고 있는 프로그래밍 언어들을 나눠보면, 크게 세 가지 부류가 있다.

'자세한 언어', '체계적인 언어', '쉬운언어'

 

여러 프로그래밍 언어의 특징을 이해할 때 프로그래밍 언어가 컴퓨터와 가까운지(자세한 언어), 인간과 가까운지로 나눌 수 있다.

 

모든 프로그래밍 언어의 특징을 파악하는 기준

  1. 객체 지향을 지원하는가?
  2. 코드 중 변수에 자료형을 작성하는가?
  3. 컴퓨터와 인간 중 어느것과 더 가까운가?

컴퓨터와 가까운 언어, 사람과 가까운언어는 딱 떨어진다고 하기보다는 상대적인 개념, 즉 스펙트럼에 좀 가깝다.

인간과 가까운 언어를 고수준 언어(High-level programming language) language

컴퓨터와 가까운 언어를 저수준 언어(Low-level programming language) languagelanguage

그렇다면 이 두 언어를 분류하는 기준은 무엇일까?

힌트는 변수의 자료형에 있다.

컴퓨터는 모든 데이터를 저장해야 되는데 자료형에 따라서 컴퓨터가 저장하는 방식이 조금씩 다르다.

컴퓨터 입장에서는 문자열을 저장하는 거랑, 숫자를 저장하는 거랑 전혀 다른 방식으로 이루어지기 때문에 차이점이 있다.

하지만 사실 이 언어들은 큰 관점에서 보면 다 매우 사람과 가까운 언어 이다. 

적어도 이 언어들은 우리가 어느 정도 읽고 뜻이 유추 가능하기 때문이다.

 

코드잇_강의이미지

 

고수준 언어(High-level programming language)

사람과 가까운 언어는 컴퓨터가 이해하기 어렵다.

프로그래머가 꼭 필요한 것만 신경 쓰고 복잡한 건 컴퓨터에게 맡겨버리면 되기 때문에 좀 더 필요한 기능과 논리에 집중할 수 있다. 그래서 코드도 훨씬 빨리 만든다.

코드를 수정하거나, 추가하기도 더 편하다.

그래서 최근 인기있는 언어들은 추상화가 많이 된 경향이 있다.

그러나 고수준 언어는 컴퓨터한테 너무 많은 걸 맡겨 버린다는 문제점이 있다. 

이 언어를 사용해서 짧게 명령을 하면 컴퓨터가 여러 가지 경우에 대한 고민을 스스로 해야 한다.

즉 사람이 편한 만큼 기계가 힘든 것 이다. 

그래서 컴퓨터 성능도 좋아야 하고, 실행이 느리다.

 

고수준 언어(High-level programming language)_쉬운 언어

객체 지향 개념이 적용된 dynamic typing 언어를 말하며,

프로그래머가 아닌 사람도 비교적 쉽게 배우고 사용할 수 있는 Python, Ruby 등의 언어가 여기 속한다.

 

이 언어들은 최대한 간결하고, 짧은 코드를 추구한다.

문법도 간편해서 코드를 작성하는 시간이 가장 짧다.

귀찮은 건 다 컴퓨터에 맡겨버리는 것 이다.

 

쉬운 언어는 빠르게 개발이 필요한, 변화가 많고 잦은 분야에서 많이 사용되고, 데이터 사이언스, 업무 자동화와 같이 개인 규모의 프로젝트에서도 가장 많이 사용된다.

 

쉬운 언어는 진입 장벽이 낮고, 배우기 쉽다.

코드를 읽거나 수정하기가 가장 간편하고, 코드를 빨리 작성할 수 있다.

그러나 코드 작성 시간은 짧지만, 컴퓨터의 코드 실행 속도가 느리다.

성능 제약이 심한 곳에서 빠른 속도를 내야 하는 경우는 사용할 수 없다.

프로그래밍 코드 문법에 제약이 너무 없어서, 큰 규모의 프로젝트에서 실수를 방지하기가 어렵다.

즉 많은 사람들의 협업에는 부적합할 수 있다.

 

저수준 언어(Low-level programming language)

컴퓨터와 가까운 언어는 사람이 이해하기가 어렵고, 복잡하고, 코드가 길어서 만드는 시간이 오래 걸린다.

하지만 컴퓨터 입장에서는 어떻게 저장할지 미리 알려주기 때문에 더 친절한 표현이다. 

다만 사람이 보기에는 불편하다.

저수준 언어들은 신경 쓸 게 많고 코드를 작성하거나, 관리하는 시간도 훨씬 오래 걸린다.

그러나 사람이 정확히 원하는 만큼만 동작을 지정해 주면 컴퓨터 입장에서는 고민할 것들도 없고 기계적으로 움직이기만 하면 되니까 가장 효율적으로 동작할 수 있다.

그래서 값비싼 컴퓨터를 쓰지 않고도 명령하면 바로 움직인다.

이런 저수준 언어의 효율성은 생각지도 못한 부분에서 극대화 된다.

노트북, 스마트폰, 태블릿 등은 좋은 성능의 칩을 가지고 있지만 냉장고, 에어컨, 전광판 등은 저렴하고 좋지 않은 칩들이 들어있다. 그래서 할 수 있는 기능이 몇가지 없다.

이와 같은 경우에는 C같은 저수준에 가까운 언어를 활용한다.

 

저수준 언어(Low-level programming language)_자세한 언어

어셈블리 언어나 C 언어 들이 있다.

객체 지향 개념이 적용되지 않고, 코드 작성 시 자료형 등의 컴퓨터적 구조를 다 고려해줘야 하는 언어 이다.

이 언어들은 사람보다는 컴퓨터의 논리적인 사고방식에 맞추어져 있다는 특징이 있어서 사람들이 작성하기 어렵지만,

컴퓨터가 실행하기는 좋다.

프로그램을 빠르고 효율적으로 만드는데 최적화되어 있다.

그래서 스마트워치, TV, 스피커, 전광판 등, 컴퓨터가 메인이 아닌 기계에 자주 사용된다.

이런 기계들은 보통 작은 칩에서 돌아간다.

그래서 저장 공간이나 성능이 컴퓨터 보다 상당히 열악하다.

여기서 C 언어 같은 자세한 언어가 핵심적으로 사용된다.

 

이런 곳에 들어가는 시스템을 임베디드 시스템이라고 부른다.

loT 라고 해서, 이런 임베디드 시스템을 연결해서, 스마트홈을 만들거나, 기계들 사이의 통신을 할 수 있게 하기도 한다.

 

임베디드 시스템 말고도 자세한 언어가 활약할 수 있는 분야가 있다.

예를 들어 수많은 문자를 거의 실시간으로 전송해야 하는 텔레그램 같은 채팅 애플리케이션이나 트위치 같은 동영상 스트리밍 서비스, 검색엔진, 개발자들이 코드 관리를 위해 사용하는 github, 머신 러닝 같은 빅데이터 처리 속도와 알고리즘이 중요한 그런 분야의 회사에서 많이 사용된다.

사람이 코딩하는 시간이 길어지지만, 컴퓨터가 실행하는 시간은 조금이라도 빠르게 하고 싶은 경우들이다.

 

자세한 언어는 코드를 작성하거나 고치는 게 힘들고 오래 걸린다.

대신 프로그램을 만들기만 하면 컴퓨터가 실행하는 속도는 매우 빠르다.

성능이 안 좋은 컴퓨터에 적용하기 좋다.

 

저수준 언어(Low-level programming language)_체계적인 언어

자세한 언어와 마찬가지로 static typing 언어지만, 객체 지향 개념이 적용된 언어이다.

Java, C++ 같은 언어들이 여기 속한다.

체계가 잡혀있기 때문에, 여러 사람이 함께 작업하기에 적합하고, 협업 과정에서 오류가 적어서 주로 큰 규모의 프로젝트에 적합하다.

 

규모가 큰 기업들에서 Java를 많이 사용하고 있다.

그래서 취업을 하려면 Java를 꼭 해야한다.

 

자세한 언어 보다는 낫지만, 여전히 문법이 완전 쉽지는 않다. 

코드를 작성하는 시간보다도 체계적으로 설계하는 데에 시간이 오래 걸릴 수 있다.

짜임새와 협업이 중요한, 규모가 큰 프로젝트에 적합하다.

객체 지향 개념이 적용되어서, 자세한 언어보다 유지보수 하기 편하다.

 

프로그래밍 언어의 추상화

추상화는 프로그램에 있어서 매우 중요한 개념이다.

추상화란 몰라도 되는 내용을 숨기고 꼭 알아야 할 이해 가능한 내용만 드러내는 것 이다.

추상화는 프로그래밍 언어의 전반에 적용되기 때문에 그냥 문법만 달라지는 게 아니라 코드를 작성하는 방식,

코드를 바라보는 관점 자체가 달라진다.

사실 위 스펙트럼도 추상화가 얼마나 됐는지 보여주는 그림이다.

즉 고수준 언어는 추상화가 많이 된 언어 이고,

저수준 언어는 추상화가 적게 된 언어 이다.

따라서 Python 코드가 더 많이 추상화된 것이다.

얼마나 추상화된 언어를 사용하는지에 따라 코딩을 하면서 어디에 초점을 맞추게 되는지 달라진다.

 

코드잇_강의이미지

 

프로그래밍 언어의 흐름

코드잇_강의노트_이미지

 

프로그래밍 언어가 위의 그림 처럼 발전했다고 볼 수 있다.

컴퓨터와 칩의 성능이 좋지 않던 시기에는 자세한 언어 들이 등장했고,

그 다음에 협업과 생산성 향상에 좋은 객체 지향 프로그래밍이 대세로 떠오르면서 체계적인 언어 가 인기를 얻었고,

누구나 프로그래밍을 배우고 할 수 있는 쉬운 언어 가 인기를 끄는 것이 사실 이다.

 

하지만, 이런 분류들이 언어를 나누는 절대적인 기준이라고 볼 수는 없고, 필요에 따라서 언어들이 등장했다 정도호만 이해하면 된다.

왜냐면 C가 요즘도 활발히 쓰이고 있고, 코틀린 같은 체계적인 언어에 속하는 언어들도 비교적 최근에 등장했다.