프로그래밍 언어란?
컴퓨터에 대한 이해와 활용이 컴퓨터의 발전을 만들게 되었다.
컴퓨터의 발전으로 프로그래밍 언어에도 발전이 필요하게 되었다.
언어의 분류
- 저급 : 어셈블리어 , 기계어
- 고급 : C, C++ , Java, C#등
고급언어 : 기종에 따라 다르게 표현되는 저급언어의 문제점 해결
프로그래밍 언어의 개념을 왜 학습하는가?
1. 프로그래밍 언어 선택 능력 향상
목적에 따른 언어에 대한 선택이 효율성을 증대시킬 수 있다.
2. 새로운 언어의 습득이 쉽다.
3. 언어 설계 능력.
4. 언어의 이해와 효율적인 알고리즘 작성
5. 유용한 프로그래밍 구사 능력.
추상화
- 주어진 어떤 것들에 대해 필요로한 만큼만 묘사 - 나머지는 은닉
예를 들어서 PC의 자료표현(2진수) - 변수로 대응 시킬 수 있다.
추상화의 목적은 가독성을 향상 시키기 위한 것.
프로그래밍언어 설계 원칙
- 효율성
목적코드, 번역, 구현, 훈련, 유지 보수
- 일반성
일반적인 성질을 묶는 것을 말한다.(관련 개념끼리)
- 직교성
문맥에 따라 제한이 생기면 안되는 것을 말한다.
- 획일성
비슷한 것은 비슷한 것으로 다른 것은 다르게 보여야 한다.
- 간결성
언어의 Soft한 성질
- 표현력
복잡한 과정 그리고 구조를 얼마나 쉽게 표현 할 수 있는지.
- 정확성
언어에 대한 정의가 있는지?
- 기계 독립성
특정 기계에 의존적이지 않고, 독립적인 것을 의미한다.
단 , 2가지는 종속적일 수 밖에 없다.
( 주소 할당 문제 = alignment 4byte? 8byte? 먼저 할지에 대한 문제점.
그리고 Big endian에 관한 문제점이 종속적이다. )
- 신뢰성
오류가 적어야 쉬운 에러를 발견 할 수 있다.
+ Type Checking , Exception Handling : 예외처리는 자바, C++, C#이 대표적이며 C언어의 경우에는 모든 예외에 대해 방어 코딩을 해야 한다.
+ Aliasing : 많이 허용 할 수록 신뢰성이 떨어진다.
컴퓨터 구조에 대해 잠깐 알아봅시다!
폰 노이만 아키텍처
- 메모리는 CPU와 분리 됨
- 명령어와 data는 메모리로부터 하나씩 CPU로 로드
- 변수를 메모리 주소로 매핑 ( 절차적 언어의 특징 )
- 내부에 bus가 많아서 병목현상이 줄어든다.
하버드 아키텍처
- 명령어와 Data 같이 존재
- 병목현상이 발생
언어의 변천사
1950년대 ~ 60년대
프로그램이 단순
60년대 : 기계의 효율성이 중요 ,가독성, 제어문이 필요,사람들의 효율성 증요.
이때 다익스트라가 구조화 프로그래밍에 대해 제안했다.
Top-down design
step-wise refinement
70년대 : 프로세스 위주에서 데이터 위주 처리
자료 추상화의 개념
80년대 : 객체 지향 프로그래밍
자료 추상화 + 상속 + 다형성
Smalltalk가 C++ , Java, C#에 영향을 주었다. 그리고 아이폰의 계열 개발 언어인 Object-C는 스몰토크를 계승한 언어이다.
Procedure-oriented의 경우는 병행성에 대한 문제로 쓰이지 않게 됨.
명령형 언어의 특징
- 순차적 실행
- 변수 사용
- 배정문 사용
= 단점
병목현상, 많은 자료의 계산, 순서에 관계가 없다면 효율이 떨어짐.
함수 언어
- 재귀함수의 제안
- list 구조
- 변수, 배정문을 사용하지 않는다.
논리 언어
- 기호 논리의 원리를 계산, 규칙 나열에 의해 처리
-개체 대한 사실과 관계 규칙을 이용하여 원하는 결과를 얻어 낸다.
- 변수, 배정문이 사용 되지만, 명령형 언어와 의미가 다르다.
객체 지향언어
- 명령형, 함수, 논리 언어 어느 것과도 결합이 가능함.
- 추상화, 상속, 동적 바이딘 개념을 지원
유래는 Simula67에서 파생 되었다.
언어의 구현방식
1. 컴파일 기법
기계어로 변환하는 방식이며 , 상업적 시스템에서 효율적이다.
= 변환은 느리나 실행이 빠른 장점
= 컴파일 하는 단계가 존재한다.
2. 순수 인터프리터
Line 마다 번역하며, 작고 효율적이지 않아도 되는 경우
= 실행오류를 미리 알 수 있다.
= 속도가 느리다.
= 공간 소모가 크다.
3. 하이브리드
중간단계라고 할 수 있다.
예로 Java언어를 들 수 있다.
Java code - byte code (JVM) - 기계어
+ JIT compiler(Just in Time)
중간언어 번역후 기계어 번역 코드를 저장 후 재호출 시에는 바로 기계어 코드를 사용한다.
Java , dot Net
컴파일 순서는
Builer - preprocessor - compiler - linker - loader 이러한 수순으로 하게 된다.