본문 바로가기
Computer Science/Programming language

프로그래밍 언어론

by HaningYa 2020. 3. 26.
728x90

1. OrthogonalityC 언어에서 발생시킬 수 있는 오류의 예를 드시오.

 -프로그래밍 언어에서 Orthogonality 는 언어를 이용해서 어떠한 기능을 구현할 때 상대적으로 적은 수의 기본 키워드(basic construct)들의 조합을 이용하여 나타낼 수 있는지를 말한다. 예를 들어 C에서 기본 자료형인 in, float, double, character와 배열을 선언하는 기호인 [] 그리고 포인터를 선언하는 *가 있다면 이 기본 키워드 조합을 이용해서 수많은 데이터 타입을 표현할 수 있다. 예를 들어 int[] char* 가 있다. 하지만 C 언어는 Class Structure 에 대한 배열을 지원하지 않아 상대적으로 직교성이 부족한 언어이다. 직교성이 좋다는 의미는 또한 예외성이 적다는 의미와 같다. 만약 int a[10] 으로 int 에는 배열을 선언 할 수 있고 char에는 char a[10]와 같이 배열 선언을 할 수 없는 예외가 있다고 하면 직교성이 떨어진 다고 할 수 있다. 결론적으로 C언어는 Class Structure 에 대한 배열을 지원하지 않기 때문에 직교성이 부족한 언어이고 직교성이 부족하다는 의미는 예외성이 적은 언어라고 볼 수 있다.

예시 1) C언어의 매개변수 전달방법에는 직교성이 없다(배열만이 참조전달 방식이고 나머지는 값만 전달한다)

예시 2) ClassStructure 에 대한 배열을 지원하지 않는다.

예시 3) Initialization and Assignment

 

1.  void f(int x);

2.  // OK

3.  int x = 5;

4.  f(7);

5.  x = 11;

6.  return 13;

 

           -

           -

 

 

 

 

 

1.  struct foo { int a, b; }

2.  void f(struct foo x);

3.  // OK

4.  struct foo x = {0, 1};

5.  // not OK

6.  f({1, 2});

7.  x = {3, 5};

8.  return {8, 13};

 

 

예시 4) C언어 함수 변환값의 자료형으로는 배열형이 제외된다.

예시 5) C언어에서 배열은 call by reference 방식을 취하는 반면, 이외의 모든 자료형에서는 call by value 방식을 취해 직교성을 보장하지 못한다.

예시 6) void void 포인터로서 포인터 역할은 할 수 있지만 일반 자료형으로는 사용할 수 없다.

 

2. C++에서 최근 도입된 개념인 Lambda expression, Smart pointer, uniform initializer, variadic template를 조사하시오.

 -Lambda expression : 람다는 함수 객체(Function Object of Functor)이란 개념이 연관되어 있다. 이 함수 객체를 좀더 편하게 사용하기 위해 람다표현이 만들어 졌다. 이 함수 객체는 람다와 목적이 동일하면서 이를 한층 업그레이드 한 개념이다. 람다의 장점으로는 코딩이 간편해 진다는 것과 코드의 가독성이 좋아진다는 것이다.

예제 코드)

 

 -smart pointer : C++프로그램에서 new 키워드를 사용하여 동적으로 할당받은 메모리는, 반드시 delete 키워드를 사용하여 해제해야 한다. 해제 하지 않은 메모리 누수로부터 프로그램의 안전성을 보장하기 위해 스마트 포인터를 제공한다. 스마트 포인터란 포인터 처럼 동작하는 클래스 템플릿으로 사용이 끝난 메모리를 자동으로 해제해 준다. 스마트 포인터는 new 키워드를 사용해 기본 포인터가 실제 메모리를 가리키도록 초기화한 후에, 기본 포인터를 스마트 포인터에 대입하여 사용한다. 이렇게 정의된 스마트 포인터의 수명이 다하면, 소멸자는 delete 키워드를 사용하여 할당된 메모리를 자동으로 해제한다. 따라서 new 키워드가 반환하는 주소값을 스마트 포인터에 대입하면 따로 메모리를 해제할 필요가 없다. 스마트 포인터의 종류로는 unique_ptr, shared_ptr, weak_ptr 이 있다.

 

 -uniform initializer : 객체의 초기화를 보다 간단한 코드만으로 구현할 수 있는 기능이다. 모든 오브젝트 타입에 대해 동일한 방식으로 리스트형 초기화를 할 수 있게 되었다.

 

 

 -variadic template : 가변길이 템플릿으로 variadic function을 타입 시스템과 붙여 컴파일 시간에 타입 체크 할 수 있게 하기위해 추가되었다. variadic template을 사용하면 사용된 인자의 타입 별로 instantiation 되기 떄문에 바이너리의 크기는 커지지만, 컴파일 타임에 타입체크를 할 수 있으며 실행 시에 생기는 비용을 줄여준다.

 

3. 스마트폰이 일반화되면서 'Platform'이란 말이 일반화 되고있다. 'Platform'이란 무엇이며, 일반응용프로그램과 어떤 차이가 있는가? 현재 널리 쓰이는 smartphone platform을 조사하고, platform을 만드는 데 사용한 프로그래밍 언어와 응용 소프트웨어()과 연결 가능한 언어 및 연결 방법을 조사하라.

- Platform 이란 : IT에서 플랫폼은 어플리케이션을 작동시키기 위한 "기반OS" "기술환경"을 의미한다.

           1) 하드웨어 플랫폼: 표준 공정을 통해 다양한 제품을 만들어내는 기반이자 도구

           2) 소프트웨어 플랫폼: 일반적인 의미에서 가장 많이 사용되는 개념으로 여러가지 기능들    을 제공해 주는 공통 실행 환경

           3) 서비스 플랫폼: 트위터 페이스북과 같은 인터넷 서비스에서 진화된 형태. 다른 서비스    들이 내 서비스를 쉽게 활용할 수 있게 하도록 도와주는 인터넷 기반의 기술 환경

- 일반 응용프로그램과의 차이점 : 플랫폼이란 구체적인 프로그램이나 하드웨어만을 의미하지 않고 이를 모두 포괄하는 환경적인 요소까지 포함한 개념으로 사회적인 의미를 포함한다. 이에 반해 응용프로그램은 하드웨어를 제외한 컴퓨터 내의 프로그램을 뜻한다. 예를 들어 카카오톡은 처음에는 단순한 프로그램, 어플리케이션이었으나 여러 부가기능이 추가되면서 통합 솔루션이 되었고 카카오톡에 대한 IT 생태계가 형성 되면서 플랫폼의 개념으로 확대되었다.

- smartphone platform 이란 : 스마트폰 플랫폼이란 스마트폰에 깔려있는 운영체제 예를들어 iOSAndroid 를 뜻한다.

- platform을 만드는데 사용한 프로그래밍 언어 : Java(멀티플랫폼 언어), Perl(UNIX, CGI) Kotlin(Andriod), Objective-C(iOS, MacOS), Swift(iOS, MacOS)

 

- 응용 소프트웨어()과 연결 가능한 언어 및 연결방법 :

           1) Python은 소프트웨어 엔지니어와 백엔드 웹 개발자가 사용하는 오픈 소스 프로그래밍 언어입니다. 파이썬은 과학 컴퓨팅에 매우 적합하며 배우기가 비교적 간단합니다.

           2) Java는 웹 기반 개발에서 널리 사용되며 1995 년에 만들어졌습니다. 건강 과학, 교육 및 금융 산업의 많은 회사에서 Java를 사용합니다. Java는 웹 사이트에서 애플릿을 다운로드하여 브라우저가 추가 기능을 수행 할 수 있게합니다.

           3) Ruby는 코더가 독립적으로 또는 Ruby on Rails와 함께 사용할 수 있는 오픈 소스 스크립팅 언어입니다. NASA는 시뮬레이션 작업에서 Ruby를 사용합니다.

           4) HTML은 웹 개발에 광범위하게 사용됩니다. HTML은 사람들이 온라인으로 볼 수 있는 전자 문서를 작성하고 구성 할 수 있도록 하는 웹 페이지의 기초 역할을 하는 코드입니다.

웹 개발자 및 소프트웨어 엔지니어는 JavaScript를 사용하여 페이지 요소를 조작하여보다 매력적인 요소를 만듭니다. JavaScript HTML을 향상 시키며 대부분의 인터넷 브라우저에 포함됩니다.

           5) C는 소프트웨어 개발자 및 시스템 분석가가 사용하는 중간 레벨 프로그래밍 언어입니다. 프로그래머는 C를 사용하여 운영 체제와 통합되는 응용 프로그램을 만듭니다.

1983 년에 개발 된 C ++은 또 다른 중급 프로그래밍 언어이며 C의 확장으로 작동합니다. 프로그래머는 C ++을 사용하여 게임, 그래픽 및 사무 응용 프로그램을 만듭니다.

           6) C # Windows 운영 체제에서 작동하도록 설계된 응용 프로그램을 만드는 소프트웨어 엔지니어가 사용하는 프로그래밍 언어입니다. C # Java와 유사성을 공유합니다.

           7) Objective-C는 모바일 개발자 및 소프트웨어 엔지니어가 사용하는 객체 지향 언어입니다. iOS OS X 유틸리티를 작성하는 개발자는 종종 Objective-C를 사용합니다.

           8) PHP 1995 년에 대중에게 공개되었습니다. 개발자는 PHP를 오픈 소스 언어로 사용하여 동적 웹 페이지를 만듭니다. WordPress Drupal과 같이 널리 사용되는 플랫폼은 PHP와 일관되게 작동합니다.

           9) SQL을 통해 프로그래머는 데이터베이스에서 정보를 작성, 읽기, 업데이트 및 삭제할 수 있습니다. 회사는 SQL을 사용하여 데이터를 수집합니다.

           10) Apple Swift 프로그래밍 언어를 사용하여 iOS OS X 응용 프로그램을 만들고 유지 관리합니다. Swift 2 Apple이 최근에 발표 한 보조 오픈 소스 프로그래밍 언어입니다.

 

 

4. 결과 출력과 해석

           - for(int i : {2, 3, 5, 7, 9}){ std::cout << i << std::endl}

결과 :

해석 : 변수 i 2, 3, 5, 7, 9 for문을 통해 순회하면서 cout을 통해 i의 값을 출력시키면서 endl을 통해 한 줄씩 띄워서 console 창에 찍혔다.

원래라면 for (int i = 0 ; i < 10 ; i++)의 방식으로 2, 3, 5, 7, 9를 출력하지만 C++11부터 추가된 방식인 Range-based for loop 이다. 변수 선언과 조작 대신 내부적으로 반복자(iterator)를 이용하여 vector와 같은 컨테이너 전체의 원소에 대해 반복을 수행한다.

 

728x90

댓글