카테고리 없음

프로그래밍 언어의 개념 1탄

seungdols 2015. 1. 3. 17:26


프로그래밍 언어란?

컴퓨터에 대한 이해와 활용이 컴퓨터의 발전을 만들게 되었다. 


컴퓨터의 발전으로 프로그래밍 언어에도 발전이 필요하게 되었다.


언어의 분류


- 저급 : 어셈블리어 , 기계어

- 고급 : 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 이러한 수순으로 하게 된다.



반응형