SICP를 읽고 체계와 추상 데이터 유형에 대한 실용적인 아이디어를 배우 십시오 . 그런 다음 C로 코딩하는 것이 쉽습니다 (SICP, 약간의 C 및 약간의 PHP, Ruby 등으로 인해 생각이 충분히 넓어지고 객체 지향 프로그래밍이 최상의 스타일이 아닐 수도 있음을 이해할 것입니다 모든 경우에 해당하지만 특정 종류의 프로그램에만 해당). 가장 어려운 부분 인 C 동적 메모리 할당에 주의하십시오 . C99 이나 C11 프로그래밍 언어 표준의 C 표준 라이브러리 (이! TCP 또는 디렉토리에 대해 알고하지 않습니다), 실제로 아주 가난한 자주 일부 외부 라이브러리가 필요합니다 또는 인터페이스 (예 :POSIX , libcurl에서 HTTP 클라이언트 라이브러리, libonion HTTP 서버 라이브러리, GMPlib bignums를 들어, 같은 몇 가지 라이브러리 libunistring ) ... 등, UTF-8.
당신의 "객체들"은 종종 C와 관련이 struct
있으며, 당신은 그들에 작용하는 함수 세트를 정의합니다. 짧거나 매우 간단한 함수의 경우 일부 헤더 파일 에서와 같이 -d struct
로 관련되는 관련을 사용하여 함수를 정의하는 것이 좋습니다.static inline
foo.h
#include
객체 지향 프로그래밍 만이 프로그래밍 패러다임 이 아님에 주목하십시오 . 어떤 경우에는 다른 패러다임이 가치가 있습니다 ( 기능 프로그래밍 -La Ocaml 또는 Haskell 또는 Scheme 또는 Commmon Lisp, 논리 프로그래밍 -La Prolog 등 ... 선언적 인공 지능에 대한 J.Pitrat의 블로그 도 읽어보십시오 ). Scott의 책 : Programming Language Pragmatics 참조
실제로 C 또는 Ocaml의 프로그래머는 일반적으로 객체 지향 프로그래밍 스타일로 코딩하기를 원하지 않습니다. 유용하지 않을 때 객체를 생각하도록 강요 할 이유가 없습니다.
struct
포인터와 그 위에서 작동하는 함수 및 함수를 정의 합니다. 당신은 몇 가지 필요한 수 태그 노조 (종종 struct
태그 멤버, 종종 일부와 enum
, 일부 union
내부), 당신은이 유용 찾을 수있는 유연한 배열 구성원 여러분 중 일부의 끝에 struct
-s를.
일부 기존의 소스 코드 내부를 살펴 무료 소프트웨어 에서 C (참조 GitHub의 및 소스 포지
일부를 찾을 수 있습니다). 아마도 Linux 배포판을 설치하고 사용하는 것이 유용 할 것입니다. 거의 무료 소프트웨어로 만들어졌으며 훌륭한 무료 소프트웨어 C 컴파일러 ( GCC , Clang / LLVM ) 및 개발 도구가 있습니다. Linux 용 으로 개발하려면 고급 Linux 프로그래밍을 참조하십시오 .
예를 들어 모든 경고와 디버그 정보로 컴파일하는 것을 잊지 마세요 gcc -Wall -Wextra -g
-notably 개발 및 디버깅 phases- 동안과 몇 가지 도구, 예를 들어, 사용하는 방법을 배우게 Valgrind의를 사냥에 메모리 누수 는 gdb
주의하십시오 등 디버거 되어 잘 이해 정의되지 않은 행동 과 강하게을 피하기는 (프로그램이 일부 UB가 때로는 "작업"으로 보일 수 있다는 것을 기억).
객체 지향 구조 (특히 상속 ) 가 진정 필요할 때 관련 구조 및 함수에 대한 포인터를 사용할 수 있습니다. 당신은 자신의 vtable 기계를 가질 수 있고, 각각의 "객체"를 struct
포함하는 함수 포인터에 대한 포인터로 시작할 수 있습니다. 포인터 유형을 다른 포인터 유형으로 캐스트하는 기능 (및 상속을 에뮬레이트하기 위해 struct super_st
시작하는 필드 유형과 동일한 필드 유형을 포함하여 캐스트 할 수 있는 기능 struct sub_st
)을 이용하십시오. 공지 사항 C는 몇 가지에 따라 특정 -in 매우 복잡한 객체 시스템을 구현하기에 충분한 것으로 규칙을 - 같은 G 객체 (GTK / 그놈에서) 보여줍니다.
당신이 진정으로 필요로 할 때 클로저를 , 당신은거야 종종 그들을 모방 콜백 과, 컨벤션 (이것은 그 호출 함수 포인터에 의해 소비) 콜백을 사용하는 모든 함수는 함수 포인터와 일부 클라이언트 데이터를 모두 통과된다. 또한 (종래에) 자신의 클로저와 같은 struct
-s (일부 함수 포인터와 닫힌 값 포함 )를 가질 수 있습니다 .
C는 매우 낮은 수준의 언어이므로 특히 메모리 관리 및 일부 명명 규칙 과 관련하여 고유 한 규칙 (다른 C 프로그램의 실습에서 영감을 받음) 을 정의하고 문서화하는 것이 중요합니다 . 명령어 세트 아키텍처 에 대한 아이디어를 갖는 것이 유용합니다 . 잊지 마세요 C의 컴파일러를 많이 할 수 최적화를 코드에 (당신에게 그것을 요구하는 경우), 그래서 (당신의 컴파일러, 손으로 휴가를 마이크로 최적화하는 것에 대해 너무 많이 걱정하지 않는다 발표의 최적화 된 컴파일 소프트웨어). 벤치마킹 및 원시 성능에 관심이있는 경우 프로그램을 디버깅 한 후에 최적화를 활성화해야합니다.gcc -Wall -O2
때때로 메타 프로그래밍 이 유용하다는 것을 잊지 마십시오 . 종종 C로 작성된 대형 소프트웨어에는 다른 곳에서 사용되는 일부 C 코드를 생성하는 스크립트 또는 임시 프로그램이 포함되어 있습니다 (그리고 X-macros 와 같은 더러운 C 전 처리기 트릭을 재생할 수도 있습니다 ). 유용한 C 프로그램 생성기 (예 : 파서를 생성하는 yacc 또는 gnu bison , 완벽한 해시 함수를 생성하는 gperf 등)가 있습니다. 일부 시스템 (특히 Linux 및 POSIX)에서는 파일 에서 런타임에 일부 C 코드를 생성하고 런타임에 일부 명령 (예 :) 을 실행하여 공유 객체로 컴파일하고 dlopen을 사용하여 공유 객체를 동적으로로드 할 수 있습니다generated-001.c
gcc -O -Wall -shared -fPIC generated-001.c -o generated-001.so
& dlsym을 사용하여 이름에서 함수 포인터를 얻습니다 . 나는 이러한 트릭하고 있어요 MELT (그것은 사용자 정의 할 수 있기 때문에, 당신에게 도움이 될 수있는 도메인 리스프와 같은 특정 언어 의 GCC 컴파일러).
알고 있어야 가비지 컬렉션 (개념과 기술 참조 횟수가 종종 C에서 메모리를 관리 할 수있는 기술이며, 그것을 잘 처리하지 않는 쓰레기 수집의 가난한 형태 이럴입니다 순환 참조 , 당신은 할 수 약한 포인터를 그것에 대해 도움말을, 그러나 까다로울 수 있습니다). 경우에 따라 Boehm의 보수 가비지 수집기 사용을 고려할 수도 있습니다 .
qux = foo.bar(baz)
이됩니다qux = Foo_bar(foo, baz)
.