태그 보관물: language-design

language-design

KISS 원칙이 프로그래밍 언어 설계에 적용 되었습니까? “간단하게 바보

KISS ( “간단하고 멍청하게 유지”또는 “간단하게 바보 유지”, 예를 들어 여기 참조 )는 비록 공학에서 유래 한 것임에도 불구하고 소프트웨어 개발에서 중요한 원칙입니다. Wikipedia 기사에서 인용 :

Johnson은 설계 엔지니어 팀에게 몇 가지 도구를 제공한다는 이야기를 가장 잘 보여줍니다. 설계중인 제트 항공기는 이러한 도구 만 사용하여 전투 조건에서 현장의 평균 정비공이 수리 할 수 ​​있어야한다는 과제가 있습니다. 따라서 ‘멍청한’은 사물이 깨지는 방식과 문제를 해결할 수있는 정교함 사이의 관계를 말합니다.

이것을 소프트웨어 개발 분야에 적용하려면 “제트기”를 “소프트웨어”, “평균 정비공”을 “평균 개발자”로, “전투 조건”을 “예상 소프트웨어 개발 / 유지 보수로” 조건 “(마감, 시간 제한, 회의 / 중단, 사용 가능한 도구 등).

따라서 나중에 쉽게 작업 할 수 있도록 소프트웨어를 단순하게 (또는 쉼표를 생략 할 경우 간단한 어리석게) 유지하는 것이 일반적으로 통용되는 아이디어입니다 .

그러나 KISS 원칙을 프로그래밍 언어 설계에도 적용 할 수 있습니까? 이 원칙을 염두에두고 특별히 고안된 프로그래밍 언어, 즉 “일반적인 작업 환경에서 평균 프로그래머가 최소한의인지 노력으로 최대한 많은 코드를 작성하고 유지하도록 허용”하는 것을 알고 있습니까?

특정 언어를 인용하면 언어 디자이너가 이러한 의도를 명확하게 표현하는 일부 문서에 대한 링크를 추가 할 수 있다면 좋을 것입니다. 어쨌든 특정 프로그래밍 언어에 대한 개인적인 의견보다는 설계자의 의도에 대해 배우고 싶습니다.



답변

미니멀리즘을 생각할 때 나는 Lisp and Go를 생각 합니다 . Lisp를 사용하면 함수와 목록 만 있으면 얻을 수있는만큼 간단합니다 (물론 조금 더 있지만 무엇이든). 그러나 Go 사례가 더 흥미 롭다고 생각합니다.

Go는 단순하도록 설계되었습니다 (적절한 읽기입니다). 그들이 사용하는 용어는 “기능 직교성 (feature orthogonality)”이며, 이는 어떤 특징이 진정으로 독특한 것을 제공하는 경우에만 추가되어야한다는 것을 의미합니다. 이는 Plan9에 대한 저자의 Russ CoxRob Pike의 생각으로 시작된 것으로 보인다. (최소한의 디자인에 관심이 있다면 간단한 창 시스템 에 관한 Rob Pike의 논문을 잘 읽어보십시오.)

다음은 간단한 구문 예입니다.

하나의 루핑 구조 만

루프는 다음 중 하나처럼 보일 수 있습니다.

무한 루프

for {
}

while 루프

for <conditional> {
}

전통적인 for 루프

for i := 0; i < 10; i++ {
}

Foreach 루프

// works for maps or arrays
for k, v := range arr {
}

다목적 스위치

switch {
    // cases must be evaluate to a boolean
}

switch <value> {
}

switch t := <value>; t {
    // can use t inside
}

여러 번 반환

return val1, val2, ...
  • 던질 필요가 없습니다 (마지막 반환 값으로 오류를 전달하십시오)
  • 출력 매개 변수가 필요 없음
  • 튜플의 필요성을 제거

인터페이스

type X interface {
    DoSomething()
    String() string
}
  • 제네릭과 유사한 문제 해결
  • 추상화 가능

임베딩

type A struct {
    Thing string
}

type B struct {
    A // embeds A in B, so B.Thing refers to A.Thing
}
  • 상속과 같은 문제를 해결
  • 수업이 필요하지 않음

채널

세마포어를 구현하는 데 사용할 수 있습니다

var c = make(chan bool, 1)
c<-true // semaphore lock
<-c // semaphore free

스레드 간 메시지 전달에 사용

func produce(c chan<- bool) {
    for {
        c <- true
    }
}
func consume(c <-chan bool) {
    for {
        <-c
    }
}

var c = make(chan bool)
go produce(c)
go consume(c)

비동기 이벤트를 처리하는 데 사용할 수 있습니다

func async() chan bool {
    var c = make(chan bool)
    go doSomethingAsync(c)
    return c
}

// wait for long async process to finish
c := async()
select {
    case _ = <-c:
}

결론

문법의 모든 부분을 다루지는 않겠지 만, 미니멀리즘이 무엇을 할 수 있는지 알 수 있기를 바랍니다. 이 언어는 많은 새로운 기능을 추가하기 때문이 아니라 추가 기능없이 다른 언어의 최상의 기능을 사용하기 때문에 흥미 롭습니다.

일반적으로 문제를 해결하는 한 가지 “최상의”방법이 있습니다. 예를 들어, 메일 링리스트에서 많은 사용자가 제네릭이없는 것에 대해 불평합니다. 토론 후, 그들은 자신이하고 싶은 모든 것이 인터페이스를 통해 이루어질 수 있다는 것을 알고 있습니다. 관용구 문에 대한 효과적인 예를 읽으십시오 .

KISS 언어의 장점은 코드 스타일이 언어에 의해 제한되기 때문에 관용적 코드를 작성할 수 있다는 것입니다. 예를 들어, Go에서는 다음과 같이 작성할 수 없습니다.

if <condition>
    statement;

중괄호를 사용해야합니다.

if <condition> {
    statement;
}

구문에는 다른 많은 사람들의 코드를 쉽게 읽을 수있는 다른 많은 예제가 있습니다.

특색있는 언어에 비해 KISS 언어의 장점 :

  • 다른 사람의 코드를 이해하기 쉽게
  • 전체 언어를 이해하기 쉬움 (C ++은 이해하기 어려운 것으로 유명합니다)
  • 구문이 아닌 알고리즘에 집중

답변

파이썬선 (Zen)은 왜 파이썬이 내가 할 수있는 것보다 훨씬 더 단순한 언어인지를 말해 줄 것이라고 생각합니다 .

Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
Complex is better than complicated.
Flat is better than nested.
Sparse is better than dense.
Readability counts.
Special cases aren't special enough to break the rules.
Although practicality beats purity.
Errors should never pass silently.
Unless explicitly silenced.
In the face of ambiguity, refuse the temptation to guess.
There should be one-- and preferably only one --obvious way to do it.
Although that way may not be obvious at first unless you're Dutch.
Now is better than never.
Although never is often better than *right* now.
If the implementation is hard to explain, it's a bad idea.
If the implementation is easy to explain, it may be a good idea.
Namespaces are one honking great idea -- let's do more of those!

@Giorgio 님의 질문에 답변

귀하의 질문에 따르면

“이 원칙을 염두에두고 특별히 설계된 모든 프로그래밍 언어를 알고 있습니다. 즉,”평균적인 작업 조건 하에서 일반 프로그래머가 최소한의인지 노력으로 최대한 많은 코드를 작성하고 유지하도록 허용합니다. “

파이썬은 저에게 즉시 떠오르는 것입니다. Python의 디자인은 Perl의 방법론 인 유명한 “한 가지 이상의 방법이 있습니다”에 직접 반응합니다. 프로그래머가 코드를 매우 쉽게 작성할 수 있도록하는 것이 좋지만 유지 관리에는 도움이되지 않습니다. Perl로 작성된 (매우 잘못 작성된, 인정할 것입니다) 프로그램을 관리하기 전에 파이썬이 좋은 코딩 관행과 간결한 언어를 강요하는 것을 좋아합니다.

파이썬은 또한 프로그램을 작성할 때 하나의 특정 방법론을 따르도록 강요하지 않습니다. 엄격한 객체 지향 프로그래밍 스타일을 따르거나 순차적으로 실행할 간단한 스크립트를 작성할 수 있습니다. 클래스를 초기화 main()할 필요가 없다면 Java에서 수행 해야하는 것처럼 메소드 를 호출하는 것이 매우 좋습니다. (또한 파이썬에서 stdout으로 인쇄하는 것은 훌륭하지만 다소 의미가 없습니다.)

마지막으로, 언어와 함께 광범위한 표준 라이브러리를 포함하는 “배터리 포함”방법이 훌륭합니다. 패키지의 일부 외부 저장소를 탐색하는 대신 필요한 대부분이 이미 언어에 포함되어 있습니다. 외부 저장소를 갖는 것도 좋지만 기본 작업을 수행하기 위해 파고 들지 않아도 정말 편리합니다.


답변

“단순성”을 유지하는 데있어 중요한 열쇠는 복잡성이 필요한시기를 인식하고이를 가장 잘 처리 할 수있는 시스템 부분을 갖추는 것입니다. 불변의 값, 변경 가능한 값 및 엔티티를 구별하지 않는 단일 종류의 객체 참조가있어 Java를 “단순하게”만들지 만, 값과 엔티티를 구별 할 필요가 없습니다. 단지 프로그래머가 도구를 빼앗아 도움을 줄 수 있습니다.

보다 일반적으로, 프로그래밍 언어 또는 프레임 워크 기능이 다중 사용 사례를 지원하려는 경우, 다른 사용 사례에서 다른 동작이 적절한 상황이 발생하지 않도록해야하지만 컴파일러는 말할 수 없습니다. 그들 떨어져. 언어 나 프레임 워크에 더 많은 유형을 추가하면 복잡한 것처럼 보일 수 있지만 많은 경우 실제로 일을 더 쉽게 만들 수 있습니다.

예를 들어, C에서 부호있는 유형과 부호없는 유형을 둘러싼 규칙의 혼란을 고려하십시오. 이러한 규칙의 복잡성은 일부 코드는 부호없는 정수 유형을 사용하여 숫자를 나타내는 반면 다른 코드는이를 사용하여 래핑 대수 반지의 멤버를 나타내는 데 있습니다. (특히 정수 세트 합동 모드 2ⁿ). 유형 변환 규칙은 때때로 한 가지 용도에 적합한 방식으로, 때로는 다른 용도에 적합한 방식으로 동작합니다. 랩핑 및 랩핑되지 않은 유형이 따로 있으면 정수 유형의 수를 두 배로 늘리지 만 이와 관련된 규칙을 단순화 할 수 있습니다.

  • 임의의 크기의 비링 정수 타입은 임의의 크기의 링에 할당 될 수있다; 링은 동일하거나 더 작은 크기 의 링에만 할당 될 수있다 .

  • 비 고리 정수 및 고리를 포함하는 관계 연산자 이외의 연산은 내재적으로 정수를 고리 유형으로 변환합니다.

  • 고리는 명시 적으로 숫자 또는 더 큰 고리로 캐스트 될 수있다. 부호없는 링의 값은 링의 0에 추가 될 때 링 값을 산출하는 음이 아닌 가장 작은 정수입니다. 부호있는 링의 값은 링의 0에 추가 될 때 링 값을 산출하는 가장 작은 크기의 정수이며, 타이의 경우 음의 값이 선호됩니다.

  • 상기 언급 된 것을 제외하고, 링은 동일하거나 더 작은 링을 갖는 작동으로 제한된다.

  • 다른 유형의 비링 정수에 대한 연산은 숫자를 피연산자의 모든 값을 수용 할 수있는 유형으로 상향 변환하거나 적절한 유형이없는 경우 컴파일러에서 거부해야합니다.

링 유형을 정의하면 정수 유형의 수를 두 배로 늘리는 것처럼 보이지만 이식 가능한 코드 작성을 크게 단순화합니다. 숫자와 링에 동일한 부호없는 유형을 사용하면 유형 수가 줄어들지 만 복잡한 규칙으로 이어 지므로 효율적인 휴대용 코드를 작성하는 것이 거의 불가능합니다.


답변

틀림없이, Tcl은 이러한 라인을 따라 개발되었습니다. 전체 언어는 단일 매뉴얼 페이지에서 12 개의 규칙으로 만 설명 할 수 있습니다 . 매우 간단하고 일관됩니다.

Tcl의 제작자는 다음을 원래 목표로 주장했습니다.

  • 언어는 확장 가능해야합니다. 각 응용 프로그램이 언어의 기본 기능에 고유 한 기능을 추가하는 것이 매우 쉬워야하며, 응용 프로그램 별 기능은 마치 처음부터 언어로 설계된 것처럼 자연스럽게 표시되어야합니다.
  • 언어는 매우 간단하고 일반적인 언어이므로 여러 다른 응용 프로그램에서 쉽게 작동하고 응용 프로그램이 제공 할 수있는 기능을 제한하지 않아야합니다.
  • 흥미로운 기능은 대부분 응용 프로그램에서 제공되므로 언어의 기본 목적은 확장 기능을 통합하거나 “함께 붙입니다”. 따라서 언어에는 통합을위한 좋은 기능이 있어야합니다.

“보낸 사람 은 Tcl의 역사 “- http://www.tcl.tk/about/history.html


답변

KISS로 인해 언어가 디자인에 고정되어 있으면 언어를 확장 할 수 없습니다. 성장할 수없는 언어는 죽을 것입니다.

다음 비디오에서 Guy Steele 은 프로그래밍 언어가 성장해야하는 이유와 이유를 똑똑하게 설명합니다. KISS를 적용하면 일단 석방 되었기 때문에 랑게 게가 어떻게 커질 수 있습니까? 도구 세트는 고정되어 있으며 절대로 변경할 수 없습니다.

“언어 성장” 에 관한 1998 ACM OOPSLA 컨퍼런스에서 Guy Steele의 기조 연설은 사용자가 개발할 수있는 프로그래밍 언어 설계와 관련된 중요성과 문제를 논의합니다.

한 시간 길이의 비디오이지만 볼만한 가치가 있습니다. Guy Steele이 누군지 모른다면 언어 디자인에 대해 이야기 할 때 정말로해야합니다.

KISS를 언어 디자인에 일반적으로 적용하는 것이 잘못되었다고 생각하기 때문에이 비디오를 답으로 선택하고, 언어 디자인의 저명한 사람으로부터 연설을 보는 것이 언어 디자인의 미래에 대한 이해를 넓히는 데 도움이되기를 바랍니다.

언어 설계에 대해 배우기 위해 여기에 왔고 KISS를 사용하지 않는 이유를 제시했기 때문에 언어 설계에 도움이되는 것을 지적하는 것이 공평합니다. 인지의 표기법

편집하다

위의 답변을 썼을 때의 이유는 다음과 같은 추론에 근거한 것입니다. 엔진을 고정 된 도구 세트로만 유지할 수 있다면 언어 설계와 관련하여 그 의미를 다시 한 번 수정하면 언어가 해제되면 언어를 변경할 수 없다는 것입니다. 의견은 그것이 의미하는 것이 아님을 나타냅니다. 수정 된 이해와 더 일치 할이 수정 된 답변을 제시하겠습니다.

그너 티브 차원의 표기법 을 살펴보면 언어 설계와 관련된 경쟁 차원이 단순성보다 많다는 것을 알게되고, 너무 중점을두면 다른 사람들에게 고통을 줄 것입니다. 간결성 (KISS)에 중점을두고 언어 설계 전문가들에 의해 뒷받침 되는 문제로 가이 스틸 (Gay Steele)연설 을 제출하여 디자인을 단순하게 유지하려는 노력이 다른 차원에 영향을 미친다는 것을 보여주었습니다. 더 중요한 것은 단순성뿐만 아니라 다양한 차원을 살펴보고 장단점을 평가해야한다는 것을 전달하려고합니다.


답변

여기에서 큰 따옴표의 브루스 맥키 니의 하드 코어 비주얼 베이직 에서 BASIC의 디자이너의 입에 박았 단어를 설정, Kemeny커츠 . 강조합니다.

모든 컴퓨터 언어는 자신의 느낌, 분위기, 정신을 가지고 있습니다. 당신은이 정신을 실제로 정의 할 수는 없지만 그것을 볼 때 그것이 무엇인지 알고 있습니다. 나는 Basic을 Albert Einstein의 진술에 대한 반추라고 생각합니다.

가능한 한 단순하게 만드십시오.

이 인용문은 Basic, John Kemeny 및 Thomas Kurtz의 원래 디자이너가 작성 했으므로 더 단순화되었을 것입니다.

가능한 것보다 간단하게 만드십시오.

그것이 바로 하드 코어 Visual Basic 프로그래머들이 모이는 모순입니다. 우리는 단순하고 우아하며 직관적 인 것을 원하지만 그렇지 않습니다. 우리는 우리의 프로그램이 현실을 모델링하기를 원하지만 그렇지 않습니다. 우리는 컴퓨터 나 운영 체제가 우리가 생각하기를 원하는 방식이 아니라 우리의 언어가 생각하는 방식대로 작동하기를 원하지만 가격을 지불하지는 않습니다 .


답변

그러나 KISS 원칙을 프로그래밍 언어 설계에도 적용 할 수 있습니까? 이 원칙을 염두에두고 특별히 고안된 프로그래밍 언어, 즉 “일반적인 작업 환경에서 평균 프로그래머가 최소한의인지 노력으로 최대한 많은 코드를 작성하고 유지하도록 허용”하는 것을 알고 있습니까?

내 생각에 간단한 프로그래밍 언어는 최소한의 구문과 기능 (Scheme, Forth, ML)이 거의없는 언어이기 때문에 “단순”의 의미를 명확히하는 것이 좋습니다. RAD (rapid application development)를 염두에두고 언어 디자인을 실제로 찾고 있다고 생각하며 그중 몇 가지가 있습니다. 이 StackOverflow 스레드를 참조하십시오 (예 : /programming/66227/what-is-the-best-multi-platform-rad-language)