프로그래밍언어

[Programming Language] Preliminaries

프로그래밍언어를 배우는 이유

  적합한 언어를 고를 수 있는 백그라운드, 생각을 표현할 수 있는 능력 향상, 새로운 언어를 배울 수 있는 능력 등 입니다. 예를 들어 Perl로 배열을 구현해서 C로 똑같이 구현하기, 객체지향 개념을 자바로 배우기, 프로그램 버그 고치는 능력 등입니다.

 

프로그래밍 영역

과학응용분야 - Fortran

사무응용분야 - COBOL 

인공지능분야 - LISP, Python, R

시스템 프로그래밍 - C(Unix가 OS)

웹 소프트웨어 - Javascript, HTML

 

언어평가기준-Readablility 판독성

유지보수의 용이성(ease of maintenance)는 판독성으로 대부분 결정됩니다. 

-Overall Simplicity (전반적인 단순성) : 프로그램의 작성자가 그 판독자가 잘 알고 있는 언어의 부분들과 다른 부분집합들을 배웠을때 문제발생.  특징 다중성(minimal feature multiplicity): 특정연산을 수행하는 데 한 가지 이상의 방법을 가지는 것, 연산자 중복(operator overloading):예를 들어 +연산자 : 모든원산자들의 합, 백터 덧셈 

-Ortogonality (직교성) : 상대적으로 적은 개수의 기본 구조들이 상대적으로 적은 개수의 방법으로 조합되어 언어의 제어 구조와 데이터구조가 생성될 수 있다는 것을 의미합니다.

-Data types (데이터 타입) : 데이터 타입과 데이터 구조를 정의할 수 있는 충분한 장치를 제공하는 것이 좋다.

ex) 1 대신 true

-Syntax considerations (구문 설계) : Identifier forms, special words(특수어) 

Readablility : 핵심은 simple하다는 것입니다. orthogonal직교성과 연관됩니다. 교차부분이 작아져서 simple하다는 것입니다. 

언어평가기준-Writablility 작성력

-Simplicity and orthogonality (단순성과 직교성)

-Support for abstraction (추상화)

-Expressivity (표현력) : count=count+1 -> count++ , while->for(루프 카운트)

언어평가기준-Reliability 신뢰성

-Type checking (타입 검사) : 타입에러검사.  런타임타입검사는 비싸다. 컴파일타입검사가 더 좋다(자바)

-Exception Handling(예외 처리) : 프로그램이 런타임에러를 가로채서, 수정하여 실행할 수 있는 능력. C++, JAVA, C#. 신뢰성에 도움이 되는 항목. 

-Aliasing (별칭) : 동일한 기억장소에 접근하는데 사용할 수 있는 두개(or more)이상의 다른 이름을 갖는 것. 신뢰성을 향상하기위해 별칭을 제한할 수 있다.

-Readability and Writability (판독성과 작성력) : readability는 신뢰성과 반비례.

자연스런 방법을 지원하지 않는 언어의 프로그램은 어쩔 수 없이 부자연스러운 접근방법을 함으로써 신뢰성을 저하한다. 

언어평가기준-Cost 비용 (가볍게 보고 넘어가기)

1. Training progrmmers to use the language 프로그래머 교육비용

2. Writing programs 프로그램 작성비용

3. Compiling programs 프로그램 컴파일비용

4. Executing programs 프로그램 실행비용(Optimization_최적화) _코드사이즈 줄이기, 실행속도 높이기.

5. Language implementation system 언어구현 시스템의 비용

6. Reliability 신뢰성 부족에 따른 비용

7. Maintaining programs 프로그램 유지보수 비용_poor readability는 비용을 높임

언어평가기준-기타

-Portability 이식성

-Generality 일반성

-Well-definedness 분명성 

 

Influences on Language Design 언어 설계에 미친 영향

-컴퓨터구조: 폰 노이만 구조 von Neumann architecture _지난 50년간 가장 인기있고 널리 대부분 사용되었다.

-Program Design Methodologies 프로그래밍설계방법론 :  새로운 방법론(예를 들어, 객체지향)패러다임

-Imperative languages: 명령형 언어: 폰 노이만 컴퓨터에서, 데이터와 프로그램은 모두 동일한 기억 장소에 저장된다. 명령어를 실행하는 중앙처리장치(CPU)는 기억 장소로부터 떨어져 있다. 따라서 명령어와 데이터는 기억 장소로부터 CPU에 전달되어야 하고, CPU의 연산결과는 다시 기억 장소에 전달되어야 한다. 

-명령형 언어 특징들: (1)기억장소위치를 표현하는 변수Variables의 사용(기억장소 셀 모델)

(2) 변수의 값을 변경하기 위한 배정문Assignment statements의 사용(piping모델)

(3) 명령의 순차적 실행_Iteration(반복)_반복문의 명령어들은 메모리(기억장소)에 인접하여 저장되어 있고, 반복문은 폰 노이만 컴퓨터에서 효율적으로 빠르게 실행된다.

폰노이만컴퓨터 구조에서 기계코드 프로그램의 실행_기계주기(Machine Cycle)

fetch-execute cycle

initialize the program counter
repeat forever
	fetch the instruction pointed by the counter
    increment the counter
    decode the instruction
    execute the instruction
end repeat

Language categories

Imperative: C, Java, Perl, Javascript, Visual BASIC, .NET, C++

Functional: LISP, Scheme, ML, F#

Logic: Prolog

Markup/programming hybrid: JSTL, XSLT(HTML, XML확장판)

 

Implementation Methods

1.Compilation (컴파일러 실행) 

JIT와 같은 기계어로 프로그램 해석합니다. ex)C, C++, COBOL, Ada

Slow translation, fast execution 해석은 느리지만 실행은 빠릅니다.

이 과정의 단계는 -

(1) Lexical analysis(tokens)_어휘분석기

(2) Syntax analysis(parse tree)_구문분석기

(3) Semantics analysis(type checking)_의미분석기

(4) Code generation(target machine dependent)_코드생성기(기계어 프로그램으로 변환)

 

그림으로 컴파일과정을 보겠습니다. 

2. Pure Interpretation

No translation

program implementation 쉬움

Slower execution

 

3. Hybrid Implementation 

compiler와 pure interpreter를 섞은 것으로 

JVM이 대표적 예시입니다. JVM은 Interpreter와 run-time system입니다. 

 

Interpretation vs Compilation

Interpretation: 소스코드들을 한줄씩 읽어들여 머신코드로 실행하는 방식

매번 실행할 때마다 translation필요해 overhead발생할 수 있다. 

Compilation: Ahead-of-time(AOT) compilation으로 실행하기 전에 소스코드들을 머신코드로 번역하는 정적 컴파일입니다. 번역된 어셈블리어또는 머신코드를 재사용합니다.

 

JIT 컴파일러

프로그램을 실제 실행하는 시점에 기계어로 번역하는 컴파일 기법입니다.