9일차 프로그래밍 언어론

Peter·2025년 4월 11일
0

bootstrap과 fetch()함수를 사용해 간단한 미니프로젝트를 진행했다.
Javascript에서 여태 공부한 것 중 가장 중요한 DOM 제어에 어느 정도 익숙해졌고, 수업은 Node.js로 넘어갔다.

강사님이 교육 과정 중 오늘이 가장 쉬울 거라고 말씀하셨고, 정말 강의 내용은 쉬웠다. 전공자라면 말할 것도 없고 코딩에 관심 있는 사람이라면 한 번쯤 해봤을 별찍기와 메소드 오버라이딩을 실습했다.

강의 중간중간에 수업과 직접적인 관련없는 CS이야기를 해주시는데 CS가 워낙 방대하다 보니 키워드 위주로 언급하고 넘어가는 게 대부분이다.
이번엔 실무 개발과는 밀접하지 않지만 알아두면 좋은 상식 정도인 프로그래밍 언어론에 대해 정리해 보겠다.

1 프로그래밍 언어의 설계 원칙

(1) 효율성 (efficiency)

1 목적 코드의 효율성

목적 코드의 효율성은 번역기가 효율적인 실행 코드를 생성할 수 있어야 함을 의미한다. 여기서 번역기는 컴파일러 또는 인터프리터를 말한다.

2 번역의 효율성

번역의 효율성은 번역기가 효율적으로 실행 코드를 생성할 수 있어야 함을 의미한다. 이는 설계된 언어가 번역기에 의해 빠르게 번역될 수 있어야 함을 뜻하는 것이다.

3 구현 용이성

번역기를 효율적으로 작성할 수 있어야 함을 의미한다. 설계된 언어가 복잡하면 구현 용이성이 떨어지는데 이러한 언어의 예로 ALGOL 60과 Ada를 들 수 있다.

4 프로그래밍 효율성

프로그래밍 효율성은 설계된 언어로 얼마나 빠르고 쉽게 프로그램을 작성할 수 있는가에 달렸다. 언어 구조가 간결하면 프로그래밍 효율성이 높아지는데 LISP가 이에 해당되는 언어이다.

(2) 일반성 (generality)

일반성은 특별한 경우를 피하고 밀접하게 관련 있는 개념들을 하나의 더 일반적인 것으로 결합하는 성질을 의미한다.

(3) 직교성(orthogonality)

직교성은 한 언어의 구성자가 문맥이 다르다고 다른 의미를 지녀서는 안 된다는 성질이다.

(4) 획일성 (uniformity)

획일성은 비슷한 것은 비슷하게 보이고 비슷한 의미를 가져야 하며, 다른 것은 다르게 보이고 다른 의미를 가져야 한다는 원칙이다.

(5) 간결성(simplicity)

간결성은 단어 뜻 그대로 언어가 복잡하지 않고 간결해야 함을 의미한다.

(6) 표현력(expressiveness)

표현력은 언어가 복잡한 과정이나 구조를 얼마나 쉽게 표현할 수 있는가를 의미한다.

(7) 확장성(extensibility)

  1. 확장성은 사용자가 언어에 새로운 기능을 추가할 수 있도록 하자는 성질이다.
  2. 사용자가 새로운 타입을 정의하는 것, 라이브러리에 새로운 함수를 추가하는 것, 번역기에 새로운 키워드를 추가하는 것 등을 언어의 확장성이라 할 수 있다.

(8) 정확성(preciseness)

정확성은 프로그램의 실행을 예측할 수 있도록 하는 언어에 대한 정확한 정의가 있는지를 의미한다.

(9) 기계 독립성(machine independence)

기계 독립성은 언어가 특정 기계에 의존적이지 않고 독립적인 것을 의미한다.

(10) 제약성(restrictability)

제약성은 언어에 대한 최소한의 지식과 일부 언어 구조만 알고 있더라도 프로그램을 작성할 수 있는 성질을 의미한다.

(11) 보안성(security)

보안성은 프로그래밍 오류를 줄이고 오류 발견을 쉽게 하는 언어를 설계하는 원칙이다.

프로그래밍 구현 기법

(1) 컴파일 기법

1 개념

  1. 컴파일 기법이란 주어진 고급 프로그래밍 언어로 작성한 프로그램을 실제 컴퓨터의 기계어로 번역하여 동등한 의미의 기계어 프로그램을 만들어 실행시키는 방법이다.
  2. 일반적으로 컴파일러는 원시(source)언어(고급 또는 저급 언어)로 작성된 프로그램을 입력으로 읽어서 목적(object)언어(저급 또는 고급언어도 가능)로 된 기능이 동등한 프로그램을 출력해주는 언어처리기로 정의된다.

2 번역기의 종류

  1. 컴파일러(compiler): 고급언어인 원시언어를 실제 기계언어에 가까운 저급언어인 목적언어로 만들어 주는 번역기이다. 일반적으로 이 저급언어는 준기계어 형태로 일반적으로 목적 코드 또는 어셈블리 언어가 이에 해당된다.

  2. 어셈블러(assembler): 목적언어가 준기계어 형태라는 점에서는 컴파일러와 유사하나 원시언어가 어셈블리 언어인 번역기를 의미한다. 어셈블러에서는 일반적으로 어셈블리 명령어 하나당 하나의 기계어 명령으로 단순 번역된다.

  3. 링커(linker): 링커(또는 링키지 에디터)는 재배치 형태의 기계어로 구성된 여러 개의 프로그램(대부분의 경우 각각 컴파일된 목적 코드와 라이브러리 프로그램)을 묶어서 로드 모듈(load module)이라는 어느 정도 실행 가능한 하나의 기계어로 번역해 주는 번역기이다.

  4. 로더(loader): 로더는 로드 모듈로 된 기계어 프로그램을 실제 실행 가능한 기계어로 번역해서 주기억장치에 적재한다.

  5. 프리프로세서(preprocessor): 프리프로세서는 원시언어와 목적언어가 모두 고급언어인 번역기인데, 프리프로세서기법은 한 고급언어로 작성된 프로그램을 그에 대응되는 다른 고급언어(주어진 컴퓨터에 구현되어 있는 언어)로 번역하여, 그 출력된 고급언어를 이미 구현된 방법으로 실행시킬 때 사용한다. 일반적으로 주어진 고급언어를 확장한 언어로 설계했을 때, 그 언어를 기존의 표준언어로 번역해서 실행하고자 프리프로세서 기법을 사용한다.


이해하기 위한 이미지1


이해하기 위한 이미지2

(2) 인터프리터 기법

개념

인터프리터는 고급언어로 된 프로그램을 입력으로 읽어 기계어 수행과 동일한 알고리즘으로 프로그램의 각 문장을 디코딩하고 실행시킴으로 써 고급 언어를 시뮬레이션 하는 것이다.

비교

컴파일러인터프리터
목적코드 생성목적코드 생성치 않음
기억장소 많이 필요기억장소 적게 필요
실행시간의 효율성 강조유연성 강조

공통점: 고급언어로 표현된 고수준의 프로그램을 읽어들임




참고 사이트
https://studyenthusiast-26.tistory.com/40
https://howudong.tistory.com/234
https://www.differencebetween.net/technology/communication-technology/difference-between-compiler-and-interpreter/

profile
개발자 지망생. 일단 하고보자

0개의 댓글