언어의 절반 인 C # 및 Java에 대한이 설명은 무엇을 의미합니까? [닫은]


32

기사 : 왜 POCO 라면 다음과 같은 문장이 있습니다 :

Maciej Sobczak은 다음과 같이 잘 설명합니다.

C #이 Microsoft & Java가 소유 하고 있지만 Oracle이 C #을 소유하고 있음에도 불구하고 그가 의미하는 바를 이해 하지 못합니다. 나는 그 문장을 증명할 증거를 찾지 못했고, 이것에 대해 정말로 궁금합니다. 그리고 '내 자신을 보호하기위한'부분에 대해 더 궁금합니다.


12
나는 프로그래머가 메모리를 자유롭게 할당하고 비우는 것과 같은 종류의 "보호"를하는 것에 대한 비판으로 해석했지만 그것이 그가 의도 한 포인트인지 확실하지 않다.
Kayaman

15
그가 인용 한 기사가 죽은 것처럼 보였기 때문에 정확하게 확신하지 못하지만 Java와 C #에는 여러 상속 또는 템플릿 메타 프로그래밍과 같은 많은 C ++의 '위험한'또는 논쟁의 여지가없는 기능이 누락 된 것 같습니다.
GoatInTheMachine

3
인용문의 맥락이 빠져 있기 때문에 (링크는 404입니다), 여기서 얻을 수있는 유일한 것은 그가 생각했던 바를 추측하는 사람들, 또는 자신의 의견을 제시하는 사람들 일 것입니다. 만약 당신이 실제로 컨텍스트, 즉 손실 된 페이지에있는 것을 알고 싶다면, 가장 좋은 방법은 저자를 직접 쓰거나, 웨이 백 머신 또는 유사한 것을 통해 손실 된 페이지를 찾는 것입니다.
JacquesB

2
처리 할 수 ​​있더라도 소프트웨어 개발의 모든 가능한 측면을 언어로 항상 노출하고 싶지는 않다는 점에서 그 진술이 누락되었습니다 . 물론 메모리 관리 코드를 읽는 데 문제가 없지만 다른 개발자가 해당 코드를 유지하는 데 크게 흥분하지 않을 수 있습니다. 캡슐화 개념과 유사합니다. 또한 C #을 사용하면 컴파일러 지시문, 특수 속성 및 리플렉션을 통해 상당히 많은 것들에 액세스 할 수 있습니다.
Mark Rogers

32
자신의 이익을 위해 언어에 C ++의 모든 기능이 "실제"이고 "완전한"것으로 간주되어야한다고 생각하는 사람들에게주의를 기울이지 마십시오. 타입 안전성, 메모리 안전성 및 잘 정의 된 동작이 "트레이닝 휠"이라고 생각하는 사람들에게주의를 기울이지 마십시오. 정확성은 대부분의 산업에서 소프트웨어의 가장 중요한 측면이되고 있으며, 신경 쓰지 않는 것에 자부심을 가진 사람들은 곧 관련이 없습니다.
Theodoros Chatzigiannakis

답변:


162

Sobczak은 기업 소유권에 대해 이야기하지 않습니다. 그가 잃어버린 "반쪽"언어는 많은 현대 언어로 할 수없는 모든 것입니다. 비록 잘 교육받은 컴퓨터 전문가 는 가능할 있다는 것을 알고 있습니다. 원하는만큼 많은 클래스에서 상속받습니다. 유형 제약 조건없이 다른 객체에 객체를 할당합니다. 컴파일러와 런타임을 신뢰하지 않고 수동으로 할당 및 리소스 해제를 제어합니다.

문제는 모든 제한이 프로그래밍 언어에 들어간 이유입니다. 우리 이 모든 것을 허용하는 언어를 가지고있었습니다. 시간이 지남에 따라 우리는 평균 프로그래머가 일정량의 제한과 손 잡기로 더 나아 졌다는 것을 알았습니다. 실제로 나쁜 오류를 일으킬 가능성이 너무 커서 추가 능력과 표현력을 가치가 없기 때문입니다.

(물론 이것은 때때로 많은 양의 손을 잡을 필요가없는 프로그래머를 성가 시게한다. 그들의 불만은 때때로 합법적이다. 그러나 사람들은 자신의 기술을 평가하는 데 악명이 나쁘고, 많은 사람들이 안전 장치가 필요하지 않다고 생각한다) 불평이 자신을 우월하게 보이게하거나 알지 못하는 평범한 코더들로부터 고급 언어로 제한을받는다고 생각하는 실제 우량한 지성을 구분하기 란 쉽지 않습니다. 더 나은.)


67
이것은 나의 goto 답변입니다.
Neil

71
또한 제한이 필요없는 우수한 지성과 같은 것은 없다고 덧붙입니다. 모든 사람이 조만간 엉망이된다고 가정하는 것이 항상 안전합니다. 그리고 일반적으로 지능이 우수할수록 실수는 더 커집니다.
Neil

29
단순히 사람들이 발에 총을 쏘는 것을 막는 것보다 Java와 C #에 조금 더 있습니다. 가비지 수집이 이루어지기 전에 메모리를 관리하는 데 상당한 시간과 노력이 소요되었으며 수동 메모리 관리를 제대로 수행하기가 어렵습니다. 가비지 콜렉션은 프로그래머의 생산성을 향상시킵니다.
Robert Harvey

12
@RobertHarvey 100 % 동의합니다. 오랜 C ++ 프로그래머이기 때문에 C #으로 이동할 때 자동 메모리 관리에 회의적이었습니다. 내가 그 일을 마치고 나면 99 %의 시간을 걱정할 필요가 없다는 것이 엄청나게 해방되었습니다. 대신 다른 문제에 대해 생각할 수있게되었습니다.
17 of 26

8
"유형 제한없이 다른 개체에 개체를 할당하십시오."... 그래서, dynamic?
Arturo Torres Sánchez

34

이것은 인용의 원래 출처 에서 꽤 잘 설명되어 있습니다 .

나는 C ++에 대해 더 많이 배우기로 결심하고 충실한 열정을 갖게되었습니다. 여기에는이 언어가 발전 할 수있는 방법에 대한 관심이 포함됩니다. 또한 실제 응용 프로그램이 아닌 유용한 라이브러리 를 개발하는 데 최첨단 기술이 필요하다는 것을 알았습니다 . 이것을 염두에두고 다른 목적으로 내 라이브러리를 작성하려고 시도했으며 (내 다운로드 페이지 참조) C ++ Boost 개발자 (내 링크 페이지 참조)의 어깨 너머로 살펴보고 고급 기술이 있습니다. 일반적이고 유용 할 것으로 예상되는 라이브러리 개발에 소요되는 시간은 정말 까다 롭습니다. 그렇기 때문에 프로그래머는 결코 학습을 중단하지 않습니다.

[…]

저는 C ++과 강력한 소프트웨어 작성 기술을 계속 사용합니다. 신뢰할 수있는 소프트웨어 영역에서 더 넓은 시야를 확보하기 위해 복잡하고 신뢰할 수 있도록 설계된 Ada 임에도 불구하고 비즈니스에 완전히 버려지는 언어 인 Ada (및 관련 내용) 학습에 시간을 투자하기로 결정했습니다. 시스템. 저는 Ada를 배우는 것이 저의 작업 및 개발 접근 방식을보다 신선한 시각으로 볼 수 있다는 점에서 나에게 정말 유익하다는 것을 인정해야합니다. 가장 중요한 것은 Ada 세계의 아이디어 중 일부는 C ++에 거의 직접 적용되어 견고성과 정확성 영역에서 좋은 결과를 얻을 수 있습니다.

[…]

알았어 나는 언젠가 Java를 배우지 않기로 맹세했다. 그러나 나는했다. 글쎄, 작업 코드를 읽고 쓸 수있는 정도까지. 온라인에서 무료로 제공되는 'Thinking in Java'와 온라인이 아닌 'Core Java'(무료는 아님)를 읽었으며 Java 개발에 간접적으로 관여하고 있습니다. 그것. 나는 누군가가 저에게 언어의 절반을 줄 때가 마음에 들지 않으며 그것이 내 자신의 보호를위한 것이라고 말합니다. 종이 망치처럼 빛을내어 손가락을 때릴 때 아무도 다 치지 않도록 C #에도 적용됩니다. 나는 강철 썰매 망치를 선택하여 사나이를하고 싶을 때 견딜 수 있음을 확신합니다.
문제는-왜 많은 사람들이 그것을 사용 하는가 (Java, C # 등)? 흠 ... 어쩌면 어떤 곳에서는 매우 좋기 때문일 것입니다. 그러나 언어와 라이브러리가 모두 실제 유틸리티가 아닌 애플릿을 위해 설계되었다는 상황이 있습니다. 포괄 기술에 관해서는 너무 많이 약속하고 너무 적습니다. 또는 모든 경쟁에서 쟁기질 할 수있는 솔루션으로 ..

나는 최대의 힘과 가장 넓은 관점이 필요할 때 C ++을 좋아합니다. C ++의 표현력이 필수가 아닌 곳에서는 Tcl 또는 Python과 같은 언어가 법안에 맞는 것 같습니다. 그들의 진화와 관련하여 개방적 일뿐만 아니라 특정 요구에 따라이를 확장하고 포함시킬 수 있습니다. 나는 그 기술에서 많은 가능성을 꿈꾸고 있습니다. 또한 C를 정규 프로그래밍 언어로 포기하는 경향이 있습니다. 이는 코드 생성의 대상으로 만 합리적인 선택 인 것 같습니다. 그렇지 않으면 오류가 발생하기 쉽습니다. 오늘날 Ada는 자유 선택의 여지가 있지만 (아쉽게도 대부분의 경우는 아닙니다) 더 심각한 프로젝트에 대한 두 번째 선택이 될 것입니다.

다시 말해,이 인용문의 저자는 C ++을 좋아하고 Java를 좋아하지 않으며 Java에 C ++의 절반이 빠져 있다고 생각합니다. 그리고 그것은 그 인용에 관한 모든 것입니다.


18
아이러니하게도, 그는 C ++을 좋아하는 것과 똑같은 이유를 C에게 싫어합니다.
GreySage

8
그는 C ++이 파이썬보다 표현력이
좋다고 생각합니다

12
@GreySage 그것은 내 눈을 사로 잡았다 ... C는 너무 오류가 발생하기 쉽지만 C #은 당신에게 충분한 힘을주지 못합니까? C는 C ++에서 멀리 떨어져 있습니까? C #에는 더 안전하지 않은 "안전하지 않은"모서리가 없습니까? 확실히 의견 먹으 렴의 재미있는 혼합 ...
WernerCD

10
@WernerCD는 실제로 안전하지 않은 C #에 대해 말할 수는 없지만 C와 C ++는 컴파일러가 질식하지 않는 유효한 C ++-ish 스 니펫으로 기본 C90 스 니펫을 이길 수 있다는 점을 제외하고는 공통점이 거의 없습니다.
Quentin

23

게시 한 블로그에 링크 된 기사가 제거되었으므로 확실하지는 않지만 Kilian은 "언어의 절반"이라고 말하면 C # 및 Java가 C ++처럼 느껴지지만 사용하기 쉽고 안전하도록 기능과 구성이 제거되었습니다.

2006 년이 시점에 C #이 비교적 젊었 고 Java가 여러면에서 미성숙했을 때, 전력 대 안전이 하나만 선택할 수있는 절충안처럼 보였을 때, 이것은 절대로 불합리한 입장이 아니 었습니다. .

요즘 그 입장은 전혀 합리적이지 않습니다. C #과 Java는 주류 언어에 대해서만 생각하면서 엄청나게 성숙하여 안전한 코드 작성을 촉진하기 위해 다른 언어 (특히 기능적)의 기능을 빌려 왔습니다. 우리는 Rust와 Swift와 같은 언어를 가지고 있습니다.

누군가가 당신의 손을 잡고 있기 때문에 언어를 내려다 보거나 사용하기 어려운 언어가 어떻게 든 좋은 것이라고 말하면, 나는 그들이 한 알의 소금으로 가져갈 것입니다. 당신은 우리가 매일 의존하는 코드에서 발견되는 난처한 수의 버그를보아야 만합니다. 업계에서 가장 밝은 사람들이 작성한 '안전한'언어를 사용하여 사소하게 피할 수 있었던 이유는 무엇입니까?


6
나는 마지막 단락에서 당신의 입장에 동의합니다. C ++은 "Fountain of Exploit"라고합니다.
Caleb Mauer

3
또한 두 번째 단락을 보완하기 위해 Java 및 C #은 C 및 C ++ 구문을 많이 사용하여 기존 C / C ++ 개발자가 학습 곡선을 낮추도록 유혹하는 등 여러 가지 이유로 많이 사용되었습니다. 그들이 성숙함에 따라, 그들은 자신의 특징을 추가하고 자신의 풍미를 가지고 있지만, 초기에는 C ++의 대안으로 더 직접적으로 위치했기 때문에 "C ++이지만 덜 강력"한 것으로보기가 더 쉬웠다.
해리슨 페인

12

보관소를 되돌아 보면 이 인용문은 2003 년에 나온 것으로 보입니다 (2006 년에 인용 된 기사에도 불구하고). 당시 C #은 버전 1. x 였고 현대적인 기능 이 많이 없었습니다 .

새로운 기능

C # 2.0

  • 제네릭
  • 부분 유형
  • 익명의 방법
  • 반복자
  • 널 입력 가능 유형
  • 게터 / 세터 별도의 접근성
  • 분석법 그룹 변환 (위임)
  • 델리게이트에 대한 공분산 및 반 분산
  • 정적 클래스
  • 델리게이트 추론

C # 3.0

  • 암시 적으로 입력 된 지역 변수
  • 객체 및 컬렉션 이니셜 라이저
  • 자동 구현 속성
  • 익명 유형
  • 확장 방법
  • 쿼리 표현식
  • 람다 식
  • 표현 트리
  • 부분 방법

C # 4.0

  • 동적 바인딩
  • 명명 된 및 선택적 인수
  • 일반 공존 및 반공 분산
  • 내장형 interop 유형 ( "NoPIA")

C # 5.0

  • 비동기 메소드
  • 발신자 정보 속성

C # 6.0

  • 컴파일러 서비스 (Roslyn)
  • 정적 형식 멤버를 네임 스페이스로 가져 오기
  • 예외 필터
  • 캐치 / 마지막 블록 대기
  • 자동 속성 초기화
  • 게터 전용 속성의 기본값
  • 표현형 멤버
  • 널 전파 기 (널 조건 연산자, 간결한 널 검사)
  • 문자열 보간
  • 연산자 이름
  • 사전 이니셜 라이저

C # 7.0

  • 변수
  • 패턴 매칭
  • 튜플
  • 해체
  • 지역 기능
  • 숫자 분리기
  • 이진 리터럴
  • 심판 반품 및 지역 주민
  • 일반화 된 비동기 리턴 유형
  • 식 본문 생성자 및 종료 자
  • 표현형 게터 및 세터

C # 7.1

  • 비동기 메인
  • 기본 리터럴 표현식
  • 유추 된 튜플 요소 이름

- "C Sharp" , Wikipedia (참조 및 링크 제거)

C #이 오늘날의 C #이 부족하기 때문에 C #이 그 맥락에서 반 언어처럼 보인다는 것이 더 이해할 수 있습니다. static수업 이 없다고 생각하는 것은 이상합니다 !

C #이 .NET에 연결되어 있으므로 더 많은 내용이 누락되었습니다. 예를 들어 WPF 는 당시에는 없었습니다. 모두 WinForms였습니다.


정적 클래스는 Java에 여전히없는 기능 (C # 종류)이있는 것처럼 누락 된 기능을 선택하는 것이 좋지 않을 수 있습니다. 이것이 자바의 b이 아니라면?
user253751 2018

1
@immibis 자바를 의도적으로 찌르는 것이 아니라 실제로 jeeze? static클래스는 그러한 원시적 인 기능처럼 보입니다. 나는 그들이 인스턴스 클래스를 미리 작성했다고 상상했다.
Nat

2
피스톤 엔진 제트가 제트 엔진 제트를 예정하고 있다고 말하는 것 같습니다. "비 인스턴스 클래스"는 일반적으로 모든 코드가 클래스 내부에 있어야하는 언어를 제외하고 모듈 또는 네임 스페이스 라고합니다 . (또는 자전거를 수동 자동차로 부르거나 유선 전화를 고정 핸드폰으로
부르

@Nat-정적 클래스를 갖는 것은 좋지만, 클래스를 가지지 않으면 절대 아무것도 변하지 않습니다. 클래스의 모든 멤버를 정적으로 만들 수 있으며 클래스가 정적으로 유지되도록 잊어 버린 경우 몇 가지 종류의 컴파일러 오류 만 잃어 버립니다.
Jirka Hanika

@JirkaHanika 그래, 나는 static대부분의 경우 수업 의 열렬한 팬이 아니야 . 솔직히 말해서 C #에서 매우 단순하고 원시적 인 부분으로 보였기 때문에 호출 할 기능으로 선택했습니다. 나는 그들이 자바에 없다고 생각하지 않았습니다.
Nat

3

그는 세밀한 제어를 가능하게하는 언어 기능의 부족에 대해 불평하고있었습니다. 여기에는 도구가 포함됩니다

  • 불변성 적용 (예 : C ++ const키워드)
  • 객체 수명 및 소유권 제어
  • 메모리 사용, 복사 및 할당 스타일 제어

이것은 Java에 대한 나의 비판 중 하나를 상기시킵니다.

모든 것이 포인터이지만 포인터는 존재하지 않습니다.

C ++ 객체에서 포인터와 참조는 명확한 의미론을 가진 세 가지 고유 한 개념입니다. Java에서는 pseudo-object-pointer가 있습니다. 이것들을 병합하고 진정한 포인터 의미를 피함으로써 객체 모델은 덜 명확합니다.

잘 정의 된 C ++ 프로그램에서 프로그래머는 참조가 유효하고 널이 아닌 것으로 기대할 수 있습니다. Java는 단순화 된 모델로 인해 동일한 보장을 할 수 없습니다.

이 덜 명확한 모델의 증상에는 null 객체 패턴 및와 같은 요다 조건이 포함됩니다 5.equals(potentiallyNullIntegerReference).


5
이것은 매우 혼란 스럽다. 논리적으로 의미있는 포인터는 Java로 해결할 수 없습니다. 모델을 단순화하는 요점은 더 많은 보증을 허용하는 것입니다. 언어로 된 코드에 대해 더 많이 가정 할 수있는 논리는 덜 제한적입니다. 더 많은 제한-> 더 많은 보증.
JimmyJames

1
@JimmyJames 문구는 모든 Java 클래스에 암시 적 (yuck, btw) 참조 시맨틱이 있지만 실제 포인터를 가질 수 없음을 의미합니다. 예를 들어, 참조에 대한 "참조"를 얻는 방법은 없습니다. 이로 인해 언젠가 미친 해결 방법이 필요한 여러 곳에서 언어가 손상됩니다 ( Map.merge지도에서 값을 간단히 업데이트하려는 경우 참조 ).
Quentin

3
@JimmyJames : 어떤 종류의 유용한 보증은 특정 제한을 부과하지 않으면 실제로 제공 될 수 없습니다. 또한, 일부 유용한 최적화에는 일부 제한이 부과 될 수 있습니다. 그러나 일부 언어는 프로그래머에게 유용한 보장을 제공하지 않으며 유용한 최적화를 수행 할 필요가없는 무의미한 제한을 적용합니다. 일부 제한은 단순히 나쁘다.
supercat

3
@JimmyJames : 반면에 Java 및 "안전 모드"의 더 근본적인 제한 중 일부는 C ++가 할 수없는 매우 유용한 보증을 제공합니다 . 특정 물체를 식별하는 것으로 관찰 된 것은 다른 물체를 식별하는 것으로 절대 관찰되지 않습니다 .
supercat

3
답변을 뒷받침 할 인용문을 제공해 줄 수 있습니까? 예를 들어, AFAIK 페이지에는 언급되지 않습니다 const. 그것은 않는 예는 계획이며, 같은 언급은 "함수형 프로그래밍은"그러나 언어가 그가 사용 하지 사실, 제도의 디자이너는 단어 "기능"과에 대한 이야기 "의 사용을 피하기 위해 조심 (순수 함수형 언어 절차 "), 따라서"참조 투명성 "이 아닌 FP의"일류 서브 루틴 "해석을 사용하고있는 것 같습니다.
Jörg W Mittag 2018

1

@Kilian 답변에 동의하지만 몇 가지 요소를 추가합니다.

1- OS가 아닌 가상 머신에 대해 실행

Java 및 C #은 가상 머신을 통해 실행되므로 VM에서 무언가를 손상시킬 가능성이 있기 때문에 OS에서 바로 사용할 때 원하는 것을 정확하게 수행 할 수 없다는 것이 논리적으로 예상됩니다. 또한 Java가 플랫폼에 무관심한 방향으로 향함에 따라 훨씬 더 논리적입니다.

2 톤의 응용 프로그램에서는 이러한 종류의 물건이 필요하지 않습니다.

실제로 많은 세부 사항을 파헤칠 필요가없는 수많은 응용 프로그램이 있지만, 필요한 언어로 수행하면 다음과 같은 이점이 있습니다.

  • 불필요한 것들로 인해 버그가 발생할 위험이 더 큽니다.
  • 더 많은 개발 비용, 메모리 관리 및 테스트에는 많은 시간과 비용이 소요됩니다!

3- 언어는 모든 선택과 같은 가중치 가중치 / 사용 / 위험에 따라 선택됩니다.

C ++를 사용하면 원하는 것을 거의 할 수 있습니다. 이것이 C ++ 사람들의 선택입니다. 그러나 많을수록 더 많이 처리해야합니다.

따라서 다중 상속과 같은 것들은 위험하다는 사실 때문에 포기되지 않으며, 구현하는 데 비용이 많이 들기 때문에 포기합니다 (개발, 유지 보수). 일반적으로 다르게 작성됩니다.


그것은 다음과 같은 보장을 모두 유지하는 것은 불가능합니다 사실에서 다중 상속 거짓말의 실제 비용 :베이스 클래스의 멤버가있는 경우 (1) B중간 클래스에서 재정의되고 M, 다음 B'해당 멤버의 S 버전은 접근을 통해 될 것 M' 재정의; (2) 유형에 대한 참조가 주어지면 T,이를 수퍼 유형 으로 변환하고 다시 T원래 유형과 동등한 참조를 생성합니다. 이러한 보장은 모두 유용하며 다중 상속을 지원하려면 하나 이상을 포기해야합니다.
슈퍼 캣

-1

프로그래머를 보호하기 위해 C # 및 Java와 같은 고급 언어로 모든 제한 사항을 적용하기 만하면됩니다. 그것들은 프로그래머를 스스로 보호하는 것이 아니라 다른 프로그래머로부터 프로그래머를 보호하기 위해 존재합니다!

프로그래머로서 우리는 코딩 실습과 디자인에서 굉장히 끔찍하지만 어떤 이유로 든 사용해야하는 라이브러리를 몇 번이나 접하게됩니까?

이러한 프로그램은 일반적으로 캡슐화가없고 오류 잡기 나 처리가 거의없는 많은 직접 메모리 쓰기와 함께 기존 절차 프로그래밍 방식의 특징을 가지고 있습니다. Segfaults는 모든 대규모 프로젝트에서 사용하려고 시도 할 때 일괄 처리를 추구합니다.

Java 및 C #과 같은 언어가 매우 도움이되는 곳입니다. 그들은 다른 언어가하는 모든 깔끔한 일을하지 못하게한다는 사실을 즐기는 것이 아니라, 다른 프로그래머가 다른 언어가 할 수있는 깔끔한 일을 남용 할 수 있기 때문에 우리가 견뎌야 할 두통이 없다는 점입니다. 해야 할 것.

인터페이스는 내 마음 속의 메모리 또는 실행 속도와 관련하여 모든 종류의 트레이드 오프 가치가 있습니다. 모든 종류의 시간 제한 미션 크리티컬 응용 프로그램에서 모든 보호, 적절한 오류 처리 및 일반적으로 메모리가 부족하지 않다고 확신하는 것이 좋습니다!


이것은 이전의 5 가지 답변에서 제시되고 설명 된 점들에 비해 실질적인 것을 제공하지 않는 것 같습니다
gnat

1
They exist not so much to protect the programmer from him/herself, but rather to protect the programmer from other programmers!아니면 다른 프로그래머를 프로그래머로부터 보호하는 것입니까?
Tobia Tesan

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