12/22/2010

프로그래밍 언어 패러다임

프로그래밍 언어론 수업에서 진행한 최종과제입니다.

각 언어별 패러다임으로 주어진 문제 4개를 작성하는 과제입니다.
전 C(명령형언어), C#(객체지향언어), Scheme(함수형언어), Prolog(논리형언어)를 택했습니다.

  • C - *OS: Fedora 13 *Tool: gedit
  • C# - *OS: Windows 7 *Tool: Visual Studio 2010
  • Scheme - *OS: Windows 7 *Tool: DrRacket(lang: scheme) v5.0.1
  • Prolog - *OS: Windows 7 *Tool: SWI-Prolog v5.10.2

 

1. 프로그램 소스코드

1) C 언어

2) C# 언어

3) Scheme 언어

4) Prolog 언어

 

2. 프로그램 스크린샷

1) 문자열이 올바른 이메일 주소인지를 판단하는 프로그램


2) 문자를 저장하는 두 개의 연결리스트에 리스트 내용이 같은지를 판단하는 프로그램


3) 사람들의 이름, 전화번호, 주소를 저장하고 정보를 검색하는 프로그램


4) 10개의 이름을 입력 받아 정렬하는 프로그램

 

3. 각 프로그래밍 언어의 장단점 비교

  장점 단점
C

· 프로그램이 가볍고 효율적입니다. 따라서 프로그램 실행속도가 빠르고 용량을 절약할 수 있습니다.

· 포인터를 사용해 주소를 직접 제어하기 때문에 메모리를 효율적으로 사용할 수 있습니다.

· 이식성이 좋습니다.

· 포인터의 사용으로 인한 허상포인터 및 분실된 힙-동적 변수 문제점을 야기합니다.

· 형 변환과 같은 타입검사가 너무 유연해 생각하지 못한 오류가 발생하곤 합니다.

· GUI 개발을 하는 것이 어렵습니다.

C#

· C언어와 비교했을 때 가비지 컬렉션의 지원으로 메모리 누수를 걱정하지 않아도 됩니다.

· 타입검사 및 문법을 엄격하게 하므로 신뢰성이 높습니다.

· 닷넷 프레임워크를 설치하면 어디서든 C#으로 작성된 프로그램을 구동할 수 있습니다.

· 다양한 라이브러리를 제공해 손쉽고 신뢰성 높은 프로그램을 작성할 수 있었습니다.

· 포인터가 없기 때문에 직접적으로 메모리에 접근하기가 어렵습니다.

· 닷넷 프레임워크의 설치가 필수적이므로 프로그램 배포시에 문제가 될 수 있습니다.

Scheme

· 매크로라는 기능을 이용해 원하는 작업을 쉽게 추상화 해서 프로그래밍할 수 있습니다.

· 간단한 구문과 의미를 가집니다. 예) operator operand1, 2...

· 동일한 매개변수가 함수에 적용되면 평가 결과는 항상 같습니다.

· 재귀와 조건식으로 프로그램을 제어하므로 부작용이 적습니다.

· 익숙하지 않은 언어였고 그동안 프로그래밍해오던 습관과 달라 과제를 구현하는데 많은 어려움이 있었습니다.

· 함수를 정의할 때 () 괄호를 사용하기 때문에 판독력이 떨어집니다.

· C언어와 같이 대화형 프로그램을 작성하는 것이 매우 어려웠습니다. 변수나 상태를 다루기 힘들어 history sensitive개념적용에 어려움을 겪었습니다.

Prolog

· 의미의 명확성, 높은 프로그래밍 생산성, 메타 프로그래밍의 용이성, 빠른 프로토타이핑, 자동 메모리 관리 및 병렬 처리의 용이성 등 많은 장점이 있습니다.

· 기본적으로 리스트 타입을 지원하기 때문에 리스트 관련 과제를 해결할 때 손쉽게 해결할 수 있었습니다.

· 익숙하지 않은 언어였고 그동안 프로그래밍해오던 습관과 달라 과제를 구현하는데 많은 어려움이 있었습니다.

· C언어와 같이 대화형 프로그램을 작성하는 것이 매우 어려웠습니다. 또한 사용자로부터 데이터를 입력받는것도 어려웠습니다.

· 프로그램이 커지면 디버그하는 것이 매우 어려울 것 같습니다.

 

Language

Intended use

Type strength

Type safety

Expression of types

Compatibility among composite types

Type checking

C

System

weak

unsafe

explicit

name-based

static

C#

Application, Web

strong

safe

explicit

name-based

static

Scheme

General, Education

strong

 

implicit

 

dynamic (latent)

Prolog

Application,
Artificial intelligence

strong

     

dynamic

참조: 위키(http://en.wikipedia.org/wiki/Comparison_of_programming_languages)

 

4. 프로그래밍 언어별 패러다임의 비교

  • 명령형 (Imperative)

    폰 노이만 구조라 불리는 컴퓨터 구조에 기반하여 설계된 언어입니다.
  • 다시 말하면, 언어 구조가 프로그래밍 언어 사용자의 능력과 성향의 관점보다는 기계 구조의 관점에서 모델링되어 있습니다.

    명령형 언어는 계산 문제를 프로그램의 상태와 그 상태를 변화시키는 문장으로 기술합니다. 변수와 배정문 같은 기어 장소를 참조하는 명령을 사용하여, 기억 장소의 내용을 조작/변경하여 계산 과정을 수행하는 언어 패러다임입니다.

    명령형 언어의 주요 특징으로 변수, 배정문, 반복문을 들 수 있습니다.

    명령형 언어로 FORTRAN, COBOL, Pascal, C 등이 있습니다.

    변수, 배정문으로 인해 효율적인 반복문이 가능합니다.

    할당문(= 연산)을 쓰기 때문에 상태가 "알 수 없게" 변한다는 겁니다. 따라서 예상치 못한 오류가 발생할 가능성이 있습니다.

     

  • 객체지향형 (Object-oriented)

    크고 복잡한 프로그램의 생산성 향상을 목적으로 명령형 언어에서 객체지향 방법론을 보다 효율적이고 유연하게 사용할 수 있도록 발전된 형태의 언어 패러다임입니다.
  • 객체 지향의 기본 개념은 클래스, 객체간의 계층화, 상속, 다형성으로 요약됩니다. 프로그램 안의 모든 독립된 개체를 객체로 표현하며, 연관된 모든 연산 및 데이터 구조가 객체에 포함되어 정의됩니다.

    주요 특징으로 추상 데이터 타입, 상속, 동적 타입 바인딩, 다형성이 있습니다.

    객체지향 개념을 잘 지원하는 언어로써 C++, Smalltalk, Java 등이 있습니다.

    동적 타입 바인딩은 보다 유연한 상속을 허용하고 이러한 상속은 기존 추상 데이터 타입을 변경하지 않으므로 소프트웨어의 재사용 가능성을 크게 향상시켜 줍니다.

     

  • 함수형 (Functional)

    프로그램의 기본 단위는 함수가 되며 프로그램의 구성은 함수의 평가와 호출로 이루어집니다. 프로그램을 기억 장소의 상태 변화 및 이에 대한 조작으로 기술하는 것이 아니라, 입력과 출력의 함수만을 사용하여 기술하는 언어입니다.
  • 명령형 언어와 달리 기억 장소의 상태에 대한 개념이 없어 함수적 부작용이 없습니다. 즉, 명시적인 기억장소 할당 명령이나 명시적인 변수 배정문 등이 없습니다. 또한 병렬 실행이 가능합니다. 하지만 상태가 없으므로 history-sensitive와 파일 입출력, 자료구조 처리 같은 것을 다루기가 어렵습니다.

    대표적인 함수형 언어로 Lisp이 있으며 ML, Scheme, Haskell 등의 언어가 함수형 언어에 속합니다.

    문법이 단순해 이해하기 쉽습니다.

    폰 노이만 식 컴퓨터 구조에서는 함수형 언어로 작성된 프로그램의 효율성이 높지 않습니다.

  • 논리형 (Logic)

    논리형 언어는 수학 논리에 기반을 두고 논리 문제를 효과적으로 표현하기 위해 개발되었습니다. 결과를 만드는 절차가 아닌 결과만을 명시합니다. 프로그램은 규칙과 규칙의 활성화 조건으로 구성됩니다. 규칙 활성화 조건이 만족되면, 연관된 규칙이 실행되는 언어입니다. 이러한 규칙의 집합을 Knowledge Base라고도 하며, 지정된 Knowledge에 대해 질의를 할 수 있습니다.
  • 대표적인 논리형 언어로 PROLOG가 있으며 많은 방언이 파생되었습니다.

    큰 프로그램의 경우, 프로그램의 오류 수정이나 실행 결과를 이해하는 것이 어렵고, 많은 back-tracking으로 실행 시간이 오래 걸립니다.

댓글 없음:

댓글 쓰기