Computer Science/프로그래밍언어론

[Programming Language Pragmatics] 01 Introduction

계속지나가기 2020. 10. 19. 11:46
반응형

(해당 강의노트는Michael L. Scott의 [Programming Language Pragmatics : 4th edition] 책을 기반으로 작성되었습니다)

01 Introduction

Table of Contents

  1. Introduction
  2. The art of Language Design
  3. The Programming Language Spectrum
  4. (pass)
  5. (pass)
  6. (pass)
  7. An Overview of Compilation

0. Introduction

  1. Programming in Old Days
  • 초기 컴퓨터들은 monstrous 장치였음
    • monstrous: very bad, because too big
  • Programmers were cheap
  • Machine language로 프로그래밍 함
  1. Machine Language
  • bit의 나열로 직접적으로 프로세서를 컨트롤함
  • 기계어로 짠 GCD Algorithm

GCD Program in x86 machine program

 

  1. The next step was writing in assembly language
  • 앞서 010011 비트로 표현하는 것보다 코드가 짧고 훨씬 효율적임(가독성이 더 좋음)
  • 속도가 빠르기 때문에 성능이 중요한 프로그램에서는 현재도 사용하는 언어
  • Use mnemonic abbreviations
    • mnemonic abbreviations? a short form of a word that helps remember something
  1. Assembly Language
  • the one-to-one mapping between mnemonics and machine language instructions translated by an assembler
    • mnemonic과 기계어 사이의 일대일 매핑을 통해 어셈블러가 해석을 진행하게 됨
  • 어셈블러는 매크로 확장을 통해 일반적인 명령 시퀀스에 대한 매개변수화된 약어를 정의한다.
  • 기계어보다는 쉽지만 아직도 어렵고, 기계중심적인(Machine-centered) 언어임
    • System-specific(not portable) : 이식성이 좋지 않음, 종속적임
  • 어셈블리어로 짠 GCD Algorithm

GCD program in x86 assembler

  1. 고급언어의 등장 배경
  • 숫자 연산 능력과 관련된 machine-neutral programming languages 에 관한 Dream으로 Fortan 등장
  • 또한 이식성이 좋은, 기계 독립적인 언어를 원하게 됨
    • 어셈블리어의 경우 이식성이 좋지 않아 같은 프로그램이라도, 기계마다 다 다른 언어를 작성해주어야 했음
  • 처음에는 사람이 더 빨랐으나 점점 시간이 지나면서 컴파일러로 하는게 더 빨라지기 시작함
  • 이후 고급 언어로, Lisp, Algol등이 등장함
  • 고급언어를 어셈블리어 혹은 기계어로 변환해주는 작업을 하는 것이 컴파일러의 역할이 됨
  1. Need to economize the programmer effort
  • 프로그램의 유지보수 문제면에서 컴파일러가 나음
  • 프로그램의 원래 구조를 더 잘 보존 가능
  • 인력을 좀 더 효율적으로 사용할 수 있음

1. The Art of Language Design

Why are there so many programming languages?

  1. Evolution : 시간이 지날수록 더 좋은 방법으로 배우길 원한다
  • The constant development of accomplishing things
  • goto-based control flow(Fortran, Cobol, Basic)
  • 구조화된 프로그래밍: goto 중심의 흐름제어 대신에 while loop, case(switch) 등의 선언 중심 control flow 등장
    • Algol, Pascal, C, Ada
  • OOP(Smalltalk, C++, Eiffel, Java, C#)
  • 스크립트 언어는 신속한 개발을 위해 더 전통적인 컴파일 언어들을 대체한다(Python, Ruby)
  1. Special Purpose
  • 구체적인 문제 영역을 위해 디자인된 언어들.
    • Lisp dialects : 심보릭 데이터와 복잡한 데이터 구조체
    • Icon and Awk : 문자열을 조작하기에 좋음
    • C : 저언어 수준의 시스템 프로그래밍
    • Prolog : 데이터 사이의 논리적 관계에 대한 추론(inference = reasoning)
  • 다른 일반적인 작업에서도 사용 가능하긴하나 각각의 전문적인 부분에 좀 더 포커스된 언어들임

3.. Personal Preference

  • 사람들마다 선호도가 다름
  • Recursion/Iteration
  • Pointer 개념의 유무
  • 보편적으로 수용가능한 프로그래밍 언어는 불가능할 것 이다.

What makes a language successful?

  1. Expressive power : 표현 능력
  • 다른 언어들보다 표현력이 더 좋음
  • 언어들의 특징 : 프로그래머들의 유지보수, clear, concise(간결)한 코딩 능력에 도움을 주는 언어
  • 이 책의 주요 쟁점이 될 것임
  1. Ease of use for the novice: 초심자에게 쉬운 언어
  • Basic, Pascal과 같은 언어
  1. Ease of Implementation : 구현이 쉬운 언어
  • Basic, Forth, Squeak
  • Pascal
  1. Standardization : 표준화
  • 표준화는 플랫폼 전반에 거쳐 이식성이 좋은 것을 보증하는 only truly effective way이다.
  1. Open Source
  • 오늘날의 대부분의 프로그래밍 언어는 최소한 하나의 컴파일러 혹은 인터프리터 오픈소스를 가지고 있음
  • C language(GCC 계열), UNIX operating system
  1. Excellent Compilers
  • Fortran, Common Lisp
  1. Economics, Patronage, and Inertia : 경제, 후원, 관성(유지보수 면)
  • 기술적 메리트보다 성공에 더 영향을 미치는 요인
  • 스폰서가 좋음(회사에서 만든 언어들)
  • 시간이 지나도 유지보수면이 좋은 언어들
  1. No one factor detemines whether a language is "good"
  2. 프로그래머와 언어 구현자의 관점에서 생각해볼 필요가 있음
  • 실행속도에 대한 소망은 두 관점 모두 빨라지기를 원함
  • 하지만 가성비(프로그래머 관점), 퀄리티(언어 구현자 관점) 사이에서는 의견차이가 있음

2. The Programming Language Spectrum

: 많은 종류의 언어들은 computation방법에 따라 분류됨

The top-level division of programming languages

  1. Declarative(선언적)
  • 컴퓨터가 무엇을 하는지에 포커스
  • 속성이 선언되어 있음, 단 실행순서가 구체적으로 지정되어있지 않음
  • 비교적 higher level로, 사용자 입장의 언어

subfamilies

programming languages

functional

Lisp/Scheme, ML, Haskell …

dataflow

Id, Va1

logic or constrained-based

Prolog, spreadsheets, SQL…

  1. Imperative(절차적)
  • 컴퓨터가 어떻게 해야하는지에 포커스
  • 행동지향적
  • sequence of actions의 관점으로 computation
  • predominate, 이 방식이 더 빠르므로 대부분의 컴퓨터 시작에서는 이 방법을 채택
  • Imperative(절차지향): the form of a verb that is usually used for giving orders

subfamilies

programming languages

von Neumann

C, Ada, Fortran, Pascal, Basic…

object-oriented

Smalltalk, Eiffel, C++, Java

scripting

Perl, Python, PHP

  1. Functional Language(함수적 언어)
  • 함수의 recursive definition에 기반한 computational model 차용
  • 1930년대에 개발된 lambda calculus에 기반
  • Input/Output 이 있는 함수적 언어
  • Iteration is often accomplished through recursion
  • Lisp, ML,Haskell 등이 함수적 언어에 속함
  1. Dataflow languages
  • 초기의 함수적 노드들 사이의 정보의 흐름으로 model computation
  • Id, Val, LabView
  1. Logic or constraint-based language
  • 특정 구체화된 관계를 나타내는 값을 찾으려는 시도로 model computation
  • Prorlog
  1. von Neumann languages
  • 매우 친숙하고 널리 유용되고 있는 언어
  • Fortan, Pascal, Basic, C
  • 폰 이만 언어들은 메모리의 값의 변화라는 side effect를 통해서 subsequent computation에 영향을 미치는 statement에 기반함
    • side effect : 만약 값을 반환하는것 이외에 함수나 표현식의 선언이 수정될 경우 side effect를 일으킨다고 한다.
  1. Object-oriented language
  • 폰 노이만 언어들과 긴밀히 연관되어 있음
  • C++, JAVA, Smalltalk
  • OO-functional languages: CLOS, OCaml
  1. Scripting Language
  • 폰 노이만 언어의 부분집합에 해당하는 언어
  • 몇몇 스크립트 언어들은 구체적인 목적으로 개발됨
    • csh, bash : job control을 위한 input language
    • awk : text manipulation
    • PHP, JavaScript: intended for the generation of dynamic web content
    • Lua is widely used to control computer games
  • Python, Ruby, Tcl, Perl are more generic, rapid prototyping

GCD algorithm in different languages

: 각기 다른 언어들로 GCD(최대공약수)를 찾는 코드를 짜보자

 

Imperative language: 절차지향언어

int gcd(int a, int b){
 while( a != b ){
     if( a > b) a -= b;
     else b -= a;
 }
 return a;
}

Functional language로 짜보기 : Input/Output 의 수학적 관계를 강조하여 코딩

// OCaml
let rec gcd a b =
  if a = b then a
  else if a > b then gcd b (a - b)
      else gcd a (b - a)

Logic language로 짜보기 

gcd(A,B,G) : - A = B, G = A. % Prolog
gcd(A,B,G) : - A > B, C is A-B, gcd(C,B,G).
gcd(A,B,G) : - B > A, C is B-A, gcd(C,A,G).

Language families사이의 구분은 명확하지 않음

  • 폰노이만 언어와 객체지향 언어 사이의 구분은 확실치 않으며 또한 많은 스크립트 언어들은 또한 객체지향이기도 함
  • 요즘의 많은 언어들이 서로의 장점을 차용하고 있기 때문에 확실히 구분되어 지지 않음
    • 대부분의 함수형, 로직 언어들은 몇몇의 절차적인 특징을 가지고 있음
    • 몇몇의 절차언어들은 함수 특징을 추가하기도 함
  • 경계상에 있는 언어들이 많음

6. An Overview of Compilation

일련의 잘 정의된 단계를 통해 일반적인 컴파일 과정 진행 방식

  • 앞의 부분에 있는 몇단계(up through semantic analysis)인 front-end 뒤의 몇단계 back-end로 구분된다

Phase of Interpretation

반응형