프로그래밍언어개론 - Syntax and Semantics

ensalada.de.pollo·2024년 4월 21일
0

프로그래밍 언어란 무엇인가?

프로그래밍 언어란, 말 그대로 프로그램을 작성하기 위한 언어입니다.

  • 여기서 '언어'라고 하는 것은, 무언가와 소통하기 위한 일종의 '약속'을 의미합니다.
    • 예를 들어서 한국어는 한국인과 소통하기 위한 약속 체계이겠죠.
  • '프로그래밍 언어'란 컴퓨터와 소통하기 위한 일종의 '프로토콜'입니다.
    1. 사람이 프로그래밍 언어로 프로그램을 작성하면,
    2. 컴퓨터는 프로그램을 구문구조에 기반하여 읽고 의미를 이해하고,
    3. 이해한 의미를 수행하고
    4. 그 수행한 결과를 사람에게 반환합니다.

위와 같은 일련의 과정은 컴퓨터와 사람이 소통하는 모습을 보여줍니다.

우리는 프로그래밍 언어로 프로그램을 작성하는 방법을 많이 배웠습니다.
그래서 1번 과정보다는 2번 이후의 과정을 초점에 두고 공부를 해볼 것입니다.

Machine Languages

기계어라고 합니다.

  • 말 그대로 컴퓨터가 사용하는 언어로, 모두가 알다시피 0과 1로 이루어져 있습니다.

  • 컴퓨터 구조 과목에서 배웠듯이 CPU마다 기계어를 해석하는 능력이 다릅니다.

여기서, Instruction Set Architecture(ISA)라는 개념을 정의하고 가겠습니다.

ISA는 마이크로프로세서가 인식해서 기능을 이해하고 실행할 수 있는 기계어 명령어 집합을 의미합니다. 쉽게 정의하면 하드웨어와 소프트웨어 사이 인터페이스를 정의하는 것입니다.

그래서 만약 x86 architecture와 ARM architecture가 있다고 해봅시다. x86 architecture에서 프로그램을 만들었습니다. 이 프로그램을 어떠한 과정 없이 바로 ARM architecture에서 실행할 수 있을까요?

소프트웨어를 해석하는 interface가 다르니까 실행할 수 없을 것입니다. 즉, 서로 말이 통하지 않는 것입니다.

이러한 이유로 같은 architecture가 아닌 이상 동일한 프로그램을 실행할 수 없는 것입니다.

  • 사람이 읽거나 작성하지 어렵다는 특징 또한 있습니다.
    - 프로그래밍 언어가 발전한 이유 중 하나이기도 합니다.

Assembly Languages

저수준 프로그래밍 언어입니다.

  • 문자열 형태를 가진 명령어입니다.
    - e.g. mov, add, lea etc...
  • 특정 CPU를 대상으로 하는 언어입니다.
    - 기계어와 밀접한 연관이 있어 일반적으로 기계어와 1대1 대응관계를 가집니다.
  • 높은 성능을 위해서 현대에도 많이 사용하기는 합니다.
    - e.g. inline assembly in C/C++

High-Level Programming Languages

우리가 잘 알고 있는 C/C++, Java, Python 등을 의미합니다.

  • 1세대가 기계어이고, 2세대가 어셈블리어라고 했을 때 3세대 이상의 언어를 의미합니다.
  • 사람이 쉽게 읽거나 작성할 수 있는 형태입니다.
    - 이 부분에서 기계어와 차이가 있네요.
  • 범용 프로그래밍 언어이기에 넓은 범위의 문제 해결에 활용합니다.
  • 하드웨어가 추상화되어있어 하드웨어에 대한 이해를 필요로 하지 않습니다.

Differences among PLs

언어마다 서로 다른 구문구조(syntax) 및 의미(semantics)를 가집니다.

  • e.g. 분기문 syntax
    • C: if-else
    • OCaml: if-then-else
  • "and"라는 연산자의 의미
    • Python
      첫 번째 피연산자를 계산하고
      그 결과가 false이면 false를 반환
      그 결과가 ture이면 두 번째 피연산자 계산결과를 반환
    • Ruby
      첫 번째와 두 번째 피연산자를 차례로 계산
      두 계산결과가 모두 true이면 true, 그렇지 않으면 false 반환

언어마다 서로 다른 특성 및 표현력을 가지기도 합니다.

  • 특성의 차이
    • C: 프로그램의 성능에 초점, 때문에 시스템 프로그래밍에 적합
    • OCaml: 프로그램의 안정성에 초점, 때문에 application 프로그래밍에 적합
  • 표현력의 차이
    • C: pointer, loop, inline assembly 등을 활용해 최적화된 알고리즘 구현
    • OCaml: 함수를 값으로 활용한 간결한 프로그래밍, 불변성을 이용한 컴파일러 최적화 및 동시성 프로그래밍에 적합

또한, 언어마다 서로 다른 패러다임을 지향합니다 (OOP, Non-OOP etc)

How programs are executed on computers

앞서 언급했듯이, 컴퓨터는 프로그래밍 언어를 있는 그대로 이해하지 못합니다!
그래서 어셈블리어로 바꾸고 기계어로 바꾸고... 그런 작업을 했던 것인데요,
이 과정을 조금 더 살펴보고자 합니다.

  • "번역기" 또는 "해석기"를 활용한다.
    • 번역은, 언어 A를 이해할 수 있는 동일한 의미의 언어 B로 변환하는 것입니다.
    • 해석은, 문장 또는 행위 등의 내용을 판단하고 이해하는 것입니다.

글로 적으니까 이해가 잘 되지 않을 수 있는데,
번역이라는 것은, 형태를 옮기는 것이고,
해석이라는 것은, 이해 그 자체를 하는 것입니다.

Compilation

프로그래밍 언어를 번역하는 것을 compilation이라고 합니다!
컴파일러는 익히 들어보았을 것입니다. 그냥 그걸 생각하면 될 것 같습니다.

compilation은 프로그래밍 언어 A로 작성된 프로그램을 프로그래밍 언어 B로 번역하는 행위를 의미합니다.

  • 보통 고수준 언어를 저수준 언어로 번역한다.
  • 당연히 이 행위는 컴파일러가 수행을 한다.
  • 입력된 프로그램에 대해 다양한 안정성 검증 과정을 수행한다.
    • 보통 컴파일 할 때 syntax error 같은 거 띄우는 역할이라고 생각하면 됩니다!
  • 성능 향상 또는 프로그램 크기 축소를 위해 다양한 최적화 수행
    • 얘는 당장 와닿지 않을 수 있는데 차차 알 수 있을 것입니다!
  • 번역이 프로그램의 "의미"를 오역하지 않는다.
    • 이 설명은 사실 이상적으로 바라본 것이고, 현실적으로는 번역의 품질에 대한 검증 절차(Translation Validation, TV)가 미비합니다.

0개의 댓글