[PL] Syntax and Semantics

👑 Programming Language

프로그램을 작성하기 위한 프로그래밍 언어는 컴퓨터와 소통하기 위한 일종의 프로토콜이라고

할 수 있다. 태초의 프로그래밍 언어인 기계어부터 어셈블리어, C, C++, Java, Python, OCaml

등의 언어들은 모두 각자의 구문구조(Syntax)의미(Semantics) 를 가진다. 이로 인해

언어마다 다른 특성 및 표현력을 가지며, 각자의 장단점을 가지게 되는 것이다.

예를들어 C 는 프로그램 성능에 초점을 맞추어 시스템 프로그래밍에 적합한 언어인 반면에

OCaml은 프로그램 안정성에 초점을 맞추어 어플리케이션 프로그래밍에 적합한 언어이다.


👑 Compiler & Interpreter

컴퓨터는 프로그래밍 언어을 있는 그대로 해석하지 못한다. 즉 Hight-level 언어를 기계어로

변환해주어야 한다. 이때, 사용할 수 있는 방법으로 CompilerInterpreter가 있다.


💡 컴파일러(Compiler)

컴파일이란 고수준 언어를 실행 프로그램으로 만들기 위해 저수준 언어로 번역하는 행위이다.

컴파일러 (Compiler)에 의해 수행되며 입력된 프로그램에 대해 컴파일러는 다양한

안정성 검증 과정과 다양한 최적화를 수행한다.

  • 큰 규모의 소프트웨어, 고성능 소프트웨어, 시스템 소프트웨어 개발에 적합하다.

    • 안정성 검증과 다양한 최적화를 통한 성능 향상이 장점이다.


  • 주로 static-typed language 이다.

    • 컴파일 시점에 모든 변수와 표현식의 타입이 결정된다.
    • 컴파일 시점에 타입 검사를 하므로, 안전한 프로그래밍이 가능하다.


  • 몇몇 언어는 타입 추론(type inference)을 제공한다.

    • 타입 시스템이 프로그램을 분석하여 자동으로 변수 및 표현식의 타입을 추론한다.
    let x = 3 in
    let y = "hello world" in
    ---------------------------------
    let x : int = 3 in
    let y : string = "hello world" in
    
    (* 아래의 경우처럼 명시적 표현도 가능 *)
    


  • Compiled Languages 예시

    • C/C++ → gcc or clang → binary
    • OCaml → ocamlc → binary


    • Java → javac → JVML
    • Scala → scalac → JVML


    • C# → mcs → MSIL
    • F# → fsc → MSIL


💡 인터프리터(Interpreter)

프로그래밍 언어로 작성된 프로그램을 해석하여 실행하는 행위

인터프리터 (Interpreter)에 의해 수행되며 프로그램을 입력으로 받아

실행 후 결과를 반환하고, 실행구문에 대한 간단한 검증만을 수행한다.

  • 별도의 번역과 최적화없이 프로그래밍 언어를 바로 해석한다.

    • 하지만, 현대에 들어 많은 인터프리터가 JIT 최적화를 수행하고 있다.


  • 높은 자유도를 활용한 소프트웨어 프로토타이핑, cross-platform 소프트웨어 개발 등에 적합하다.

    • 다양한 동적 특성을 활용할 수 있다.
    • 동일 프로그램이 각 platform 별로 구현된 interpreter를 통해 실행 가능하다.


  • 주로 dynamic-typed language 이다.

    • 실행중에 변수 및 표현식의 타입이 변화한다.
    • 동일 변수에 여러가지 다른 타입의 값을 저장 가능하다.
    • 동일한 표현식이 여러 타입에 대해 다른 동작을 수행한다.
    • 위 특성을 통해 개발자에게 높은 자유도를 제공한다.
    var x = 3;
    var y = 'c';
    x = 10;
    y = "Hello";
    // 다른 타입의 값을 저장해도 문제 없다.
    


  • Script 언어들이 해당한다.

    • JavaScript, SQL, Python, Ruby 등등


👑 Syntax & Semantics

프로그래밍 언어는 구문구조(syntax)의미(semantics)로 구성된다.

따라서 프로그래밍 언어을 정의한다는 것은 구문구조의미를 정의하는 것이라고 할 수 있다.

  • Syntax란 프로그래밍 언어의 “형태”를 말한다.
ISO/IEC 9899 Keywords Syntax
  • Semantics란 프로그래밍 언어 구문의 “실행동작”을 말한다.

    • 일반적으로 자연어로 작성되며, undefined or unspecified behavior가 존재하기도 한다.
ISO/IEC 9899 Keywords Semantics

Categories:

Updated:

Leave a comment