본문내용
1. 프로그래밍 언어의 개요
1.1. 프로그래밍 패러다임과 프로그래밍 언어 패러다임
프로그래밍 패러다임과 프로그래밍 언어 패러다임은 밀접한 관계를 가지고 있다. 프로그래밍 패러다임이 프로그램을 작성하는 방식이나 스타일을 의미한다면, 프로그래밍 언어 패러다임은 해당 언어가 지원하는 프로그래밍 패러다임을 의미한다.
프로그래밍 언어는 대체로 특정한 프로그래밍 패러다임에 특화되는 경향이 있지만, 하나의 언어가 반드시 한 가지 프로그래밍 패러다임만을 지원하는 것은 아니다. 예를 들어 C++, Java, Python 등 많이 사용되는 언어들은 명령형, 함수형, 객체지향 등 여러 가지 프로그래밍 패러다임을 지원한다.
반대로 하나의 프로그래밍 패러다임을 지원하는 언어들도 있는데, Prolog와 같이 순수한 논리 프로그래밍 언어가 대표적이다.
프로그래밍 언어의 패러다임은 개발 과정에서의 생산성, 프로그램의 가독성, 유지 보수성 등에 큰 영향을 미친다. 따라서 프로그래밍 언어를 선택할 때는 개발 목적과 특성에 맞는 프로그래밍 패러다임을 지원하는지 고려해야 한다.
요약하자면, 프로그래밍 패러다임은 프로그램을 작성하는 방식이나 스타일을 의미하고, 프로그래밍 언어 패러다임은 언어가 지원하는 프로그래밍 패러다임을 의미한다. 이 두 가지는 밀접한 관계를 가지고 있으며, 개발 목적과 특성에 맞는 프로그래밍 언어 패러다임을 선택하는 것이 중요하다.
1.2. 프로그래밍 패러다임의 실례
프로그래밍 패러다임의 실례는 다음과 같다.
명령형(Imperative) 프로그래밍 패러다임의 예로는 BASIC과 C 언어를 들 수 있다. 이들 언어에서는 데이터를 처리하기 위한 명령어의 순서를 효율적으로 작성하는 것이 중요하다. 변수와 할당문 등을 사용하여 메모리 장소의 내용을 조작하는 방식으로 계산 과정을 수행한다.
절차형(Procedural) 프로그래밍 패러다임의 예로는 FORTRAN과 Pascal을 들 수 있다. 이들 언어에서는 문제 해결에 필요한 연산을 정리하고 이를 모듈화하여 관리하는 데 초점을 맞춘다. 명령형 프로그래밍 패러다임에 비해 절차의 추상화 수준이 높다고 볼 수 있다.
함수형(Functional) 프로그래밍 패러다임의 예로는 Lisp과 Haskell을 들 수 있다. 이들 언어에서는 데이터를 값으로 간주하고 새로운 값을 생성하는 함수에 초점을 맞추어 메모리 관리의 부담을 덜어준다. 기억 장소의 상태 변화 개념이 존재하지 않으며, 프로그램은 입력과 출력의 함수 관계만을 기술한다.
논리(Logic) 프로그래밍 패러다임의 예로는 Prolog를 들 수 있다. 이 언어에서는 문제의 요구사항을 논리식으로 표현하고, 논리식의 무결성을 갖추면 컴퓨터가 알아서 원하는 답을 찾아낸다. 데이터 처리 과정보다는 문제의 요구사항을 선언적으로 명시하는 데 초점을 맞춘다.
객체지향(Object-Oriented) 프로그래밍 패러다임의 예로는 C++, Java, Python 등을 들 수 있다. 이들 언어에서는 데이터와 그 데이터를 처리하는 연산을 하나의 객체에 묶어 관리함으로써, 데이터와 연산 절차를 통합적으로 다룰 수 있다. 객체 간 메시지 교환을 통해 계산을 진행한다.
이처럼 각 프로그래밍 패러다임은 문제 해결 방식과 스타일에 차이가 있으며, 언어 설계 철학과 핵심 기능에서도 다양한 특성을 보인다."
2. 프로그래밍 언어의 문법 표현
2.1. BNF(Backus-Naur Form)
BNF(Backus-Naur Form)는 프로그래밍 언어의 구문 표현을 위한, 최초의 메타 언어로 ALGOL 60을 정의하는 데 사용되었다. BNF 표기에 사용된 메타기호에는 ::=, |, 가 있다. ::=는 좌변(비단말 기호)이 우변에 의해 정의됨을 의미하고, < >는 BNF 구문 요소를 나타내며, |는 둘 중 하나를 선택하라는 의미의 메타기호이다.
비단말 기호(nonterminal)는 다시 정의될 수 있지만, 단말기호는(terminal) 더 이상 정의가 불필요한 기호를 의미한다. 예를 들면 식별자를 의미하는 는 각괄호 묶여 메타기호 ::=에 의해 우측에서 정의될 수 있으므로 비단말기호이다. 반면, A, B, a, b, 0, 1 등은 문자 그 자체를 의미하는 것으로 각괄호로 묶이지 않고 더 이상 정의가 불필요한 단말기호가 된다.
BNF는 프로그래밍 언어 구문을 정의하는데 있어, 단순하면서도 체계적인 표현 방식을 제공...