어떤 프로그래밍 언어가 찾기 어려운 버그를 가장 적게 생성합니까? [닫은]


54

일반 프로그래머가 찾기 어려운 버그를 최소화하여 기능을 출력 할 수있는 언어는 무엇입니까? 이것은 물론 매우 광범위한 질문이며, 매우 광범위하고 일반적인 답변과 지혜에 관심이 있습니다.

개인적으로 Java 및 C # 프로그램에서 이상한 버그를 찾는 데 거의 시간이 걸리지 않는 반면 C ++ 코드에는 고유 한 반복 버그 세트가 있으며 Python / 비슷한 버그는 컴파일러에서 감지 할 수있는 공통적이고 어리석은 버그 세트를 가지고 있습니다 다른 언어로.

또한 기능 코드를 작성하는 크고 복잡한 프로그램을 본 적이 없기 때문에 기능적 언어를 고려하기가 어렵다는 것을 알았습니다. 입력 해주세요.

편집 : 찾기 어려운 버그에 대한 임의의 설명 : 재생산하는 데 15 분 이상 걸리거나 원인을 찾아 수정하는 데 1 시간 이상 걸립니다.

이것이 중복이라면 용서하십시오. 그러나이 특정 주제에 대해서는 아무것도 찾지 못했습니다.


10
이 주제에 대한 연구가 필요합니다! "나의 일화적인 증거는 내가 아는 유일한 언어가 왕이라는 것을 시사하는 것"뿐만 아니라 대규모 프로젝트의 버그 비율 등입니다.
Frank Shearar

@Frank .. 만약 당신이 많은 시간 (그리고 나는 많은 것을 의미하는 경우)을 가지고 있다면, 아마도 수천 개의 코드 리포지토리에서 버그를 수정 한 패치를 식별 할 수 있다면 ohloh에서 일부 통계를 채굴 할 수있을 것입니다.
Tim Post

의견 만 허용되는 곳. 다른 지침은 없습니다 :)
Victor Hurdugaci

4
"찾기 어려운"을 명확히해야한다고 생각합니다. 귀하의 질문과 대부분의 답변은 "찾기 어려운"을 "컴파일러가 잡지 않은"것으로 정의하는 것 같습니다. 파이썬에서 컴파일러에 의해 발견되는 바보 같은 버그가 있다고 언급했습니다. 그럴 수 있지. 그러나 그 바보 같은 버그는 대개 찾기가 어렵지 않습니다. 확실히, 그들은 너무 빨리 메모리를 해제한다고 말하는 C ++ 버그와 같은 카테고리에 있지 않습니다.
Winston Ewert

@Winston Agree.
Magnus Wolffelt

답변:


58

언어의 유형 시스템이 강력할수록 컴파일 시간에 더 많은 버그가 발생합니다.

다음 그림은 유형 시스템의 성능, 단순성 및 안전성 측면에서 잘 알려진 일부 프로그래밍 언어를 비교합니다. [ 출처 ]

대체 텍스트

안전하지 않은 구조물을 사용할 수있는 능력

"안전하지 않은"키워드 및 관련 포인터 메커니즘으로 인해 C #이 안전하지 않은 행에 채워집니다. 그러나 이것들을 일종의 인라인 외부 함수 메커니즘으로 생각하고 싶다면 C #을 부딪 히십시오.

나는 Haskell '98을 순수한 것으로 표시했지만 안전하지 않은 기능 계열로 인해 GHC Haskell은 순수한 것이 아닙니다. 안전하지 않은 *을 비활성화하면 GHC Haskell을 그에 따라 위로 이동하십시오.


8
훌륭합니다!

7
그래픽에서 Common Lisp를 찾을 수 없습니다 : (let ((itbe '())) ... )...
duros

7
뭐? PHP를 위해 왼쪽에 남은 공간이 없습니까?
pestaa

7
C #은 안전한 포인터를 허용 합니다 : 모든 포인터 산술이 확인됩니다. 따라서 Java와 함께 있어야한다고 생각합니다.
Alex ten Brink

11
@ missingfaktor : C #의 위치가 잘못되었다고 생각합니다. C #은 스와 스트 프로그래밍 스타일을 허용하고 촉진합니다. 그것이 허용하는 최악의 것으로 측정해서는 안됩니다.
back2dos

20

내 생각에 Haskell은 일반적인 오류 원인을 피하는 데 도움이됩니다.

  • 순전히 기능적입니다 : 함수는 (의도하지 않은) 부작용을 가질 수 없으며, 이는 멀티 코어 프로그래밍을보다 쉽고 오류가 덜 발생시킵니다
  • 예를 들어 실수로 bool, char, int 및 float 값을 혼합 할 수 없습니다.
  • 정적으로 입력되었습니다 : 컴파일시 많은 프로그래밍 오류가 발생합니다.
  • null가치 유형 정의의 일부가 아닙니다.이를 통해 10 억 달러의 실수 를 피할 수 있습니다
  • 자체적으로 구현 된 결함이있는 구현을 작성하는 대신 재사용 할 수있는 기성품의 고차 함수가 많이 있습니다.
  • 가비지 수집기가 있습니다. 메모리 오류가 거의 제거됩니다 (게으른 평가 전략으로 인한 "공간 누출"제외).

11
나는 이것을 하향 투표하지는 않지만 그것이 기준에 맞지 않기 때문에 유혹을 받는다. 최소한의 버그 수로 "일반적인 프로그래머가 기능을 출력 할 수 있도록"되어야하는데, 평균적으로 프로그래머는 그것을 무례하게 말하면 Haskell의 머리 나 꼬리를 만들 수 없습니다.
메이슨 휠러

5
좋은 점은 많지만 일부 오류 클래스 (의도하지 않은 부작용, 예기치 않은 유형 변환)를 제거하는 동안 Haskell은 완전히 새로운 오류 클래스 인 공간 누출을 추가합니다. (또한 전혀 존재하지만 null이 있고, undefined모든 형태의 부재이다.)
j_random_hacker

5
@Mason : 작성하지 않으면 버그를 가질 수 없습니다 :)
Michael K

2
무료 점심과 같은 것은 없다고 생각합니다. 찾기 쉬운 버그 나 작성하기 쉬운 코드를 가질 수 있지만 둘다는 아닙니다. :)
Benjol

6
@Mason“평균 프로그래머”란 정확히 무엇입니까? 질문은 "어떤 프로그래밍 언어 ..."로 시작하는 것이지 "C, C ++ 및 java 중 어느 것"이 아니라 ...;)
Agos

18

일반적으로 버그를 찾기 가장 어려운 것은 멀티 스레드 응용 프로그램의 경쟁 조건입니다.

  • 재생산이 거의 불가능
  • 매우 미묘 할 수 있습니다

그러므로 당신을 위해 가능한 한 많은 방해없이 당신을 위해 평 행성을 관리하는 언어가 필요합니다. 이것들은 아직 주류가 아닙니다. Java는 일부를 수행하지만 어려운 부분을 남겨 둡니다.

"부작용 없음"은 처음에는 두 개의 글 머리 기호가 사라 지므로 기능적인 언어가 필요하다는 것을 이해합니다. Haskell을 효율적인 멀티 스레드 언어로 투명하게 만드는 작업이 진행되고 있으며 Fortress는 처음부터 효율적인 병렬 언어로 설계되었다고 생각합니다.


편집 : Java에서는 Executors더 많은 어려운 부분을 처리하십시오. 개별 작업이 Callable인터페이스를 준수하도록해야합니다 .


5
++ 경쟁 조건. 다시 말씀 하셔도됩니다.
Mike Dunlavey가

네. 언어 지원이 있더라도 병렬 컴퓨팅은 일반적으로 어렵다는 것을 명심하십시오. (일반적인 Lisp 매크로는 언어 지원이 많음에도 불구하고 어렵습니다. 왜냐하면 그들이하는 일이 매우 강력하기 때문입니다. 같은 원칙입니다.)
David Thornley

얼랭은 어때요?
Malfist

@Malfist, Erlang에 대해 충분히 알지 못합니다. 당신이 정말로 알고 싶다면 질문을 열어야합니까?

2
Erlang은 멀티 스레딩을 간단하고 안전하게 만들 수 있도록 설계된 기능적 프로그래밍입니다. 변수를 공유하지 않고 메시지를 전달합니다. Wikipedia 페이지를 읽으십시오.
Malfist

13

Ada는 런타임이 아닌 컴파일 타임에 최대한 많이 포착되도록 설계되었습니다. 이것이 의미하는 바는 Ada에서 프로그램을 컴파일하는 데 Java보다 동등한 시간이 걸리는 데 종종 10 배가 더 걸리지 만 컴파일 할 때 프로그램의 버그가 발생할 때 전체 클래스의 버그가 나타나지 않을 것이라고 확신 할 수 있습니다 운영.


7
Ada는 다른 언어가 무시하는 컴파일러의 내용을 정확하게 포착한다는 사실을 +1했습니다. -1은 Ada 프로그램을 컴파일하는 데 10 배가 걸린다는 것을 의미합니다. Ada는 디자인하는 프로그래머에게 보상합니다! 생각하는 그의 코드 !!! 그가 미친 듯이 타이핑하기 전에하고있는 일에 대해 방어 업무를 위해 Ada에서 프로덕션 프로그래밍을 수행하는 개인적인 경험에 따르면 C / C ++ 또는 FORTRAN보다 Ada 코드를 컴파일하는 데 시간이 많이 걸리지 않지만 나중에 Ada 코드의 문제가 훨씬 줄었습니다. 프랫 앤 휘트니도 비슷한 것을 발견했다.
John R. Strohm

1
@ john r strohm, 내가 이해 한 바에 따르면 컴파일러가 코드를 컴파일하는 데 걸리는 시간이 아니라 코드를 컴파일 할 수있는 시간에 대해 이야기하고 있지 않습니다.
Malfist

오, 코드를 컴파일 할 수있게하는 데 동의했다. 나는 nit picking에 관한 언어를 배우는 프로그래머에 의해 작성된 많은 성 주의자 의견을 기억할 수 있습니다. 일반적으로 음의 라인을 따라, 당신이 할 경우 ... 여자 후 언어를 이름
마이클 쇼에게

@ 프톨레마이오스 (Ptolemy), 보트가 여자의 이름을 따서 명명 될 수 있다면 (미국 항공사는 제외) 프로그래밍 언어도 가능하다. 오히려 "USS Ronald Reagan"보다 "Ada"라는 이름을 지정했습니다.

1
학습 곡선에 도달하면 실제로 디자인을 생각하는 데 많은 시간을 보낸 후 Ada 코드를 작성하는 데 실제로 빠릅니다. Ada는 해커의 언어가 아닙니다. 요즘 Java로 작업하고 있으며 현재 프로젝트에서 볼 수있는 것들 중 일부는 실제로 Ada를 조금 그리워합니다 (절대로 생각하지는 않았습니다).
제임스 아담

7

먼저 정의 : 찾기 어려운 버그는 내가 이해하는 것처럼 재현 할 수있는 버그이지만 원인을 찾기가 어렵습니다.

아마도 가장 중요한 측면은 내가 좁힘 이라고 부르는 것입니다 . 즉, 버그 탈출 거리, 버그가 잠재적으로 영향을 미칠 수있는 범위는 얼마나 니까 ? C와 같은 언어에서 음수 배열 인덱스 또는 초기화되지 않은 포인터와 같은 버그는 전체 프로그램의 모든 곳에서 문자 그대로 영향을 줄 수 있으므로 최악의 경우 문제의 원인을 찾기 위해 모든 곳 을 확인해야합니다 .

이와 관련하여 좋은 언어는 액세스 수정자를 지원하고이를 우회하기 어렵거나 불가능하게 만드는 방식으로 시행합니다. 좋은 언어를 사용하면 전역 변수를 너무 쉽게 만드는 대신 변수의 범위를 제한하는 것이 좋습니다 (예 : "명시 적으로 선언되지 않은 것은 기본 유형 및 값을 가진 전역 변수").

두 번째로 중요한 측면은 동시성 입니다. 경쟁 조건은 일반적으로 재현하기 어렵 기 때문에 찾기가 어렵습니다. 좋은 언어는 사용하기 쉬운 동기화 메커니즘을 제공하며 표준 라이브러리는 필요한 경우 스레드로부터 안전합니다.

이것은 이미 내 목록을 완성합니다. 강력한 타이핑과 같은 다른 것은 컴파일 타임에 버그를 잡는 데 도움이되지만 나중에는 찾기가 쉽지 않을 것입니다.

이 모든 것을 고려하면 JVM 및 .net 세계의 Java 및 C # 및 기타 많은 언어가 찾기 어려운 버그를 피하는 데 적합하다고 말합니다.


수동 잠금은 "사용하기 쉬운 동기화 메커니즘"으로 보일 수 있지만 실제로는 "사용하기 간단하지만 교착 상태를 추적 할 때 재미있는 시간을 보내고 있습니다". 그리고 액터 기반의 동시성은 꽤 많은 언어로 수행 할 수 있습니다.
Frank Shearar

Frank : 최소한 잠금은 충분히 간단하여 모든 사람이 사용할 API 등을
알아낼 필요

그런 다음 "모든 사람이 할 수있을 정도로 간단"한 동시성 솔루션은 미취학 아동에게 테이블 톱을주는 것과 같은 견해가 있습니다.
David Thornley

@David : 나는 당신의 요점을 알지만, 많은 경우에 간단한 해결책이 실제로 필요한 전부입니다. 예를 들어, 공유 리소스 (예 : 데이터베이스 연결)를 사용해야하는 소수의 사용자 만 사용하는 서블릿을 고려하십시오. 동기화가 없으면 경쟁 조건이 항상 발생합니다. 그러나 모든 데이터베이스 액세스 작업을 동기화 된 (연결) {} 블록에 넣는 것은 과학적으로 정확하지 않습니다.
user281377

+1이 정의에서 "버그가 잠재적으로 영향을 줄 수있는 범위는 얼마나 큽니까?" 나는 동적 언어로 매우 불쾌한 버그를 가지고 있었는데, 잘못된 데이터 유형의 객체가 코드에서 매우 멀어졌습니다 (덕 타이핑 덕분에).
Giorgio

7

Excel이 가장 널리 사용되는 DSL이므로 Excel을 사용하겠습니다. (물론 VBA 제외)

청구서에 맞습니다.

  • 항상 재현하기 쉽습니다 (스프레드 시트가 있습니다-작동하지 않습니다)
  • 완전히 "기능적"이므로 버그를 찾기가 매우 쉽습니다. 잘못된 셀로 시작하여 모든 종속성을 추적하십시오.

찾기 쉬운 버그를 추가하지 않는 한 이것은 사실 일 수 있습니다.
mouviciel

+1 Excel은 언어가 아니라 데이터이므로 약간 건방진입니다. 나에게 좋은 웃음을 줘 :)
recursion.ninja

2
@awashburn-아, 모르겠다. 언어로서 자격이 있다고 생각합니다. 각 셀은 "변수"입니다. 각 변수는 선언적으로 (예 : 123또는 ABC) 또는 함수 ( =SUM(A2:A5))로 설정됩니다. 그런 다음 Excel은 모든 변수를 평가하여 종속성을 해결하는 순서 등을 파악합니다. 데이터는 아닙니다.
Scott Whitlock

2
내 진술을 철회하면 Excel이 Turing Complete라는 것이 밝혀졌습니다. 전적으로 불안한 것을 배웠습니다 ...
recursion.ninja

1
"... 진정한 [Lisp] 마스터는 모든 데이터가 코드임을 인식합니다." 아마도 이것은 Excel에도 적용됩니다. blogs.msdn.com/b/sriram/archive/2006/01/15/lisp-is-sin.aspx
James Mishra

7

대부분의 버그는 언어 자체의 결함이 아니기 때문에 언어를 사용하는 방식에있어 실수를 저지르는 개발자의 실수이기 때문에 이것은 어려운 질문입니다.

버그 가능성에 영향을 미치는 언어 기능에는 몇 가지 측면이 있다고 생각합니다.

  • 상호 작용 -REPL이 포함 된 동적 언어는 실행중인 프로그램 및 훨씬 더 작은 코드 / 테스트 주기로 상호 작용 / 실험을 장려합니다. 반복이 깨끗하고 간단한 솔루션을 발견하고 버그를 감지 / 제거하는 좋은 방법이라고 생각한다면 대화 형 언어를 선호하는 경향이 있습니다.

  • 표현성 -코드가 짧고 상용구 / 부수적 인 복잡성이 적 으면 버그 / 논리 오류를 쉽게 확인할 수 있습니다.

  • 타입 안전 – 컴파일 시간을 더 많이 검사할수록 컴파일러가 더 많은 버그를 잡을 수 있으므로 일반적인 타입 안전은 좋은 것입니다. 그러나 이것들은 일반적으로 버그 를 찾기가 어렵지 않습니다 . 완전 동적 언어에서도 데이터 구조의 잘못된 유형은 일반적으로 매우 명백한 런타임 오류를 유발하며 TDD는 거의 항상 이런 종류의 버그를 선택합니다.

  • 불변성 -많은 하드 버그는 변경 가능한 상태의 복잡한 상호 작용으로 인해 발생합니다. 불변성을 강조하는 언어 (Haskell, Clojure, Erlang)는 변이를 피함으로써 엄청난 이점을 가지고 있습니다

  • 기능적 프로그래밍 -코드 작성에 대한 기능적 접근 방식은 복잡한 효과 / 상호 작용 시퀀스를 가진 객체 지향 코드보다 "아마도 올바른"경향이 있습니다. 내 경험은 FP가 까다로운 버그를 피하는 데 도움이된다는 것입니다. 저는 현재이를 뒷받침 할 수없는 학술 연구가 있다고 생각합니다.

  • 동시성 지원 -동시성 문제는 감지 및 디버깅이 특히 어렵 기 때문에 이것이 매우 중요합니다. 수동 잠금이 필요한 것은 결국 실패로 끝날 것입니다 ( 동시성에 대한 거의 모든 객체 지향 접근 방식 이 포함됨 ). 이와 관련하여 내가 아는 가장 좋은 언어는 Clojure입니다. 소프트웨어 트랜잭션 메모리와 불변 데이터 구조를 결합하여 새롭고 신뢰할 수 있으며 컴포저 블 동시성 프레임 워크를 얻는 동시성 관리에 고유 한 접근 방식이 있습니다. 자세한 정보는 http://www.infoq.com/presentations/Value-Identity-State-Rich-Hickey 를 참조하십시오 .


함수형 프로그래밍을 열정적으로지지하는 나와 같은 사람들은이 답변에 감사합니다. 표현력은 당신의 친구입니다.
Sridhar Sarnobat 2016

1
지금까지 가장 좋은 답변! 나는 이것이 버그 빈도에 대한 두 가지 분석, deliberate-software.com/safety-rank-part-2macbeth.cs.ucdavis.edu/lang_study.pdf에 의해 뒷받침 된다고 생각 합니다. 그들은 둘 다 더 순수하고, 기능적이며, 표현력이 높고 안전할수록 버그가 적다는 것을 보여줍니다. 마찬가지로 Clojure와 Ruby는 안전 규칙을 이스케이프하고 상호 작용이 지적한 것처럼 동등한 영향을 미쳤음을 나타냅니다.
Didier A.

@DidierA. 불행하게도 ucdavis 링크 (NO WBM 아카이브로) 고장 - 당신이에서 그것을 가지고 생각 프렘 Devanbu의 페이지 현재 업데이트 된 링크를 가리키는 : 프로그래밍의 대규모 연구 Github에서의 언어 및 코드 품질
icc97

5

언어가 덜 강력할수록 자신의 발을 쏠 수있는 옵션이 줄어 듭니다.

Java 및 C #과 같은 고급 언어는 C ++과 같은 저수준 언어보다 버그가 적습니다.

Java가 C #보다 안전하다고 생각합니다. Java는 인위적으로 제한되어 있으므로 고급 지식이없는 일반 프로그래머가이를 마스터하고 안정적인 프로그램을 만들 수 있습니다.


4
"언어가 적을수록 자신의 발을 쏠 수있는 옵션이 줄어 듭니다."
Michael K

missingfaktor의 차트는 C #과 C ++이 자신을 쏠 수 있고 Java를 그 이상으로 높이는 한 "발판"에 있다고 말합니다. 그래도 차트의 해당 부분에 동의하지는 않습니다. C # 촬영을하려면 농구대를 거쳐야합니다.
Jesse C. Slicer

6
안전과 힘은 반비례하지 않습니다 (예 : ;-) Haskell은 매우 강력하지만 발을 쏠 수있는 방법은 거의 없습니다.
missingfaktor

3
언어가 약하면 더 큰 발이 필요합니다.

7
@missingfaktor, 그것은 발에 자신을 촬영하는 부작용이기 때문입니다.

3

일반 프로그래머가 찾기 어려운 버그를 최소화하여 기능을 출력 할 수있는 언어는 무엇입니까?

제 생각에는 델파이입니다. 파스칼을 기반으로하는이 언어는 일반 프로그래머 (또는 경험이없는 코더) 가 쉽게 찾을 수 있을 정도로 간단하고 직관적 이며 풍부한 도구와 라이브러리 지원으로 대부분의 버그를 쉽게 찾을 수 있습니다.

  • 강력한 타이핑과 많은 일반적인 오류를 포착하는 엄격한 컴파일러.
  • 일반적인 오류를 유발하지 않는 직관적 인 구문. if (alert = RED) {LaunchNukes;}예를 들어 ""세계의 마지막 버그 " 는 컴파일되지 않습니다.
  • 많은 공통 C ++ OOP 오류를 제거하는 잘 설계된 객체 모델입니다.
  • 언어에 내장 된 경계 검사 및 범위 검사를 통해 보안 문제의 가능성을 크게 줄입니다.
  • 아마도 사람에게 알려진 가장 빠른 컴파일러는 생산성을 높이고 빌드를 기다리는 동안 생각을 잃기 어렵게 만듭니다.
  • 디버거 Visual Studio의 디버거는 커질 때처럼되고 싶습니다.
  • 누수 추적 기능이 메모리 관리자에 직접 내장되어있어 메모리 누수를 쉽게 찾아서 수정할 수 있습니다.
  • 자신 만의 버그가있는 구현을 구축하지 않고도 일반적인 작업을 수행 할 수 있도록 사전 구축되고 사전 테스트 된 방법을 제공하는 크고 성숙한 표준 라이브러리입니다.
  • 문제를 쉽게 추적 할 수 있도록 강력한 로깅 시스템 및 프로파일 러와 같은 유용한 도구가 제공됩니다.
  • 를 포함한 표준 라이브러리에없는 일반적인 문제에 대한 강력한 커뮤니티 지원 하는 강력한 타사 동시성 라이브러리 .

나는 델파이 기수 였지만, 파스칼 (Pascal) 루트와는 거리가 멀었다. la C / C ++로 다른 것을 타이프 캐스트 할 수 있었기 때문이다.var I: Integer; Pointer(I)^ := $00;
Jesse C. Slicer

1
@Jesse : 아마도 실용주의에 필요한 양보라고 생각합니다. Kernighan은 Why Pascal이 내가 가장 좋아하는 프로그래밍 언어가 아닌 이유 를 썼을 때 많은 좋은 지적을했습니다 . 타입 캐스트는 많은 중요한 저수준 작업을 수행하는 데 필요합니다. 그러나 Delphi의 강점 중 하나는 라이브러리가 하위 수준의 세부 정보를 캡슐화하고 안전하지 않은 포인터 및 유형 변환 기능을 불필요하게 만드는 방법입니다.
메이슨 휠러

필자는 이것이 필요하다고 동의하지 않지만 강력한 타이핑을 주장하는 것은 다소 부정적입니다. Original Pascal은 그러한 샤니 건을 허용하지 않았으므로 강력하게 입력되었습니다. 그러나 델파이를 약한 유형이라고 부르지 않았습니다. '중간 유형'입니다.
Jesse C. Slicer

1
@Jesse : 파스칼의 원래 Wirth 버전이 변형 레코드를 허용하지 않았습니까? IIRC 그들은 결국 강력한 타이핑을 전복시키는 데 일반적으로 사용되어 볼랜드와 다른 사람들은 모두가 그렇게하기 때문에 타입 캐스트를 더 단순하게 만들기로 결정했습니다.
메이슨 휠러

en.wikipedia.org/wiki/Pascal_(programming_language)# 분할en.wikipedia.org/wiki/Pascal_(programming_language)# 비판 뿐만 아니라 pascal-central.com/ppl/chapter3.html 이 나는 Wirth가 1974 년까지 거슬러 올라간 참고 문헌을 보았습니다. 그래서 그렇습니다. 문제가되는 부분은 그것을 (예 : C의 공용체와 같은 동일한 메모리를 사용하는 변형 필드) 파괴 될 수 있다고 생각합니다. 그것들이 단순히 범위 지정 메커니즘으로 사용되었고 메모리 레이아웃이 수퍼 셋에 대한 것이면 더 강력하게 입력됩니다.
Jesse C. Slicer

2

고려해야 할 한 가지는 전환 시간입니다.

지난 5 년 동안 저는 주로 자바 (JSF, Seam 등)로 웹 애플리케이션을 개발했습니다. 최근에 나는 새로운 직업을 얻었고, 우리는 Perl (Catalyst 및 Moose)을 사용하고 있습니다.

Java보다 펄에서 더 생산적입니다.

컴파일하고 배포 할 필요가없는 것이 한 가지 이유입니다. 또한 반복적 인 방식으로 수행 할 수 있으므로 사용 사례 작성이 더 쉽다는 것을 알게되었습니다. 그리고 Java의 프레임 워크는 적어도 내가 관련된 프로젝트에 대해 불필요한 복잡한 것처럼 보입니다.

내 Perl 코드의 버그 수는 Java 코드의 버그 수와 거의 같거나 더 높을 수도 있습니다. 그러나 이러한 버그를 찾아서 수정하는 것이 더 쉽고 빠릅니다.


1

아마도 모든 프로그래밍 언어에 대한 정적 및 동적 코드 분석에 사용할 수있는 도구 수를 조사하면 아이디어가 될 수 있습니다. 언어를위한 도구가 많을수록 언어는 사용자들 사이에서 매우 인기가 있거나 버그를 찾기 어려운 경우가 많습니다. 그러나이 주제에 대한 연구를 Google에 알려주지 못했습니다. 또한 C와 같은 일부 언어는 기본 하드웨어 버그를 해결하고 하드웨어의 노후화를 해결하는 데 사용될 수 있습니다.


1
"고령화되면서 하드웨어의 마모를 해결"...?
j_random_hacker

미션 크리티컬 머신에서 실행되는 일부 유닉스 OS가 CPU, RAM 및 기타 하드웨어의 상태를 점검한다는 것을 읽었습니다. serverfault.com/questions/56192/… 는 이것에 대해 좀 더 깊이 논의합니다. RAM 모듈의 일부 라인이 시간이 지남에 따라 결함이있는 경우, 해당 결함이있는 모듈은 OS에서 사용되지 않으며 사용 가능한 총 실제 메모리에보고하지 않습니다. 이러한 작업은 다른 하드웨어에서도 수행 될 수 있습니다.
vpit3833

그것은 재미있는 재미있는 일이지만, 그것이 그것이 어떻게 관련되는지는 모르겠습니다. 또한 링크에서이 자체 복구 유닉스 OS에 대해서는 언급하지 않으며 PC 하드웨어 스트레스 테스트 방법에 대해서만 이야기합니다.
j_random_hacker

1
프로그램 자체만으로는 버그의 원인이 아닐 수 있으며 하드웨어 나 기타 외부 요인이 될 수도 있습니다.
vpit3833

1

언어에 대한 이야기 ​​대신 언어 기능에 대한 이야기

  • java는 예외 (throws ...)에 대해 생각하도록 강요하고 이러한 예외를 공개하거나 처리해야합니다. 이로 인해 오류 상황을 잊어 버리지 못합니까? 아니면이 처리가 필요하지 않은 SystemException에서 파생 된 더 많은 예외를 사용하고 있습니까?
  • 사전 및 사후 조건에 대해 생각하게하는 "계약 별 디자인"(http://en.wikipedia.org/wiki/Design_by_contract)은 어떻습니까? 나는 그것이 c # -4.0에서 가능하다는 것을 읽었습니다.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.