- 프로그래밍 언어란
- 첫 번째 정의
- 프로그래밍 언어 = “컴퓨터에게 우리가 시키고 싶은 내용을 전달하기 위한 표기법”
- 초기 컴퓨터들은 하드웨어로 직접 연결되는 방식(하드 와이어링)으로 구성되어 프로그래밍
- 매우 번거롭고 복잡한 과정
- 명령어를 기호화하는 어셈블리어와 고급 프로그래밍 언어 탄생
- 추상화의 진행
- 프로그래밍 언어의 발전은 추상화 과정을 통해
- 초기에는 기계어로 직접 CPU 명령어를 전달하던 방식
- 어셈블리어, 고급 언어로 점차 발전하며, 특정 하드웨어와 독립적인 언어 체계를 만들 수 있게 되었음
- 두 번째 정의
- 프로그래밍 언어 = “기계-판독 가능(machine-readable)하고 인간-판독 가능(human-readable)한 형태로 계산을 서술하기 위한 표기 체계”
- 컴퓨터가 이해할 수 있을 정도로 단순하면서도 인간이 읽고 이해할 수 있을 정도로 직관적인 구조를 갖추는 것이 중요함
- 프로그램을 큰 그림에서 이해할 수 있도록 추상화가 필수적
- 첫 번째 정의
- 계산(또는 프로그래밍)의 패러다임
- 소프트웨어 위기
- 1960년대 '소프트웨어 위기' 등장
- 많은 소프트웨어 프로젝트들이 품질, 비용, 기간 측면에서 성공하지 못하는 상황
- 소프트웨어 개발의 복잡성이 커지고, 하드웨어의 발전 속도를 소프트웨어가 따라가지 못해 발생
- 소프트웨어 공학 이라는 용어 등장
- 해결하기 위해 구조적 프로그래밍, 통합 개발 환경, 버전 관리 시스템 등의 보수적 접근 방식
- + 프로그래밍을 과학적 학문으로 발전시키는 진보적 접근 방식
- + 기존의 방법을 넘어서 새로운 프로그래밍 방식 모색하는 급진적 접근 방식 >> 새로운 패러다임
- 프로그래밍 패러다임
- 프로그래밍 패러다임은 문제 해결을 위한 접근 방식의 틀을 제공, 시대와 상황에 따라 발전
- 명령형 패러다임
- 사람이 원하는 결과를 얻기 위해 컴퓨터에게 절차를 명령
- 프로그램의 흐름을 제어
- 변수 값을 변환하여 데이터를 조작하는 구조
- C/C++
- 함수형 패러다임
- 변수를 사용하는 것을 지양
- 함수의 조합을 통해 결과 도출
- 수학적인 함수 개념 기반 순수함수(pure function) 사용
- 상태 변화 없이 연산 수행
- Scheme과 Haskell
- 논리형 패러다임
- '어떻게'가 아닌 '무엇'을 해결해야 하는지에 중점
- program = data structure + algorithm (=logic+control)
- 문제와 해결 방식을 선언적으로 정의
- Prolog
- 프로그램 실행 순서보다는 논리 구조에 의한 해답
- 객체 지향 패러다임
- 실세계의 객체 개념을 프로그램으로 모델링
- 코드 재사용과 유지보수를 용이하게
- 객체는 데이터와 메서드를 포함 / 클래스와 인스턴스를 통해 객체의 관계 정의
- Java, C++ 등에서 사용
- 상속, 다형성 등의 개념을 통해 모듈화와 코드 재사용성을 강조
- 소프트웨어 위기
- 언어의 정의
- 구문(Syntax) = 형태
- 프로그래밍 언어의 구문은 프로그램의 구조와 문법 정의
- 문맥-무관 문법(CFG)과 배커스-나우어 형태(BNF)라는 표준 규칙을 통해 표현
- C 언어의 if 문 구문을 통해 조건문 정
- 의미(Semantics) = 뜻
- 구문이 수행할 동작을 설명
- 프로그램이 실행하는 의미적 내용 정의
- 정형적 의미론을 통해 연산적 의미론, 표기적 의미론, 공리적 의미론의 방식으로 프로그램의 의미를 수학적으로 분석할 수 있음. 올바르고 정확한 소프트웨어를 작성하는 데 필수적
- 구문(Syntax) = 형태
- 언어의 구현
- 언어 구현 방식
- 프로그래밍 언어의 구현은 사용자에게 해당 언어를 실질적으로 사용할 수 있게
- 번역 방식(컴파일러), 통역 방식(인터프리터), 혼합 방식 / 각각의 장단점
- 번역 방식(컴파일러)
- 소스 코드를 한 번에 기계어로 변환하여 실행
- 실행 속도가 빠르며, 최적화된 코드 생성이 가능
- 통역 방식(인터프리터)
- 코드 문장을 한 줄씩 실행
- 즉각적인 실행이 가능하나 느림
- 파이썬, 루비
- 혼합 방식
- 자바 - 소스 코드를 바이트 코드로 컴파일한 후, JVM(Java Virtual Machine)이 실행
- 이식성과 효율성 동시 확보
- 언어 구현 방식
- 언어의 설계
- 복잡성 제어를 위한 추상화
- Alfred N. Whitehead
- 프로그래밍 언어의 표기법이 인간의 두뇌를 불필요한 작업에서 해방시키고, 고차원적 문제 해결에 집중할 수 있도록 돕는다
- Algol60에서 순환(recursion)을 도입하여 문제 해결의 효율성 높임
- 추상화가 프로그래밍의 복잡성을 제어하는 중요한 역할을 한다
- 복잡성 제어를 위한 추상화
'[ Computer Science ]' 카테고리의 다른 글
[Programming Language] 6. 구문 (4) | 2024.11.01 |
---|---|
[Programming Language] 5. 설계 원칙 (0) | 2024.10.31 |
[Programming Language] 4. 프로그래밍 언어 개발의 역사 (6) | 2024.10.31 |
[Programming Language] 2. 추상화 (2) | 2024.10.31 |
[Programming Language] 1. 프로그래밍 언어론 개요 (0) | 2024.10.31 |