본문 바로가기

ETC/DailyRoutine

[방송통신대학교]프로그래밍언어론 2학기 중간과제물

반응형

1.

프로그래밍 언어의 세 가지 기본 기능은 작성력(프로그램 수식이나 문장, 기능을 쉽게 표현할 수 있는 특성), 가독성(작성된 프로그램을 보고 쉽게 이해할 수 있도록 하는 특성), 신뢰성(작성된 프로그램이 오류에 빠지는 가능성을 줄이는 특성)으로 볼 수 있다.

이 중에 가장 중요한 것인 가독성을 볼 수 있는데 Python의 들여 쓰기를 예로 들 수 있다.
보통 이는 스타일 가이드 문서로 정의 되는데 아래와 같이 정의를 한다.
- 한번의 들여쓰기에 4개의 스페이스를 사용하여야 합니다.
- 괄호(대,중,소) 및 괄호안의 괄호와 같이 연결되는 라인에서 줄바꿈이 일어나는 요소들은 수직으로 정렬되어야 합니다. 
(첫째 열에대한 규칙은 없으나 내어쓰기는 명확하게 구현하도록 합니다.)

가독성의 좋은 예로 보자면

여는 소괄호 기호로 정렬되는 경우
foo = long_function_name(var_one, var_two,
                         var_three, var_four)

아랫줄과 구분을 위해, 여러 행에 대해 들여쓰기 포함된 경우.
def long_function_name(
        var_one, var_two, var_three,
        var_four):
    print(var_one)

매달린 형태의 들여쓰기는 하나의 들여쓰기 레벨을 추가해야 함.
foo = long_function_name(
    var_one, var_two,
    var_three, var_four)

가독성의 안좋은 예로 보면

행 첫 번째 문자 세로 정렬이 안되어 있을때, 첫 째 줄은 금지되며, 문제의 소지가 있슴.
foo = long_function_name(var_one, var_two,
    var_three, var_four)

여러 행에 대해 들여쓰기가 필요한 경우, 함수 안 첫째 줄과 구분이 어려움.
def long_function_name(
    var_one, var_two, var_three,
    var_four):
    print(var_one)

가독성의 기대효과는
- 사용되는 에디터의 윈도우 폭을 제한하여 여러 파일을 열어 겹쳐보는 것이 가능 합니다.
- 이는 인접한 열에 두 버전을 제공하는 코드 리뷰툴을 사용할 때 작업효율이 향상됩니다.
- 대부분의 툴에서 기본 행바꿈은 코드의 가시적 구조를 파괴하여 이해하기 어렵게 만듭니다.
- 폭이 80글자로 세팅되어있는 윈도우 에디터 툴에서, 심지어 라인의 줄바꿈을 자동으로 
해주는 상황에서도, 최대 줄수를 제한하는 것은 기본 행바꿈에 의해 구조가 파괴되는 상황을 
피하기 위함입니다.
- 몇몇의 웹 기반 툴은 동적인 자동 줄바꿈을 지원하지 않습니다.

 

2.

프로그래밍 언어의 두 가지 부가 기능으로는 추상화(어떤 대상을 간략하게 추려 나타내는 방법)와 모듈화(복잡한 대상을 나누어 구성할 수 있는 방법)으로 나눠 볼 수 있다.

이 중 모듈화에 대해서 Python으로 보자면 모듈은 간단한 기능을 담을 때 사용한다.
간단하게 제곱근에 대해 모듈을 작성해보자면,

a = 2          # 변수
 
def square(n):    # 함수
    return a ** n

변수와 함수를 넣어서 모듈을 만들었을 때 모듈 이름을 지정할 수 있습니다.

이를 Python은 import를 통해 삽입하여 사용 한다.

다른 모듈은, 그들이 서브 모듈로부터 기능을 보여주는 os.path 혹은 패키지의 init 모듈과 
같이 명시적으로 보유하고 있는 모듈의 API를 문서화(Documentated)된 부분이 아니라면, 
반드시 import된 이름에 대한 간접적인 접근에 의지해서는 안됩니다.

import는 아래와 같이 그룹화 하도록 합니다.
- 표준 라이브러리 import
- 관련된 서브파티 import
- 로컬 어플리케이션/자체라이브러리 import

모듈을 사용하는 가장 큰이유는 자주 사용되는 코드를 별도의 파일로 만들어서 필요할 때마다 재활용할 수 있다는 것을 들 수 있습니다.

 

3.

프로그래밍 언어의 아홉 가지 평가 기준은 작성력(프로그램 수식이나 문장, 기능을 쉽게 표현할 수 있는 특성), 가독성(작성된 프로그램을 보고 쉽게 이해할 수 있도록 하는 특성), 신뢰성(작성된 프로그램이 오류에 빠지는 가능성을 줄이는 특성), 직교성(언어 기능이 서로 간섭하지 않고 자유롭게 조합될 수 있는 특성), 일관성(유사한 기능을 같은 형태로 나타낼 수 있는 특성), 확장성(사용자가 원하는 새로운 기능을 추가할 수 있는 특성). 효율성(작성된 프로그램이 효율적으로 수행될 수 있도록 하는 특성), 유연성(프로그래머가 표현하고 싶은 내용을 유연하게 수용하는 특성), 이식성(프로그램을 다른 실행 환경으로 이전할 수 있는 특성)으로 볼 수 있습니다.

이 중 효율성을 보자면,

가장 좋은 예는 Python 상속이 아닐까 합니다.

항상 클레스의 메서드와 인스턴스 변수가 public이 되는지 non-public이 되는지 결정하도록 합니다.
만약 확신하지 못한다면 non-public 으로 결정하는 것이 좋습니다. 
(public을 non-public으로 만드는 것보다 non-public을 public 속성으로 만드는 것이 더 쉽습니다.)
Public속성은 사용을 위한 클래스의 관련없는 클라이언트라고 예상되는 것이며, 호환되지 않는 변경사항을 피하도록 노력합니다.
Non-public 속성은 서드파티에 의해 사용되지 않는 것입니다.
Non-public 속성은 바뀌지 않거나 제거되지 않는다는 것이 보장되지 않습니다.
파이썬에서는 “private” 속성이 없기 때문에, “private”라는 용어를 여기서는 사용하지 않습니다.
속성의 또 다른 카테고리는 서브클래스 API의 부분입니다. (종종 “protected”라고 다른 언어에서 불립니다)
몇몇의 클래스는 클래스 기능의 수정과 확장을 위해 상속을 염두해 두고 설계됩니다. 
위의 클래스를 설계할 때, 속성이 public이고, 서브클래스 API의 일부이고 기초클래스에 의해 사용되는 것에 관한 explicit 결정(decisions)을 만들 수 있음에 주의하도록 합니다.
위와 관련하여 아래와 같이 가이드라인이 제시됩니다.
Public 속성은 이름앞에 _언더스코어를 가지지 않습니다.
만약 public 속성 이름이 예약된 키워드와 충돌한다면, 이름 뒤에 하나의 언더스코어(_)를 붙이도록 합니다. 이것은 축약형이나 스펠링을 파괴하는 것보다 선호되는 방법입니다.
(그러나, 여기 ‘cls’는 어떤 클래스로 잘 알려진 변수 혹은 독립변수에 대해(특히 클래스메서드에서 첫번째 독립변수) 선호되는 스팰링입니다.)
단순한 public 데이터 속성에 대해, 복잡한 접근자/유발자(mutator) 방법 없이 속성 이름을 
노출하는 것이 최고의 방법입니다.
특성, 속성(Properties)는 세로운 스타일의 클래스에서만 작동합니다.
Caching과 같은 부작용은 일반적으로 괜찮지만 부작용이 없는 기능을 유지하도록 시도해야 합니다.
계산적으로 상당한 작동을 요구하는 특성(Properties)을 사용하는 것을 피하도록 합니다.
만약 클래스가 서브 클래스화 되는 것이 고려될 때, 서브 클래스에서 사용하길 원하지 않는 속성을 가지고 있다면, 이름 앞에 두개의 언더스코어를 활용하는 네이밍과 이름 끝에는 언더스코어를 작성하지 않는 것을 고려하도록 합니다.
단순한 클래스명은 맹글링된 이름에서 사용된다는 것을 참고하도록 합니다.
만약에 서브 클래스가 같은 클래스 이름과 같은 속성을 이름을 선택한다면, 여전히 이름 충돌을 가질 수 있습니다.
이름 맹글링은 덜 편리한 디버깅과 **getattr**()과 같이 확실한 사용을 만들 수 있으나 이름 맹글링 알고리즘은 잘 서류화(documentated)되며 수행하기 쉽습니다.
모두가 이름 맹글링을 좋아할 수는 없습니다. 향상된 호출자에 의한 잠재적 사용을 활용하여 이름 충돌을 피하기 위한 요구에 밸런스를 맞추는 것을 시도하도록 합니다.

 

4.

<배열 선언> ::= <타입> (<char> | <int> | <double>) <identifier> [<배열 차원> {<dight>} <dight>] 
배열 선언을 정의하는 데 타입은 char / int / double 중 한 개를 선택 하고 identifier는 배열차원을 생략 할 수도 있고 재귀 호출로 dight를 부르거나 한번만 dight를 하는 버전 2개로 표현 할 수 잇다.

반응형