1. 프로그래밍 언어 개요
1.1. 프로그래밍 언어의 필요성
- 사람과 컴퓨터 간의 의사소통 수단
- 사람이 컴퓨터에게 작업을 지시하기 위한 명령어를 기술하기 위해 사용된다.
1.2. 언어의 분류
-
저급 언어(Low Level Language)
- 기계어(Machine Language)
- 이진수(0과 1)로 구성된 컴퓨터가 이해하는 유일한 언어
- 배우기 어렵고 사용이 불편함
- 표준화 되어있지 않음
- 어셈블리어(Assembly Language)
- 연산 코드(Opcode; Mnemonic): 기계어를 사람이 이해하기 쉬운 기호(예: ADD, LDA)로 1:1 대응
- 피연산자(Operand; Symbolic): 레지스터, 메모리 주소, 상수
- 하드웨어의 직접 통제가 가능함
- 기계어(Machine Language)
-
고급 언어(High Level Language)
- 인간의 자연어와 유사하여 이해하기 쉽고 친근함
- 생산성이 높으며, 컴파일러 등을 통해 기계어로 변환되어 실행됨
- (예: C, C++, Java, Python 등)
- 기계 독립적
1.3. 언어의 세대별 발달
- 1세대: 기계어
- 2세대: 어셈블리어
- 3세대: 절차적 중심 언어(Fortran, C, Pascal 등)
- 4세대: 비절차적 중심 언어, 데이터베이스 질의 언어(SQL), 비주얼 프로그래밍 언어(Visual Basic)
- 5세대: 자연어, 블록 프로그래밍(Scratch), 인공지능 및 교육용 언어
2. 프로그램 구현 및 개발 환경
- 프로그램: 컴퓨터에서 특정 목적의 작업을 수행하기 위해 관련된 명령어와 자료를 모아놓은 것
2.1. 개발 도구의 구성
-
에디터(Editor)
- 소스 코드 작성 및 편집
-
컴파일러(Compiler)
- 고급 언어로 작성된 소스를 기계어로 변환
-
링커(Linker)
- 여러 목적 파일(Object file)과 라이브러리를 연결하여 실행 파일(.exe) 생성
-
디버거(Debugger)
- 오류(Bug)를 찾아 수정(Debugging)하는 도구
- 디버깅의 유래: 그레이스 호퍼 중위가 컴퓨터 릴레이에 낀 나방(Bug)을 발견한 것에서 시작됨
-
통합개발환경(IDE)
- 위 도구들을 하나로 통합해 제공하는 환경
- (예: Visual Studio, Eclipse)
2.2. 번역 및 실행 방식
-
컴파일러 방식
- 소스 전체를 한 번에 기계어로 번역
- 실행 속도가 빠름
- (C, Fortran)
-
인터프리터 방식
- 소스를 한 줄씩 읽어 실행
- 번역 속도는 느리나 수정 및 대화형 작업에 유리
- (Python, Basic)
-
중간 방식(하이브리드)
- 컴파일러와 인터프리터의 특징을 모두 가짐
- 가상 머신(VM) 위에서 실행되어 플랫폼 독립적임
- (Java, C#)
2.3. 프로그램 번역과 실행
| 단계 | 입력 | 컴포넌트 | 출력 | gcc |
|---|---|---|---|---|
| 전처리 | 소스(.c) | 전처리기 | 전처리된 소스(.i) | gcc -E |
| 컴파일 | 전처리된 소스(.i) | 컴파일러 | 어셈블리 코드(.s) | gcc -S |
| 어셈블 | 어셈블리 코드(.s) | 어셈블러 | 오브젝트 코드(.o) | gcc -c |
| 링킹 | 오브젝트 코드(.o) | 링커 | 실행 파일(.exe/.out) | gcc |
| 로딩 | 실행 파일(.exe/.out) | 로더 | 메모리 적재 | (OS Kernel) |
-
소스 작성
- 편집기로 프로그램 작성
-
전처리
- 전처리 지시자(헤더 파일 삽입, 매크로 치환)를 처리한다.
- 소스 코드(
.c) → 전처리된 소스 코드(.i)
-
컴파일
- 전처리된 소스 코드를 어셈블리어 코드로 변환한다.
- 전처리된 소스 코드(
.i) → 어셈블리어 코드 파일(.s)
-
어셈블
- 어셈블리어 코드를 바이너리 형태(기계어)의 목적 파일(object file)로 변환한다.
- 어셈블리어 코드 파일(
.s) → 오브젝트 파일(.o)
-
링킹
- 링커: 각 프로시저를 따로 컴파일, 어셈블 하는 시스템 프로그램으로 실행 파일 생성
- 여러 개의 목적 파일과 각종 라이브러리를 합쳐서 실행 파일(executable)을 만든다.
- 오브젝트 파일(
.o) → 실행 파일(Unix:.out/Windows:.exe)
-
로딩
- 로더: 프로그램을 주기억장치에 적재하는 시스템 프로그램
- cf. 디버거
- 오류는 컴파일 오류, 링크 오류, 실행 오류로 구분
3. 주요 고전 및 시스템 프로그래밍 언어
-
포트란(FORTRAN)
- IBM의 존 배커스가 고안한 최초의 고급 언어
- 과학·공학·수학적 문제들을 해결하기 위해 사용
- 매우 단순하고 간결하여 배우기가 쉬움, 문법이 엄격함
-
코볼(COBOL)
- 미국 국방성 CODASYL에 의해 개발된 고급언어
- 사무 처리용 언어
- 영어 문장과 유사한 구조
- 컴퓨터 내부적인 특성에 독립적으로 설계
-
베이직(BASIC)
- 초보자 교육용 대화형 언어
- 인터프리터를 사용하여 쉽게 파악할 수 있음
- 마이크로소프트, 비주얼 베이직 IDE 개발
-
파스칼(PASCAL)
- 알고리즘 학습에 적합하도록 니클라우스 워스 교수가 개발
- 구조적인 프로그래밍이 가능하도록 설계
- 볼랜드, 델파이 IDE 출시
-
C 언어
- 벨 연구소 데니스 리치 개발
- 유닉스(Unix) 운영체제 개발을 위해 탄생
- 하드웨어 제어와 이식성이 뛰어나 범용적으로 사용됨
-
C++
- C 언어에 객체지향(OOP) 개념(상속성 등)을 추가하여 확장한 언어
4. 객체지향 프로그래밍 (OOP)
4.1. 개요 및 특징
-
현실 세계의 사물(객체)을 모델링하여 소프트웨어를 개발하는 방법론
-
주요 특징 4가지
- 추상화, 상속성, 캡슐화, 다형성
-
구성 요소
- 속성(Attribute): 객체의 정적인 특성 (데이터)
- 행동(Behavior): 객체의 동적인 일 처리 (메소드)
4.2. 절차지향 vs 객체지향
-
절차지향(예: C)
- 동사(함수) 중심
- 전체 과정을 순차적으로 처리
-
객체지향(예: Java, C++)
- 명사(객체) 중심
- 객체 간의 상호작용(메시지 교환)으로 문제 해결
- 재사용성 및 유지보수성 우수
5. 현대의 주요 언어 및 특수 목적 언어
5.1. 범용 및 웹/앱 개발 언어
-
자바(Java)
-
이식성이 높음(JVM 사용)
-
웹 개발 및 안드로이드 등 다양한 플랫폼에서 사용
-
Java 언어
- 썬 마이크로시스템, 가전제품을 제어하기 위해 고안한 언어
- C++ → Oak → Java, 개발도구 JDK 발표
- 플랫폼에 독립적인 언어
-
Java bytecode
- 다양한 하드웨어 및 소프트웨어 플랫폼에서 효율적으로 실행하기 위해 설계된 구조 중립적인 중간 형태의 이진 파일
-
Java Virtual Machine
- Java bytecode가 모든 플랫폼에서 실행될 수 있도록 하는 것
-
-
C#(닷넷)
- 마이크로소프트의 닷넷(.NET) 플랫폼을 위한 언어
- XML 웹 서비스 기반
- C# → 컴파일러 → MSIL → CLR 인터프리터
-
코틀린(Kotlin)
- 구글의 안드로이드 공식 언어
- 자바와 100% 호환되며 문법이 간결함
-
스위프트(Swift)
- 애플(iOS, macOS) 앱 개발용 언어
- 빠르고 안전하며 Objective-C를 대체
- 제네릭스, 타입 인터페이스 등 현대 프로그래밍 언어의 기능을 포함
-
Go(고)
- 구글이 개발
- 간결한 문법, 빠른 컴파일, 멀티스레딩(동시성) 지원
- IDE: JetBrains GoLand, eclipse LiteIDE 등
5.2. AI 및 데이터 분석 언어
-
파이썬(Python)
- 귀도 반 로섬이 개발한 인터프리터 언어
- 문법이 쉽고 간결함
- 변수를 선언하지 않고 사용할 수 있는 동적 자료형 제공
- AI, 머신러닝, 빅데이터 분야에서 가장 널리 사용됨 (풍부한 라이브러리)
-
R 언어
- 통계 분석 및 데이터 시각화에 특화된 인터프리터 언어
- 빅데이터 처리에 적합
5.3. 교육용 언어
- 스크래치(Scratch)
- MIT 개발
- 블록을 끼워 맞추는 방식의 비주얼 프로그래밍
- 어린이 및 입문자 코딩 교육용