컴퓨터과학개론 11강 - 프로그래밍 언어 (1)
사람의 의도를 컴퓨터가 실행할 수 있는 형태로 표현하는 프로그래밍 언어의 개념과 주요 유형을 학습한다. 형식 문법과 파스 트리, 프로그램 번역 과정, 대입문과 변수형 검사처럼 서로 다른 프로그래밍 언어에 공통으로 나타나는 핵심 원리도 함께 살펴본다.
1. 프로그래밍 언어의 개요
프로그래밍 언어의 의미
프로그래밍 언어(programming language)는 사람이 원하는 작업을 컴퓨터에 전달하여 수행하게 하기 위해 만들어진 언어이다. 사람의 의도를 추상화하여 정해진 규칙에 따라 압축된 형태로 표현하고, 그 표현을 컴퓨터에서 실행할 수 있는 이진 코드로 번역할 수 있어야 한다.
일상 언어로도 프로그램의 내용을 설명할 수 있지만 일상 언어의 문장은 문맥에 따라 둘 이상의 의미로 해석될 수 있다. 컴퓨터는 같은 명령을 상황에 따라 임의로 다르게 해석해서는 안 되므로 프로그래밍 언어에는 더 엄격한 규칙이 필요하다.
프로그래밍 언어는 구문론적으로 명확하게 정의되어야 하고, 같은 표현은 언제나 의미론적으로 동일하게 해석되어야 하며, 최종적으로 실행 가능한 이진 코드로 변환될 수 있어야 한다.
구문론과 의미론
구문론(syntax)은 프로그램을 어떤 기호와 순서로 작성해야 하는지를 정하는 형식 규칙이다. 괄호의 위치, 명령문의 구조, 연산자와 피연산자의 배열 등이 구문론의 대상이다. 규칙에 어긋난 표현은 프로그램의 뜻을 논하기 전에 올바른 문장으로 인정되지 않는다.
의미론(semantics)은 구문에 맞게 작성된 문장이 실제로 무엇을 뜻하고 어떤 동작을 수행하는지를 정한다. 프로그래밍 언어의 논리적인 설계는 컴퓨터가 처리할 수 있는 이진 코드의 변환이 명확해지도록 구성되어야 한다.
구문론이 문장의 ‘모양’을 정한다면 의미론은 그 문장이 수행할 ‘동작과 의미’를 정한다. 문법에 맞는 프로그램이라도 의도와 다른 의미를 나타내면 올바른 결과를 얻을 수 없다.
2. 저급 프로그래밍 언어
기계어
기계어(machine language)는 0과 1의 이진수로 구성되며 컴퓨터 하드웨어를 직접 제어하기 위한 전기 신호와 대응하는 수준의 언어이다. 컴퓨터는 기계어 명령을 직접 이해할 수 있지만, 사람은 긴 이진수의 의미를 파악하기 어렵고 프로그램을 작성하거나 수정하기도 매우 어렵다.
기계의 구성과 명령어는 하드웨어나 컴퓨터 구조에 따라 달라질 수 있다. 그러므로 특정 컴퓨터의 기계어로 작성한 프로그램은 다른 구조의 컴퓨터에서 그대로 사용할 수 없는 경우가 많아 범용성이 낮다.
어셈블리어
어셈블리어(assembly language)는 기계어의 0과 1로 이루어진 명령어를 사람이 읽기 쉬운 영문 약자와 기호인 심벌릭 명령으로 바꾼 언어이다. 예를 들어 데이터 이동을 뜻하는 명령을 mov처럼 표현하므로 기계어보다 읽고 작성하기 쉽다.
그러나 어셈블리어도 컴퓨터의 명령 실행 순서와 하드웨어 동작을 고려하여 프로그램을 작성해야 하므로 초보자가 이해하기 쉽지 않다. 또한 기계어와 밀접하게 대응하기 때문에 컴퓨터 구조에 따른 의존성이 남아 있다.
| 구분 | 표현 방법 | 장점 | 한계 |
|---|---|---|---|
| 기계어 | 0과 1의 이진 코드 | 하드웨어가 직접 실행 가능 | 사람이 작성하기 어렵고 기계 의존성이 큼 |
| 어셈블리어 | 기계 명령을 나타내는 영문 약자와 기호 | 기계어보다 읽고 작성하기 편리함 | 하드웨어와 실행 논리를 알아야 하며 이식성이 낮음 |
3. 고급 프로그래밍 언어의 발전
초창기의 고급 프로그래밍 언어
고급 프로그래밍 언어는 연산, 수행 제어, 기억장치 접근과 같은 프로그램 동작을 사람의 자연언어와 수학적 표현에 가까운 형태로 나타낸다. 기계의 세부 명령보다 해결하려는 문제와 알고리즘에 집중할 수 있게 한다.
1950년대에는 과학·공학 계산을 위한 포트란(FORTRAN), 인공지능 연구에 활용된 리스프(LISP), 사무 처리에 사용된 코볼(COBOL) 등이 등장했다. 1960년대 중반에 등장한 베이직(BASIC)은 이후 마이크로컴퓨터 환경에서 널리 사용되었다.
함수형 프로그래밍 언어
함수형 프로그래밍 언어는 프로그램을 기본적으로 수식의 연속으로 구성하고, 함수를 사용하여 수식을 변환하는 방식에 중심을 둔다. 여기에서 수식은 단순한 산술식뿐 아니라 일반적인 의미의 함수를 포함하며, 함수의 결과를 다시 다른 함수의 입력으로 사용할 수 있다.
리스프는 심벌의 리스트를 연산의 기본 단위로 사용하는 대표적인 함수형 언어이다. 스킴(Scheme), ML 계열의 고급 언어도 함수형 언어의 범주에 포함된다. (+ 3 2), (length (a b c))와 같은 표현은 함수와 인수를 중심으로 계산을 표현하는 예이다.
구조적 프로그래밍 언어
구조적 프로그래밍 언어는 프로그램을 순차, 선택, 반복과 같은 명확한 제어 구조로 조직한다. 1950년대 말 등장한 알골 60(Algol 60)은 조건문과 반복문을 사용하고, 실행 흐름을 제어하는 블록 구조와 함수 호출 등 중요한 구조적 개념을 도입했다.
이후 파스칼(Pascal), C, 모듈라-2(Modula-2) 등은 구조적 프로그래밍의 영향을 받았다. 구조적 방식은 복잡한 실행 흐름을 작은 블록과 제어 구조로 나누어 프로그램의 이해와 검증을 쉽게 한다.
논리형 프로그래밍 언어
논리형 프로그래밍 언어는 형식 논리로 사실(fact)과 규칙(rule)을 표현하여 문제의 모델을 정의한다. 원하는 결과를 얻기 위해 문제 영역의 관계를 선언하면 언어 처리계가 논리적인 추론을 통해 결과를 찾는다.
1970년대에 등장하여 1980년대 인공지능 분야에서 널리 사용된 프롤로그(Prolog)가 대표적이다. 예를 들어 ‘A는 B의 아버지’, ‘B는 C의 아버지’라는 사실과 ‘X가 Y의 아버지이고 Y가 Z의 아버지이면 X는 Z의 할아버지’라는 규칙을 조합해 새로운 관계를 추론한다.
객체지향 프로그래밍 언어
객체지향 프로그래밍 언어는 객체를 정의하고, 객체가 수행하는 연산인 메서드(method)와 객체의 상태를 나타내는 멤버 변수를 함께 구성하여 프로그램을 작성한다. 구조적 프로그래밍과 달리 객체를 중심으로 문제를 바라보는 사고방식을 제공한다.
클래스 개념을 갖춘 시뮬라 67(Simula 67)이 1960년대 말 등장했고, C++, 스몰토크 80(Smalltalk 80) 등은 1980년대에 발전했다. 1990년대 중반에 등장한 자바(Java)는 대표적인 객체지향 프로그래밍 언어로 사용되고 있다.
스크립트 언어
스크립트 언어(script language)는 유닉스와 같은 운영체제를 관리하고 작업을 자동화하려는 목적으로 사용되기 시작했다. 셸 스크립트와 배치 처리 스크립트가 초기의 대표적인 형태이며, 여러 명령과 프로그램을 연결해 반복 작업을 자동화한다.
펄(Perl), 파이썬(Python) 같은 스크립트 언어는 웹 기반 서비스와 다양한 자동화 작업에서 널리 사용된다. 스크립트 언어는 짧은 코드로 기존 기능을 조합하고 작업 절차를 표현하기에 편리하다.
| 언어 부류 | 중심 개념 | 강의의 대표 예 |
|---|---|---|
| 함수형 | 수식과 함수 적용을 통한 계산 | LISP, Scheme, ML |
| 구조적 | 순차·선택·반복, 블록과 함수 호출 | Algol 60, Pascal, C, Modula-2 |
| 논리형 | 사실과 규칙을 바탕으로 한 논리 추론 | Prolog |
| 객체지향 | 객체, 메서드, 멤버 변수 | Simula 67, C++, Smalltalk 80, Java |
| 스크립트 | 운영체제 관리와 작업 자동화, 기능 조합 | 셸 스크립트, Perl, Python |
4. 프로그래밍 언어의 파스 트리
문법과 파스 트리
모든 언어는 사용할 수 있는 단어의 집합과 그 단어를 나열하여 문장을 만드는 규칙을 가진다. 문법에 맞게 구성된 문장은 실제 세계와 연결되는 의미를 표현한다. 프로그래밍 언어도 형식 문법을 사용하여 프로그램 문장의 구조를 기술한다.
파스 트리(parse tree)는 문장이 문법 규칙에 따라 어떤 구조로 만들어졌는지를 트리 형태로 표현한 것이다. 문장의 구조를 눈으로 확인할 수 있어 이해가 빠르고, 문법의 모호성을 파악하기에도 유리하다.
예를 들어 The cat ate the rat라는 문장은 최상위의 문장에서 명사구와 동사구로 나뉜다. 첫 번째 명사구는 관사 The와 명사 cat으로, 동사구는 동사 ate와 다시 관사와 명사로 이루어진 명사구로 분석할 수 있다.
단말 심벌
단말 심벌(terminal symbol)은 문장을 이루는 실제 단어 또는 더 이상 문법적으로 나누지 않는 기본 기호이다. 파스 트리의 끝에 있는 단말 노드에 해당한다. 자연언어 예에서는 사전에 나오는 The, cat, ate, rat와 같은 낱말이 단말 심벌이다.
비단말 심벌
비단말 심벌(nonterminal symbol)은 단말 심벌 자체가 아니라, 단말 심벌과 다른 비단말 심벌의 조합으로 이루어진 문법적인 범주이다. 파스 트리의 내부 노드에 해당하며 문장, 명사구, 동사구, 명사, 동사, 관사와 같은 구조적 이름이 이에 해당한다.
생성 규칙
생성 규칙(production rule)은 하나의 비단말 심벌을 다른 비단말 심벌이나 단말 심벌의 조합으로 대체하는 규칙이다. 예를 들어 <문장> → <명사구> <동사구>, <명사구> → <관사> <명사>와 같이 표현할 수 있다.
여러 후보 중 하나를 선택할 수 있을 때는 세로선으로 대안을 나타낸다. 예를 들어 명사가 cat, rat, dog 중 하나라면 <명사> → "cat" | "rat" | "dog"와 같이 적을 수 있다.
시작 심벌
시작 심벌(start symbol)은 문법의 가장 상위 계층에 있는 비단말 심벌로, 일반적으로 전체 문장을 나타낸다. 파스 트리에서는 루트 노드가 된다. 시작 심벌에서 생성 규칙을 계속 적용하여 최종적으로 단말 심벌만 남는 문장을 만들 수 있다.
형식 문법의 네 요소는 단말 심벌, 비단말 심벌, 생성 규칙, 시작 심벌이다. 파스 트리의 잎은 단말 심벌, 내부 노드는 비단말 심벌, 루트는 시작 심벌에 해당한다.
5. 프로그램 코드의 분석과 실행 코드 생성
실행 가능한 코드로의 변환
프로그래밍 언어로 작성된 코드는 사람이 읽고 이해하기 쉽지만, 컴퓨터가 그 자체를 직접 이해하고 실행하지는 못한다. 사람이 작성한 프로그램을 분석하고 기계어 이진 코드로 바꾸는 변환 과정을 거쳐야 컴퓨터가 실행할 수 있는 프로그램이 된다.
프로그램 번역 과정은 크게 어휘 분석 → 구문 분석 → 코드 생성의 순서로 이루어진다. 각 단계는 앞 단계의 결과를 받아 더 높은 수준의 구조와 의미를 확인한 뒤 실행 가능한 형태로 바꾼다.
어휘 분석
어휘 분석(lexical analysis)은 프로그램을 구성하는 문자들의 나열에서 의미 있는 단어를 추출하는 과정이다. 빈칸과 구분 문자를 기준으로 단어를 구분하고, 각 단어를 이름, 숫자, 수식 기호 등의 종류로 분류한다.
어휘 분석의 결과로 나온 개개의 단어를 토큰(token)이라고 한다. 변수 이름, 상수, 연산자, 괄호, 예약어 등이 각각 하나의 토큰이 될 수 있다.
구문 분석
구문 분석(syntax analysis 또는 parsing)은 어휘 분석으로 얻은 토큰의 나열이 해당 프로그래밍 언어의 문법에 맞는지 확인하는 과정이다. 토큰이 올바른 순서와 구조로 결합되어 있는지를 검사하며, 문법적 적합성을 표현하기 위해 파스 트리를 생성한다.
괄호가 닫히지 않았거나 연산자와 피연산자의 순서가 문법 규칙에 맞지 않으면 구문 분석 단계에서 오류로 판정할 수 있다.
실행 코드의 생성
구문 분석 결과를 바탕으로 변수, 상수, 제어의 흐름과 같은 프로그램의 구성 요소가 결정된다. 코드 생성 단계에서는 각 명령을 어셈블리어로 풀어 쓰거나 직접 기계어 이진 코드를 만들어 실행 가능한 코드를 생성한다.
| 단계 | 입력과 처리 | 주요 결과 |
|---|---|---|
| 어휘 분석 | 문자의 나열을 의미 있는 단어로 분리·분류 | 토큰의 나열 |
| 구문 분석 | 토큰의 배열이 언어 문법에 맞는지 확인 | 파스 트리와 문법 적합성 |
| 코드 생성 | 분석된 구조를 실행 명령으로 변환 | 어셈블리어 또는 기계어 실행 코드 |
어휘 분석은 ‘어떤 단어들이 있는가’를 찾고, 구문 분석은 ‘그 단어들이 문법에 맞게 배열되었는가’를 확인하며, 코드 생성은 ‘확인된 구조를 어떤 기계 명령으로 실행할 것인가’를 결정한다.
6. 대입문의 원리
대입문의 역할
대입문(assignment statement)은 변수나 기억장치 주소에 값을 저장하는 명령으로, 명령형 프로그래밍 언어에서 가장 중요한 기능 중 하나이다. 일반적인 형태는 <수식1> := <수식2> 또는 언어에 따라 x = x + 1처럼 나타낸다.
대입문의 왼쪽 수식은 l-value라고 하며 값이 저장될 위치, 즉 기억장치 주소를 가리킨다. 오른쪽 수식은 r-value라고 하며 계산되어 저장될 실제 값이나 그 값을 담고 있는 기억장치의 내용을 의미한다.
x = x + 1에서 왼쪽의 x는 결과를 저장할 기억장치 위치를 뜻하고, 오른쪽의 x는 현재 그 위치에 저장되어 있는 값을 뜻한다. 오른쪽 값을 읽어 1을 더한 뒤, 계산 결과를 다시 왼쪽의 위치에 저장한다.
대입은 수학의 등식이 아니다. 오른쪽 수식의 값을 계산하여 왼쪽 수식이 가리키는 저장 장소에 기록하는 동작이다.
7. 변수형 검사와 형 변환
변수형 검사의 필요성
변수형 검사(type checking)는 연산에 사용되는 상수와 변수의 자료형을 확인하여 그 연산이 의미 있고 서로 호환되는지를 판단하는 과정이다. 정수를 문자로 나누거나 복잡한 구조체를 수처럼 곱하는 것처럼 의미가 맞지 않는 연산은 허용해서는 안 된다.
정수와 실수의 덧셈처럼 서로 다른 형 사이의 연산이 가능하도록 한쪽 값을 변환할 수 있는 경우도 있다. 예를 들어 정수를 실수형으로 바꾸어 계산하면 실수 결과를 얻을 수 있다. 반면 변환 규칙이 없고 자료형이 호환되지 않는 연산을 찾는 것을 형 검사라고 한다.
정적 형 검사와 동적 형 검사
정적(static) 형 검사는 컴파일 과정에서 프로그램을 실행하기 전에 이루어진다. 변수 선언과 연산 규칙을 바탕으로 자료형 오류를 미리 탐지할 수 있다. 동적(dynamic) 형 검사는 프로그램의 실행 중에 실제 값과 연산을 기준으로 이루어진다.
프로그래밍 언어마다 변수형을 다루는 방식과 형을 제한하는 정도는 다르다. 어떤 언어는 숫자와 문자열의 결합을 허용하지만 다른 언어는 오류로 처리할 수 있다.
C 언어의 형 검사와 캐스팅
C 언어는 변수 선언에서 자료형을 지정하고 연산 과정에서도 형을 검사하지만, 특정 상황에서는 컴파일러 경고만 발생하고 연산이 진행될 수 있다. 예를 들어 정수 변수에 문자열의 주소와 관련된 값을 더하면 컴파일러나 실행 환경에 따라 의미 없는 숫자 결과가 나타날 수 있다.
서로 다른 자료형 사이에서 올바른 연산을 수행하기 위해 한 변수나 데이터의 형을 수동으로 변환하는 것을 형 변환(type casting)이라고 한다. C 언어에서 컴파일러 경고에 나타나는 cast는 바로 이러한 형 변환을 의미한다.
| 구분 | 검사 시점·기능 | 핵심 특징 |
|---|---|---|
| 정적 형 검사 | 컴파일 과정 | 실행 전에 형 오류를 확인 |
| 동적 형 검사 | 프로그램 실행 중 | 실제 값과 연산이 수행될 때 형을 확인 |
| 형 변환 | 자료형을 다른 형으로 변경 | 서로 다른 형 사이의 올바른 연산을 가능하게 함 |
핵심 개념 정리
- 프로그래밍 언어는 사람의 의도를 명확한 규칙으로 표현하고 실행 가능한 이진 코드로 번역할 수 있어야 한다.
- 구문론은 프로그램 문장의 형식을, 의미론은 그 문장이 나타내는 동작을 정한다.
- 기계어는 이진수로 구성되며, 어셈블리어는 기계 명령을 영문 약자와 기호로 나타낸다.
- 고급 언어는 함수형, 구조적, 논리형, 객체지향, 스크립트 언어 등 서로 다른 문제 해결 관점을 제공한다.
- 함수형 언어는 수식과 함수 적용, 논리형 언어는 사실과 규칙에 의한 추론, 객체지향 언어는 객체와 메서드를 중심으로 한다.
- 형식 문법은 단말 심벌, 비단말 심벌, 생성 규칙, 시작 심벌로 구성된다.
- 파스 트리의 잎은 단말 심벌, 내부 노드는 비단말 심벌, 루트는 시작 심벌이다.
- 프로그램은 어휘 분석, 구문 분석, 코드 생성 순으로 실행 가능한 코드로 변환된다.
- 어휘 분석의 결과는 토큰이며, 구문 분석은 토큰의 배열이 문법에 맞는지 확인하고 파스 트리를 만든다.
- 대입문은 오른쪽 수식의 값을 왼쪽 수식이 가리키는 기억장치 위치에 저장한다.
- 변수형 검사는 연산에 사용되는 자료형의 호환성을 확인하며 정적 검사와 동적 검사로 나눌 수 있다.
- 형 변환은 서로 다른 자료형 사이에서 필요한 연산을 수행하도록 데이터의 형을 바꾸는 것이다.
최종 정리: 프로그래밍 언어는 사람이 이해할 수 있는 문제 해결 표현과 컴퓨터가 실행할 수 있는 기계 명령을 연결한다. 이 연결을 정확하게 만들기 위해 명확한 문법, 파스 트리에 의한 구조 분석, 어휘·구문 분석과 코드 생성, 대입과 자료형 검사 같은 공통 원리가 사용된다.
예상문제 20선
1. 프로그래밍 언어의 설명으로 가장 알맞은 것은?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ①
프로그래밍 언어는 사람의 작업 의도를 형식적으로 표현하며 최종적으로 컴퓨터가 실행할 수 있는 코드로 변환되어야 한다.
2. 프로그래밍 언어에서 문장의 형식과 기호 배열 규칙을 다루는 것은?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ②
구문론은 프로그램 문장을 어떤 기호와 순서로 작성해야 하는지 규정하며 의미론은 그 문장의 뜻을 규정한다.
3. 기계어의 특징으로 옳은 것은?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ③
기계어는 이진수 명령으로 하드웨어가 직접 이해하지만 사람이 작성하기 어렵고 컴퓨터 구조에 의존한다.
4. 어셈블리어에 대한 설명으로 옳지 않은 것은?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ④
어셈블리어는 기계어보다 읽기 쉽지만 기계 명령과 밀접하게 대응하므로 하드웨어 의존성이 남아 있다.
5. 수식과 함수의 적용을 중심으로 프로그램을 표현하는 언어 부류는?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ①
LISP, Scheme, ML과 같은 함수형 언어는 수식과 함수 적용을 계산의 중심으로 삼는다.
6. 순차·선택·반복 및 블록 구조를 중심으로 프로그램을 조직하는 방식은?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ②
구조적 프로그래밍은 명확한 제어 구조와 블록을 사용하여 복잡한 실행 흐름을 체계적으로 구성한다.
7. 사실과 규칙을 선언하고 논리적 추론으로 결과를 구하는 대표 언어는?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ③
Prolog는 사실과 규칙으로 문제 영역을 기술하고 논리적인 추론을 통해 답을 찾는 대표적인 논리형 언어이다.
8. 객체지향 프로그래밍 언어의 핵심 구성으로 알맞은 것은?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ④
객체지향 언어는 데이터와 동작을 객체로 묶으며 객체의 상태는 멤버 변수, 동작은 메서드로 표현한다.
9. 운영체제 관리와 반복 작업 자동화를 위해 사용되기 시작한 언어 부류는?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ①
셸 스크립트와 배치 스크립트는 운영체제 관리 및 작업 자동화를 위해 사용되었으며 Perl과 Python도 대표적인 스크립트 언어이다.
10. 파스 트리에서 실제 단어나 더 이상 나누지 않는 기본 기호에 해당하는 것은?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ②
단말 심벌은 문장을 이루는 최종 기호이며 파스 트리의 잎 노드에 놓인다.
11. 파스 트리의 내부 노드에 해당하며 여러 심벌의 조합으로 구성되는 문법 요소는?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ③
문장, 명사구, 동사구처럼 다른 문법 요소로 전개되는 범주는 비단말 심벌이며 파스 트리의 내부 노드가 된다.
12. 형식 문법에서 하나의 비단말 심벌을 다른 심벌의 조합으로 대체하는 규칙은?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ④
생성 규칙은 비단말 심벌이 어떤 단말 또는 비단말 심벌의 나열로 전개될 수 있는지를 정의한다.
13. 파스 트리의 루트 노드에 해당하는 형식 문법 요소는?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ①
시작 심벌은 문법의 최상위 비단말 심벌이며 전체 문장을 전개하는 출발점이므로 파스 트리의 루트가 된다.
14. 고급언어 프로그램에서 실행 코드가 생성되기까지의 올바른 순서는?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ②
먼저 문자에서 토큰을 추출하고, 토큰 배열의 문법을 확인한 다음 분석된 구조에 맞춰 실행 코드를 만든다.
15. 어휘 분석 결과로 얻는 개개의 의미 있는 단어를 무엇이라 하는가?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ③
어휘 분석은 변수 이름, 숫자, 연산자 같은 의미 있는 단위로 문자를 나누며 각 단위를 토큰이라고 한다.
16. 구문 분석에서 수행하는 작업은?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ④
구문 분석은 어휘 분석으로 얻은 토큰들이 문법적으로 올바른 구조를 이루는지 검사한다.
17. 대입문 x = x + 1의 실행 의미로 옳은 것은?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ①
대입문은 오른쪽 수식의 값을 계산한 후 왼쪽 수식이 가리키는 기억장치 위치에 그 결과를 저장한다.
18. 대입문의 왼쪽 수식인 l-value가 나타내는 것은?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ②
l-value는 대입 결과가 들어갈 저장 장소를 뜻하고, r-value는 계산되어 저장될 값을 뜻한다.
19. 컴파일 과정에서 실행 전에 자료형 오류를 검사하는 방식은?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ③
정적 형 검사는 컴파일 시점에 수행되며 동적 형 검사는 프로그램이 실행되는 동안 수행된다.
20. 서로 다른 자료형 사이의 올바른 연산을 위해 데이터의 형을 바꾸는 것은?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ④
형 변환은 한 자료형의 값을 다른 자료형으로 바꾸는 것이며 C 언어의 컴파일러 경고에서 cast라는 용어로 나타나기도 한다.
댓글
댓글 쓰기