2.7프로그래밍 언어
자바스크립트와 파이썬으로 알아보는 프로그래밍 언어의 주요 개념
TL;DR
추억의 쪽지 시험
41. 자바스크립트와 파이썬
자바스크립트와 파이썬은 오늘날 가장 대중적인 프로그래밍 언어들이다.
자바스크립트는 모든 브라우저에 포함되어 있어 소프트웨어를 별도로 다운로드 하지 않아도 된다. 거의 모든 웹페이지가 자바스크립트 코드를 어느 정도 포함하고 있고, 그 코드는 브라우저 내에서 페이지 소스 보기를 통해 확인할 수 있다. 자바스크립트로 웹페이지에 다양한 효과를 주기도 한다.
다만 자바스크립트에는 단점도 있는데, 언어에 어색한 부분이 있으며 의도와 다른 동작을 일으킬 때도 있다. 브라우저 인터페이스는 표준화가 아주 잘 되어 있지는 않아서 서로 다른 브라우저에서 항상 같은 방식으로 코드가 작동하지 않는다.
자바스크립트 프로그램은 일반적으로 웹페이지의 일부로 실행되지만, 브라우저가 아닌 환경에서도 점점 더 많이 사용되고 있다. 브라우저 환경에서 자바스크립트를 사용할 때는 HTML도 써야 한다.
파이썬은 매우 폭넓은 응용 분야에 활용 가능하며 일상적으로 프로그래밍하기에 아주 좋다. 최근에는 프로그래밍 입문 수업이나 데이터 과학, 머신러닝에 초점을 맞춘 강의에서는 파이썬이 표준 언어이다. 보통은 파이썬을 컴퓨터에서 직접 실행하지만, 요즘은 파이썬 프로그램을 웹에서 실행할 수 있게 해주는 웹사이트가 있어 별도의 소프트웨어를 다운로드하거나 명령줄 인터페이스를 배울 필요가 없다.
42. 프로그래밍 언어의 주요 개념
프로그래밍 언어는 모두 계산을 일련의 단계로 풀어서 상세히 설명하기 위한 표기법이다. 따라서 프로그래밍 언어들은 기본적인 개념들을 공유한다. 예를 들어, 모든 프로그래밍 언어는 입력 데이터를 읽고, 산술 연산을 하고, 계산이 진행됨에 따라 중간 값을 저장하고 가져오며, 이전에 계산한 값을 기반으로 어떻게 진행할지 결정하고, 그 과정에서 결과를 표시하고, 계산이 완료되면 결과를 저장하기 위한 방법을 제공한다.
구문 규칙(syntax) 이 있고, 프로그래밍 언어는 문법 면에서 까다롭다. 언어에는 의미 체계(semantics) 도 있는데, 이는 해당 언어로 표현할 수 있는 모든 것에 대해 명확히 정의된 의미이다.
이론상으로는 특정 프로그램이 구문상 정확한지, 만약 그렇다면 그 의미가 무엇인지 모호함이 없어야하지만 불행하게도 실제론 늘 그렇지는 않다.
대부분의 언어는 세 가지 측면에서 살펴볼 수 있다.
-
언어 그 자체다. 즉, 컴퓨터에 산술 연산을 수행하고, 조건을 검사하고, 계산을 반복하라고 지시하는 문장이다.
-
다른 이들이 작성했지만 프로그램을 만들 때 사용할 수 있는 코드 라이브러리이다.
-
프로그램 실행 환경에 접근하는 기능이다. 브라우저에서 실행되는 자바스크립트 프로그램은 사용자에게서 입력을 받고, 사용자가 버튼을 누르거나 폼에 타이핑 하는 것 같은 이벤트에 반응하며, 다른 웹페이지로 가게 만들 수 있다. 파이썬 프로그램은 실행되는 컴퓨터 상의 파일 시스템에 접근할 수 있는데, 이는 브라우저에서 실행되는 자바스크립트 프로그램에서는 브라우저에 따라 제한적으로 지원되는 기능이다.
43. 자바스크립트로 Hello, World 출력하기
첫 번째로 써볼 자바스크립트 프로그램은 웹 페이지가 로드될 때 'Hello, World'라고 쓰여 있는 대화 상자를 띄우는 작은 프로그램이다. 아래는 HTML로 된 전체 페이지 코드로, 우선은 <script>
와 </script>
태그 사이에 있는 자바스크립트 코드를 보자.
html<html> <body> <script> alert("Hello, World"); </script> </body> </html>
이 일곱 줄을 메모장 같은 텍스트 편집기에 입력하여 hello.html
파일로 저장하고 그 파일을 더블 클릭해 브라우저에 로드하면 알림창이 뜬다. 이 프로그램은 브라우저마다 다르게 작동하는데, 예를 들면 Safari에서 실행할 경우 Chrome, Edge와는 다르게 '닫기'를 버튼이 아닌 글씨로만 표시한다.
여기에 사용된 alert
함수는 브라우저와 상호작용하기 위한 자바스크립트 라이브러리의 일부다.
여담으로, 자바스크립트 프로그램을 만들 때는 일반적인 텍스트에서 볼 수 있는 스마트 따옴표(“”)가 아닌 표준 큰따옴표("")를 사용해야 한다. 이는 구문 규칙의 한 예이다.
44. 사용자 이름 입력받아 출력하기
다음 자바스크립트 프로그램은 사용자의 이름을 입력하도록 요청하고, 맞춤형 인사말을 표시한다.
javascriptconst username = prompt("What's your name?"); alert("Hello, " + username);
이 프로그램에서 몇 가지 새로운 개념을 볼 수 있다.
첫째로, const
라는 단어는 변수를 선언한다. 변수는 프로그램이 실행되는 동안 값을 저장할 수 있는 주기억 장치상의 공간을 뜻한다. 프로그램이 무엇을 하는지에 따라 값이 변경될 수 있기 때문에 변수라고 부른다.
둘째로, 이 프로그램은 prompt
라는 자바스크립트 라이브러리 함수를 사용한다. 앞서 본 alert와 비슷하지만, 사용자에게 입력을 요청하는 대화 상자를 띄운다. prompt 함수는 사용자가 입력한 값을 계산해 프로그램이 이용할 수 있도록 한다. 그 결과 값은 =
을 통해 앞서 선언한 변수인 username에 저장된다.
등호(=)를 이렇게 오른쪽에 있는 연산을 수행하고 그 결과를 왼쪽에 있는 이름으로 된 변수에 저장하라와 같이 해석하는 것은 의미 체계의 한 예이다. 이 연산은 할당(Assignment)이라고 한다.
마지막으로, 플러스 기호 +
가 alert문에서 사용된다. 이는 Hello라는 단어와 사용자가 입력한 이름을 결합하기 위해 사용된다. 이 또한 등호(=)처럼 일반적인 의미인 '수를 더하기'가 아니라 '두 문자열을 연결'하는 의미로 쓰이는 의미 체계의 한 예이다.
45. 루프와 조건문
javascriptlet num, sum; sum = 0; num = prompt("Enter new value, or 0 to end"); while (num != '0'){ sum = sum + parseInt(num); num = prompt("Enter new value, or 0 to end"); } alert(sum);
이 프로그램은 0이 입력될 때까지 사용자가 입력한 수를 읽은 다음에 전체를 합산해 출력한다. 여기서 살펴볼 것은 while 루프
로, 4행부터 7행에 있다. while문은 괄호 사이에 있는 조건을 검사하고, 만일 조건이 참이면 중괄호 사이에 있는 모든 문장을 순서대로 실행한다. 그런 다음 돌아가서 조건을 다시 검사한다. 이 사이클은 조건이 참인 동안 계속 반복되고, 조건이 거짓이 되면 루프가 닫힌 중괄호 다음에 오는 문장을 실행한다.
다음 프로그램은 또 다른 제어 흐름문인 if-else
를 보여주는데, 모든 고수준 언어에서 일정한 형식으로 나타난다.
javascriptlet max, num; max = 0; num = prompt("Enter new value, or 0 to end"); while (num != '0'){ if(parseInt(num) > parseInt(max)){ max = num; } num = prompt("Enter new value, or 0 to end"); } alert("Maximum is " + max);
if-else
문은 else
부분이 없는 형태와 else
부분이 있는 형태가 있다. else
가 있으면 if
다음에 오는 괄호 안의 조건이 거짓일 때 실행될 문장들이 중괄호에 들어오게 된다.
한편, 예제 프로그램에는 구조가 잘 표시되도록 들여쓰기를 사용했다. while
이나 if
로 제어되는 문장들은 들여쓰기 되었을 때 보다 가독성이 좋기에 이렇게 쓴다.
이 프로그램은 언뜻 정확해 보이지만, 음수가 들어간다면 프로그램은 최댓값이 (유저가 입력한 숫자 중 최댓값이 아닌) 항상 0이라고 대답할 것이다.
이 예제는 테스트의 중요성을 보여준다. 테스트는 단순히 임의의 값을 프로그램에 입력해보는 것 이상의 작업을 필요로 한다. 좋은 테스터는 이상하거나 유효하지 않은 입력, 데이터가 아예 없거나 0으로 나누는 것 같은 엣지 케이스(Edge Case)를 포함해 무엇이 잘못될 수 있는지 열심히 생각한다.
다만 문제는, 프로그램이 커질수록 모든 테스트 케이스를 생각해 내기가 더욱 어렵다는 것이다. 이 부분은 완벽한 해결책은 없지만, 신중하게 프로그램을 설계하고 구현하며 프로그램 자체에서 문제를 일찍 알아챌 수 있또록 일관성 검사와 온전성 검사를 프로그램에 포함하는 방법이 도움을 준다.
46. 자바스크립트로 구글 지도에 위치 표시하기
자바스크립트는 정교한 웹 애플리케이션을 만들기 위해 다른 API와 종종 연결되어 쓰인다. 예를 들어, 구글 지도에서는 자바스크립트 프로그램을 통해 지도 이용을 제어하도록 라이브러리와 API를 제공한다.
자바스크립트의 단점은 소스 코드를 공개할 수밖에 없어 지적 재산권을 보호받기 어렵다는 것이다. 누구든지 브라우저에서 페이지의 소스 코드를 볼 수 있다. 일부 자바스크립트는 이해하기 어렵게 난독화 되어 있다. 이는 의도적일 수도 있고, 코드를 더 빨리 다운로드할 수 있도록 크기를 줄이려는 노력의 결과일 수도 있다.
47. 자바스크립트는 어떻게 작동할까?
브라우저가 웹페이지에서 자바스크립트 코드를 발견하면(<script>
태그를 만나면) 해당 코드를 자바스크립트 엔진에 전달한다.
자바스크립트 엔진은 자바스크립트 코드를 파싱하여 바이트 코드 등 내부 표현으로 변환(컴파일)한 후 실행(인터프리트)하며, 실행 도중 자주 사용되는 코드를 Just-In-Time 컴파일러를 통해 기계어로 변환해 코드를 최적화한다. 기계어로 변환된 코드는 이후부터 직접 CPU에서 실행되어, 인터프리터가 한 줄씩 코드를 읽으며 해석하는 것보다 빠르게 실행된다.
자바스크립트 엔진과 브라우저는 밀접하게 상호작용한다. 예를 들면, 사용자가 버튼을 눌렀을 때 브라우저는 시뮬레이터에 버튼이 눌렸음을 알려준다. 시뮬레이터는 대화 상자 띄우기 같은 작업을 하고 싶을 때 alert
나 prompt
함수를 호출해서 브라우저에 작업을 수행하도록 요청한다.
48. 파이썬으로 Hello, World 출력하기
파이썬을 살펴보자. 파이썬은 자바스크립트와 달리 실행하려면 우선 설치해야하는데, 요즘엔 설치하지 않고도 온라인으로 실행할 수 있는 서비스들이 있다. 구글의 Colab은 다양한 머신러닝 툴을 편리하게 사용할 수 있는 사이트로, 파이썬 프로그래밍을 시작하기에도 좋다.
코랩 웹사이트에서 [파일]>[새 노트]를 선택하고, '+ 코드' 박스에 프로그램을 입력하고 코드 왼쪽의 삼각형 아이콘을 클릭하여 프로그램을 실행한다.

코랩은 주피터 노트북(Jupyter Notebook)이라는 대화형 툴의 클라우드 버전이다. 주피터 노트북은 각종 아이디어, 설명, 실험 결과, 코드와 데이터를 기록하는 노트의 컴퓨터 버전에 해당된다. 이 모든 것들을 단일 웹페이지에서 편집하고 업데이트하고 실행하고 다른 사람에게 배포할 수 있다.
49. 더하기 프로그램 만들기
입력된 수를 더해서 마지막에 합계를 출력하는 프로그램을 만들어보자. 참고로, 아래 프로그램은 컴퓨터에 설치한 파이썬 프롬프트에 작성하면 input
함수 호출이 즉시 해석되어 버리기 때문에 작동하지 않고, 대신 addup.py
와 같은 별도의 파일로 저장하고 해당 경로를 지정한 후 파일을 파이썬으로 실행해야 작동한다.
pythonsum = 0 num = input() while num != '0': sum = sum + int(num) num = input() print("The sum is", sum)
구조상으로 JavaScript에서 쓴 프로그램과 매우 흡사하다. input
은 JavaScript의 prompt
와 같은 역할을 한다.
50. 파이썬으로 그래프 그리기
파이썬의 강점 중 하나는 프로그래머가 사용할 수 있는 방대한 라이브러리를 제공한다는 것이다.
여기서는 그래프를 그리는데 사용하는 matplotlib
라이브러리를 살펴보자.

맨 위의 두 개 import
문은 파이썬 코드 라이브러리에 접근하는데 사용된다. matplotlib.pyplot
은 너무 이름이 길어서 관례상 plt
라는 짧은 별칭을 부여한다.
4~8행은 각 리스트에 새 값을 추가하는데, 1부터 20까지의 루프를 돌며 변수 n을 이용하여 값을 설정한다. 이후 plot 함수를 호출하여 그래프를 그리고, 범례를 레이블에 추가한다. quadratic
은 너무 빠르게 증가하기 때문에 처음 10개만 그래프로 그리도록 [0:10]이라고 표기하는데, 이는 slice라는 방법을 쓴 것이다.
51. 파이썬은 어떻게 작동할까?
이전에 다룬 컴파일러, 어셈블러와 어셈블리 언어에 관한 논의를 떠올려보자. 파이썬 프로그램은 그와 유사한 방법을 거쳐 실행 가능한 형태로 변환되긴 하지만, 실제로 세부 사항은 아주 다르다.
파이썬을 실행할 때는 프로그램의 텍스트가 파이썬 컴파일러로 전달된다. 컴파일러는 프로그램에 에러가 있는지 검사하고, 프로그램을 모형 컴퓨터처럼 만들어 낸 컴퓨터(가상 머신)의 어셈블리 언어 명령어로 컴파일한다.
그리고 나서 컴파일러는 파이썬 프로그램이 하기로 되어 있는 모든 동작을 수행하고자 가상 머신을 실행한다. 가상 머신은 키보드나 인터넷에서 데이터를 읽거나 화면에 출력을 표시하는 것 같은 작업을 하기 위해 컴퓨터 환경과 상호작용한다.
52. 요약
프로그래밍을 배우면 컴퓨터가 무엇을 하고 어떻게 작동하는지 더 잘 이해하는데 도움이 된다. 프로그래머의 사고 습관과 문제 해결 접근 방식은 삶의 많은 부분에 유용하다.
물론 프로그래밍은 모든 사람에게 필요한 기술이 아니며, 배우도록 강요하는 것도 타당하지 않다.(예를 들면, 의무적으로 배워야 하는 독서, 작문, 산수와는 다르다)
또, 컴퓨터과학 내에서도 프로그래밍은 중요한 부분이지만 전부는 아니다. 학문으로서 컴퓨터과학은 앞서 살펴본 알고리즘이나 자료구조에 대한 이론적이고 실용적인 연구, 컴퓨터 아키텍처, 프로그래밍 언어, 운영체제, 네트워크 등 범위가 넓다.
💪 개인 탐구
튜링 완전(Turing Complete)
어떤 계산 체계나 프로그래밍 언어가 튜링 머신과 동일한 계산을 수행할 수 있는 능력을 갖췄다는 의미이다. 튜링 머신은 실제로 있는 기계가 아니라 수학자 Alan Turing이 1936년에 제시한 추상적 계산 모델로, 조건문, 반복문 등 기본적 연산을 통해 모든 계산 가능한 함수를 구현할 수 있는 기계이다.
튜링 완전하다는 의미는 튜링 머신과 동일한 계산 능력을 가진다는 의미인데, 알고리즘으로 표현할 수 있는 어떤 문제든지 계산해 낼 수 있다는 뜻이다.

튜링은 무한히 늘어날 수 있는 종이 테이프, 상태 기록기, 그리고 행동 표를 통한 튜링 머신을 제시했는데, 무한히 늘어날 수 있는 테이프는 현실의 컴퓨터에서 이에 대응하는 기억 장치가 유한할 수 밖에 없기에 엄밀히 말하면 오늘날의 컴퓨터는 튜링 완전하지 않다. 이에 오늘날의 컴퓨터는 느슨한 튜링 완전(Loose Turing Complete) 이라고 하는데, 충분한 시간과 메모리만 주어진다면 사실상 튜링 완전하기 때문이다. 이 말은 다시 생각해보면 어떤 컴퓨터가 할 수 있는 모든 일은 (역시 충분한 시간과 메모리만 주어진다면) 다른 어떤 컴퓨터로도 할 수 있다는 의미이다.
HTML은 프로그래밍 언어가 아닌 이유는 조건문 및 반복문 등 기본적 연산을 할 수 없기 때문이다. 사실 HTML5와 CSS3의 조합으로 튜링 완전하게 만들 수도 있지만, 이러라고 만든게 아닌 언어이니 웹 애플리케이션을 프로그래밍하려면 튜링 완전한 자바스크립트를 쓰자.