충남대학교 컴퓨터공학과 이성호 교수님의 "프로그래밍 언어 개론" 강의를 필기한 내용입니다.
다소 잘못된 내용과 구어적 표현 이 포함되어 있을 수 있습니다.
Imperative <-> Declarative
- Imerative : 보통의 명령들을 나열해 문제를 푸는 방법을 선언하는 방식으로 프로그래밍 하는 것
- Declaraive : 문제를 푸는 방법을 적는게 아니라 어떤 문제인지를 적어서 프로그래밍하는 방법
- 문제는 얘가 알아서 풀어준다
- 옛날에는 구렸는데 요즘은 엔진이 좋아져 종종 쓰인댄다
- SQL같은게 여기에 해당한다고 할 수 있음
프로그래밍 언어의 번역 vs 해석
Compile
- 번역은 그냥 동일한 의미의 기계어로 바꾸는 것 (Compiled language)
- 오류를 컴파일 타임에 잡을 수 있다
- 프로그램 전체를 검토해 기계어로 바꾸기 때문에 최적화 가능 (성능의 이점)
- 비교적 low level이어서 시스템 프로그래밍에도 사용할 수 있다
- 다만 비교적 배우기 어렵고 컴파일 과정이 복잡하다
- 그리고. static-typed language이다
- 컴파일 시점에 변수들의 자료형이 모두 결정된다
- 자바같은 경우에는 JVM이라는 가상 기계어 환경으로 컴파일해 구동하는 과정을 거친다
- 여러 플랫폼에서 일관되게 지원하기 위함
Interprete
- 해석은 언어를 읽고 이해해 바로 실행하는 것 (Interpreted language)
- interprete는 프로그램을 통째로 컴파일하는 과정이 아닌 바로바로 해석해서 실행하게 된다
- 컴파일의 경우에는 통째로 번역하기 때문에 최적화가 용이하지만 인터프리트의 경우 한줄한줄 바로바로 실행하기 때문에 최적화가 어려움
- 속도가 비교적 느리다
- 간단한 검증만을 수행하기 때문에 오류를 미연에 방지하기는 컴파일 언어보다 어렵다
- 대신 배우기 쉽고 자유로우며 자료형들이 동적으로 선언(Dynamic-typed language)된다
- 스크립트 언어들이 여기에 해당된다
- 그리고 shell들도 이런식으로 구동된다
프로그래밍 언어의 구성
- 프로그래밍 언어는 syntax와 semantics로 구성되며 얘네들은 해당 언어의 specification(사용 설명서) 에 기술된다
- Syntax : 명령어들이 어떻게 생겼는지
- Semantics : 해당 syntax가 어떻게 작동하는지를 기술
- syntax별로 semantics가 정의되게 된다
Unspecified Behaviors
- 특정 syntax에 대해 일부로 semantics를 정의 않는 것
- 동작을 정의하는데에 있어 자유를 부여함
- 이때 자유라는 것은 나의 자유가 아니라 어떻게 동작할지는 해당 언어의 컴파일러 / 인터프리터 개발자의 자유이다
- 얘네들을 개발할때 임의적으로 정의해서 개발을 하게 된다는 것
- 컴파일러 / 인터프리터에 따라 다르게 작동할 수 있다
- 보통 어떻게 정의하든 별로 중요하지 않을 때 이런식으로 기술한다
- 정의가 중요했으면 당연히 semantics를 정의했겠지
- 다만 개발자는 얘가 semantics를 정의하지 않은 놈이라는것을 알고는 있어야 한다
Undefined Behaviors
- 특정 syntax에 대해 semantics가 정의 않은 것
- 얘네들은 약간 에러같은애들이다
- 프로그램을 오작동하게 하지만 에러로 처리하기에는 성능면에서 안좋거나 하는 등의 사유가 있는 애들
- 얘를들어서 쓰레기값에 접근하는 경우이다
- 얘네들은 에러는 안나지만 undefined여서 오작동하게 된다
- 따라서 개발자는 어떤 경우에 undefined인지를 반드시 숙지해야 한다