프로그래머가 되고자 하는 분들을 위한 이야기
필자는 최근에 프로그래밍 입문서를 집필하고 있다. 프로그래밍 언어의 특징을 설명하려고 보니, 컴파일형 언어니 인터프리터 언어니 하는 내용들을 쓰게 되었고, 처음 프로그래밍을 배우는 사람에게는 쉽게 이해하지 못 할 것이라는 생각이 들었다. 책의 서두에 관련 내용을 정리해 보았으나, 굳이 초반부터 다소 복잡한 내용을 (굳이 알 필요가 없는(?)) 집어넣지 말자는 의견에 부록 신세가 되었다. 필자의 책은 한 가지 유형의 언어만을 다루기 때문이다.
하지만, 프로그래밍을 처음 배우는 사람이라면, 어떤 언어를 배우는 것이 좋을 것인가라는 질문에 선뜻 답을 구하기가 쉽지 않다. 해서 책의 부록의 내용을 발췌하여 풀어쓰고자 한다. 만약, 컴퓨터의 기본 동작 원리를 잘 이해하지 않고 있다면, 아래에 필자가 기고한 글을 먼저 읽어 보기 바란다.
그럼, 시작해 보자.
프로그래밍 언어는 CPU에게 명령을 내리기 위해 사용하는 언어이다. CPU가 바로 이해할 수 있는 코드는 이진 코드, 즉 0과 1 밖에 없다. 이 0과 1로만 이루어진 코드가 바로, 머신 코드 혹은 기계어라고 불린다. 만약, 여러분에게 컴퓨터에게 ‘2 + 4’를 수행하는 명령어를 0과 1로만 표현해보라고 하면 어떨까? 아마 할 수 있는 사람도 없거니와, 그 어느 누구도 그런 따분한 작업을 계속하고 싶어 하지 않을 것이다. 그렇기 때문에 사람들은 사람이 알아볼 수 있는 언어를 활용하여 프로그래밍 언어를 만들기 시작했다. 그래서 탄생한 언어가 바로 어셈블리 Assembly 다.
어셈블리는 기존의 이진 코드가 아닌 사람이 읽을 수 있는 여러 ‘부호’를 활용하여 프로그래밍을 한다. 가령, ‘ADD 1, 1, 20’ 형태이다. 작업할 내용과 결과를 쓸 메모리 위치를 함께 표기하는 방식이다. 이렇게 어셈블리어로 작성된 코드는 어셈블러 Assembler라고 하는 변환기에 의해 머신 코드로 바뀌어 실행이 된다. 하지만, 여전히 쉽고 빠르게 프로그램을 만들 수는 없을 것이다. 이러한 수준의 언어를 저수준 프로그래밍 언어 Low-level Programming Language라고 부른다.
사람들은 매일 같이 사용하고 있는 사람의 언어와 유사한 언어로 프로그래밍을 하고 싶었다. ‘만약 어떤 경우에~’라는 명령어를 내리기 위해서 ‘if’ 문을 사용하였고, 루프를 돌리고 싶을 땐 ‘for’ 문을, 조건에 따라 루프를 돌리기 위해서 ‘while’ 문을 사용하기 시작하였다. 이런 방식으로 탄생된 언어들이 바로, 포트란 FORTRAN, 코볼 COBOL, 파스칼 PASCAL이고, 이들을 시작으로, C, C++, 자바 Java 등으로 발전하였고 컴퓨터의 발전에 큰 기여를 하게 된다. 이러한 프로그램 언어들을 고수준 프로그래밍 언어 High-level Programming Language라고 부른다. 앞서 어셈블리에도 머신 코드로 바꿔주는 변환기인 어셈블러가 있다고 하였다. 고수준 프로그램 언어들을 머신 코드로 바꿔주는 변환기들을 바로 컴파일러 Complier와 번역기 Interpreter라는 녀석 들이다. 이렇게 프로그래밍 언어는 크게 두 영역으로 나눌 수 있다.
>_ 컴파일 언어 Complied Language
컴파일 언어는 작성된 코드를 컴파일러를 거쳐서 머신 코드가 담긴 파일로 변경 한 뒤 실행이 가능해지는 언어들을 일컫는다. 가령, 잘 알려진 C, C++, 자바 등이 이 범주에 속한다.
1) C++ 의 컴파일 및 실행
아래 그림은 C++인 경우의 컴파일 과정을 보여 주고 있다.
CPP 의 확장자를 가진 소스 코드가 컴파일러에 의해 컴퓨터에서 실행아 가능한 EXE 파일로 변경이 되었다. 이 EXE 파일은 컴퓨터에서 바로 실행이 가능하다.
2) 자바의 컴파일 및 실행 과정
자바 같은 경우도 컴파일 언어로 분류가 되지만, 한 가지 과정을 더 거친다. 이번에도 그림을 먼저 살펴보자.
자바의 자바 컴파일러 javac를 통해 컴파일된 코드는 머신 코드로 바로 바뀌는 것이 아니라, .class라는 확장자를 가지는 바이트코드 Bytecode로 변경이 된다. 이 바이트코드는 다시 자바 가상 환경인 JVM JavaVirtual Machine 안의 JIT Just-In-Time 컴파일러를 통해 머신 코드로 변경이 되고, 자바 가상 환경 위에서 실행이 된다. 이와 비슷한 언어로는 C#이 있을 것이고, C#인 경우에는 JVM의 역할을 .Net Framework가 대신한다고 보면 된다.
결국, 컴파일 언어는 실행하기 위해 중간 단계의 파일이 필요하다는 점만 기억하면 되겠다.
>_ 인터프리터 언어 Interpreted Language
인터프리터 언어는 내가 작성한 코드를 중간 컴파일 과정 없이, 바로 실행시킬 수 있는 언어라고 이해하면 된다. 아래 그림을 함께 살펴보자.
컴파일 언어보다 훨씬 단순하다. 소스 코드를 작성하면, 실행 준비가 완료된다. 이 소스 코드는 인터프리터에 의해 머신 코드로 번역이 되는 동시에 실행이 된다.
이러한 언어들을 다른 말로 스크립팅 프로그래밍 언어라고도 한다. 스크립팅 프로그래밍 언어는 연극에서 배우들의 연기를 하나하나 기술한 ‘스크립트’와 같이 사람이 컴퓨터의 동작을 스크립트 언어로 작성을 하고 나면, 번역기를 포함하고 있는 가상 환경 VM에 의해 컴퓨터에서 바로 실행되는 언어를 말한다. 예를 들자면, 한국에서 중요한 행사가 있을 때,외국인 연사가 영어로 발표하는 내용을 동시통역을 통해 한국어로 바꿔 준다고 볼 수 있다. 이때, 영어는 앞서 언급한 스크립팅 언어이고, 한국어는 머신 코드의 위치와 같다고 볼 수 있겠다. 잘 알려진 스크립팅 프로그래밍 언어로는 유닉스 운영 체제에서 돌아가는 Bash, 일반적으로 웹 브라우저에서 구동되는 자바스크립트 JavaScript,마이크로소프트사의 비주얼 베이직 Visual Basic 등이 있겠다. 파이썬 역시 대표적인 스크립팅 프로그래밍 언어라고 할 수 있다.
그렇다면 컴파일형 언어와 스크립트형 언어의 차이 점은 어떤 것이 있을 까? 대표적인 컴파일형 언어인 자바와 대표적인 스크립트형 언어인 파이썬을 가지고 비교해보자.
일반적으로 컴파일형 언어에는 소스 코드 작성을 위한 제약사항이 스크립트형 언어보다 더 많다. 가령, 자바 같은 경우는 변수를 선언할 때 변수의 자료 형을 명확하게 기술해야 한다. 숫자인지 문자열 인지 등을 말한다. 숫자인 경우에도 자료 형에 따라 허용하는 범위를 엄격하게 제안하고 있다. 하지만 파이썬 같은 경우는 전혀 기술하지 않는다. 변수를 변수라고 선언하지도 않는다. (자바스크립트는 var 라도 표기하지만..) 파이썬에서 해당 변수의 자료 형을 결정하는 순간은 소스 코드가 번역기에 의해 실행이 되는 순간이다. 이를 동적 타이핑이라고 한다. 그럼 둘 중에 어떤 것이 더 좋은 것일까?
상식적인 수준으로만 생각해보자. 컴파일형 언어는 내가 사용해야 하는 변수의 자료 형 및 허용 범위를 명확히 알아야 하고 각종 문법에 따른 제약 사항 등을 명확하게 알아야 한다. 스크립트 형 언어에 비해서 배울 것이 더 많다. 해서 많은 사람들이 파이썬이나 자바스크립트가 컴파일형 언어인 자바나 C, C++ 보다 초보자에게는 배우기 쉽다는 표현을 하는 것이다. 개발 생산성(속도)도 상대적으로 더 좋다. 하지만, 스크립트형 언어는 이런 동적 타이핑으로 인하여 잃는 것도 많다. 가령, 소스 코드가 실행되기 전 까지는 소스 코드의 버그를 인지하기 쉽지 않다. 물론, 이를 지원하는 개발 도구들이 존재하긴 하나, 컴파일형 언어에 비해서는 오류를 인지하는 시점이 늦다. 이는 테스트 코드가 각 변수의 타입을 확인하는 등의 더욱 정교한 테스트 기법을 요구하며, 문제가 생겼을 때 원인을 찾기 위한 트러블 슈팅 과정이 더 길어질 수 있다는 것을 의미한다. 일반적으로 컴파일형 언어가 디버깅 작업이 훨씬 수월하다.
실행 속도는 어떨까? 컴파일형 언어는 말 그대로 컴파일을 한 뒤 생성된 파일에 의해 프로그램이 실행된다. 머신 코드에 더 가까운 파일이 실행되는 만큼, 속도가 더 빠르다. 하지만, 스크립트형 언어는 실행 시에 번역기에 의해 번역이 되고 실행이 된다. 컴파일형 언어에 비해 상대적으로 느릴 수밖에 없다. 일반적으로 실행 속도 관련해서는 C, C++ > Java > Python 순으로 실행 속도가 느려진다. 해서 연산 속도나 실행 속도에 민감한 프로그램이라면 스크립트형 언어로 개발하지 않는다. 혹시 개발을 하더라도 컨셉을 확인하기 위한 초기 프로그램에 대해서만 스크립트형 언어로 개발 한 다음, 성능상 이슈가 있으면 컴파일형 언어로 변경하는 작업을 수행한다.
갈수록 오리 무중이다. 그럼 무슨 언어를 선택해야 하는가?
세상에 가장 좋은 프로그래밍 언어라는 것은 존재하지 않는다. 모두 장단점이 있고, 용도가 다를 뿐이다. 또한 본인에게 익숙한 언어인지 아닌지와 배우기 쉬운지 어려운지 정도로 갈리겠다. 그리고 어느 정도 수준에 다다르면(최소한 한 가지 언어에 대해서 마스터한다면..), 프로그래밍 언어는 그저 컴퓨터와 함께 일하는 개발자들과 소통하기 위한 도구가 될 것이다. 다른 언어를 배우는 것은 처음보다 훨씬 수월하게 된다.
만약, 여러분이 처음으로 프로그래밍을 배우는 분이라면, 필자는 파이썬을 강력하게 추천하는 바이다. 배우기도 쉽고, 강력한 객체 지향 언어로써의 매력을 느낄 수 있는 언어이다. 그리고 다른 언어에 비해 범용적인 목적으로 널리 사용이 되고 있다.
본인이 스크립트형 언어보다는 컴파일형 언어를 배우고 싶다면, 자바를 배우는 것을 추천한다. 다른 컴파일형 언어에 비해 쉽게 배울 수 있고, 현장에서도 가장 많이 사용되고 있다.
너무나도 많은 프로그래밍 언어 중에서 어떤 언어를 배워야 할지 망설이는 분들에게 조금이나마 도움이 되었으면 좋겠다.
아래 링크에는 다양한 프로그래밍 언어에 대한 역사를 한 눈에 볼 수 있는 이미지를 볼 수 있다. 여러분이 공부해보고 싶은 언어의 역사가 어떻게 되어 있고, 어떤 언어에 의해 파생이 되었는지 확인해 보기 바란다.
http://www.digibarn.com/collections/posters/tongues/ComputerLanguagesChart-med.png
그리고 어떤 언어를 배울지 선택하였다면, 배울 수 있는 방법은 무궁무진하다. 필자의 아래 글도 참조하기 바란다.
그럼 오늘도 프로그래머가 되기 위해 한 발자국 더 나아갔기를 바란다.
모두 파이팅!!