프로그래밍 언어가 필요한 이유
프로그래밍 언어라는 단어는 누구나 들어 본 단어이고 어렴풋이 어떤 걸 의미하는지 알고 있다. 다만, 영어와 수학이 복합적으로 섞여 있는 것처럼 보이는 프로그래밍 언어는 낯설고 처음 시작하기에 친숙하지도 않다. 프로그래밍 언어는 종류도 다양하고 프로그램을 개발하는 데 있어 도달하고자 하는 목표에 따라 프로그래밍 언어 선택도 중요한 요소로 작용한다. 시대는 빠르게 변화하고 생각해 왔던 미래는 어느덧 손에 닿을 곳까지 왔다. 우리가 실생활에 사용하고 있는 편리한 기능들이 어떤 언어들로 프로그램되어 있는지 알아보고 누구나 할 수 있다는 프로그래밍 언어에 한발 다가가 보고자 한다.
우리가 사용하는 언어는 각 단어를 정의하는 데 있어 한 단어에 한 가지의 뜻을 가지고 있는 것과 한 단어가 지니는 의미가 여러 개인 경우가 있다. 쓰이는 장소나 환경에 따라 같은 단어라도 다른 뜻을 의미하기 때문에 컴퓨터에 인간의 언어를 쓰기가 적합하지 않다. 혼란스럽고 모호한 인간 언어로 코드를 쓰는 대신, 정확한 의사소통을 위해 고안된 특별한 프로그래밍 언어를 쓴다. 컴퓨터는 상황에 대한 인식이나 상식 없이, 프로그램이 시키는 대로만 할 수 있기 때문에 정확한 의사소통이 반드시 필요하다.
프로그래밍 언어의 진화
(1) 기계어 코드: 컴퓨터의 기본원리는 '트랜지스터'라는 전기 스위치를 열고 닫음으로써 계산을 수행한다. 비디오 스트리밍부터 미사일의 방향 유도까지 전기가 특정 경로를 따라 흐르는지, 흐르지 않는지를 결정하는 것에 불과하다.
프로그램은 어떤 스위치가 열리는지 닫히는지를 컴퓨터에 알려주는 기계어 코드(Machine code)라는 숫자 다발들로 구성된다. 이진코드(Binary code)라고 불리는 1(열림)과 0(닫힘)으로 구성된 기계어 코드는 가장 기본적인 형태이다. 1과 0으로 여러 가지 명령어를 만들려면 수많은 숫자로 구성된 코드들이 필요한데, 매우 긴 시간이 걸리고 버그를 찾는 일도 매우 어렵다.
(2) 저급 언어: 기계어 코드에서 한 단계 더 발전했지만 '어셈블리어(Assembly language)를 사용한 것으로 1과 0을 짧은 단어로 대체하는 수준이다. 저급 언어는 이진 코드보다 인간의 언어에 가깝지만 여전히 직관적이지 않다. 소수의 전문가가 특별히 빠르고 효율적이어야 하는 프로그램을 만들 때 저급 언어를 쓰기도 하지만, 대부분의 개발자는 저급 언어를 거의 쓰지 않는다.
(3) 고급 언어: 대부분의 프로그램 개발자는 고급 언어를 사용하는데 인간의 언어와 마찬가지로 특정한 순서로 배열된 의미 단위를 가지고 있다. 쉽게 설명하자면 단어와 문법으로 이루어진 언어라고 생각하면 된다. 컴퓨터 구문은 인간 언어의 문법처럼 문장을 쓰고 구두점을 찍는 등의 규칙을 가지고 있다. 프로그래밍 언어는 모두 고유한 어휘와 구문을 가지고 있다. 컴퓨터는 고급 언어로 작성된 프로그램을 직접 실행할 수 없기 때문에 인터프리터(Interpreter)나 컴파일러(Compiler)를 사용해 프로그램을 기계어 코드로 변환한다. 이 과정을 '코드를 컴파일한다'고 부른다. OS가 다르면 컴파일러도 다르기 때문에 OS에 따라 여러 번 컴파일해야 한다.
프로그래밍 언어의 선택
프로그래밍 언어는 수백 개나 되며 각각의 언어는 나름의 장단점이 있기 때문에 목표로 하는 프로그램의 방향성과 잘 맞는 언어는 선택하는 것은 개발하는 시간을 줄여주고 보다 효과적인 프로그램을 작성할 수 있다. 앱 인벤터같이 특정 기기나 OS 용을 개발된 것이 있는가 하면, 자바 스크립트나 파이썬 등과 같이 여러 플랫폼, 컴퓨터, OS 전반에 걸쳐 소프트웨어가 작동하도록 개발된 언어도 있다. 자바나 C++과 같은 언어는 어느 목적에서나 잘 작동되면 그래프 작성 및 통계 분석을 처리하는 R 언어처럼 특정 작업에 최적화된 경우도 있다.
프로그램 개발자는 여러 언어를 배우고 특정 프로젝트에 가장 적합한 언어를 선택하여 프로그램을 개발한다. 프로그래밍 언어를 처음 공부할 때 시간이 오래 걸리는데, 처음에는 컴퓨터처럼 생각하는 법(Computational Thinking)을 배워야 하기 때문이다. 두 번째와 세 번째 언어는 훨씬 더 쉽게 배울 수 있다.
프로그래밍 언어의 유형
(1) 명령형 언어: 컴퓨터에게 일을 어떻게 하는지 알려준다. 명령형 언어로 작성된 프로그램은 위에서 아래로 한 줄씩 실행되기 때문에 하향식 언어라고 불린다. 명령형 언어로 작성된 프로그램은 구조가 간단해 빠르게 실행된다. 명령형 언어는 대개 사건의 논리적 흐름을 수반하기 때문에 초보자가 이해하기 쉽다. 저급 언어나 초기 고급 언어 대부분은 명령형 언어다.
(2) 선언형 언어: 구체적인 방법 없이 결과 값만을 기술한다. 개발자들은 웹페이지를 만들 때 대개 선언형 언어를 상용한다. HTML 코드는 웹브라우저에게 텍스트의 한 부분을 굵게 표시하거나 두 개의 열에 표시하도록 지시할 뿐 브라우저가 어떻게 그 일을 할 것인지는 제어하지 않는다. 특히 신기술의 도입이 빠른 곳에서 선언형 스타일의 프로그램이 선호되고 있는데 JavaScript 코드의 코딩 스타일이 점점 선언형으로 변화하고 있다.
(3) 객체 지향형 언어: 단계별로 지시를 내리는 명령형 언어와 달리, 객체 지향형 언어는 현실을 반영한 모델을 구축한다. 우리가 실생활에서 쓰는 모든 것을 객체라고 하며, 객체 지향 프로그래밍은 프로그램 구현에 필요한 객체를 파악하고 각 객체들의 역할이 무엇인지를 정의하여 객체들 간의 상호작용을 통해 프로그램을 만드는 것을 말한다. 객체는 클래스라는 틀에서 생겨난 실체(Instance)이다. 따라서 객체 지향 프로그램은 객체와 객체 간의 연결로 되어 있으며 각각의 객체 안에 자료 구조와 알고리즘이 들어있는 것이다. 잘 작성된 객체 지향 프로그램은 수정하거나 재사용하기에 쉬우며 문제 해결 역시 쉽다.
(4) 함수형 언어: 표현 방식이 수학 방정식과 비슷하다. 함수 코드는 짧고 예측 가능하며 오류 제거가 쉽다. 그러나 함수형 언어를 배우는 것은 낯선 개념을 이해하여야 하므로 쉽지 않다. 금융 사기 탐지 프로그램을 설계하거나 인간 언어를 해석할 수 있는 검색 엔진을 만드는 것 같은 복잡한 계산이 필요한 프로젝트를 개발할 때 주로 함수형 언어를 쓴다.
(5) 혼합형 언어: 여러 가지 언어로 쓴 코드로 복잡하고 다양한 기능을 수행한다. 첨단 장비의 세밀한 컨트롤이나 복잡하고 정밀한 작업을 요구하는 경우 핵심 운영 코드와 이를 보조해 줄 수 있는 다목적 언어(C++이나 Java)를 사용해 세부적인 프로그램을 작성하기도 하고 코드 테스트와 오류를 추적하고 버그를 수정하기 위한 맞춤형 소프트웨어를 만들기 위해 파이썬을 사용해 핵심 운영 코드의 문제점을 사전에 보완하는 기능을 추가하기도 한다.
프로그래밍 언어의 구성 요소
(1) 변수: 프로그램이 저장하거나 상호 작용하는데 필요한 정보를 의미한다. 변수는 텍스트나 숫자 같은 단순한 데이터에서부터 표현된 방식에 따라 매우 복잡한 데이터 구조일 수도 있다.
(2) 루프: 프로그램이 행동을 반복하게 한다. 루프를 사용할 때 반드시 주의해야 할 점은 행동의 반복을 언제 멈춰야 하는지를 컴퓨터에 말해 주어야 한다. 그렇지 않을 경우, 무한 루프가 되어 프로그램을 강제로 닫을 때까지 끊임없이 똑같은 작업을 반복하게 될 것이다.
(3) 조건문: 개발자는 조건문 또는 if-then 문장을 사용하여 컴퓨터가 이벤트에 반응하는 방법을 제어할 수 있다. 조건문에는 종종 대안 경로를 설명하는 else 문장이 포함된다. 대부분의 프로그램은 수많은 조건문을 사용해 이벤트의 흐름을 제어한다.
(4) 함수: 개발자는 함수를 정의하는 코드를 작성한 후, 그 작업을 반복하고 싶을 때마다 메인 프로그램에서 해당 함수를 이름으로 호출한다. 일반적으로 사용되는 함수가 들어있는 코드 라이브러리를 활용할 수도 있다. 목록을 분류하거나 무작위 숫자를 생성하려는 경우, 코드를 직접 작성하기보다 라이브러리에서 원하는 함수를 간단히 불러낸다.
통합개발환경
서두에서 말했던 것처럼 프로그래밍 언어는 생소하고 너무 많은 것들을 외우고 있어야 한다는 두려움이 있다. 이러한 두려움이 코딩을 시도하기도 전에 사람들을 겁먹게 만들 수 있다. 그러나 경험이 많은 개발자도 수많은 함수 이름과 구문 규칙을 다 외우지 못한다. 그런 세부 사항을 다루는 개발 도구, 즉 통합개발환경(IDE)에서 작업을 하는 것이다. 모든 IDE는 드롭다운 메뉴가 있는 코드 편집기를 가지고 있다. 개발자가 코딩을 입력하면 코드 편집기가 다음 단계를 제안하고 각 명령과 관련된 옵션을 보여 준다. 또한 코드 편집기는 구문을 처리하고, 오타를 찾고, 누락된 부분을 강조 표시하며, 샘플 코드를 링크해 준다. 코드 편집기를 사용하면 개발자는 아이디어에 좀 더 집중할 수 있다.
(1) 소프트웨어 개발 키트: 특정 프로그래밍 언어나 하드웨어 플랫폼에 연결된, 무료로 다운받을 수 있는 자료 모음을 말한다. 소프트웨어 개발 키트는 대개 사용 지침 프로그램, 샘플 코드, 작성된 코드 라이브러리, IDE 형태로 제공된다. 안드로이드 개발 키트를 사용하면 자바 코드를 안드로이드용 앱으로 쉽게 바꿀 수 있다.
(2) 게임 엔진: 개발자가 애니메이션, 음향 효과, 온라인 플레이, 메뉴 등을 쉽게 다룰 수 있도록 도와준다. 유니티(Unity)와 언리얼(Unreal) 같은 무료 게임 엔진으로 만들어진 게임을 쉽게 찾아볼 수 있다.
(3) API: 응용프로그램 인터페이스(API)는 어댑터처럼 작용한다. 서로 관계없는 회사가 각기 다른 언어로 만든 프로그램이더라도 API는 두 개의 소프트웨어를 연결할 수 있다. API를 사용하면 독립 개발자가 만든 앱도 스냅챗, 트위터, 인스타그램 같은 인기 프로그램과 연결할 수 있다. 자기 아이디어를 구현화하기 위해 필요한 낮은 수준의 세부적인 일을 이런 도구들을 사용하여 쉽게 해결하고 좀 더 창의적인 목표에 집중할 수 있다. 이러한 도구들이 프로그래밍의 세계에 많은 사람이 도전할 수 있도록 도움을 주고 있다. 세상은 당신의 아이디어로 바뀔 것이다.
'IT' 카테고리의 다른 글
심리학과 소프트웨어 (0) | 2023.03.01 |
---|---|
알고리즘(Algorithm) 설계와 활용 (0) | 2023.02.26 |
코딩(Coding)과 버그(Bug) (0) | 2023.02.10 |
프로그래머(Programmer) (0) | 2023.02.09 |
메타버스 [META VERSE] (1) | 2023.01.16 |