프로그래밍언어는 인간의 언어를 기계어 코드로 변환할 수 있는 규칙들의 집합(set of rules)이다.
프로그래밍 언어가 필요한 주 목적은 기계와의 communication에 있다. 그러나 이 뿐 아니라, 프로그래밍 언어를 이용하면 모호한 자연어를 이용하여 소통하는 것보다 사람들 간의 소통이 더 명료해지기도 한다.
기계어는 0과 1의 이진법 체계로 이루어져 CPU는 이해 가능하지만 사람들이 이해하기에는 어려운 언어를 이른다. 각 CPU마다 그에 맞는 specific한 기계어를 가지고 있다.
어셈블리어는 로우 레벨의 언어로서, 기계는 이해하지 못하지만 사람은 이해할 수 있는 언어다. 기계어를 어셈블리어로 직접적으로 변환할 수 있다.
니모닉(mnemonic)이란 기억을 돕는다는 뜻으로, 기억하기 쉽도록 간략하게 만든 코드(LDA, ADD 등)
C/C++, Python, Java, Ocaml 등의 하이레벨 프로그래밍 언어들은 기계어가 이해하지 못하고 사람들이 이해할 수 있는 언어들이다.
프로그래밍 패러다임은 명령형 프로그래밍과 선언형 프로그래밍으로 나눌 수 있는데, 명령형 프로그래밍은 무엇을 할 것인지보다 어떻게 할 것인지를 설명하는 방식이라면 선언형 프로그래밍은 어떻게 할것인지보다 무엇을 할 것인지 설명하는 프로그래밍이다.
📌 syntax의 차이
< 조건문 syntax >
C : if-else
Ocaml : if-then-else
📌 semantics의 차이
< and 연산자의 semantics >
Python : Short-Circuit-Evaluation (=AND 혹은 OR 의 연산의 결과가 확실히 예측될 때 뒤에 나머지 연산을 실행하지 않는 것)
if (1==2 and 1==1) 에서, 전자가 False면 후자는 검사하지 않는다.
Ruby : 전자의 값과 상관 없이 스킵하지 않고 검사한다.
📌 property
C : performance (성능)이 좋으므로 시스템 프로그래밍에 적합
Ocaml : reliability가 좋으므로, 어플리케이션 프로그래밍에 적합
📌 expresiveness
C: Pointer, Inline Assembly 등 low-level memory에 접근하고 변경하는 것 가능. 알고리즘 최적화에 적합.
Ocaml : low-level memory 변경이 불가능. functions as value가 가능하므로 간결한 프로그램(concise program)에 적합.
새로운 프로그래밍언어를 개발할 때에는, syntax와 semantics를 개발해야 한다.
1) 프로그래밍 언어의 Syntax 정의
How the language 'looks like'
2) 프로그래밍 언어의 Semantics 정의
How the language 'operate'