[컴퓨터과학 개론] 11강 - 프로그래밍 언어(1)

2025. 11. 10. 19:08·방송통신대학교/💻컴퓨터과학 개론

✅ 1. 프로그래밍 언어의 개요

(1) 프로그래밍 언어 개념

  • 프로그래밍 언어는 사람의 의도를 컴퓨터에게 전달하여 컴퓨터에게 작업을 수행시키기 위해 만들어짐.
  • 프로그래밍 언어는 사람의 의도를 추상화하여 압축된 언어로 컴퓨터에 전달되어야 함.
  • 동시에 컴퓨터에서 실행될 수 있는 이진 코드(binary code)로 번역되어야 함.

[ 프로그래밍 언어 목적 ]

  • 일상 언어로 프로그램을 작성할 수 있다면 누구나 자신의 필요에 따라 프로그램을 작성할 수 있음
  • 하지만, 일상 언어로 작성된 프로그램은 애매모호한 의미를 가질 수 있음
  • 즉, 하나의 문장에서 두 개의 의미로 해석이 될 수도 있다는 의미임.
  • 프로그래밍 언어는 의미적으로 애매모호함이 없고, 어떤 경우에도 동일한 의미로 해석되어야 함
  • 결론은 이렇게 애매모호한 의미를 가질 수 있기 때문에 프로그래밍 언어를 사전에 정의를 해두고, 그거에 맞게 사용을 함으로써 애매모호함을 없애는 것이 프로그래밍 언어의 목적이라고 볼 수 있음.

[ 프로그래밍 언어의 필수 요건 ]

  • 프로그래밍 언어는 의미적으로 애매모호함이 없고 어떤 경우에도 동일한 의미로 해석되어야 함
  • 프로그래밍 언어는 구문론적 측면에서 명확하게 정의되어야 하며, 의미론적 측면에서 언제나 동일하게 해석되어야 함.
  • 프로그래밍 언어는 논리적으로 설계되어 컴퓨터가 처리할 수 있는 이진코드로의 변환이 명확하게 정확하게 되어야 함.
  • 컴파일러는 구문론적, 의미론적 측면에서 옳은건지 아닌지 파악을 해주고 이진 코드로 번역을 해주는 역할임.

(2) 프로그래밍 언어의 전형

  • 프로그래밍 언어는 이진 코드에 가까운 어셈블리어와 자연어에 가까운 고급언어로 분류가 된다.
  • 즉, 어셈블리어와 고급언어사이에 다양한 프로그래밍 언어가 존재함.

(3) 기계어

  • 0과 1의 이진수로 구성되는 언어로 컴퓨터 하드웨어를 직접적으로 제어하기 위한 전기 신호의 표현 형태로 전달될 수 있는 수준의 언어이다.
  • 0과 1로 이루어지기 때문에 사람이 의미를 이해하기 어렵고, 프로그램 작성이 매우 어려움
  • 하드웨어나 컴퓨터 구조에 따라 기계어의 구성과 명령어(0과 1의 나열)가 달라지기 때문에 범용성이 떨어짐.
  • 기계어는 두 가지 성격을 동시에 가진다고 할 수 있음.
  • 추상적(논리적): 인간이 ‘0과 1’에 의미를 부여해 명령으로 해석하는 언어적 표현
  • 물리적(전기적): 실제로는 하드웨어 내부의 전압의 존재(1) 또는 부재(0) 로 구현되는 신호

(4) 어셈블리어

  • 기계어의 0과 1로 이루어진 명령어를 사람의 언어와 유사한 알파벳 심벌 형태로 바꾼 언어이다.
  • 기계어보다는 훨씬 읽기 편하지만 프로그램의 실행 논리를 컴퓨터가 실행하는 논리 순서에 맞추어 생각해야 하기 때문에 이해하기 쉽지 않음.
  • 즉, 기계어보단 쉬울순 있지만 일반 고급 언어보다는 어려움.

(5) 초창기의 고급 프로그래밍 언어

  • 연산, 수행 제어, 메모리 접근 등의 프로그램을 사람의 자연어에 유사한 형태로 표현함
  • 포트란(FORTRAN, 과학/공학 계산용 언어, 최초의 고급언어)이나 코볼(COBOL, 비지니스용 언어)등이 초기의 고급 프로그래밍 언어에 해당이 된다. ( 1950년대 말 )
  • 1960년대 중반에 등작한 베이직(Basic)도 1980년대 마이크로컴퓨터에서 많이 사용이 됨.
  • 이러한 고급언어가 발전하면서 특정 목적에 부합하는 언어들도 나오게 됨. ( 함수형 프로그래밍 언어 등 )

(6) 함수형 프로그래밍 언어

  • 수학적 함수 개념에 기반하여 프로그램을 구성하는 방식의 프로그래밍 언어이다.
  • 쉽게말해, 입력값이 들어오면 함수 내부에서 특정 코드가 실행 되고 이후 결과값을 반환해주는 함수 계산임.
  • 기본적으로 수식(expression)의 연속으로 이루어져 있고 함수들을 사용해 수식을 변환한다.
  • 수식은 사칙 연산 뿐만 아니라 일반적인 의미의 모든 함수를 의미하고, 함수의 결과를 다른 함수의 입력 값으로 사용함.
  • 리스프(LISP, 1950년대 말)와 같이 심벌의 리스트를 연산의 기본 단위로 하기도 함.
  • 스킴9Scheme), ML 등의 고급 언어도 함수형 언어에 포함됨.

(7) 구조적 프로그래밍 언어

  • 프로그램을 순차, 선택, 반복 이라는 세 가지 기본 제어 구조로 구성되어있는 언어이다.
  • 또한, 제어 구조를 활용해 프로그램의 논리적 흐름을 명확히 표현할 수 있게 해주는 언어이다.

  • 우리가 현대의 프로그래밍 언어에서 사용하는 많은 개념들이 구조적 프로그래밍 언어에서 도입이 됨.
  • 1950년대 말에 나온 알골 60(Algol 60) 은 조건문과 반복문을 사용하여 실행 흐름을 제어하고, 블록(block) 구조, 함수 호출 등 주요 개념을 도입하였음.
  • 이후의 구조적인 프로그래밍 언어인 파스칼(Pascal, C, 모듈라-2) 등에 영향을 줌.

(8) 논리형 프로그래밍 언어

  • 형식 논리로 사실(fact)들과 규칙(rule)들로 이루어진 문제 도메인 모델을 정의함.
  • 원하는 결과를 얻기 위해 문제 도메인에 대한 질의를 주어서 논리적인 추론에 기초한 결과가 나오게 하는 선언형 언어임.
  • 1970년대에 등장하여 1980년대에 인공지능분야의 인기와 더불어 많은 주목을 받은 프롤로그(Prolog)가 대표적인 예임

(9) 객체지향 프로그래밍 언어

  • 객체(object) 개념을 정의하고, 객체에 대한 연산(메소드)과 성질(멤버 변수)을 정의하여 프로그램을 작성하는 언어이다.
  • 구조적인 프로그래밍 언어와 달리 객체 중심의 사고의 틀을 제공해준다.
  • 1960년대말: 최초로 클래스 개념을 갖춘 Simular 67
  • 1980년대: C++, 스몰톡-80 등
  • 1990년대 중반: Java -> 현재 가장 대표적인 객체지향 프로그래밍 언어임.

(10) 스크립트 언어

  • 유닉스(Unix)와 같은 운영체제의 관리와 자동화를 위해 만들어져 사용되기 시작한 언어임.
  • 쉘 스크립트(sh, hash, csh 등)와 패턴 처리 스크립트 언어(awk, sed)등에서 시작이 됨.
  • 펄(Perl), 파이썬(Python) 등 스크립트 언어들이 웹 기반 서비스에서 많이 사용되고 있음.

(11) 핵심

  • CPU는 어셈블리어와 대응이 되도록 초기에 설계가 된다.
  • 즉, 어셈블리어라는 규약이 존재한다면, 거기서 ADD MOV 와 같은 명령어와 이진수와 대응이 되도록 정의를 해둠.
  • 즉, 하드웨어를 직접 제어할 때 사용하면 정확히 어떤 CPU 동작을 시킬지 예측이 가능함
  • 또한, 고급언어의 컴파일러 같은 경우에는 결국 명령어를 이진수로 변환할 때, 어셈블리어 수준 명령어에 대응되는 이진수로 변환을 하는 것임.
  • 즉, 어셈블리어로 바꾸는 것은 아니지만, 어차피 결국 어셈블리어의 대응되는 이진수로 변환을 하는 과정을 거침.
  • 하지만, 어셈블리어는 바로 이진수와 매칭이 되어 대응이 되기 때문에 매우 빠를 수 있음.

✅ 2. 프로그래밍 언어의 파스 트리

(1) 개요

  • 모든 언어는 사용될 수 있는 단어들의 집합과 단어들이 나열된 구조를 가진다.
  • 이러한 구조는 문법에 따라 문장을 생성하고, 각각의 문장은 실세계와 연결되는 의미를 가진다.

(2) 파스 트리 란?

  • “파스 트리(Parse Tree)”는 프로그래밍 언어에서 문장을 구조적으로 분석한 트리 구조를 의미함.
  • 쉽게말해, 컴퓨터가 소스 코드를 문법적으로 이해하기 위해 만든 구조도로 볼 수 있음.
  • 핵심은 컴파일러가 결국 해당 파스 트리 구조를 활용해서 번역을 한다고 이해할 수 있음.
  • 즉, 구문적인 측면에서 해석이 옳은지 그른지를 찾아내는 단계로 볼 수 있음.

  • 모든 언어는 사용될 수 있는 단어들의 집합과 단어들이 나열되어 구조에 대한 규칙(문법)에 따라 문장을 생성한다.
  • 또한, 각각의 문장은 실세계와 연결되는 의미를 가지게 된다.
  • 대부분의 프로그래밍 언어는 형식 문법을 사용해서 언어의 구조를 기술함.

[ 파스 트리 장점 ]

  • 문장의 구조는 파스 트리의 형태로 표현하면 이해가 빠르고 문법의 모호성을 파악하기 쉬움.

(3) 파스 트리 - 형식문법 이란?

  • 형식 문법은 언어를 정의하는 규칙을 의미한다. ( 자연어 규칙을 형식적으로 표현한 것 = 형식 문법 )
  • 쉽게말해, 자연어를 컴퓨터가 읽을 수 있는 규칙과 구조로 바꾼 것을 형식 문법이라고 한다.
  • 형식 문법은 비단말 기호, 단말 기호, 생성 규칙, 시작 기호 4가지 요소로 구성이 된다.
  • 언어나 문장을 수학적/형식적으로 정의한 규칙이다.
  • 컴퓨터가 이해하고 처리할 수 있도록 추상화한 문법임.
  • 파스트리는 이러한 형식 문법을 이용해 문자열을 생성한 구조적 표현을 의미한다.

(4) 파스 트리 - 형식문법의 요소

[ 단말 심벌 ]

  • 문장을 이루는 단어들을 단말 심벌이라 함.(파스 트리의 단말노드에 해당됨.)
  • 즉, 아래의 하나의 노드만 가지고 있는 관사-The , 명사-cat 와 같은 노드들이 단말 노드에 해당 할 수 있음.
  • 자연어에서는 사전에 나오는 모든 단어가 단말 심벌이 됨.

[ 비단말 심벌 ]

  • 비단말 심벌은 단말 심벌이 아니면서 복합적으로 나열된 단말 심벌과 비단말 심벌의 조합으로 구성이 됨.
  • 파스 트리의 내부 노드에 해당이 된다. ( 즉, 단말 노드를 제외한 모든 노드로 볼 수 있을 듯 )
  • 자연어에서는 <명사구>, <동사구>, <문장> 등이 비단말 심벌임.

[ 생성 규칙 ]

  • 하나의 비단말 심벌이 다른 단말 심벌이나 비단말 심벌로 대체되는 규칙을 의미한다.
  • 쉽게말해, 위의 관사, 명사, 동사 등의 단말 심벌들을 조합해서 문장을 만들어주는 규칙을 의미한다.
  • 단말 노드에 'the' 'cat' 'chased' 'the' 'mouse' 이런 단어가 있으면 규칙에 맞게 “the cat chased the mouse” 이렇게 만들어줌.

[ 시작 심벌 ]

  • 가장 상위 계층의 비단말 심벌로 보통 <문장>이 시작 심벌이 된다.
  • 파스 트리의 그냥 루트 노드에 해당이 된다고 보면 됨.

(5) 파스트리 - 구문 분석

  • 위와 같이 파스트리는 문장의 구조를 파악하기 위한 굉장히 좋은 방법이다. ( 트리 구조의 자료구조 한 형태로 볼 수 있음. )
  • 이 처럼 파스트리를 활용해 문장을 만들어내는 과정을 구문 분석 과정이라고 한다.
  • 파스트리로 만들어지는 생성규칙들이 명확하게 정의되어 있어야 오류가 없음.

✅ 3. 프로그래밍 언어의 분석

(1) 실행 가능 코드

  • 프로그래밍 언어로 작성된 프로그램 코드 -> 사람이 읽고 이해하기가 쉬움.
  • 프로그래밍 언어로 작성된 프로그램 코드 -> 컴퓨터가 이해할 수 없음.
  • 즉, 자연어로 작성된 프로그램을 분석하여 기계어의 이진 코드로 바꾸는 변환 과정을 거쳐야함.
  • 이 과정에서 어휘 분석을 해야 모호함이 없어져 실행 가능한 코드로 바꿀 수 있음.

[ 어휘 분석 ]

[ 어휘 분석 ]
예시 문장: "the cat chased the mouse"
[ 과정 ]
1. 문자열을 단어 단위로 분리
- 'the , 'cat' , 'chased' , 'the' , 'mouse'
2. 각 단어에 토큰 부여
- 'the'= DET(관사), 'cat'= N(명사), 'chased'= V(동사), 'mouse'= N(명사)
  • 입력된 문자열을 의미 있는 단위(Token)로 나누는 과정이다.
[ 어휘 분석 ]
int x = 5 + 3;
int : 키워드(KEYWORD)
x : 식별자(IDENTIFIER)
= : 연산자(ASSIGN_OP)
5 : 상수(NUMBER)
+ : 연산자(ADD_OP)
3 : 상수(NUMBER)
; : 구분자(SEMICOLON)
  • 이런 코드 자체도 마찬가지로 문자열로 보고 의미 있는 단위(Token)로 나누게 된다.
  • 생성 규칙은 사전으로 볼 수 있으며, int = 키워드 이런식으로 정의 되어있어서, 비교하면서 어휘를 분석하게 됨.
  • 즉, 생성 규칙에 정의되지 않은 내용의 단어를 사용하게 되면, 오류를 내뱉을 수 있음.

(2) 프로그램 코드의 분석

  • 사람이 작성한 프로그램은 어휘 분석과 구문 분석을 통해 프로그램에 문제가 없음을 확인하게 된다.
  • 어휘 분석 및 구문 분석 과정을 통과하면 코드 생성 단계에서 실제 실행 가능한 이진 기계어 코드가 생성이 됨.
  • 순서: 어휘 분석 -> 구문 분석 -> 코드 생성
  • 참고로 구문 분석 단계에서 생성 규칙을 사용해서 토큰을 조합하게 되는 것임. ( 어휘 분석에서 생성 규칙 사용 x )

[ 구문 분석 ]

          S
          │
     Declaration
  ┌───────┼───────┬────────┬────────┐
 TYPE IDENTIFIER '='  Expression   ';'
  │       │       │        │
 'int'   'x'      │       '+'
                  │      /   \
                 '5'   '3'
  • 어휘 분석의 결과로 나온 토큰들을 생성 규칙을 사용해 토큰을 조합하는 과정임.
  • 즉, 토큰들을 생성 규칙에 따라 문법을 검증 하고 조합하여 파스 트리를 만드는 과정임.

(3) 실행코드의 생성

  • 프로그래밍 언어에 대한 어휘 분석 미치 구문 분석의 결과로 파스 트리 구조가 생기게 됨.
  • 이후, 변수 상수 제어 흐름 등이 결정이 되면 기계어 이진 코드가 생성이 됨.

(4) 핵심 정리

  • 어휘 분석: 토큰을 생성 규칙과 같은 사전을 통해서 정의된 문법을 매칭시켜줘서 토큰을 만들어내는 역할임.
  • 구문 분석: 어휘 분석으로 만들어진 토큰을 파스 트리 형식으로 만들어서 구조화 시켜주는 역할을 함.
  • 의미 분석: 트리가 의미적으로 맞는지 확인하는 과정이며, 타입 검사, 변수 선언 여부 확인등을 함.
  • 코드 생성: 트리 기반으로 기계가 실행할 명령어 생성 -> 실행 가능한 코드로 변환함.
  • 이것들은 컴파일러 내부에서 일어나는 자연어 -> 기계어로 변환하는 과정이다.

✅ 4. 프로그래밍 언어의 공통 개념

  • 언어마다 문법은 달라도 대부분 공통적으로 가지는 기본적인 요소나 구조를 의미한다.
  • 대표적으로 대입문, 변수, 데이터 타입, 제어문, 반복문, 연산자, 함수 등이 있음.

(1) 대입문

[ 대입문 : = ]
int age = 20;
age = 30;
  • 대입문(할당문)은 변수나 기억장치 주소에 값을 저장하는 역할을 한다.
  • 대입문은 명령형 언어의 가장 주요한 기능 중의 하나이다.

  • <수식1> 은 왼쪽(l-value) 라고 하며, 값이 저장될 위치(기억장치의 주소)를 가리킨다.
  • <수식2> 는 오른쪽(r-value) 라고 하며, 값 또는 주소값 등을 의미하며, <수식1> 주소값 공간에 데이터를 넣을 수 있음.

  • 위와 같이 x 주소값에 x 의 값 + 1을 더한 값을 x 에 다시 넣는 경우이다.

(2) 데이터 타입 검사

  • 데이터 타입은 연산에 사용되는 상수 또는 변수의 종류를 지정해주는 역할을 한다.
  • 데이터 타입은 해당 변수의 메모리 공간 할당의 크기를 정하는데 사용이 될 수 있음.
  • 연산 수행 시에 호환성이 없는 데이터타입간의 연산을 막아서 연산의 결과로 얻게 되는 정보의 손실을 최소화할때 사용.
  • 즉, 데이터 타입으로 정수, 실수, 문자 인지 등을 정해주는 역할임.
  • 컴파일러는 정수와 실수의 덧셈과 같은 것의 형식을 맞추기 위해서 형 검사를 하게 됨.

[ 컴파일러 - 형 검사 ]

  • 정적(static) 형 검사: 컴파일 과정에서 이루어지는 형 검사 방식이다.
  • 동적(dynamic) 형 검사: 프로그램의 실행(run-time) 중에 이루어지는 형 검사 방식이다.
  • 언어 마다 형식이 달라서, 자동으로 형 변환을 해주는 언어도 있고 아닌 언어도 있음.

'방송통신대학교 > 💻컴퓨터과학 개론' 카테고리의 다른 글

[컴퓨터과학 개론] 13강 - 데이터베이스(1)  (0) 2025.11.10
[컴퓨터과학 개론] 12강 - 프로그래밍 언어(2)  (0) 2025.11.10
[컴퓨터과학 개론] 10강 - 컴퓨터 구조(2)  (0) 2025.11.10
[컴퓨터과학 개론] 9강 - 컴퓨터 구조(1)  (0) 2025.11.10
[컴퓨터과학 개론] 8강 - 운영체제(2)  (9) 2025.11.10
'방송통신대학교/💻컴퓨터과학 개론' 카테고리의 다른 글
  • [컴퓨터과학 개론] 13강 - 데이터베이스(1)
  • [컴퓨터과학 개론] 12강 - 프로그래밍 언어(2)
  • [컴퓨터과학 개론] 10강 - 컴퓨터 구조(2)
  • [컴퓨터과학 개론] 9강 - 컴퓨터 구조(1)
junbin2
junbin2
java.lang.NullPointerException
  • junbin2
    bin's Development Diary
    junbin2
  • 전체
    오늘
    어제
    • 전체보기 (233)
      • 방송통신대학교 (87)
        • ⚙️컴퓨터의 이해 (11)
        • 💻컴퓨터과학 개론 (15)
        • 🔢자료구조 (14)
        • 🧬알고리즘 (10)
        • ⚙️운영체제 (14)
        • 🕸️이산수학 (11)
        • 🌍유비쿼터스 컴퓨팅 (11)
        • 🖥️컴퓨터과학과 (1)
      • 공부 (72)
        • 📚백엔드 공부 (6)
        • ☕Java (23)
        • 🌳Spring (13)
        • ⚙️C (12)
        • ⚡Python (15)
        • JavaScript (1)
        • 🛢️Database (0)
        • Algorithm Problem Solving (2)
      • 네트워크 (7)
        • 📜HTTP (7)
      • 스파르타코딩클럽 (64)
      • 정보 (2)
      • 정리가 필요한 글 (1)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

    • GitHub
  • 공지사항

  • 인기 글

  • 태그

    자료구조
    알고리즘
    배열
    방통대
    컴퓨터의 이해
    함수
    그래프
    자바
    spring
    파이썬
    이산수학
    방송대
    C언어
    유비쿼터스
    Python
    운영체제
    Java
    컴퓨터과학 개론
    방송통신대학교
    컴퓨터과학과
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.1
junbin2
[컴퓨터과학 개론] 11강 - 프로그래밍 언어(1)
상단으로

티스토리툴바