기사 : 왜 POCO 라면 다음과 같은 문장이 있습니다 :
Maciej Sobczak은 다음과 같이 잘 설명합니다.
C #이 Microsoft & Java가 소유 하고 있지만 Oracle이 C #을 소유하고 있음에도 불구하고 그가 의미하는 바를 이해 하지 못합니다. 나는 그 문장을 증명할 증거를 찾지 못했고, 이것에 대해 정말로 궁금합니다. 그리고 '내 자신을 보호하기위한'부분에 대해 더 궁금합니다.
기사 : 왜 POCO 라면 다음과 같은 문장이 있습니다 :
Maciej Sobczak은 다음과 같이 잘 설명합니다.
C #이 Microsoft & Java가 소유 하고 있지만 Oracle이 C #을 소유하고 있음에도 불구하고 그가 의미하는 바를 이해 하지 못합니다. 나는 그 문장을 증명할 증거를 찾지 못했고, 이것에 대해 정말로 궁금합니다. 그리고 '내 자신을 보호하기위한'부분에 대해 더 궁금합니다.
답변:
Sobczak은 기업 소유권에 대해 이야기하지 않습니다. 그가 잃어버린 "반쪽"언어는 많은 현대 언어로 할 수없는 모든 것입니다. 비록 잘 교육받은 컴퓨터 전문가 는 가능할 수 있다는 것을 알고 있습니다. 원하는만큼 많은 클래스에서 상속받습니다. 유형 제약 조건없이 다른 객체에 객체를 할당합니다. 컴파일러와 런타임을 신뢰하지 않고 수동으로 할당 및 리소스 해제를 제어합니다.
문제는 모든 제한이 프로그래밍 언어에 들어간 이유입니다. 우리 는 이 모든 것을 허용하는 언어를 가지고있었습니다. 시간이 지남에 따라 우리는 평균 프로그래머가 일정량의 제한과 손 잡기로 더 나아 졌다는 것을 알았습니다. 실제로 나쁜 오류를 일으킬 가능성이 너무 커서 추가 능력과 표현력을 가치가 없기 때문입니다.
(물론 이것은 때때로 많은 양의 손을 잡을 필요가없는 프로그래머를 성가 시게한다. 그들의 불만은 때때로 합법적이다. 그러나 사람들은 자신의 기술을 평가하는 데 악명이 나쁘고, 많은 사람들이 안전 장치가 필요하지 않다고 생각한다) 불평이 자신을 우월하게 보이게하거나 알지 못하는 평범한 코더들로부터 고급 언어로 제한을받는다고 생각하는 실제 우량한 지성을 구분하기 란 쉽지 않습니다. 더 나은.)
dynamic
?
이것은 인용의 원래 출처 에서 꽤 잘 설명되어 있습니다 .
나는 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 ++의 절반이 빠져 있다고 생각합니다. 그리고 그것은 그 인용에 관한 모든 것입니다.
게시 한 블로그에 링크 된 기사가 제거되었으므로 확실하지는 않지만 Kilian은 "언어의 절반"이라고 말하면 C # 및 Java가 C ++처럼 느껴지지만 사용하기 쉽고 안전하도록 기능과 구성이 제거되었습니다.
2006 년이 시점에 C #이 비교적 젊었 고 Java가 여러면에서 미성숙했을 때, 전력 대 안전이 하나만 선택할 수있는 절충안처럼 보였을 때, 이것은 절대로 불합리한 입장이 아니 었습니다. .
요즘 그 입장은 전혀 합리적이지 않습니다. C #과 Java는 주류 언어에 대해서만 생각하면서 엄청나게 성숙하여 안전한 코드 작성을 촉진하기 위해 다른 언어 (특히 기능적)의 기능을 빌려 왔습니다. 우리는 Rust와 Swift와 같은 언어를 가지고 있습니다.
누군가가 당신의 손을 잡고 있기 때문에 언어를 내려다 보거나 사용하기 어려운 언어가 어떻게 든 좋은 것이라고 말하면, 나는 그들이 한 알의 소금으로 가져갈 것입니다. 당신은 우리가 매일 의존하는 코드에서 발견되는 난처한 수의 버그를보아야 만합니다. 업계에서 가장 밝은 사람들이 작성한 '안전한'언어를 사용하여 사소하게 피할 수 있었던 이유는 무엇입니까?
보관소를 되돌아 보면 이 인용문은 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였습니다.
static
클래스는 그러한 원시적 인 기능처럼 보입니다. 나는 그들이 인스턴스 클래스를 미리 작성했다고 상상했다.
static
대부분의 경우 수업 의 열렬한 팬이 아니야 . 솔직히 말해서 C #에서 매우 단순하고 원시적 인 부분으로 보였기 때문에 호출 할 기능으로 선택했습니다. 나는 그들이 자바에 없다고 생각하지 않았습니다.
그는 세밀한 제어를 가능하게하는 언어 기능의 부족에 대해 불평하고있었습니다. 여기에는 도구가 포함됩니다
const
키워드)이것은 Java에 대한 나의 비판 중 하나를 상기시킵니다.
모든 것이 포인터이지만 포인터는 존재하지 않습니다.
C ++ 객체에서 포인터와 참조는 명확한 의미론을 가진 세 가지 고유 한 개념입니다. Java에서는 pseudo-object-pointer가 있습니다. 이것들을 병합하고 진정한 포인터 의미를 피함으로써 객체 모델은 덜 명확합니다.
잘 정의 된 C ++ 프로그램에서 프로그래머는 참조가 유효하고 널이 아닌 것으로 기대할 수 있습니다. Java는 단순화 된 모델로 인해 동일한 보장을 할 수 없습니다.
이 덜 명확한 모델의 증상에는 null 객체 패턴 및와 같은 요다 조건이 포함됩니다 5.equals(potentiallyNullIntegerReference)
.
Map.merge
지도에서 값을 간단히 업데이트하려는 경우 참조 ).
const
. 그것은 않는 예는 계획이며, 같은 언급은 "함수형 프로그래밍은"그러나 언어가 그가 사용 하지 사실, 제도의 디자이너는 단어 "기능"과에 대한 이야기 "의 사용을 피하기 위해 조심 (순수 함수형 언어 절차 "), 따라서"참조 투명성 "이 아닌 FP의"일류 서브 루틴 "해석을 사용하고있는 것 같습니다.
@Kilian 답변에 동의하지만 몇 가지 요소를 추가합니다.
1- OS가 아닌 가상 머신에 대해 실행
Java 및 C #은 가상 머신을 통해 실행되므로 VM에서 무언가를 손상시킬 가능성이 있기 때문에 OS에서 바로 사용할 때 원하는 것을 정확하게 수행 할 수 없다는 것이 논리적으로 예상됩니다. 또한 Java가 플랫폼에 무관심한 방향으로 향함에 따라 훨씬 더 논리적입니다.
2 톤의 응용 프로그램에서는 이러한 종류의 물건이 필요하지 않습니다.
실제로 많은 세부 사항을 파헤칠 필요가없는 수많은 응용 프로그램이 있지만, 필요한 언어로 수행하면 다음과 같은 이점이 있습니다.
3- 언어는 모든 선택과 같은 가중치 가중치 / 사용 / 위험에 따라 선택됩니다.
C ++를 사용하면 원하는 것을 거의 할 수 있습니다. 이것이 C ++ 사람들의 선택입니다. 그러나 많을수록 더 많이 처리해야합니다.
따라서 다중 상속과 같은 것들은 위험하다는 사실 때문에 포기되지 않으며, 구현하는 데 비용이 많이 들기 때문에 포기합니다 (개발, 유지 보수). 일반적으로 다르게 작성됩니다.
B
중간 클래스에서 재정의되고 M
, 다음 B
'해당 멤버의 S 버전은 접근을 통해 될 것 M
' 재정의; (2) 유형에 대한 참조가 주어지면 T
,이를 수퍼 유형 으로 변환하고 다시 T
원래 유형과 동등한 참조를 생성합니다. 이러한 보장은 모두 유용하며 다중 상속을 지원하려면 하나 이상을 포기해야합니다.
프로그래머를 보호하기 위해 C # 및 Java와 같은 고급 언어로 모든 제한 사항을 적용하기 만하면됩니다. 그것들은 프로그래머를 스스로 보호하는 것이 아니라 다른 프로그래머로부터 프로그래머를 보호하기 위해 존재합니다!
프로그래머로서 우리는 코딩 실습과 디자인에서 굉장히 끔찍하지만 어떤 이유로 든 사용해야하는 라이브러리를 몇 번이나 접하게됩니까?
이러한 프로그램은 일반적으로 캡슐화가없고 오류 잡기 나 처리가 거의없는 많은 직접 메모리 쓰기와 함께 기존 절차 프로그래밍 방식의 특징을 가지고 있습니다. Segfaults는 모든 대규모 프로젝트에서 사용하려고 시도 할 때 일괄 처리를 추구합니다.
Java 및 C #과 같은 언어가 매우 도움이되는 곳입니다. 그들은 다른 언어가하는 모든 깔끔한 일을하지 못하게한다는 사실을 즐기는 것이 아니라, 다른 프로그래머가 다른 언어가 할 수있는 깔끔한 일을 남용 할 수 있기 때문에 우리가 견뎌야 할 두통이 없다는 점입니다. 해야 할 것.
인터페이스는 내 마음 속의 메모리 또는 실행 속도와 관련하여 모든 종류의 트레이드 오프 가치가 있습니다. 모든 종류의 시간 제한 미션 크리티컬 응용 프로그램에서 모든 보호, 적절한 오류 처리 및 일반적으로 메모리가 부족하지 않다고 확신하는 것이 좋습니다!
They exist not so much to protect the programmer from him/herself, but rather to protect the programmer from other programmers!
아니면 다른 프로그래머를 프로그래머로부터 보호하는 것입니까?