2009-06-29 2 views
8

저는 현재 Actionscript 3 및 PHP 개발자로 일하고 있습니다. 나는 PHP를 배우기 시작하고 Actionscript 3로 옮겼으며 지금은 Python을 배우고 있습니다. 이 3 개 언어는 어느 수준에서도 낮은 수준의 메모리 관리와 다른 숫자에 사용할 데이터 유형을 아는 것과 같은 사항에 대해 걱정할 필요가없는 고급 언어입니다.일반적으로 OS 및 컴퓨터에 대해 더 깊이 이해할 가치가 있습니까?

3 가지 프로그래밍 언어를 알고 있지만 뭔가 빠져있는 것처럼 느껴집니다. 예를 들어 스택 오버플로 (예, 내가 stackoverflow에이 질문을 쓴다고 부끄러워해야한다는 것을 알고 있습니다)가 무엇인지, 그리고 왜 발생하는지에 대해서는 알지 못합니다. 나는 이런 종류의 일을 결코 알지 않을 것이다. 왜냐하면 나는 결코 나의 일의 라인에서 이러한 종류의 문제들을 직면하지 않을 것이기 때문이다.

제 질문은 매우 간단합니다. 제가 직장에서 일하지는 않더라도 C를 배우면 도움이 될까요?

+0

아직 많은 것을 배워야합니다. PHP 또는 Python에서 스택 오버플로가 발생할 수 있습니다. PHP에서 결코 발견 할 수 없지만 C에서는 빈번한 오류가 세그먼테이션 오류입니다. – Ksempac

+0

네,하지만 제 기억 관리 때문이 아닙니다. –

+0

진정으로 깊은 이해를 원한다면 x86 어셈블리 언어를 배우거나 최소한 그걸 가지고 놀아야합니다. – toto

답변

11

학습하는 것은 거의 시간 낭비가 아닙니다. 그리고 C는 배울 수있는 아주 간단한 언어입니다. 저는 그것을 상업적으로 가르쳐 왔고 4.5 일 만에 많은 일을했습니다. 그래서 한번 시도해 보겠습니다.

+3

4 & 1/2 일? 나는 감동을 받을지 두려워 할지를 모른다. (어쨌든 +1) –

+0

사실, 특정 고객을위한 현장 프레젠테이션을 위해 우리는 일상적으로 3.5 일로 줄였습니다 .--) 생각해 보면, 우리가 다루지 않은 한 비트가 있음을 알았습니다 - 가변 매크로를 사용하여 printf()와 같은 함수. –

+3

그것이 작동하는 법을 배우고 그것의 작동 방식을 아는 것은 제 생각에는 완전히 다른 두 가지입니다. 일주일 만에 언어를 배울 수 있지만 (4.5 일이라는 것은 정말 빠릅니다) 언어를 아는 데 수년이 걸릴 것입니다. –

12

이탈리아의 학습이 단테의 신곡을 이해하기에 충분한 지 묻는 것과 같은 좋은 단계입니다. 상위 레벨 프로그램에는 존재하지 않는 OS와 하위 레벨 프로그래밍에는 많은 차이점이 있습니다. C는 하루가 끝날 때 단지 언어 일뿐입니다.

저는 C 언어를 확실히 배우지만 컴파일러 작성, 기본 OS 개념 등과 같은 책에 대해 공부할 때 사용합니다. 이것이 바로 저수준의 개념을 배우는 곳입니다.

1

언어에 관계없이 프로그래밍을 배우기 만하면됩니다. 각 패러다임 중 적어도 하나를 배우십시오. C는 좋은 출발점입니다. BTW

... Stack Overflow

3

첫번째로, 당신이 뭔가를 모른다면 당신은 부끄러워해서는 안됩니다. 게다가, 스택 오버플로를 이해하는 것은 그리 어렵지 않습니다 (그 대답은 이름 그 자체입니다).

저는 이론적으로 무언가를 배우는 데 항상 끔찍한 시간을 보냅니다. 내가 손을 더럽힐 수 없다면, 나는 개념을 완전히 이해하지 못한다. 바로 C가 매우 편리합니다. Os 내부에 대해서는 & 스택 오버 플로우를 읽을 수 있지만 C로만 작동하는 모습을 볼 수 있습니다.

C는 배우기가 쉬운 언어이지만 (모든 특이성이있는) 매우 힘든 언어입니다. 따라서, (특히 고급 개념을 마스터하고 싶다면) 약간의 노력이 필요하지만 그만한 가치가있는 것을 경험하십시오.

+0

훌륭한 답변을 보내 주셔서 감사합니다. 나는 물건을 배우는 것에 관해서 당신과 정확히 같습니다. 나는 완전히 이해하기 위해서 그것을해야만합니다. 나는 확실히 C를 배울 것입니다. –

+0

행운을 빕니다. 포스터를 올려 놓은 Joel 기사에 대한 링크는 반드시 읽어야합니다. Joel이 말한 것은 정확히 Java와 C++에 대해 오랫동안 느낀 것입니다. 많은 재미를 배우십시오. –

2

심각한 프로그래머가되고 싶다면 분명히해야합니다.

이드는 어셈블러를 살펴볼 것을 제안합니다. 당신은 실제 프로그램을 코딩 할 필요가 없지만 어셈블러에서 컨트롤 구조와 함수가 어떻게 보이는지를 아는 것이 중요하다고 생각합니다. 이것은 실제로 일어나는 일에 대한 더 나은 이해를 제공하며, 고급 언어의 내용이 비싸다는 느낌을 더 잘 갖습니다.

하지만 C (어셈블러 매크로와 같은 것)가 첫 번째 단계 여야합니다. 가능한 한 많은 인덱스 오류 (배열 요소를 액세스하지 않고 액세스) 및 메모리 누수 (사용 후 메모리를 할당하지 않고 할당 유지)를 시도하십시오. 너무 빨리 코드를 찾을 수 없도록 코드를 복잡하게 유지하십시오. ;) Youll는 더 높은 언어를 더 좋아합니다.

그리고 : 어쩌면

http://www.state-machine.com/devzone/cplus_3.0_manual.pdf

+0

심각한 프로그래머. 나는 C#으로 프로그램하고 자신을 매우 진지한 프로그래머라고 생각하지만 C를 모른다. – Colin

+0

감사합니다. 큰 충고! 이제 나는 C를 배우기 시작했다. –

+0

콜린, 그건 분명히 약간의 범주에 불과했다. 이드는 오히려 다음과 같이 말합니다. C를 알고 있으면 좋은 프로그래머가되기 쉽습니다. OOP가 C로 "다시 구현"(쉬운 방법)하여 어떻게 작동하는지 알면 더 쉽게 이해하고 사용할 수 있습니다. – Dill

2

: 내가 OOP를 이해하는 측면에서 매우 유익한 발견 한 것은 객체 지향 일반 C에서 이것은 C의 지식을 요구하는 코딩했다. 지금부터는 C를 거의 독점적으로 쓰고 있습니다. 왜냐하면 저는 밑에서부터 일하고 있기 때문입니다. 나는 대학에 가기 전에 죽일 시간이 많아서 시작하기 전에 소프트웨어 아키텍처에 능숙 할 수도 있습니다. 그것은 (어떤 경우에는) 더 높은 수준의 개념을 배우기 쉽고, 문제 해결 능력을 향상시킵니다. 내가 더 젊었을 때 나는 PHP와 VB6를 배웠습니다. 내가 C와 어셈블리로 이동했을 때, "문자열"이 단일 값이 아니라 단일 값의 배열이라는 것을 파악하는 가장 어려운 일은 - 그리고 나는 하나를 다른 것과 비교할 수 없었습니다. 각 문자 배열을 횡단하여 차이점을 찾아야했습니다. 그런 작은 것들이 나를 다시 생각하게하고 컴퓨터가 실제로 어떻게 작동하는지 다시 배웠습니다. 내 말은, 내가 문자열에 관한 것을 발견하기 전에, 나는 프로세서 레지스터가 전혀 쓸모 없다고 생각했다. (32 비트로 유용한 것을 어떻게 넣을 수 있을까?).

즉, 나는 결코 당신이 그것을 사용하지 않을 것이라는 사실에도 불구하고 저레벨 프로그래밍을 배우는 잠재적 이점에 대해서 놀림을 피할 수 있습니다. 그러나 나에게있어, 내가 어떤 이유를 생각해 내는지에 상관없이, 그것은 대부분 일반적인 관심사를위한 것이다. 나는 C가 재미 있다고 생각합니다. 그리고 그걸로 더 많이 성취할수록 내 기술에 대해 더 잘 느낍니다. 스택 오버 플로우, 계산 수학, 낮은 수준의 메모리 관리 (잘못된 포인터 또는 널 포인터, 힙 손상 및 조각화 등)와 같은 것을 학습하는 데 많은 관심을 가지지 않는다면 은 정말입니다. 하지만 너는 그럴지도 모른다.

아키텍처에 대해 배우려면 C를 배우십시오. 실제적으로 내용이 인 경우이 작동 할 수도 있습니다. 필자는 종종 어셈블리 코드를 컴파일하여 컴퓨터가 실제로 수행 할 작업을 실제로 처리하는 방법을 확인합니다. 각 작업에 대해 수행 된 각 개별 단계를 확인합니다. 사실, 그게 내가 char *a = "a string"char a[] = "a string"의 차이점을 알아내는 방법입니다. 그러나 당신에게 가장 유익한 것은 통증이없는 더 높은 수준의 언어가 실제로 얼마나 고통 스러운지를 깨닫는 것입니다 : P.

레코드의 경우 각 프로세스에 호출 스택이 제공됩니다. 미리 결정된 크기의 메모리 블록입니다. 주로 로컬 변수에 사용됩니다. 지역 변수를 만들 때마다 스택의 내용이 스택의 끝에 추가되고 함수가 반환되면 (그리고 변수가 범위를 벗어나면) 해당 데이터가 다시 제거됩니다. 스택 오버플로는 스택 끝에 너무 많은 내용이 추가되고 미리 할당 된 메모리 공간을 오버런 할 때 발생합니다. 이것은 대개 HUGE 객체를 스택에 넣거나 너무 많은 재귀 (자신을 호출하는 함수)의 결과입니다. 또한 함수 호출에서 함수 호출이 너무 복잡해 졌는지 추측합니다.이 호출은 기본적으로 재귀 호출과 동일합니다 (이 경우).

0

대답은 간단합니다. 그렇습니다.

개발자가 중요 시점과 같이 유용해야하는 언어가 있습니다. 나는 C, Java, PHP가 그러한 언어에 속한다라고 말할 것이다. 지금 당장은 교육용으로 자바 스크립트에 대한 책을 읽고 있습니다. 물론 내 사이트에서는 전혀 사용하지 않고 아마도 사용하지 않을 것입니다.

당신이 그것을 원한다면, 그것을 위해 가십시오!

1

또한 컴파일러 구성을 살펴 봐야합니다. 그것은 어떤 언어 나 프로그래밍 패러다임과도 독립적으로 두뇌 속의 "메커니즘"에 대해 많은 통찰력을 줄 것입니다.

0

내가 보는 방식은 "내가 결코 사용하지 않을 언어를 배워야 하는가?"입니다. 여기에 주어진 많은 대답과 같은 대답은 "예"입니다.

프로그래밍 기술을 크게 향상시키고 다른 언어로 코드 작성을 시도 할 때까지 결코 이해할 수없는 방식으로 이점을 얻을 수 있으며 더 빠르게 생각할뿐만 아니라 더 간단하고 깨끗하고 우수한 코드를 작성할 수 있습니다.

알고있는 세 가지 언어는 모두 스크립트 언어이며 변수 및 메모리 할당에는 그다지 도움이되지 않습니다. C는 당신을 이미 다른 세계로 인도하고 이미 알고있는 프로그래밍 방식에 접근합니다.

체크 this 링크.

P. 스택 오버플로를 더 잘 이해하려면 조나단 (Jonathan)의 대답을 확인하고 사이트 상단에있는 sackoverflow.com의 이미지를 참조하십시오.

+0

대단하군요. 그럴 가치가 없다고 말하는 답을 얻을 까봐 두려웠습니다. 지금까지 저는 C를 배우기 시작했습니다. 답을 고맙습니다. –

0

이것은 여러 해답이며 많은 부분이이 주제에 쏟아져 나왔습니다. 대답은 '예'입니다.

  • 일상적으로 사용하지 않더라도 컴퓨터가 제대로 작동하는지에 대한 낮은 수준의 지식은 항상 도움이됩니다.

  • 당신은 생각보다 더 자주 지식을 사용합니다 (경우에 따라 C 자체).

  • 언어로 직접 프로그래밍하지 않아도 전체적으로 더 나은 프로그래머가되도록 많은 경험이 있습니다. C가 하나의 예입니다. 다른 예로는 함수 프로그래밍, Lisp, 어셈블리 언어 및 파서 작성법을들 수 있습니다.

C도 매우 간단하므로 일반적으로 만들어진 것보다 배우기가 쉽습니다. K & R의 C 책은 이유가있어 압축 적입니다. Python, Lua 또는 Tcl과 같은 많은 언어가 C로 작성된 모듈을 포함하고 있습니다. 이것은 종종 시스템을 개발하는 좋은 방법입니다.

따라서이 토론은 항상 해결되는 것처럼 보입니다. 예. C를 배우십시오. 많은 혜택을 볼 수 있습니다.

1

개발자가 임베디드 임에도 불구하고 C는 제 빵과 버터 언어이지만 제게는 로스트 비프와 로스트 비프와 맛있는 육즙을 맛볼 수 있습니다. 오늘 나가기 시작했다면 내가 마스터 할 수있는 두 가지 언어가 있습니다. C와 C# 그리고 어쩌면 C++의 무언가를 던져 버릴지도 모릅니다. 관리되지 않는 네이티브 응용 프로그램의 경우 C#이 스스로 대처하지 못할 것입니다.

요즘에는 어셈블러를 사용하지 않아도됩니다. C 컴파일러와 칩 디자인은 너무 얽혀있어 C 컴파일러가 생성하는 것보다 더 효율적인 어셈블러를 작성할 수는 없습니다. 또한 기본 시스템에 대한 모든 지식을 C를 사용하여 얻을 수 있습니다.

이제 로맨틱 한 사운드가 들립니다. 다시 문구 보자. C에서 가치있는 것을 작성하려면 기본 시스템을 이해해야합니다.즉, "Hello World"를 출력하는 것보다 원격으로 더 유용한 것을 얻으려면 문서를 작성하는 사람들이 말하는 내용을 이해할 수 있기 때문에 많은 읽기, 많은 오해 및 재독리를 할 것입니다 그러나 문서를 읽는 챕스는 그렇지 않다면 읽지 않을 것입니다.

C 구문은 매우 쉽고 프로그램 작성은 매우 쉽습니다. 프로그램과 기본 OS 및 하드웨어 간의 상호 작용이 어려워지는 곳입니다. C에서 무료로 제공되는 것은 없지만 예! 그것은 아름다운 언어입니다.

어떤 언어 학습에 대한 조언은 다음과 같습니다.해야 할 일을 찾아 배우고 자하는 언어를 사용해야합니다.

+0

컴파일러를 작성하는 경우에는 어셈블러에 대해 신경 쓸 필요가 있습니다. :) –

0

다른 사람들도 지적했듯이 새로운 것을 배우는 것은 언제나 가치가 있습니다.

그러나 지난 몇 년 동안 C를 배운 사람으로 말하면, 귀하의 질문에 대한 대답은 학습을위한 실질적인 응용이 있다면 달려 있다고 생각합니다.

내 경우; 나는 서버 프로그램, 임베디드 프로그래밍 및 기본적으로 어디서나 가능한 한 많이 제어하려는 C를 즐긴다. (어셈블리에서 더 이상 광기를 잃지 않고).

내 제안은 C로 발전하는 것이 의미가있는 관심있는 미니 프로젝트를 찾은 것입니다.

1

나는 당신이 (단지) 학습 C, 당신은 K & R2를 읽고해야보다는, C.

음을 배워야한다고 생각합니다. 여기

는 K & R2가에 대해 가르침의 세탁 목록입니다 :
  • 정렬
  • 이진 검색 나무
  • 해시 테이블
  • 메모리 할당 알고리즘

    • C
    • 폰 -Neumann 플랫 메모리 시스템 아키텍처
    • 시스템 프로그래밍 (wc입니다 --- 또는 --- 놀라 울 정도로 복잡 할 수있다)
    • 커널와 인터페이스

    당신이 진정 C "를 얻을"때, 당신은 또한 베어 메탈에 쉽게 액세스 할 수 있습니다; 기계 고유의 호출 스택을 얻는 것이 훨씬 쉬워집니다. 함수 포인터, if-then-else 블록, "goto"및 "return"사이의 유사성을 확인하면 버퍼 오버 플로우 악용이 어떻게 작동하는지 이해하는 것이 훨씬 쉬워집니다.

    학습 C는 좋은 것입니다. 프로그램이 작동하는 방법에 대한 모든 것을 자동으로 가르치기 때문에가 아니라, 그 지식으로 끌리는 것이기 때문에.

  • +0

    여기에 K & R Second Edition이 있으며 바이너리 검색 트리 나 해시 테이블 등을 가르쳐주지 않습니다. – toto

    +0

    6.5 절. "자체 참조 구조"에서는 이진 트리에 대해 설명합니다. 6.6 절. "테이블 조회"에서는 해시 테이블에 대해 설명합니다. 철저히 생각하지 않아도됩니다. 이것은 알고리즘과 데이터 구조가 아닌 C에 관한 책입니다. 그러나 열렬하고 세심한 학생은 나무와 해시 테이블을 똑같이 배울 수 있습니다. –

    0

    예를 들어 나는 스택 오버플로 [... is ...]가 무엇인지, 왜 발생하는지 알지 못합니다.

    한 함수가 다른 함수를 호출 할 때마다 컴퓨터는 호출자의 실행 위치를 기억해야합니다.이 정보는 스택에 저장됩니다. 함수를 호출하면 "완료되면 $ return"이라는 새 레코드가 반환되는 반면 함수에서 반환하면 반환 주소가 튀어 나와 거기로 돌아갑니다 (또는 함수 호출 후 다음으로 이동합니다). 그것은 방금 돌아왔다).

    일반적으로 (OS 또는 언어 런타임에 의해 결정됨)이 스택에는 제한된 공간 만 있습니다. 그 공간을 다 써 버리는 것을 스택 오버 플로우라고합니다.

    (일부 파이썬에서 던진로) 나는 또한 액션 스크립트 3 개발자입니다 또한 http://en.wikipedia.org/wiki/Stack_overflow

    0

    참조하십시오. C 학습은 현재의 프로젝트입니다. Objective-C로 비둘기를 가지고 AppStore에 첫 번째 앱을 제출했지만, 내가하고있는 일에 대해 더 낮은 수준의 이해를 원합니다. 필자는 리눅스 커널에서 컴파일러를 작성하거나 해킹하는 것에별로 관심이 없지만 필자가 만지는 모든 것은 코어에서 C/C++입니다. 그래서 적어도 언어에 대한 이해를 위해서는 시간이 필요합니다.

    기존 경험에서 얻은 이점과 비교하면 the Alchemy project은 꽤 멋지 며 AS3에서 C/C++ 라이브러리를 활용할 수 있습니다. 이것에 대한 몇 가지 흥미로운 결과가 있습니다.

    개인적으로 나는 매년 언어를 배우는 느슨한 목표를 가지고 있습니다. 올해는 Objective-C입니다.하지만 그걸로 들어가면 저는 한발 뒤로 물러나서 C를 배워야합니다. 확실히 상처를 입힐 수는 없으며, 장기적으로 더 나은 프로그래머가 될 것입니다.

    0

    내 대답은 다음과 같습니다.

    1. 당신이 수치 방법 (미적분, 선형 대수, DIFF-EQ, 유한 요소 분석 등)을 포함 수학 문제 힘든 해결해야합니까 :이 질문은 당신이 결정하는 데 도움이 될까요? 최고의 라이브러리 중 많은 수가 C로 작성되었으며 알고리즘을 다른 언어로 구현하는 방법을 이해하면 은 을 번역 할 수 있으므로 C를 이해해야합니다.
    2. 컴팩트 데이터를 고안해야합니까? 메모리를 낭비하지 않는 구조입니까? 내 C에서의 경험으로 컬렉션 및 문자열 클래스를 Java로 만들었습니다. J2SE 라이브러리에 제공된 표준 클래스보다 훨씬 적은 메모리를 사용했습니다.
    3. 기존 응용 프로그램과 인터페이스해야합니까? 많은 것은 C 또는 C++로 작성됩니다.

    C를 배우기위한 다른 많은 좋은 이유가 있지만, 어떤 프로그래밍을 할 것인지, 그리고 C가 제공하는 기술과 필요한 기술 사이에 교차가 있는지 여부에 달려 있습니다.

    0

    대부분의 경우 사용자는 뭔가를하는 방법을 아는 것에 만족합니다. 그러나 당신은 궁극적으로 어떻게 그 이유를 알게 될 것입니다. 왜 당신이 무언가를하고 있는지 묻는다면, C는 저급 성질 때문에 종종 대답을 줄 수 있습니다. 물론, 다른 '원시'언어도 동일한 대답을 줄 것입니다. 원시 (raw) 란 API 레이어와 클래스가 많이 숨겨져있는 대신 컴퓨터에 직접 액세스 할 수있는 언어를 의미합니다.

    물론 어떤 사람들은 왜 그런지 묻지 않습니다. 그들은 C를 배우기를 원치 않는 사람들입니다.

    관련 문제