무언가를 생성 할 수 있다면 코드가 아닌 데이터입니다.
나중에 해당 코드가 데이터임을 규정하는 한, 제안은 "무엇이 생성 될 수 있으면 코드가 아닙니다"로 줄어 듭니다. 그렇다면 C 컴파일러에 의해 생성 된 어셈블리 코드가 코드가 아니라고 말할 수 있습니까? 직접 작성한 어셈블리 코드와 정확히 일치하면 어떻게됩니까? 당신이 원한다면 당신은 거기에 갈 수 있지만, 나는 당신과 함께 오지 않을 것입니다.
"code"의 정의로 시작해 봅시다. 너무 기술적이지 않은 한,이 논의의 목적을위한 아주 좋은 정의는 "계산을 수행하기위한 기계 작동 가능 명령"입니다.
그렇다면 소스 코드 생성에 대한이 전체 아이디어가 오해가 아닙니까?
글쎄, 당신의 시작 제안은 코드를 생성 할 수 없다는 것이지만, 나는 그 제안을 거부합니다. "code"에 대한 나의 정의를 받아들이면 일반적으로 코드 생성에 개념적 문제가 없어야합니다.
즉, 무언가를위한 코드 생성기가 있다면, 필요한 매개 변수를 수신하고 "생성 된"코드가 수행 한 올바른 조치를 수행 할 수있는 적절한 함수로 만들 수있는 이유는 무엇입니까?
글쎄요 , 그 특성보다는 코드 생성을 채택한 이유 에 대해서는 전혀 다른 질문 입니다. 코드 생성기를 쓰거나 사용하는 대신 결과를 직접 계산하는 함수를 작성하는 대안을 제안하고 있습니다. 그러나 어떤 언어로? 누구나 기계 코드로 직접 작성했던 시절은 지났고, 다른 언어로 코드를 작성하는 경우 실제로 실행되는 프로그램을 생성하기 위해 컴파일러 및 / 또는 어셈블러 형태의 코드 생성기에 의존합니다.
그렇다면 왜 Java, C 또는 Lisp 등으로 작성하는 것을 선호합니까? 심지어 어셈블러? 나는 언어가 데이터 및 연산에 대한 추상화를 제공하여 수행하려는 계산의 세부 사항을 더 쉽게 표현할 수 있기 때문에 적어도 부분적으로 있다고 주장합니다.
대부분의 상위 코드 생성기에서도 마찬가지입니다. 원형 적 사례는 다음과 같은 스캐너와 파서 생성기 아마 lex
와 yacc
. 그렇습니다. 스캐너 나 파서를 C로 직접 작성하거나 다른 프로그래밍 언어 (원시 기계 코드)로 직접 작성할 수도 있습니다. 그러나 lex 또는 yacc와 같은 고급 특수 언어를 사용하면 복잡한 문제가 발생할 경우 수작업으로 작성한 코드를보다 쉽게 작성, 읽기 및 유지 관리 할 수 있습니다. 일반적으로 훨씬 작습니다.
또한 "코드 생성기"의 의미가 무엇인지 고려해야합니다. 나는 C 전처리와 C ++ 템플릿의 인스턴스화가 코드 생성 연습이라고 생각합니다. 당신은 이것에 반대합니까? 그렇지 않다면, 당신은 그것들을 받아들이지 만 다른 종류의 코드 생성을 거부하는 것을 합리화하기 위해 정신 체조를 수행해야한다고 생각합니다.
성능상의 이유로 수행되면 컴파일러의 단점처럼 들립니다.
왜? 당신은 기본적으로 사용자가 데이터를 공급하는 보편적 인 프로그램을 가지고 있어야하고, 일부는 "명령"으로 분류되고, 다른 것은 "입력"으로 분류되고, 계산을 수행하고 우리가 "출력"이라고 부르는 더 많은 데이터를 방출해야한다고 포지셔닝하고 있습니다. (특정 관점에서, 그러한 범용 프로그램을 "운영 체제"라고 부를 수 있습니다.) 그러나 왜 컴파일러가보다 범용적인 프로그램을 최적화하는 것만 큼 범용 프로그램을 최적화하는 데 효과적이어야한다고 가정하십니까? 프로그램? 두 프로그램은 특성과 기능이 다릅니다.
두 언어를 연결하기 위해 인터페이스 라이브러리가 부족한 것 같습니다.
당신은 마치 보편적 인 정도의 인터페이스 라이브러리를 갖는 것이 반드시 좋은 것이라고 말한다. 아마도 그럴 수도 있지만, 대부분의 경우 그러한 라이브러리는 크고 유지 관리하기가 어렵고 심지어 느릴 수도 있습니다. 그리고 그러한 짐승이 실제로 특정 문제를 처리하기 위해 존재하지 않는다면 코드 생성 방식으로 문제를 훨씬 빠르고 쉽게 해결할 수있을 때 누가 그것을 주장해야합니까?
여기에 뭔가 빠졌습니까?
몇 가지 생각합니다.
코드도 데이터라는 것을 알고 있습니다. 내가 이해하지 못하는 것은 왜 소스 코드를 생성하는 것입니까? 파라미터를 받아 들여서 작동 할 수있는 함수로 만들어 보지 않겠습니까?
코드 생성기는 한 언어로 작성된 코드를 일반적으로 저급 언어의 다른 코드로 변환합니다. 그렇다면 사람들이 여러 언어를 사용하여 프로그램을 작성하려는 이유, 특히 주관적으로 다른 수준의 언어를 혼합하려는 이유를 묻습니다.
그러나 나는 이미 그것을 만졌다. 특정 작업에 대한 언어의 명확성과 표현력에 따라 언어를 선택합니다. 코드가 작을수록 평균적으로 버그가 적고 유지 관리가 쉬우므로 최소한 대규모 작업에는 고급 언어에 대한 편견도 있습니다. 그러나 복잡한 프로그램에는 많은 작업이 포함되며, 일부 언어는 한 언어로 더 효과적으로 처리 될 수있는 반면, 다른 언어는 다른 언어로 더 효과적으로 또는 더 간결하게 처리 될 수 있습니다. 작업에 적합한 도구를 사용한다는 것은 때때로 코드 생성을 의미합니다.