프로그래밍 언어에 대한 자세한 설명이 왜 좋지 않습니까? [닫은]


98

프로그래밍 언어의 자세한 표현에 대해 불평하는 사람들이 많이있었습니다. 일부 범위 내에서 프로그래밍 언어가 더 장황할수록 이해하는 것이 좋습니다. 또한 자세한 내용은 API해당 언어에 대한 명확한 글쓰기를 강화한다고 생각합니다 .

내가 생각할 수있는 유일한 단점은 더 많이 입력한다는 것입니다.하지만 대부분의 사람들은 모든 작업을 수행하는 IDE를 사용합니다.

그렇다면 장황한 프로그래밍 언어의 가능한 단점은 무엇입니까?


20
최근에 APL로 코딩 한 적이 있습니까?
SK-logic

5
Dhanji R. Prasanna의 언어, 언어 및 Java 를 확인하십시오
Jeremy Heiler

66
"개발자가 죽기 전에 키
스트록

10
아마도 당신은 "많은 사람들이 불평하는 이유"가 무엇인지 물어보아야합니다.
Eric Lippert

29
@EricLippert, 나는 P.SE가 많은 "불평"개발자들에게 문의하기에 완벽한 장소 라고 생각 합니다.
Kevin McCormick

답변:


168

목표는 빠른 이해입니다

"Verbose"는 "너무 많은 단어를 사용합니다"를 의미합니다. 문제는 "너무 많은"것입니다.

좋은 코드는 한 눈에 이해하기 쉬워야합니다. 대부분의 문자 가 코드의 목적을 직접 제공하는 경우 더 쉽습니다 .

신호 대 잡음

경우 언어가 장황, 코드의 더 많은 소음입니다. Java의 "Hello World"를 비교하십시오 .

class HelloWorldApp {
    public static void main(String[] args) {
        System.out.println("Hello World!");
    }
}

... 루비와 함께 :

print "Hello World!"

소음은 정신 에너지를 낭비합니다.

암호화 대 클리어

다른 한편으로, 언어의 과도한 간결함 은 정신 에너지를 요합니다. Common Lisp의 다음 두 예제를 비교하십시오 .

(car '(1 2 3))   # 3 characters whose meaning must be memorized
# vs
(first '(1 2 3)) # 5 characters whose meaning is obvious

19
나는 이전으로 (우리가 일반적으로 더 간결 선호) 매크로 수준의 가독성에 대해 여기서 후자는 (우리가 일반적으로 더 자세한 표기법을 선호) 마이크로 수준의 가독성에 대한 것을 말할 것
JK합니다.

67
실제로 어떤 작업을 수행하는 Java의 경우 특히 라이브러리 사용률이 높을수록 Java를 훨씬 더 쉽게 읽을 수 있습니다.

9
실제로 매크로 규모의 상세의 더 나은 예는 누락 된 언어 기능 해결 패턴을 수 있습니다
JK합니다.

21
Java를 사용한 예제도 최고가 아니라고 말하고 싶습니다. 코드 골프에서는 클래스와 메소드를 정의해야 할 필요가 있지만 실제 애플리케이션에서는 거의 없습니다. Java가 몇 단어를 출력하기 위해 많은 코드를 필요로하는 것과는 달리,이 몇 줄은 프로그램을 만드는 데 필요하지만 다릅니다.
Malcolm

27
Signal vs. NoiseCryptic vs. Clear
Spoike

118

한 눈에보고 파싱 할 수있는 코드의 양에 영향을줍니다.

x++ 오히려 set(x,Integeradd(get(x),1))

추신. 코드를 읽는 것만이 아닙니다. 40x25의 화면에서 APL 유형 언어 또는 Perl은 Cobol 또는 Fortran보다 읽기 / 페이지 수있는 코드 양에 유용했습니다. 그러나 이제는 자신의 내부 캐시에 관한 것입니다. 문에 단일 연산자가 있으면 3 개의 기호와 4 개의 함수 호출을 가진 하나보다 노화 두뇌가 구문 분석하기가 더 쉽습니다.


19
이것이 궁극적 인 이유라고 생각합니다. 종이나 모니터와 같은 제한된 공간에서 가독성.

1
+1, 완전히 동의하면 13 인치 노트북에 코드를 작성하지만 다시이 사이트에는 로고로 3 개의 모니터가 있습니다. 다소 관련이 있어야합니다. :)
ZJR

1
@ZJR-편집 참조
Martin Beckett

3
그래서 set여기서 방법은 무엇 입니까? 실제로 무언가를 설정합니까 (예 : 첫 번째 x매개 변수), 무언가를 반환 x합니까 (예 : 호출 후 할당 )? 자세한 예제에서 이상한 복제가 진행되고 있다고 말할 것입니다.
Jesse C. Slicer

8
여기서 누락 된 한 가지는 표의 문자의 유용성입니다. 기호는 단어보다 의미가있을 수 있습니다. 예를 들어 +보다 더 의미가 plus있습니다. =보다 낫다 equals. 이것은 물론 너무 멀리 갈 수 있고 (여러 언어로도 사용 가능) 적당히 사용될 때 매우 강력합니다.
mcmcc

29

언어의 세부 정보가 코드 가독성을 떨어 뜨리면 좋지 않습니다.

일부 언어에는 코드 의 의미 를 이해하는 데 시간이 오래 걸리는 자세한 구문이 있습니다 (VB.NET과 C #에 대해 생각하고 있습니다).

If something Then
End If

if(something)
{}

실제로 코더가 친숙하고 편안한 것으로 요약합니다.


6
나는 C #에서 주로 일하지만 VB를 읽을 때 C # 인 것처럼 읽습니다. 나는 모든 것을 무시하고 If .. Then .. End If중요한 것을 읽습니다.
Andy Hunt

7
앤디와 동일합니다. 나는 똑같이 읽을 수있는 것을 발견했다. 나는 심지어 작은 VB의 변형을 선호한다고 말하는 경향이 있습니다 (c #에 더 익숙하지만).
dagnelies

9
VB.NET은 다른 나쁜 범죄자들과 비교하여 장황 하지 않습니다 !

3
@AndyBursh-정확히 내 요점. VB.NET을 읽을 때 코드를 이해하는 것 이상의 정신 번역을합니다.
Oded

6
Oded, End-If는 대괄호가 다른 if 문 내부, 루프 내부, 다른 루프 내부, 내부 함수 내부에 중첩되어있을 때 대괄호보다 if 문 끝을 이해하기 훨씬 쉬운 구조입니다. 수업. 앞에서 언급 한 모든 블록은 동일한 브래킷을 사용하므로 특정 엔드 브래킷이 어느 것이 직관적이지 않은지 파악하려고 시도합니다.
Andrew Neely

27

현재 생각할 수있는 가장 장황한 언어 중 하나 인 AppleScript를 살펴보고 , 부족한 것을 작성 하고, 되돌아 와서 자세한 내용이 언어에서 좋은 특성이라고 주장하십시오.

매일 키워드를 사용하지 않으면 키워드의 위치와 키워드의 의미를 모두 기억하는 것이 쉽지 않습니다.

이 간단한 예 에서 모든 키워드 노이즈 를 살펴보십시오 .

tell application "Finder"
    if folder "Applications" of startup disk exists then
        return count files in folder "Applications" of startup disk
    else
        return 0
    end if
end tell

bash전통적인 유닉스 도구와 동일한 것을 인정하면 간결하지만 대부분의 OSX 사용자에게는 암호가 될 수 있으므로 균형을 맞춰야합니다.


15
return the 0입력 할 때 원하지 않습니까? AppleScript는 내가 아는 유일한 언어로 상대방에게 키워드 애도를 허용합니다. 동료를 의미합니다.
ccoakley

90 년대의 Applescript IDE 인 Script Editor 는 액션의 애플 스크립트 기록 에 대한 자세한 설명에 도움을주었습니다. 매우 똑똑하지는 않았지만 Finder를 스크립팅하는 동안 편리합니다. . (OSX 전이가 IIRC, no로 수정 한 경우에는
Dunno

3
AppleScript의 번거 로움에 대한 OSX의 대답은 Automator입니다. 타이핑하기 쉬운 텍스트를 드래그 가능하고 자세하게 설명되어 있고 잘 설명되지 않은 기능 블록으로 구성된 거대한 라이브러리로 대체 해 봅시다!
솜털 같은

AppleScript의 최악의 점은 구동하려는 응용 프로그램마다 용어가 다를 수 있다는 것입니다. Apple은 모든 프로그램이 지원해야하는 특정 명령 모음을 정의하지만 일반적으로 한 응용 프로그램을 스크립팅하는 방법을 아는 것은 다른 응용 프로그램을 스크립팅하는 데 도움이되지 않습니다.
kindall

1
애플 스크립트는 작성하기에 번거롭지 만 프로그래머가 이해하기 쉬운 범위에있다.
aramis

23

나는 당신이 머리에 질문을 켜고 질문해야한다고 생각합니다 : 왜 어떤 사람들은 간결한 코드가 좋다고 생각합니까?

내 대답은 두 가지 기본 이유가 있다는 것입니다.

간결이 더 좋은 이유

여기에는 짧은 문장이 꽃이 많고 장황한 문장보다 더 이해하기 쉬운 방식으로 더 읽기 쉬워집니다. 종종 영어 문법을 모방하려고 시도하는 프로그래밍 언어는 끔찍하게 길어지기 때문에 가장 간단한 작업을 수행하기 위해 엄청난 양의 코드가 필요합니다. 종종 언어가 서면 언어를 에뮬레이트할수록 논리적으로 복잡한 작업을 수행하기 위해 언어를 동축하기가 더 어렵다는 것을 알게 될 것입니다.

간결한 것이 더 나쁜 이유

어떤 언어들 (그리고 나는 Perl을 생각하고있다)은 이상한 상징들의 배열을 사용하는데, 그것들은 구문의 일부로 거의 임의로 선택된 것처럼 보인다. 이 상형 문자에 익숙하지 않은 사람에게는 언어가 뚫을 수 없게됩니다. 쉽게 볼 수없는 오타를 쉽게 만들 수 있습니다. 정규 표현은 아마도 이런 종류의 간결함을 보여줄 것입니다.

또한 어떤 사람들은 간결한 코드를 작성하여 자신을 영리하게 보이게하기 때문에 과시하기를 좋아합니다. 때때로 사람들이 가독성을 희생하면서 매우 컴팩트 한 답변을 제출하는 StackOverflow에서이 사실을 알 수 있습니다. 이것은 당신이 철학을 얼마나 많이 알고 있는지에 대한 일종의 "동료들에게 감동을주는 것"이지만, 훌륭한 프로그래머들은 " 코드 골프 "가 유지 보수 가능한 소프트웨어를 만드는 방법이 아니라는 것을 알고 있습니다.


나는 verbose의 반대를 고려하지 않을 것입니다. Verbose는 부정적인 의미를 가지므로 긍정적 인 의미를 갖는 반의어에 더 적합 할 것입니다.
Joshua Drake

6
terse의 반의어이며 verbose, terse단지 동일한 부정적인 의미를 전달할 수 있습니다 (Perl 참조)

1
@JarrodRoberson : 금요일 밤에 모든 일을하는 것을 싫어하지만 온라인 시소러스 몇 개를 보았는데 그 중 어느 것도 terse반의어 가 아닙니다 verbose. / ducks
Scott Mitchell


15

@frowing에서, 자세한 문제를 보는 한 가지 방법은 프로그래밍이 항상 솔루션을 찾고 표현하는 두 가지 스타일의 혼합이라는 것을 깨닫는 것입니다.

첫 번째로 더 장황한 스타일은 언어 지향적 (언어 적) 프로그래밍입니다. 이 스타일은 문장과 유사한 구조 내에서 명사와 같은 단어와 동사와 같은 단어를 결합하며 잘 작성된 단락과 거의 같은 방식으로 읽고 이해하도록 의도되었습니다. 언어 자체는 보편적이기 때문에 언어 적 프로그래밍은 가장 보편적 인 프로그래밍 스타일입니다. 같은 이유로, 장기 프로그램 지원에는 항상 강력한 언어 구성 요소가 필요합니다. 새로운 프로그래머가 가장 먼저 찾는 것은 수행되는 작업에 대한 개념적인 이해이기 때문입니다. 일반적으로 프로그램을 작성하는 맥락에서 멀어 질수록 언어 적 프로그래밍 스타일이 더 중요 할 것입니다. 언어적인 프로그래밍 스타일은 코드를 이해하려는 다음 사람이 가정과 개념을 오해하지 않도록하는 것입니다. .

두 번째로 간결한 스타일은 수학 중심 (수학) 프로그래밍입니다. 예를 들어 변수는 명사 및 연산자와 동사와 유사하기 때문에 이러한 추론 스타일은 언어에 의존합니다. 그러나 수학적 추론은 우리 뇌의 놀랍고 평행 한 능력을 활용하여 우리의 시야 내에있는 물체에 대해 복잡한 공간 변형을 수행합니다. 명사와 동사를 작고 독특한 상징으로 표현함으로써, 잘 짜여진 가상의 물체 (방정식)로 배열 될 수 있으며, 고도의 평행 한 시각적 기능을 사용하여이 가상의 회전, 교체, 이동, 반전 및 기타 변형을 수행 할 수 있습니다. 사물. 각 심볼은 밀접하게 관련된 객체의 전체 클래스를 나타낼 수 있기 때문에 결과적으로 한 번에 처리 할 수있는 사례 수를 크게 증폭 할 수 있습니다.

시각적 처리를 효과적으로 적용하려면 가상 객체를 가능한 한 크기와 기능을 실제 객체와 비슷하게 유지해야합니다. 필요한 시야가 너무 넓어 지거나 기호를 물체의 움직일 수있는 표시처럼 사용할 수 없거나“문자를 읽고”단어로 변환해야하는 경우 복잡한 변환을 안정적으로 수행하는 능력이 떨어집니다 아주 좋은 수학자에게도

그렇기 때문에 수학의 프로그래밍 스타일에 깊이 빠져있는 사람들은 방정식이 널리 퍼져서 "자세한"언어 적 스타일로 표현 될 경우 심각하게 불행해질 수 있습니다. 방정식이 크게 바뀌었기 때문이 아니라 시각적으로 이해하는 스타일을 적용하는 것을 거의 불가능하게 만들 수 있기 때문입니다. 그러나 동시에 짧은 기호에 익숙하지 않은 새로운 프로그래머는 코드의 기능을 처음 이해하기 위해보다 언어적인 정보를 제공하는보다 자세한 버전을 선호 할 것입니다.

그래서 내가 무엇을 추천할까요?

두 스타일을 모두 사용하되 각 스타일을 사용 하는 이유에 주의를 기울이십시오 .

예를 들어, 외부 세계와 인터페이스 할 가능성이있는 것은 코드와 혼합 된 인라인 주석의 형식으로되어 있어도 어느 정도 집중적으로 자세해야하며 올바른 사용법에 대한 자동 검사도 포함해야합니다. 암묵적이고 특히 불완전하게 정의 된 표기법은 그러한 인터페이스에서 아무런 의미가 없습니다. 화성 기후 Obiter 1999 손실 때문에 소프트웨어 인터페이스 유닛 파운드 뉴턴으로 표현되었는지를 인식하는 실패는 소프트웨어 또는 하드웨어 인터페이스에 원료 수에 의존 너무 부담의 위험 특히 지적 된 예이다.

반대로, 깊이 알고리즘적이고 수학적인 모든 형태의 프로그래밍은 수학적 스타일의 추론을 지원하는 훌륭한 간결한 프로그래밍입니다. 새로운 사람이 그러한 코드를 유지해야한다면, 코드를 좀 더 장황한 형태로 변환하는 대신 수학적 표기법을 배우는 것이 일반적으로 더 좋습니다. 물론 그러한 개발자가 사용할 수있는 수학적 부분을 수학 부분을 설명하기 위해 쉽게 구할 수있는 문서가 항상 있어야하지만 그것은 별도의 문제입니다.

이러한 극단 사이에는 프로그래머가 상당한 재량권을 가지고있는 경우가 많습니다. 코드를 장기적으로 유지 관리하는 방법을 살펴보고 장기적으로 코드를 유지 관리 할 가능성이 가장 높은 사람들의 요구를 수용하려고합니다.


8

많은 사람들이 아마도 명시 적으로 언급해야 할 내용을 암시했습니다.

자세한 표현은 미시적 수준의 이해를 선호하는 경향이 있습니다. 일반적으로 개별 진술을 읽고 이해하기 쉽습니다. 자세한 표현은 또한 언어를 이해하는 데 필요한 언어에 대한 친숙 함 정도 (적어도 어느 정도까지)를 줄이는 경향이 있습니다. 가장 장황한 언어 (예 : COBOL)는 완전한 프로그래머가 아닌 사람이라도 읽을 수 있습니다.

결정은 반대 방향으로 향합니다. 거시적 수준에서, 특히 해당 언어에 가장 친숙한 프로그래머가 이해하는 데 도움이됩니다. 동시에, 특정 언어에 대한 지식이 부족하면 숙련 된 프로그래머조차도 초보적인 이해조차 할 수 없습니다.

따라서 가독성은 대상 사용자에 따라 크게 다릅니다. 한편으로, 거의 독점적으로 해당 프로젝트를 수행하는 사람들이 작성하고 관리하는 크고 복잡한 프로젝트를 고려하십시오. 대부분은 상당한 프로그래밍 배경과 교육을받은 사람들입니다 (예 : 많은 박사 학위). 이것은 더 간결한 언어를 선호하는 경향이 있습니다.

그 반대의 극단에서, 소프트웨어 자체보다는 소프트웨어와 관련된 비즈니스를 전문으로하는 사람들이 주로 유지하는 상당히 단순한 프로젝트 (아마도 여전히 큰 프로젝트)를 고려하십시오. 이것은 훨씬 더 장황한 언어를 선호 할 것입니다.


6

기술 서적 을 보지 않고 Strunk and White 의 Elements of Style *로 되돌아갑니다 . 기본 개념은 "정확하다"와 "필요 이상으로 말하지 말라"입니다. 다른 모든 것은 주석입니다.

프로그래밍에 적용하면 매우 정확하지만 불필요한 보풀이 없습니다. 여분의 보풀은 구문 일 수 있지만 의미를 전달하는 데 필요한 것보다 많은 단어 일 수도 있습니다. (물론 모호성을 허용하기에는 너무 적지 않습니다)

  • 가장 간결하기 때문에 원본 버전을 인용합니다. :-)

5

하루가 끝나면 '다른'것이 있으면 사람들이 울부 짖을 것입니다. 나는 C 스타일 구문에 익숙하기 때문에 비슷한 구문 (C ++, Java, C #)을 공유하는 다른 언어에서도 괜찮습니다. 그래서 나는이 특정 스타일을 선호하는 경향이 있습니다.

언어는 설명 적이면서도 장황하지 않은 균형을 찾는 경향이 있습니다.

펄은 매우 간결한 코드를 작성할 수있는 예제입니다. 처음에는 Perl 닌자가 작성한 코드가 마법에 불과합니다.

COBOL은 너무 자세한 예입니다.


5
이 질문에 어떻게 대답합니까?
ChrisF

자세한 내용은 모든 사람에게 다릅니다. 그것은 내 의견의 의도였습니다. C / C ++ 캠프에있는 경우 허용되는 세부 정보는 펄 캠프에있는 경우와 다릅니다.
Nasir

펄 닌자에 의해 작성된 코드는 마법에 불과한가? 진심으로, 그것은 악몽이라고 생각합니다.
Kevin

나는 펄을 피한다 :)
Nasir

프로그래머의 경우 COBOL은 다른 언어와 비교하여 너무 장황 할 수 있습니다. 그러나 잘 작성된 COBOL은 비즈니스 고객이 쉽게 읽을 수 있습니다. 이를 통해 코드를 읽고 필요한 작업을 코드에서 확인할 수 있습니다.
BillThor

4

한때 어딘가에서 읽은 많은 논쟁이 새로운 프로그래머와 노인의 손에서 비롯됩니다. 사용 된 비유는 우리가 새로운 것을 배울 때, 우리가 스스로 그것을 극복 할 "이야기"(HS에서 대수학을 언제 배웠는지 생각하는 것)를 말합니다. 경험을 쌓으면서 개별 구성 요소를 설명하는 이야기의 필요성을 넘어서 더 많은 것을 이해합니다. 우리의 코드는 코드가 말하는 것을 반복하는 대신 필요한 항목만을 설명하는 주석과 함께 더 조밀하고 간결 해집니다.

나는 이것이 나와 동료 사이에 사실이라는 것을 알았습니다. 그녀는 코드 줄이 무엇인지 설명하고 많은 공백이있는 주석을 많이 사용하여 코드를 작성합니다. 그것을 읽고 있다면, 이것 때문에 한 화면에 몇 줄의 코드 만 넣을 수 있다는 것을 알았습니다. 각 개별 라인을 이해하는 것이 훨씬 쉬워 지지만 전체 기능을 이해하는 것이 훨씬 어려워집니다.

여분의 공백이나 주석없이 코드를 작성하는 경향이 있습니다. 이렇게하면 전체를 훨씬 쉽게 볼 수 있지만 개별 코드 "단어"를 간단히 "가져올"수 있어야합니다. 각 단어가 고유 한 줄에 있고 공백 / 주석 / 추가 언어가 많은이 대답을 읽으려고하면 각 개별 단어를 이해하는 것이 훨씬 쉽지만 전체를 이해하는 것이 훨씬 어렵습니다.


아무도 의견에 반대하지 않습니다. 문제는 자바, 애플 스크립트 또는 Visual Basic과 같은 언어로, 중복되지만 필수 요소가 많습니다.
Marcin

2
@Marcin 나는 의견에 반대하지 않지만 다음과 같은 i++; //this is adding one to var i경우에는 중복됩니다.
스펜서 Rathbun

문제는 프로그래밍 언어에 관한 것입니다.
Brendan Long

2
@BrendanLong 흠, 아마도 분명하지 않을 수도 있습니다. 불필요한 프로그래밍 언어로 불필요한 주석을 동일시했습니다. 같은 말을하는 많은 단어들, 장황한 프로그래밍 언어 만이 항상 그것들을 필요로합니다.
스펜서 Rathbun

어쨌든 함수는 몇 줄 이상으로 구성되어서는 안된다고 주장 할 수 있습니다. 함수의 작동 방식을 파악하기 어려우면 너무 많은 주석으로 인한 것이 아닙니다. 그러나 어쨌든 즉시 명확한 내용 만 언급하는 의견을 피하는 것이 좋습니다.
leftaroundabout

4

아인슈타인은 "가급적 단순하지만 단순하지는 않다"고했다.

이것은 코드에도 적용됩니다. 반복적이고 불필요하게 장황한 요소를 제거하여 코드를 단순화 할 수 있다면 좋습니다.

또한 일부 사례 연구는 코드 라인에서 측정 된 프로그래머 생산성이 다소 일정하다는 것을 시사합니다. LOC 당 버그 수도 마찬가지입니다. 따라서 다른 모든 사항이 동일하게 유지되면 코드 라인 당 더 많은 작업을 수행 할 수있는 언어로 전환하는 것이 생산성 향상으로 간주 될 수 있습니다.

즉,이 업계에서는 간단한 일을 과도하게 엔지니어링하고 복잡하게 만드는 경향이 있습니다. 관계형 데이터베이스에서 연락처 세부 정보를 채우는 것과 같은 간단한 것. 특정 문제에 대해 엄청나게 복잡하고 잘못된 해결책 ( 기침 MDA)을 보았습니다 . 스칼라와 루비와 같은 언어는 특정 개인의 손에 이해하기 어렵고 지나치게 복잡하며 관리하기 어려운 코드를 생성하는 강력한 도구의 좋은 예입니다. 몇 번의 키 스트로크로 여러 수준의 간접 지시를 사용할 수 있다고해서 특정 망치로 모든 못을보아야하는 것은 아닙니다.

올바르게 사용하면 짧고 이해하기 쉬운 깔끔한 코드를 얻을 수 있습니다. 잘못 사용하면 문제의 개인이 시각적 손상이나 비슷한 언어를 사용하여 더 이상의 피해를 입히지 않는 것이 좋습니다.

진정한 기술은 복잡한 것을 단순한 방식으로 만드는 것이 아니라 단순한 방식으로 복잡한 것을 만드는 데 있습니다.


3

다른 사람이 맞지 않은 것은 한 화면에 맞는 코드의 양입니다. 몇 가지 이유로 도움이됩니다.

  • 하나의 파일에서 여러 기능을 작업하거나 읽을 때 스크롤이 적게 걸립니다.
  • 가로 스크롤이 적습니다 (읽기 중지, 스크롤 막대 클릭 및 드래그, 읽기 중지, 스크롤 막대 클릭 및 드래그 ...).
  • 원하는 것을 찾는 데 방해가되지 않는 구문이 적기 때문에 스캔 속도가 빨라집니다.

실제로 읽을 수있는 글꼴 크기로 1920 X 1080 화면에서 얼마나 많은 스크롤이 수행됩니까? 어떤 방법 으로든 탐색을위한 바로 가기 키라고하는 것도 있습니다.

@JarrodRoberson-내 화면에는 약 30 줄이 표시됩니다. 코드 창을 전체 화면으로 만들고 글꼴 크기를 거의 읽을 수 없도록 줄이면 60 줄이 표시됩니다. 나는 수천 줄의 파일 을 작업해야했습니다 (선택에 따라가 아니라고 확신합니다). IDE에서 "네비게이터"를 사용하고 있지만 화면에있는 두 코드 섹션 사이를 보는 것만 큼 편리한 곳은 없습니다.
Brendan Long

IDE가 분할보기를 지원하지 않습니까?
leftaroundabout

2
내 IDE가 스크롤을 덜 나쁘게 만들 수 있는지 여부는 스크롤 하지 않거나 핫키를 사용하거나 분할 화면을 사용하지 않는 것만 큼 ​​좋은 점이 아닙니다 . "화면 키보드는 괜찮습니다. 클릭하는 것에 대해 들어 보지 못했습니까?"; 분명히 나는 ​​가지고 있지만 실제 키보드를 사용하는 것을 이길 수는 없습니다.
Brendan Long

나는 이것이 사실이라는 것을 실제로 보여주는 연구가 있다는 것을 모호하게 기억합니다 (특히 스크롤 부분). 전체 논리 장치를보기 위해 스크롤해야하는 경우 이해하기가 더 어려워집니다. 최소한 그럴듯하게 들린다.
Konrad Rudolph

1

더 많은 코드는 더 많은 개발 시간과 더 많은 버그를 의미하기 때문입니다.

300 줄의 코드가 아닌 100 줄의 코드를 작성하는 경우 즉, 거의 1/3의 개발 시간과 1/3의 잠재적 버그가 발생할 수 있습니다.

적은 코드를 작성하면 기계가 더 많은 일을해야하고 효율성이 떨어지기 때문에 대부분의 경우 효율성과 간결함의 균형을 유지해야합니다.


2
나는 300 라인의 Ada보다 100 개의 전형적인 Perl 라인에서 훨씬 더 숨겨진 버그를 기대합니다. — "적은 코드를 작성한다는 것은 기계가 더 많은 일을해야하고 효율을 떨어 뜨린다는 것을 의미하기 때문에"이러한 상관 관계는있을 수 있지만 인과 관계는 아닙니다. Ruby, Perl 및 Python과 같은 간결한 동적 및 / 또는 해석되는 언어는 C 또는 Fortran과 같은 더 자세한 정적 컴파일 언어보다 속도가 느린 경향이 있습니다. 그러나 간결하게 컴파일 된 Haskell, Python w / PyPy 또는 C ++ 프로그램은 해석되는 Basic, Groovy, Smalltalk 또는 C # 코드와 같이 장황한 것보다 훨씬 빠를 수 있습니다.
leftaroundabout

1

일반적으로 사람들은 가독성이 높고 간결한 언어보다 읽기 쉽고 자세한 언어를 선호합니다. 그러나, 나는 대부분의 사람들이 "verbosity"를 "clutter"로 동화했다고 생각합니다.

예를 들어 : while(<>){print if($.==2 || $& && !$x++); $.=0 if (/^--+$/)}

매우 간결한 진술입니다. 알고 싶은 모든 것이 포함되어 있습니다. 그러나 간결하기 때문에 이해하기가 어렵습니다. 반면에 같은 프로그램의 좀 더 장황한 버전은 더 읽기 쉽기 때문에 이해하기가 쉽습니다. 이것은 물론 언어 자체의 속성은 아니지만 일부 언어는 더 장황한 반면 다른 언어는 프로그래밍 방식이 더 간결한 경향이 있습니다.

다른 극단적 인 표현으로는 http://en.wikipedia.org/wiki/Literate_programming 입니다. 저는 꽤 흥미로운 개념이라고 생각합니다.

다른 측면은 "클러 터"라고도하는 "원치 않는 상세"입니다. 기술적 이유, 구문 설탕 부족, 부풀린 API 등으로 인해 추가해야 할 사항

나는 명확하고 직관적 인 구문이 매우 중요하다고 생각합니다. 또한 쉽게 읽을 수 있도록 충분히 장황해야합니다. 너무 많은 논리로 채워진 너무 짧은 문장은 종종 약간 더 긴 문장보다 더 많은 시간을 해독 할 수 있습니다. 다른 한편으로, 아주 간단한 것을하기 위해 상용구 라인으로 가득 찬 쓸모없는 bloated 코드는 마찬가지로 귀찮은 일입니다.


4
[간결한 의미] ( en.wiktionary.org/wiki/concise )는 거의 암호의 반의어이기 때문에 다시 확인하는 것이 좋습니다. 아마도 Java로 코딩합니까?
Joshua Drake

2
간결한 언어로 작성된 자세한 코드를 선호합니다.
Brendan Long

@Joshua : 예, 매우 다른 방식으로 해석 될 수 있음을 알았으므로 답변을 편집했습니다. ... 자바와 관련이있는 것은 무엇입니까?
dagnelies

1
다운 보트 된 이유를 설명하는 주석은 다운 보트 자체보다 더 흥미로울 수 있습니다.
dagnelies

@arnaud는 위키 낱말 사전을 사용하는 것이 좋지 않습니다. Google 검색 정의 : 간결한 시작 : 샘플 코드가 명확하게 위반되는 "많은 정보를 명확하게 제공" 나는 간결함의 원래 의미를 인정해야하지만, 명확하고 간결하게 지금 여행합니다.
Joshua Drake

1

자세한 표현은 방대한 양의 텍스트를 사용하는 경향이 있으며, 아주 작은 텍스트 사용은 간결합니다 ...

자세한 내용은 다음과 같은 이유로 나쁩니다.

  1. 그것은 인쇄상의 오류에 대한 더 많은 기회를 소개합니다
  2. 화면이나 종이에서 코드를 읽거나 펀치 카드에 입력하기가 더 어렵습니다.
    1. 이것은 디버그 시간을 증가시킵니다
    2. 이것은 업그레이드 / 유지 보수를위한 코드 이해를 어렵게합니다
    3. 이로 인해 의도하지 않은 코드 복제가 발생할 수 있습니다
  3. 구문 오류 가능성을 다소 증가시킵니다.
  4. 대부분의 장황한 언어는 고도로 구조화되어 있고 같은 말을하는 여러 가지 방법이 없기 때문에 코딩 유연성이 떨어집니다.
  5. 코딩 및 컴파일 시간이 증가합니다.
  6. 더 많은 저장 공간이 필요할 수 있습니다.

명확성을 위해서는 특정 레벨의 세부 정보가 필수적입니다.

다음과 같은 이유로 최소 레벨의 상세가 좋습니다.

  1. 인간이 순수한 기호 코드보다 의미 적 가치를 읽고 첨부하는 것이 더 쉽습니다.
  2. 변수 및 함수 이름 지정을 통해 코드를보다 쉽게 ​​디버그, 이식 및 유지 관리 할 수 ​​있습니다.
  3. 기본 수준의 언어 작업 및 복잡한 언어의 키워드에서 잘못된 작업 / 키워드 할당이 줄어 듭니다.

많은 사람들이 지나치게 간결한 명령의 몇 가지 훌륭한 예는 옛 BASIC 대기 상태를 포함 val(x$), str$(x)그리고 chr$(x)... 그 문자열 표현에서 숫자를 반환 번호에 대한 문자열을 반환하고, 문자열로 단일 문자 가진 아스키 x 값을 반환합니다.

또는 C / C ++ 포인터와 참조 연산자 &*BASIC byref키워드를 기준으로 합니다. C / C ++에서 변수 X를 가질 수 있고 해당 변수에 대한 포인터를 전달할 수 있지만 포인터가 무엇인지, "포인터가 가리키는 변수로 포인터 사용"을 기억해야합니다. 기본적으로 함수 호출에서 byref 키워드로 참조를 전달하면 더 명확하지만 덜 유연합니다.

def fn Foo(x byref as float) foo= (x += x+1)
...
Foo(x)

이 코드에서 x의 내용은 byref 플래그로 인해 수정됩니다. 일부 풍미는 호출시 반품을 허용하고 다른 풍미는 정의 중 일부를 허용합니다.

일반 프로그래머가 기호를 더 쉽게 사용할 수 있도록하려면 자세한 정보가 중요합니다. BASIC 또는 python은 C / C ++보다 인간이 읽기 쉽고 더 장황하므로 일반 프로그래머에게는 훨씬 유용합니다. C / C ++의 간결함은 한 화면에서 더 많은 코드와 더 복잡한 코드를 볼 필요가 있지만 다양한 상징적 구조 규칙을 배워야하는 숙련 된 프로그래머에게는 훨씬 더 좋습니다. 맨 끝에는 거의 완전히 인간이 읽을 수없는 APL이 있습니다.

친밀하게 관련된 문제는 명확성입니다. 간결한 코드는 종종 불분명하며 지나치게 자세한 코드 (AppleScript에서와 같이)는 불분명 할 수 있습니다. 주어진 언어에 익숙하면 해당 언어 내에서 간결한 코드의 선명도가 높아집니다. C ++ 코드에 직면 한 초보자는 수식 만 구문 분석 할 수있을뿐만 아니라 기능적인 BASIC 또는 Python 코드도 이해하기에는 너무 간결합니다. 일반적으로 언어 사전에 의존하지 않고 당황합니다. 의도적 인 난독 화없이 내가 만난 가장 분명한 것은 Inform 7입니다 ...

옛날에

과거에 또 다른 중요한 고려 사항 이었지만 더 이상 취미 코더에 중요하지 않은 사항은 작업 및 저장 공간입니다. (여전히 여전히 중요하다.) 많은 언어, 특히 베이직 풍미가 해석되었고, 더 많은 런타임이 컴파일되었다는 점을 명심하라. 특히 디스크는 128KiB 만 보유하고 개별 펀치 카드는 80B 만있을 때 코드 공간이 중요했다.

몇 가지 솔루션이 존재했습니다. 토큰 화는 BASIC에서 매우 일반적이었습니다. 개별 언어 키워드는 상위 128 자 또는 제어 문자 공간에서 1 또는 2 바이트 단어로 줄었습니다. 토큰 화는 Inform 및 Z-Machine에서와 같이 바이트 코드 컴파일로 이어집니다.

공간 제한을 극복하기 위해 다중 오브젝트 파일 컴파일 및 링크도 사용되었습니다. 100KiB 파스칼 코드 섹션은 5KiB로만 컴파일 될 수 있습니다. 여러 개의 컴파일 된 파일을 연결함으로써 대형 드라이브에 액세스하지 않고도 방대한 응용 프로그램을 구축 할 수 있습니다 (10MiB가 엄청나게 큰 것을 기억하고 새 차를 사십시오).

그러나 더 간결한 언어는 디스크와 램의 주어진 덩어리에 더 많은 코드를 가져 와서 한 번에 더 큰 덩어리를 컴파일했습니다. 명심하십시오 : 1970 년대 초의 "미니 컴퓨터"는 단지 64KiB의 램을 가질 수 있습니다 (Honeywell 800은 각각 8 개의 2048 워드의 4 개의 뱅크를 설치했습니다). APL 및 이와 유사한 기호 언어는 명령어 당 피연산자에 비해 훨씬 큰 3B-10B와 비교하여 명령어 당 1B에 접근했습니다. (심볼은 기본적으로 타입 볼의 글꼴이었고 많은 카드 펀치에는 키에 심볼이 없었기 때문에 펀치 카드에 타이핑하는 것은 악몽이었습니다.)

또한 카드를 지울 수 없으며 많은 프로그램이 카드에 입력되었습니다. 개별적으로 비싸지는 않지만, 코드가 코드에 압축 될수록 필요한 용량은 줄어들고 프로그램의 규모는 커지거나 비용은 줄어 듭니다. 이것이 베이직이 대부분의 맛에서 한 줄에 여러 명령을 연결하는 이유의 일부입니다. 펀치 카드를 절약하기 위해 도입되었습니다. (또는 Vax Basic 프로그래밍 텍스트라고도합니다.) 카드 리더를 위해 프로그래밍하지는 않았지만 FORTRAN, BASIC, APL 및 기타 상징적 인 언어로 Honeywell 800의 카드 펀칭을 수행했습니다.


대부분의 경우 자세한 표시는 단순히 잘못된 동작을 생성하지 않고 컴파일 타임 에 인쇄상의 오류가 감지 될 가능성을 높입니다 .
supercat

-1

많은 것들과 마찬가지로, 그 대답은 "verbosity"의 구체적인 정의에 달려 있습니다. 그 정의가 상세가 중복성을 의미한다면, 나는 항상 나쁘다고 주장 할 것입니다. 이러한 정의를 통해 자주 인용되는 Java hello world 프로그램은 "verbose"자격을 갖추지 못합니다 . 중복되는 것은 없기 때문입니다.


1
대괄호와 세미콜론은 유형 선언이므로 대부분 중복됩니다.
Marcin

1
@Marcin : 예.하지만 언어에 대한 파서 / 분석기를 작성하는 것이 더 쉽습니다. 나는 언어를 사용하는 프로그래머가 아닌 언어 구현 자의 이익을 위해 그러한 구문이 존재한다고 확신합니다.
ccoakley

1
@Marcin-형식 선언이 필요한지 여부에 따라 언어에 전적으로 의존합니다. 특정 유형의 시스템은 단순히 아니라, 오히려 명확한 문법과 언어와 짧은 내다 싶어, 브래킷과 세미콜론에 관한 .... 따라서, decidable되지 않습니다 - 아주 작은 프로그램은 시간이 걸릴 수 컴파일 다른 사람 또는 끝 당신의 원하는 프로그램 해석을 선택해야합니다.
Ingo

1
@ingo 형식 시스템의 복잡성으로 인해 모든 변수 또는 함수에 형식 선언이 있어야하는 언어는 없습니다. 사실, 더 강력한 타입 시스템을 가진 언어는 그러한 선언을 생략 할 가능성이 더 높다고 말할 것입니다.
Marcin

1
@Marcin, 화낼 이유가 없습니다. 당신은 말했다 내가 더 강력한 타입 시스템과 언어는 선언을 생략 할 수 있도록 할 가능성이 있다는 말을 내가 당신에게 더 강력한 타입 시스템이 더 타입의 주석을 필요로하는 예를했다. 그것이 당신의 결정에 위배되지 않는다고 생각한다면, 그렇게하십시오.
Ingo

-1

프로그래머는 작은 코드로 자주 수행해야하는 간단한 작업을 코딩 할 수 있으므로 표현력이 뛰어난 언어를 선호하는 경향이 있습니다. 장황한 언어는 여러 줄의 코드를 사용하여 동일한 작업을 반복해서 수행해야 함을 의미합니다. 그러나 표현력이 높은 언어로는 더 간단한 고급 언어를 실행하는 것만 큼 빠르지 않기 때문에 가격이 책정 될 수 있습니다. C와 C ++의 대조적 인 예를들 수 있다면. C ++는 코드 작성자에게보다 표현력을 제공합니다. 실제 객체의 개념을 클래스로 캡슐화 할 수 있습니다. C 프로그래머는 동일한 것을 달성 할 수 있지만 클래스 구성의 표현력은이를 도와 줄 수 있습니다. 따라서 종종 더 길고 더 복잡한 (이해하기 위해) 코드를 작성해야합니다. 그러나 C ++의 "late binding"(즉, 런타임 리팩토링)을 사용하여 코드를 실행하지 않기 때문에이 코드는 더 빠르게 실행될 수 있습니다 (컴파일러 품질 등에 크게 의존하지만). C는 컴파일되고 연결된 코드를 실행하기 만하면 C ++은 어떤 코드를 실행할지에 대해 런타임에 결정해야합니다 (특정 상황에서).


이 "늦은 바인딩"을 사용하면 가상 함수 호출을 의미 할 수 있습니다. 그러나 이것은 코드 재사용을 달성하기위한 많은 다른 방법들 중 하나 일뿐입니다. 동적 타이핑은 또 다른 방법이며 C ++의 가상 호출보다 훨씬 많은 오버 헤드가있는 경향이 있으므로 요점을 더 잘 이해할 수 있습니다. 그러나 컴파일 타임에 완전히 해결할 수 있기 때문에 런타임 성능에 전혀 영향을 미치지 않는 메커니즘도 있습니다. 현대 객체 지향 언어에는 템플릿 / 일반 언어가 있으며 정적 기능 언어 매개 변수 다형성이 있습니다.
leftaroundabout

늦은 바인딩은 가상 함수 호출을 작동시키는 데 사용되는 것이므로 "가상 호출을 의미하지"않습니다. 늦은 바인딩을 의미했습니다. 가상 호출은 언어 정의의 일부이며, 후기 바인딩이 해당 부분을 작동시키는 원인입니다. 물론 다른 언어로 된 다른 예가 있습니다. 저는 한 언어를 다른 언어보다 추천하지 않고 표현력과 속도 사이의 절충 가능성에 대한 예를 제시했습니다.
adrianmcmenamin

-1

: 나는 거기 일기 좋게보다 더 근본적이고 이론적 인 문제에 뿌리를두고 질문에 대한 답변이며,이 답변은 그레고리 차이 틴에 의해 설립 된 알고리즘 정보 이론과 관련이 있다고 생각 http://en.wikipedia.org/wiki/Algorithmic_information_theory . 몇 마디로 말하면, "문자열의 정보 내용은 해당 문자열의 가능한 가장 짧은 자체 포함 표현의 길이와 동일합니다", 이것은 주어진 문제를 밀접하게 해결하는 가장 짧은 프로그램 (즉, 사전 길이)으로 암시합니다. 는 해결책을 제시하는 문제의 본질적 복잡성과 일치하므로 문제의 본질에 의존하고 문제의 표현에 덜 의존합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.