एक सी प्रोग्राम बनाएं जो जीसीसी में संकलित करने के लिए सबसे लंबी अवधि लेता है


27

एक छोटा सी प्रोग्राम बनाएं जो कि जीसीसी के साथ संकलन करने में एक बेतुका लंबा समय लेता है। संकलन का समय संकलन द्वारा दर्ज किया जाएगा, फिर संदर्भ कार्यक्रम के संकलन समय को घटाया जाएगा।

नियम

  • कोई सी भाषा सुविधा या जीसीसी एक्सटेंशन
  • जीसीसी 4.2.1

1
टैगिंग को बदल दिया गया है क्योंकि [कोड-गोल्फ] का स्पष्ट अर्थ है "शॉर्ट कोड द्वारा (कुंजी) स्ट्रोक काउंट"।
dmckee

6
वर्णों की संख्या से विभाजित करने का कोई मतलब नहीं है, क्योंकि इस चुनौती के लिए किसी भी उचित दृष्टिकोण का संकलन-समय-जटिलता बड़ा O ( n ) होगा, अर्थात किसी भी समाधान का स्कोर केवल इसे बनाकर तुच्छ रूप से बढ़ाया जा सकता है थोड़ा लंबा, जो संभवत: हमेशा स्पष्ट तरीके से संभव होगा।
को बंद कर दिया

जवाबों:


13
#define a "xxxxxxxxxxx"
#define b a a a a a a a
#define c b b b b b b b
#define d c c c c c c c
#define e d d d d d d d
#define f e e e e e e e
#define g f f f f f f f
#define h g g g g g g g
#define i h h h h h h h
#define j i i i i i i i
z=j;

मेरी मशीन पर संकलित नहीं करता है
22

19
कम से कम अंतिम पंक्ति को कुछ main(){char*z=j;}इस तरह बदलना होगा कि यह एक मान्य सी प्रोग्राम बना सके।
dmckee

2
मेरा VS2012 हीप स्पेस से बाहर हो जाता है। मुझे लगता है कि /Zmइसे ठीक करेंगे
संशोधित करें

13

दोनों चार्ली जवाब और मेरे पहले एक पूर्व प्रोसेसर लिखने एक दे के सिद्धांत पर काम बहुत कोड की, लेकिन वे ज्यादातर पूर्व प्रोसेसर ही है, lexer (अच्छा विचार के रूप में इस कदम को पारंपरिक रूप से धीमी गति से किया गया है) और पार्सर व्यायाम। मेरा भी अनुकूलन और कोड जनरेशन स्टेप्स को काम करने का प्रयास है, लेकिन यह स्पष्ट रूप से वहां बहुत कुछ हासिल नहीं कर रहा है।

यह सोचकर कि एक विशिष्ट सी कंपाइलर कैसे काम करता है, मुझे एहसास हुआ कि हम प्रतीक तालिका संबंधित कोड को कुछ भी करने के लिए नहीं दे रहे थे। यह प्रविष्टि उस उपाय का एक प्रयास है। इसे c कार्यान्वयन में मूल ऑब्जेक्ट-ओरिएंटेशन की याद दिलाने वाला माना जाता है, लेकिन यह कुछ भी दिलचस्प नहीं करता है: पूर्व-प्रोसेसर विस्तार तकनीक को घोषित करने और तुच्छ रूप से (और गलत तरीके से) वस्तुओं के एक समूह को शुरू करने से मना करता है। ऑब्जेक्ट जो जटिल प्रकारों का उपयोग करता है, कई स्तरों पर, विभिन्न हटाने पर एक-दूसरे को छायांकित करता है। यह प्रतीक तालिका को एक असली काम देने के लिए चाहिए।

#include <stdlib.h>
#include <stdarg.h>
#include <string.h>
// Exercise the symbol table mechanism of the compiler in an effort to
// take a unreasonable about of time compiling

#define PTR(T) T*
#define CONST(T) T const
#define FUNC(NAME,RTYPE,ARG) RTYPE NAME(ARG)
#define FPTR(NAME,RTYPE,ARG) FUNC((*NAME),RTYPE,ARG)

// Forward decalration of repeated OO method pointers
typedef void* (*cctor_ptr)(void*this, void*that, ...);
typedef void* (*dtor_ptr)(void*this);

// Assumes three var-args: sizeof(payload type), cctor, dtor
void* default_ctor(void*this, ...){
  // Pull in variadac bits
  va_list list;
  va_start(list,this);
  int size=va_arg(list,int);
  cctor_ptr cctor=va_arg(list,cctor_ptr);
  dtor_ptr dtor=va_arg(list,dtor_ptr);
  va_end(list);
  // process
  if (!this) this = malloc(size);
  if (this) {
    memset(this,size,0);
    /* various dodges to install the cctor and dtor in the write places */
  }
  return this;
}
// Copies the payload from that to this; 
void* default_cctor(void*restrict this, void* restrict that, ...){
  // Pull in variadac bits
  va_list list;
  va_start(list,that);
  int size=va_arg(list,int);
  cctor_ptr cctor=va_arg(list,cctor_ptr);
  dtor_ptr dtor=va_arg(list,dtor_ptr);
  va_end(list);
  // process
  if (!this) this = malloc(size);
  if (this) {
    memcpy(this,that,size);
    /* various dodges to install the cctor and dtor in the write places */
  }
  return this;
}
// Assumes that his was allocated with malloc, does not use varargs
void* default_dtor(void*this, ...){
  free(this); 
  return NULL;
};

#define DECLARE_STRUCT(N) struct S##N##_s
#define TYPEDEF_ACCESSOR(N,T) typedef FPTR(f##N##_ptr,CONST(PTR(T)),PTR(CONST(struct S##N##_s)))
#define TYPEDEF_STRUCT(N,T) typedef struct S##N##_s {PTR(T)p; cctor_ptr cctor; dtor_ptr dtor; f##N##_ptr f##N;} S##N
#define OO_STRUCT(N,T) DECLARE_STRUCT(N); TYPEDEF_ACCESSOR(N,T); TYPEDEF_STRUCT(N,T)

OO_STRUCT(1,char);
OO_STRUCT(2,int);
OO_STRUCT(3,double*);
OO_STRUCT(4,S3);
OO_STRUCT(5,S4);
OO_STRUCT(6,S5);
OO_STRUCT(7,S6);
OO_STRUCT(8,S7);

#define SUBSCOPE(A) { \
    S1*A##1=default_ctor(NULL,sizeof(char),default_cctor,default_dtor); \
    S2 A##2; default_ctor(&A##2,sizeof(int),default_cctor,default_dtor); \
    S2*A##3=default_ctor(NULL,sizeof(double*),default_cctor,default_dtor); \
    S8 A##5; default_ctor(&A##5,sizeof(S4),default_cctor,default_dtor); \
    S6 A##6; default_ctor(&A##6,sizeof(S5),default_cctor,default_dtor); \
    S8*A##8=default_ctor(NULL,sizeof(S7),default_cctor,default_dtor); \
  }
#define SUBSCOPE2(A,B)  { \
    S2*B##5=default_ctor(NULL,sizeof(S4),default_cctor,default_dtor); \
    S4 A##7; default_ctor(&A##7,sizeof(S6),default_cctor,default_dtor); \
    SUBSCOPE(A) SUBSCOPE(B);                 \
  }
#define SUBSCOPE6(A,B,C)  { \
    S2*A##3=default_ctor(NULL,sizeof(double*),default_cctor,default_dtor); \
    S2 B##2; default_ctor(&B##2,sizeof(int),default_cctor,default_dtor); \
    S4*C##4=NULL;                           \
    SUBSCOPE2(A,C) SUBSCOPE2(B,C) SUBSCOPE2(A,B); \
  }
#define SUBSCOPE24(A,B,C,D) { \
    S1*D##1=default_ctor(NULL,sizeof(char),default_cctor,default_dtor); \
    S2 C##2; default_ctor(&C##2,sizeof(int),default_cctor,default_dtor); \
    S2*B##3=default_ctor(NULL,sizeof(double*),default_cctor,default_dtor); \
    S4 A##4; default_ctor(&A##4,sizeof(S3),default_cctor,default_dtor); \
    SUBSCOPE6(A,B,C) SUBSCOPE6(A,B,D) SUBSCOPE6(A,C,D) SUBSCOPE6(B,C,D); \
  }
#define SUBSCOPE120(A,B,C,D,E) { \
    S5*A##5=default_ctor(NULL,sizeof(S4),default_cctor,default_dtor); \
    S6*A##6=default_ctor(NULL,sizeof(S5),default_cctor,default_dtor); \
    S8 A##8; default_ctor(&A##8,sizeof(S7),default_cctor,default_dtor); \
    SUBSCOPE24(A,B,C,D) SUBSCOPE24(A,B,C,E) SUBSCOPE24(A,B,D,E); \
    SUBSCOPE24(A,C,D,E) SUBSCOPE24(B,C,D,E); \
  }
#define SUBSCOPE720(A,B,C,D,E,F) { \
    S5 A##5; default_ctor(&A##5,sizeof(S4),default_cctor,default_dtor); \
    S6 A##6; default_ctor(&A##6,sizeof(S5),default_cctor,default_dtor); \
    S8*A##8=default_ctor(NULL,sizeof(S7),default_cctor,default_dtor); \
    SUBSCOPE120(A,B,C,D,E) SUBSCOPE120(A,B,C,D,F) SUBSCOPE120(A,B,C,E,F); \
    SUBSCOPE120(A,B,D,E,F) SUBSCOPE120(A,C,D,E,F) SUBSCOPE120(B,C,D,E,F); \
  }

int main(){
  S4 s4;
  SUBSCOPE720(A,B,C,D,E,F)
}

मेरी मशीन पर संकलित समय 4 सेकंड से -O3अधिक और 1 सेकंड से अधिक है जिसमें कोई अनुकूलन नहीं है।


जाहिर है अगला कदम एक बीसीडी वर्गों के लिए ओओ कार्यान्वयन को समाप्त करना होगा और इसका उपयोग करके पीआई की गणना फिर से करना होगा ताकि मुझे कड़ी मेहनत से चलने वाले दोनों प्रभाव मिलें।


12

यहां घातांक-पूर्वप्रक्रमक-विस्तार विषय की एक दरार है जो न्यूनतम कुछ दिलचस्प करता है: श्रृंखला विधियों द्वारा पाई के लिए दो सन्निकटन की गणना करता है और दोनों में मूल्य math.hऔर सामान्य झुकाव के साथ तुलना करता है।

Ungolfed।

#include <math.h>
#include <stdio.h>

// Some random bits we'll need
#define MINUSONODD(n) (n%2?-1:+1)
#define TWON(n) (2*(n))
#define NPLUSONE(n) ((n)+1)
#define TWONPLUSONE(n) NPLUSONE(TWON(n))
#define FACT(n) (tgamma(NPLUSONE(n)))

// The Euler series
//                           2^(2n) * (n!)^2      z^(2n+1)
// atan(z) = \sum_n=0^\infty --------------- * ---------------
//                               (2n+1)!       (1 + z^2)^(n+1)
#define TERMEULER(n,z) (pow(2,TWON(n))*                 \
            FACT(n)*FACT(n)*                \
            pow((z),TWONPLUSONE(n))/            \
            FACT(TWONPLUSONE(n)) /              \
            pow((1+z*z),NPLUSONE(n)) )

// The naive version
//                           (-1)^n * z^(2n+1)
// atan(z) = \sum_n=0^\infty -----------------
//                                2n + 1
#define TERMNAIVE(n,z) (MINUSONODD(n)*pow(z,TWONPLUSONE(n))/TWONPLUSONE(n))


// Define a set of bifruncations of the sum
#define N2TERMS(n,z,ALG)  (TERM##ALG(TWON(n),(z)) + TERM##ALG(TWONPLUSONE(n),(z)))
#define N4TERMS(n,z,ALG)  (N2TERMS(TWON(n),(z),ALG)+N2TERMS(TWONPLUSONE(n),(z),ALG))
#define N8TERMS(n,z,ALG)  (N4TERMS(TWON(n),(z),ALG)+N4TERMS(TWONPLUSONE(n),(z),ALG))
#define N16TERMS(n,z,ALG) (N8TERMS(TWON(n),(z),ALG)+N8TERMS(TWONPLUSONE(n),(z),ALG))
#define N32TERMS(n,z,ALG) (N16TERMS(TWON(n),(z),ALG)+N16TERMS(TWONPLUSONE(n),(z),ALG))

// Sum the fist 32*2+16 = 80 terms of a series...
#define PARTIALSUM(z,ALG) N32TERMS(0,(z),ALG)+N32TERMS(1,(z),ALG)+N16TERMS(4,(z),ALG)


int main(void){
  const double PI_TRAD = 4.0L * atan(1.0);
  const double PI_NAIVE = 4.0L * PARTIALSUM(0.999999L,NAIVE);
  const double PI_EULER = 4.0L * PARTIALSUM(0.999999L,EULER);
  printf("pi (math.h) = %10.8f\n",M_PI);
  printf("pi (trad.)  = %10.8f\n",PI_TRAD);
  printf("pi (NAIVE)  = %10.8f\n",PI_NAIVE);
  printf("pi (EULER)  = %10.8f\n",PI_EULER);
}

मान लें कि आप उपयोग कर रहे हैं gccऔर glibcअन्य व्यवस्थाओं के साथ काम कर भी सकते हैं और नहीं भी। मेरे 2.4 गीगाहर्ट्ज इंटेल कोर 2 डुओ मैकबुक पर 1 केtime (1) साथ संकलन करने के लिए प्रोसेसर समय (मूल्यांकन ) के बारे में 1.0-1.1 सेकंड लगते हैं । एक डिफ़ॉल्ट संकलन प्रोसेसर समय के बारे में 0.4 सेकंड लेता है।-03

काश, मैं powया तो tgammaसंकलक समय पर या मूल्यांकन करने के लिए नहीं मिल सकता , जो वास्तव में मदद करेगा।

जब आप इसे चलाते हैं तो आउटपुट है:

pi (math.h) = 3.14159265
pi (trad.)  = 3.14159265
pi (NAIVE)  = 3.11503599
pi (EULER)  = 3.14159065

जो दिखाता है कि बस धीरे-धीरे भोली श्रृंखला कैसे परिवर्तित होती है।


1 जितना संभव हो उतना निरंतर तह और उप-अभिव्यक्ति उन्मूलन प्राप्त करने के लिए।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.