C는 컴퓨터 과학에 필수적입니까? [닫은]


15

나는 거의 심지어와 파일 참조 프론트 엔드 개발자로서 .h또는 .c확장. 나는 기본 C 구문을 알고 있으며, Unreality에서 배웠지 만 간단한 것에는 너무 많은 설정이 있었기 때문에 저수준 프로그래밍에 관심이 없었습니다.

나는 컴퓨터 과학의 모든 측면을 배우는 데 관심이 있지만 컴퓨터 과학의 대부분의 개념을 이해하기 위해 특정 언어를 알 필요는 없다고 생각합니다. 그러나 데이터 구조 및 알고리즘 디자인과 같은 기본적인 컴퓨터 과학 개념에 관한 책과 기사를 읽으려면 모든 예제와 교훈이 C (그리고 때로는 Java)이기 때문에 C를 배워야 할 것 같습니다.

제 질문은 C가 컴퓨터 과학에 필수적인 프로그래밍 언어입니까, 아니면 CS로 작성된 모든 자료를 C로 작성 했습니까? C를 배우지 않고 컴퓨터 과학을 배울 수 있습니까?


4
이에 대한 Joel Spolsky의 의견은 다음과 같습니다. joelonsoftware.com/articles/CollegeAdvice.html 토론 가능 하지만 그의 요점이 있다고 생각합니다.
Doc Brown

2
순수 주의자들은 컴퓨터 과학이 컴퓨터에 관한 것이 아니라 프로그래밍 언어를 불필요하게 만든다고 주장 할 것이다.
Blrfl

1
"컴퓨터 과학"은 무엇을 의미합니까? 당신이 설명하는 것은 대부분 제가 생각하는 컴퓨터 과학 의 소프트웨어 공학 부분입니다. 또한 모든 리소스가 C로 작성된 방법을 알지 못합니다 . 알고리즘 / 데이터 구조에 대한 많은 책을 읽었으며 C는 사용 하지 않았습니다 . 거의 모든 언어는 모든 사람들이 쉽게 이해할 수있는 일종의 의사 코드 언어를 사용했습니다. 어셈블리를 사용하는 TAOCP를 제외하고 ... 그러나 그것은 또 다른 이야기입니다)
Bakuriu

비현실? 그것은 대학에서 자동 수정의 기발한 것일까, 아니면 흑 마법의 학교인가? 나는 보이지 않는 대학을 알고있다 : [
사슴 사냥꾼

답변:


31

나는 여기서 흐름에 맞서고 그렇습니다, 당신은 C를 배워야한다고 말합니다. 나는 실제로 많은 다른 답변의 요점에 동의하지만, 당신은 매우 강한 진술을합니다.

나는 컴퓨터 과학의 모든 측면을 배우는 데 관심이 있지만 컴퓨터 과학의 대부분의 개념을 이해하기 위해 특정 언어를 알 필요는 없다고 생각합니다.

(강조 광산)

글쎄, 운영 체제와 네트워크 스택은 컴퓨터 과학의 두 가지 큰 측면이며, 모든 주요 운영 체제와 네트워크 스택은 크게 C로 작성됩니다.이를 이해하려면 C를 배워야합니다. Java로 된 OS 클래스이지만 영어로 Homer를 읽는 것과 같습니다.

게다가 C는 그렇게 큰 언어가 아닙니다. 컴퓨터 과학의 모든 측면을 정말로 배우고 싶다면 'meh'라고 말해야합니다. '언어가 더 있습니까?'


C에게 "학습"한다는 것은 언어를 구사하는 데 도움이되지 않는 사소한 프로그램을 작성하기에 충분히 유창하다는 것을 의미합니다. 해당 수준의 이해가 운영 체제 및 네트워크 프로그래밍의 전제 조건인지 확실하지 않습니다.
Telastyn

3
@Telastyn : 운영 체제 코드와 네트워킹 코드 (C가 사용되는 도메인)를 이해하고 수정할 수있을 정도로 유창함을 의미합니다. 그렇다고 C로 게임을 작성하고 C로 그래픽, 머신 인텔리전스 엔진으로 멋진 UI 및 차트 응용 프로그램을 만드는 방법을 알아야한다는 것은 아닙니다. CS의 다른 모든 도메인에는 다른 언어 선택이 있기 때문입니다.
rwong

12

컴퓨터 과학이 직업이 아닌 과학으로서 고도로 오랜 기간 동안, 모든 다른 대학들이 사용하는 모든 시스템에서 실행되는 언어에 대한 선택의 여지가 거의 없었습니다.

지금까지 대학은 유닉스 시스템을 사용하는 경향이있었습니다. 편리하게, 이것은 C로 프로그래밍되었습니다. 어떤 기계에서나 C를 배우는 것으로 시작하여 결국에는 C에서 유닉스 소스 코드를 얻을 수 있습니다. 집에서 학생들은 Windows의 Borland Turbo C 또는 Windows의 MPW 와 같은 C 컴파일러를 사용할 수 있습니다 . Mac-어디서나 작동했습니다.

파스칼은 또 다른 옵션이지만 프로그래밍의 특정 시점에서 실제로 필요한 작업을 수행하기에 언어가 충분하지 않다는 문제가있었습니다 (파스칼로 OS를 프로그래밍하는 것은 고통 스럽습니다).

일부 고등 학교는 Fortran을 배웠지 만 다시 한 번 더 높은 수준의 CS 수업 (Fortran의 AI 이론, Doable이지만 고통스러운)을 가르 칠 수있는 충분한 언어는 아니 었습니다.

그래서 오랫동안 C가 선택되었습니다.

그것은 유일한 선택이 아니며 현재 많은 대학들이 다른 언어로 내부의 일부를 연마하고 추억의 메모리 관리 등을 다루지 않고도 높은 수준의 개념을 배우도록 가르치고 있습니다. 어떤 사람들은 이것이 좋다고 생각하고 어떤 사람들은 이것이 나쁘다고 생각합니다 .


따라서 C를 배우는 것이 컴퓨터 과학을 배우는 데 필수적이지는 않습니다. Java 또는 Python에서 컴퓨터 과학을 가르치는 많은 다른 책을 찾을 수 있습니다. 단지 오랫동안 C가 선택되었고 학술 서적은 느리게 움직였습니다.


기록을 위해 AI 교육은 전통적으로 70 년대와 80 년대에 LISP를 통해 C의 난자 동반자와 함께 이루어졌지만 그 해답은 바로 앞서 있습니다.
jwrush

@ jwrush 내 대답은 다른 언어 (LISP가 아니라-AI의 90 년대에 lisp 수업을 들었습니다)와 비교하여 C에서도 AI 공부를 할 수있는 선을 따라 더 많았습니다. 물론 그 당시 MIT (계란의 본거지)는 LISP에서 많은 수업을 가르쳤습니다. 물론 이것은 다른 선택이지만 다른 분야에서는 실용적이지 않았습니다. 가르치는 과정에서 각 수업에서 같은 기준으로 일하는 것이 중요했기 때문에 첫 수업에서 첫 주나 두 시간 동안 학생들에게 해당 수업에 특화된 다른 언어를 가르치는 일을 할 필요가 없었습니다.

12

나는 하나가 잘 지불하는 일자리를 얻을 이제까지 감동 C없이 생산성을하지만, 내가보기 엔이다 사람을 위해 C 학습을 추천 할 수 있음을 인정 심각한 갖는 고체에 대한 이해 컴퓨터 과학을.

컴퓨터 과학은 특정 프로그래밍 언어와 상관없이 배울 수있는 개념에 관한 것이지만, C를 배우거나 C를 사용하여 해당 분야를 배우면 훨씬 더 잘 이해 될 수있는 분야가 있습니다.

  • 알고리즘 및 데이터 구조. 표준 C에는 이러한 것들이 거의 없습니다 . 언어 나 표준 라이브러리에서 이미 구현 한 것은 학생들에게 동기를 부여하는 경향이 있습니다. " 왜 쉽게 사용할 수있는 것을 구현해야합니까?"C 코드를 살펴보면 C의 모든 것이 몇 가지 기계 명령어로만 컴파일되기 때문에 알고리즘 비용이 즉시 나타납니다. 고급 언어 (예 : Perl 또는 Python)는 종종 경량 구문을 사용하여 고급 데이터 구조를 사용합니다. 코드는 가벼워 보이지만 코드 코드의 알고리즘 복잡성을 올바르게 추론하기 위해서는 이미 많은 지식이 필요하므로 이러한 언어는 알고리즘과 데이터 구조를 배우는 데 적합하지 않으며 항상 살아있는 많은 프로그래머에게 적합하지 않습니다. 고급 언어에서는 성능 문제를 해결할 수없는 경향이 있습니다.

  • 운영체제. 대부분의 운영 체제는 C로 작성되었습니다. 호출하지 않고 프로세스 작성을 어떻게 이해 fork하시겠습니까? Java VM의 추상화 계층은 여기서 도움이되지 않습니다. 프로세스를 만들지 않고 그것에 대해 이야기하는 것이 더 나빠질 수 있습니다. 표준 출력을 창 중 하나로 리디렉션 할 수있는 Eclipse와 같은 소프트웨어를 어떻게 작성할 수 있습니까? 이를 위해 OS 레벨 개념을 이해해야하며 C에서만 직접 개념을 만질 수 있습니다.

  • 우회. 포인터를 다루지 않으면 C를 수행 할 수 없습니다. 포인터를 사용하면 2 단계로 생각할 수 있으며 추상화 기술이 확장됩니다.

C 지식의 기술적 이점도 있습니다.

  • 언어 간 상호 운용성 훌륭한 Ruby 모듈을 Python 프로젝트에 통합하려고합니다 (여기에서 두 개의 임의의 언어로 대체). 두 언어 모두 C에 대한 외부 인터페이스를 가지고 있기 때문에 C를 통해서만 할 수 있습니다.

  • 성능이 중요한 소프트웨어 작성. 이를 위해 저수준으로가는 것을 생략 할 수는 없습니다.


나는 모든 프로그램이 C로 작성되어야한다고 말하지는 않는다. 그러나 C는 당신이 어떤 언어로 프로그래밍하든 유용한 지식에 도움을 줄 수있다.


포인터 산술은 운영 체제를 이해하는 데 중요하므로 그 이유가 있습니다. 예를 들어 왜 힙과 스택이 다르고, 가상 메모리의 성능이 나쁘거나, 루프가 다른 루프보다 빠르게 작동하는 이유는 무엇입니까?
Michael Shopsin

6

나는 또한 여기서 곡식에 대항하여 C에 대해 (약간 유머러스 한) 심미적 인 사례를 만들려고합니다. 어떤 사람들은 클래스 또는 포인터에 대한 의존성, 그렇지 않다는 것을 알았습니다. .

TL; DR : 제 생각에는 C는 간단하고 C는 읽을 수 있으며 두드리는 비트에는 약간의 기쁨이 있습니다.

C는 간단하다

표준 C는 함수, 포인터 및 배열을 생성하는 몇 가지 기본 유형 및 메커니즘 만 정의합니다. 그 외에도, 구조체와 공용체와 같은 프리미티브에서 더 복잡한 유형을 만들기위한 적은 수의 컴포지션 구성이 있습니다. 내가 가장 많이 묘사 한 방법에 주목 의 언어를 두 문장으로 . 즉, 코딩하는 동안 너무 많은 구문 규칙과 양식을 머리에 보관할 필요가 없습니다.

단순하다 아름답다 .

C는 비전이 아니다

많은 고급 언어와는 달리 C에서 기묘하고 이해할 수없는 많은 기호를 찾기가 어려울 것입니다. C 세계에서 추상화와 "구문 압축"의 주요 기능은 의미 상 매우 간단하고 자기 설명 적 구성. 좋은 C 스타일은 거의 시적이고 읽기 쉬운 아름다움을 장려합니다. 설명을 위해 Linux 커널에서 다음 스 니펫을 읽으십시오. 기본 데이터 구조와 구현 세부 정보를 파악하지 않아도 다음을 이해할 수 있습니다.

bool kthread_freezable_should_stop(bool *was_frozen)
{
    bool frozen = false;

    might_sleep();

    if (unlikely(freezing(current)))
        frozen = __refrigerator(true);

    if (was_frozen)
        *was_frozen = frozen;

    return kthread_should_stop();
}

기능의 중간에는 "전류가 얼지 않을 경우 냉장고에 실제로 얼지 않았는지 물어보십시오"라고 표시됩니다. Dr. Seuss는 더 잘 쓸 수 없었습니다.

읽을 수있는 것이 아름답습니다 .

C는 투명하다

C 문에 함수 호출이 포함되어 있지 않으면 일반적으로 런타임 비용과 부작용에 대한 좋은 아이디어를 얻을 수 있습니다. C는 프로그래머에게 제어권을주고 궁극적으로 올바른 일을하도록 신뢰합니다. 우리는 strlen()GNU C 라이브러리 의 구현 에서이 (SE에 대해 약간 재구성 된) 스 니펫이 실행될 때 발생하는 상황에 대한 그림을 얻을 수 있습니다. 모든 연산자에는 잘 정의 된 의미가 있기 때문입니다. C에는 과부하가 없습니다.

for (char_ptr = str; ((unsigned long int) char_ptr & (sizeof (longword) - 1)) != 0;
        ++char_ptr)

if (*char_ptr == '\0')
    return char_ptr - str;

"최적화"의 목적으로이 속성은 훌륭합니다. 아마도 일부 고급 언어는 클래스 및 오버로드가 포함 된 C ++와 같이 고급 알고리즘의 간결한 표현을 더 쉽게 만들 수 있지만 C는 휴대용 어셈블러 역할을하도록 설계되었으므로 C가 이상적입니다. 때때로, 저수준 코드가 성공적으로 실행될 때, 프로그래머는 어떤 의미에서 기계와 하나를 느낄 수도 있습니다 (또는 0-구현 세부 사항 임). 이것은 다른 언어가 나쁘거나 "젠"이 아니거나 그런 어리석은 말이 아니며, IMO C가 많은 다른 언어가 선택하지 않은 방식으로 여러 가지 유효한 이유로 흥미로울 수 있다는 것입니다.

필자가 생각하기에 위에서 제시 한 세 가지 사항은 리눅스로 구현 된 복잡하지만 효율적인 시스템의 생성을 관리 할 수있게한다. 나는이 세상이 나의 미적 감수성에 호소한다는 사실을 알게되었고, C를 그의 다음 목표로 생각하는 사람들에게 이러한 점들을 고려할 것을 권합니다. 나는 성공적인 프로그래머가되기 위해 커널을 이해할 필요가 없기 때문에 운영 체제와 그 밖의 것에 대한 주장이 명시 적으로 더 잘 뒷받침된다고 생각합니다.


3

컴퓨팅 과학을 논의하기 위해 사용하는 프로그래밍 언어는 컴퓨팅 수단과 과학을 배우는 작업과 크게 관련이 없습니다.

컴퓨터 과학, 컴퓨터 프로그래밍의 예술 에 관한 (논쟁 적으로) 중요한 작품 , 주제를 알리기 위해 기존의 언어를 사용하지 않습니다. 대신, Donald Knuth는 가상 컴퓨터와 가상 머신 언어 (및 관련 어셈블리 언어)를 모든 주제에 대해 논의하는 관점에서 정의하기로 결정했습니다.

주제에 다른 높은 평가를 받고있는 작품, 컴퓨터 프로그램의 구조와 해석 는 비슷한 맥락에서 LISP 프로그래밍 언어의 간단한 방언을 고안하여 자체 맥락으로 작용했다. 이 언어는 우리가 지금 체계라고 알고 있습니다.

그러나 컴퓨터 과학, 다른 아주 좋은 일 컴퓨팅 시스템의 요소 실제로 동일한 부품 컴퓨터 공학 및 컴퓨터 과학, 그리고이다 ( 매우 간단 함)는 기계와 도구를 만드는 디지털 논리를 가르치는 더 근본적인 접근 방식을 취합니다. 초등 컴퓨터 과학을 가르치기 전에 언어와 언어.

따라서 C는 컴퓨터 과학을 이해하는 데 필요하지 않습니다. 중요한 것은 알고리즘의 핵심 개념과 그 응용에 대한 이해입니다.


2

플로피 디스크와 함께 제공된 설명서에서 vb3을 학습하여 프로그래밍 경력을 시작했습니다. 나는 약간의 자바를 배웠고 훌륭한 프로그램을 만들 수 있었지만 대학에서 C를 공부할 때까지는 "후드"에서 무슨 일이 일어나고 있는지 실제로 이해했다고 생각하지 않았다. 나는 이제 .net으로 만 작업하고 실제로 포인터, 유효하지 않은 주소 또는 오버플로에 대해 걱정하지 않습니다. 그러나 그것들을 이해합니다. 이것은 매일 결정하는 것을 알려주며 구식 물건 중 일부는 여전히 현대적인 해석 언어, 플래그로 표시됩니다 비트 단위 연산, 부울 논리, 모든 강력한 도구 및 매우 효율적입니다.

C를 배우십시오. 그것은 당신을 대신 할 것입니다. 나는 수년간 c 프로그래머 핸드북의 사본을 보관하고 Kernighan과 Ritchie를 엄폐 적으로 읽었습니다. C를 이해하는 데 도움이되는 언어는 중요하지 않습니다.


1

C를 배우지 않고 컴퓨터 과학을 배울 수 있습니까?

대답은 '예'입니다. CS에서 학위를 받았으며 C를 배우는 것이 아니라 Java를 배울 필요가있었습니다. 적어도 우리 학교에서는 어셈블리 언어, 데이터 구조 및 데이터베이스 디자인에 대한 몇 가지 가르침과 함께 객체 지향 프로그래밍을 배우는 데 중점을 두었습니다.


7
당신의 학위 가 CS의 " 모든 측면"을 다룬다 고 확신 하십니까?
SK-logic

나는 필요한 모든 측면을 말할 것입니다. 학위는 학위 프로그램의 모든 측면을 다루지 않습니다. 또한 "전체"는 주관적입니다.
PhillyNJ

1
"필요한"을 어떻게 정의합니까? 모든 것은 모든 가능한 CS 응용 프로그램을 포괄하는 의미입니다. 그것은 "주관적"이 아니며, 정량화가 가능합니다.
SK-logic

나는 CS가 계산 및 컴퓨터 기술, 하드웨어 및 소프트웨어에 대한 연구를 다루고 문맥에 대한 '필요한'을 정의하는데, 이는 원래의 질문에 답하는 특정 언어가 아닙니다.
PhillyNJ

저급 언어없이 하드웨어를 어떻게 다루는가? 그러한 핵심 언어없이 프로그래밍 언어 (CS의 "모든"에서 예외적으로 중요한 부분)의 역사를 어떻게 다룰 것인가? 포인터 산술로 적어도 하나의 언어없이 프로그래밍 언어 의미를 어떻게 다룰 것인가? 어떤 식 으로든 C와 유사한 언어가 모든 CS 교육 과정에 있어야합니다.
SK-logic

0

그것은 당신이 배우고있는 것과하고자하는 것에 달려 있습니다. 많은 알고리즘이 C 또는 그 자손으로 제공된다는 것은 사실입니다. 그러나 수년에 걸쳐 더 많은 C ++, C # 및 Java 예제를 보았습니다. CS가 가르치려는 것은 컴퓨팅에 대한 일반적인 이해와 현재 작업에 적합한 언어를 선택하거나 만드는 방법입니다.

그러나 여전히 첫 번째 언어와 마지막 언어가 C 또는 Java의 변형 인 많은 사람들이 있으며, CS 학위가 제공하는 모든 언어를 이해하기 위해 교육을받는 것은 아닙니다. 일부 CS 졸업생조차도 프로그래밍에 문제가 있습니다. 따라서 경력 경로에 따라 의사 소통 할 수있는 언어를 충분히 이해해야 할 수도 있습니다. 학계를 고수하려는 경우 특히 학제 간 영역 (사람들이 프롤로그, 리스프, 하스켈, 수학 등을 사용하는)에서 콘텐츠에 대한 언어 장벽이 더 커집니다.


-1

실제로 "컴퓨터 과학의 모든 측면"(야심 찬 계획!)을 배우려면 여러 가지 다른 어셈블리 언어와 하나 이상의 HDL (넷리스트 수준에서 코딩 연습)을 처리해야합니다.

그리고 이러한 진정으로 근본적인 것들에 접근하기위한 더 높은 단계의 단계로서 C 또는 Pascal과 같은 것을 피해야합니다. 추상화의 사다리에서 단계를 건너 뛰는 것은 비생산적입니다.

어쨌든, 나는이 질문을 물어볼 가치가 있다고 의심합니다. 결국 C는 아주 작은 언어 일뿐입니다. C를 배워야하는지 아닌지를 반영하여 낭비하는 것보다 짧은 시간에 기본 사항을 배울 수있었습니다.

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