전역 편집 : 죄송합니다, 나는 모두 해고되었고 많은 넌센스를 썼습니다. 낡은 괴짜 란트.
나는 C가 절약되었다고 생각하고 싶었지만 C11 이래로 C ++과 동등한 수준이되었습니다. 분명히, 컴파일러가 표현식에서 부작용으로 무엇을하는지 알기 위해서는 이제 "동기화 지점 앞에 위치"에 기반한 코드 시퀀스의 부분 순서와 관련된 약간의 수학 수수께끼를 풀어야합니다.
K & R 시대에 몇 가지 중요한 실시간 임베디드 시스템을 설계하고 구현했습니다. (엔진을 점검하지 않은 경우 가장 가까운 벽에 충돌하는 사람들을 보낼 수있는 전기 자동차 컨트롤러 포함) 제대로 명령하지 않으면 사람들을 펄프에 박힐 수있는 로봇, 그리고 무해하지만 수십 개의 프로세서가 1 % 미만의 시스템 오버 헤드로 데이터 버스를 빨아 들일 수있는 시스템 계층).
정의되지 않은 것과 지정되지 않은 것 사이의 차이를 얻기에는 너무 멍청하거나 어리석지 만 동시 실행과 데이터 액세스가 무엇을 의미하는지 여전히 잘 알고 있다고 생각합니다. 필자의 의견으로는, C ++에 대한 이러한 집착과 이제는 동기화 문제를 극복하는 애완 동물 언어를 가진 C 녀석은 값 비싼 꿈입니다. 동시 실행이 무엇인지 알고 있고, 이러한 기즈모가 필요하지 않거나 필요하지 않으며, 세계를 크게 엉망으로 만들지 않을 것입니다.
이러한 눈물을 흘리는 메모리 장벽 추상화의 모든 트럭로드는 단순히 다중 CPU 캐시 시스템의 일시적인 한계로 인해 발생합니다. 이는 모두 뮤텍스 및 조건 변수 C ++와 같은 일반적인 OS 동기화 객체에 안전하게 캡슐화 될 수 있습니다 제공합니다.
이 캡슐화의 비용은 미세한 특정 CPU 명령어를 사용하여 얻을 수있는 것과 비교하여 성능이 약간 저하되는 경우가 있습니다. 키워드 (또는
volatile
#pragma dont-mess-with-that-variable
시스템 프로그래머로서, 케어)는 메모리 액세스 순서를 바꾸지 말라고 컴파일러에게 지시하기에 충분했을 것이다. 직접 asm 지시문으로 최적의 코드를 쉽게 생성하여 임시 CPU 특정 명령으로 저수준 드라이버 및 OS 코드를 뿌릴 수 있습니다. 기본 하드웨어 (캐시 시스템 또는 버스 인터페이스)의 작동 방식에 대한 친밀한 지식 없이는 쓸모없고 비효율적이거나 결함이있는 코드를 작성해야합니다.
volatile
키워드와 Bob 의 미세한 조정은 모든 사람을 제외한 대부분의 저급 프로그래머의 삼촌 일 것입니다. 그 대신에, 일반적인 C ++ 수학 괴물 집단은 아직 이해하기 어려운 또 다른 추상화를 설계하는 현장 하루를 보냈으며, 존재하지 않는 문제를 찾는 솔루션을 설계하고 컴파일러의 사양으로 프로그래밍 언어의 정의를 착각하는 전형적인 경향을 가져 왔습니다.
이번에는 C의 기본 측면을 손상시키는 데 필요한 변경 사항이 있었는데, 이러한 "장벽"이 제대로 작동하려면 낮은 수준의 C 코드에서도 생성되어야했기 때문입니다. 그것은 무엇보다도 설명이나 정당화없이 표현의 정의에 혼란을 가져왔다.
결론적으로 컴파일러가이 터무니없는 C 조각에서 일관된 기계 코드를 생성 할 수 있다는 사실은 C ++ 사용자가 2000 년대 후반의 캐시 시스템의 잠재적 불일치에 대처하는 방식의 먼 결과 일뿐입니다.
C (표현 정의)의 한 가지 기본적인 측면을 엉망으로 만들었습니다. 따라서 캐시 시스템에 대해 망설이지 않고 정당하게도 많은 C 프로그래머가 전문가를 설명해야합니다. 차이 a = b() + c()
와 a = b + c
.
이 불행한 배열이 어떻게 될지 추측하는 것은 어쨌든 시간과 노력의 손실입니다. 컴파일러가 무엇을 만들 것인지에 관계 없이이 코드는 병적으로 잘못되었습니다. 그것과 관련된 유일한 책임은 그것을 쓰레기통에 보내는 것입니다.
개념적으로, 부작용은 평가 전이나 후에 수정이 별도의 진술로 명시 적으로 이루어 지도록하려는 사소한 노력으로 항상 표현에서 벗어날 수 있습니다.
이런 종류의 혼란스러운 코드는 컴파일러가 아무것도 최적화하지 못했을 때 80 년대에 정당화되었을 수 있습니다. 그러나 이제 컴파일러는 대부분의 프로그래머보다 더 영리 해졌습니다. 남아있는 것은 모두 엉뚱한 코드입니다.
나는 또한이 정의되지 않은 / 지정되지 않은 토론의 중요성을 이해하지 못한다. 일관된 동작으로 코드를 생성하기 위해 컴파일러에 의존하거나 그렇지 않을 수 있습니다. 당신이 그것을 정의되지 않은지 또는 불특정이라고 부르는지 여부는 논란의 여지가 있습니다.
내가 알기로는 C는 이미 K & R 상태에서 충분히 위험하다. 유용한 진화는 상식 안전 조치를 추가하는 것입니다. 예를 들어,이 고급 코드 분석 도구를 사용하면 스펙은 잠재적으로 극단적으로 신뢰할 수없는 코드를 자동으로 생성하는 대신 컴파일러가 최소한 bonkers 코드에 대한 경고를 생성하도록 구현해야합니다.
그러나 대신에 사람들은 C ++ 17에서 고정 평가 순서를 정의하기로 결정했습니다. 이제 새로운 소프트웨어가 난독 화를 결정적인 방식으로 간절히 처리 할 것이라는 확신을 바탕으로 의도적으로 코드에 부작용을두기 위해 모든 소프트웨어가 비효율적입니다.
K & R은 컴퓨팅 세계에서 놀라운 일 중 하나였습니다. 20 달러에 대해 당신은 언어의 포괄적 인 사양을 얻었습니다 (단독의 개인 이이 책을 사용하여 완전한 컴파일러를 작성하는 것을 보았습니다), 훌륭한 참조 매뉴얼 (목차는 일반적으로 질문)과 합리적으로 언어를 사용하도록 가르치는 교과서입니다. 언어를 남용하여 매우 어리석은 일을 할 수있는 수많은 방법에 대한 이론적 근거, 예 및 현명한 경고문으로 완성하십시오.
작은 이익을 얻기 위해 그 유산을 파괴하는 것은 나에게 잔인한 낭비처럼 보입니다. 그러나 다시 한 번 요점을 완전히 보지 못할 수도 있습니다. 어쩌면 어떤 종류의 영혼이 이러한 부작용을 크게 활용하는 새로운 C 코드의 예를 지시 할 수 있습니까?