programing

C에는 기능 프로그래밍을 위한 툴이 어떤 것이 있습니까?

goodsources 2022. 7. 16. 14:04
반응형

C에는 기능 프로그래밍을 위한 툴이 어떤 것이 있습니까?

C++가 아닌 C에서 기능 프로그래밍을 어떻게 해야 할지 요즘 많이 고민하고 있습니다.분명히 C는 절차 언어이며 기능 프로그래밍을 네이티브하게 지원하지 않습니다.

언어에 기능적인 프로그래밍 구조를 추가하는 컴파일러/언어 확장 기능이 있습니까?GCC는 언어 확장자로서 중첩된 함수를 제공합니다.네스트된 함수는 부모 스택프레임에서 변수에 액세스할 수 있지만 성숙한 폐쇄에는 아직 멀었습니다.

예를 들어, C에서 매우 유용할 것으로 생각되는 것은 함수 포인터가 예상되는 곳이라면 어디든 람다 식을 통과시켜 함수 포인터로 붕괴되는 폐쇄를 만들 수 있다는 것입니다.C++0x 에는 람다 표현(멋있다고 생각합니다)이 포함되어 있습니다만, 스트레이트 C에 적용할 수 있는 툴을 찾고 있습니다.

[편집] 명확하게 하자면, 기능 프로그래밍에 적합한 C의 문제를 해결하려는 것이 아니라, 어떤 툴이 있는지 궁금할 뿐입니다.

함수 프로그래밍은 람다에 관한 것이 아니라 순수한 함수에 관한 것입니다.따라서 다음과 같은 기능적 스타일을 폭넓게 홍보합니다.

  1. 함수 인수만 사용하고 전역 상태는 사용하지 마십시오.

  2. printf 또는 IO와 같은 부작용을 최소화합니다.모든 기능에서 직접 부작용을 일으키지 않고 실행할 수 있는 IO를 기술한 데이터를 반환합니다.

이것은 마법이 필요 없는 플레인 c에서 달성할 수 있습니다.

GCC의 중첩 함수를 사용하여 람다 식을 시뮬레이션할 수 있습니다. 실제로 이 작업을 수행할 매크로가 있습니다.

#define lambda(return_type, function_body) \
  ({ \
    return_type anon_func_name_ function_body \
    anon_func_name_; \
  })

다음과 같이 사용:

int (*max)(int, int) = lambda (int, (int x, int y) { return x > y ? x : y; });

기능 프로그래밍 스타일의 전제 조건은 1등급 기능입니다.다음에 허용할 경우 휴대용 C에서 시뮬레이트할 수 있습니다.

  • 어휘 범위 바인딩, 즉 폐쇄의 수동 관리.
  • 기능 변수 수명에 대한 수동 관리.
  • 함수 어플리케이션/콜의 대체 구문.
/* 
 * with constraints desribed above we could have
 * good approximation of FP style in plain C
 */

int increment_int(int x) {
  return x + 1;
}

WRAP_PLAIN_FUNCTION_TO_FIRST_CLASS(increment, increment_int);

map(increment, list(number(0), number(1)); // --> list(1, 2)


/* composition of first class function is also possible */

function_t* computation = compose(
  increment,
  increment,
  increment
);

*(int*) call(computation, number(1)) == 4;

이러한 코드의 런타임은 다음과 같이 작을 수 있습니다.

struct list_t {
  void* head;
  struct list_t* tail;
};

struct function_t {
   void* (*thunk)(list_t*);
   struct list_t* arguments;
}

void* apply(struct function_t* fn, struct list_t* arguments) {
  return fn->thunk(concat(fn->arguments, arguments));
}

/* expansion of WRAP_PLAIN_FUNCTION_TO_FIRST_CLASS */
void* increment_thunk(struct list_t* arguments) {
  int x_arg = *(int*) arguments->head;
  int value = increment_int(x_arg);
  int* number = malloc(sizeof *number);

  return number ? (*number = value, number) : NULL;
}

struct function_t* increment = &(struct function_t) {
  increment_thunk,
  NULL
};

/* call(increment, number(1)) expands to */
apply(increment, &(struct list_t) { number(1), NULL });

본질적으로 우리는 기능/인수 쌍과 매크로 묶음으로 표현되는 닫힘과 함께 일급 함수를 모방한다.여기서 완전한 코드를 찾을 수 있습니다.

제가 C에서 기능 프로그래밍을 하는 방법은 C에서 기능 언어 통역사를 쓰는 것이었습니다.Fexl이라고 이름 붙였어요. Fexl은 Function EXpression Language의 줄임말이죠.

인터프리터는 매우 작아서 -O3를 유효하게 하면 68K로 컴파일 됩니다.장난감도 아닙니다.비즈니스용으로 작성한 모든 새로운 생산 코드(투자 파트너십을 위한 웹 기반 회계)에 사용하고 있습니다.

C 코드는 (1) 시스템 루틴(fork, exec, setrlimit 등)을 호출하는 빌트인 함수를 추가하거나 (2) Fexl로 쓸 수 있는 함수를 최적화합니다(서브스트링 검색).

모듈 메커니즘은 "콘텍스트"의 개념을 기반으로 합니다.컨텍스트는 기호를 정의에 매핑하는 함수(Fexl로 작성)입니다.Fexl 파일을 읽을 때 원하는 컨텍스트로 해결할 수 있습니다.이를 통해 사용자 지정 환경을 만들거나 제한된 "샌드박스"에서 코드를 실행할 수 있습니다.

http://fexl.com

C의 어떤 점을 기능시키고 싶은가, 구문인가, 의미론인가.함수 프로그래밍의 의미론들은 확실히 C 컴파일러에 추가될 수 있지만, 당신이 끝날 때쯤이면 당신은 기본적으로 Scheme, Haskell 등과 같은 기존의 함수 언어 중 하나에 해당하는 것을 갖게 될 것이다.

이러한 의미론을 직접 지원하는 언어의 구문만 배우는 것이 시간을 더 잘 사용할 수 있습니다.

FFCALL을 사용하면 C에 폐쇄를 만들 수 있습니다.callback = alloc_callback(&function, data)를 반환하며, 이 경우 함수 포인터는 반환됩니다.callback(arg1, ...)라고 하는 것은, 「부르다」라고 하는 것과 .function(data, arg1, ...)그러나 가비지 수집은 수동으로 처리해야 합니다.

이와 관련, Apple의 GCC 포크에는 블록이 추가되어 있습니다.이 블록은 함수 포인터는 아니지만 람다를 전달하면서 캡처된 변수를 위해 직접 만들고 저장 공간을 확보할 필요가 없습니다(실제로 일부 복사 및 참조 카운트는 구문 설탕 및 런타임 라이브러리 뒤에 숨겨져 있습니다).

Hartel & Muller의 책 Functional C(2012-01-02)는 현재 http://eprints.eemcs.utwente.nl/1077/에서 찾을 수 있습니다(PDF 버전에 대한 링크가 있습니다).

C에 대해 모르다.Objective-C에는 몇 가지 기능이 있지만, OSX의 GCC도 몇 가지 기능을 지원하지만, 기능 언어를 사용하는 것을 다시 한 번 권장합니다.상기에는 많은 기능이 있습니다.저는 개인적으로 계획을 가지고 시작했는데, 리틀 셰머와 같은 훌륭한 책들이 있습니다.

펠릭스 언어는 C++로 컴파일됩니다.C++가 괜찮으시다면 스텝스톤이 될 수도 있어요

가장 먼저 떠오르는 것은 코드 생성기 사용입니다.기능적 프로그래밍을 제공하는 다른 언어로 프로그래밍한 후 C 코드를 생성하시겠습니까?

그것이 매력적인 옵션이 아니라면 CPP를 악용하여 그 중 일부를 얻을 수 있습니다.매크로 시스템은 몇 가지 기능적 프로그래밍 아이디어를 에뮬레이트할 수 있도록 합니다.gcc가 이렇게 구현된다는 이야기는 들었지만 확인해 본 적은 없습니다.

물론 C는 함수 포인터를 사용하여 함수를 전달할 수 있지만, 주요 문제는 폐쇄가 부족하고 유형 시스템이 방해가 되는 경향이 있습니다.M4와 같은 CPP보다 더 강력한 매크로 시스템을 탐색할 수 있습니다.결국 제가 제안하는 것은 진정한 C는 큰 노력 없이 작업을 수행할 수 없다는 것입니다. 하지만 C를 확장하여 작업을 수행할 수 있다는 것입니다.이 확장자는 CPP를 사용하거나 스펙트럼의 반대편으로 이동하여 다른 언어에서 C 코드를 생성할 경우 C와 가장 비슷합니다.

Hartel & Muller의 책 Functional C를 보세요.

http://www.ub.utwente.nl/webdocs/ctit/1/00000084.pdf
http://www.cs.bris.ac.uk/~henkm/f2c/index.http://http://www.cs.bris.ac.uk/

폐쇄를 구현하려면 어셈블리 언어에 익숙해져 스택 스왑/관리를 해야 합니다.반대하지 말고, 그냥 그렇게 해야 할 거라고 말하는 거야.

C에서 익명 함수를 어떻게 처리할지 확실하지 않습니다.폰 노이만 기계에서는 익명 기능을 asm으로 실행할 수 있습니다.

꽤 많은 프로그래밍 언어가 C로 작성되어 있습니다.그리고 그들 중 일부는 퍼스트 클래스 시민으로서의 기능을 지원하며, 그 영역의 언어는 ecl(embable common lisp IIRC), Gnu Smalltalk(gst)(Smalltalk에는 블록이 있음), 그리고 glib2 http://library.gnome.org/devel/gobject/unstable/chapter-signal.html#closure에는 적어도 함수 프로그래밍에 근접한 라이브러리들이 있습니다.따라서 이러한 구현 중 일부를 기능 프로그래밍에 사용할 수도 있습니다.

아니면 Ocaml, Haskell, Mozart/Oz 등을 배우러 갈 수도 있습니다;-)

안부 전해요

언급URL : https://stackoverflow.com/questions/216037/what-tools-are-there-for-functional-programming-in-c

반응형