Utwórz krótki program w C, którego skompilowanie z gcc zajmuje absurdalnie długo. Wpisy będą oceniane przez synchronizację kompilacji, a następnie odjęcie czasu kompilacji programu referencyjnego.
Zasady
- Dowolna funkcja języka C lub rozszerzenie gcc
- gcc 4.2.1
code-challenge
c
charliehorse55
źródło
źródło
Odpowiedzi:
źródło
main(){char*z=j;}
aby uczynić to poprawnym programem c./Zm
to naprawiZarówno odpowiedź Charliego, jak i moja wcześniejsza praca nad zasadą pozwalania, aby preprocesor napisał dużo kodu, ale głównie ćwiczą sam preprocesor, leksykon (dobry pomysł, ponieważ ten krok tradycyjnie był powolny) i parser. Mój próbuje również wykonać kroki optymalizacji i generowania kodu, ale najwyraźniej niewiele tam zyskuje.
Myśląc o tym, jak działa typowy kompilator c, zdałem sobie sprawę, że nie dajemy nic do zrobienia kodowi związanemu z tablicą symboli. Ten wpis jest próbą zaradzenia temu. Ma to przypominać podstawową orientację obiektową w implementacji c, ale nie robi nic interesującego: po prostu deklaruje technikę ekspansji preprocesora i trywialnie (i niepoprawnie) inicjuje wiązkę obiektów. Obiekt używający skomplikowanych typów, na wielu poziomach zasięgu, przesłaniający się przy różnych usunięciach. Powinno to nadać tabeli symboli prawdziwy układ.
Czas kompilacji na moim komputerze przekracza 4 sekundy
-O3
i ponad 1 sekundę bez optymalizacji.Oczywiście następnym krokiem byłoby dokończenie implementacji OO dla klas BCD i ponowne wykonanie obliczeń pi przy jej użyciu, aby oba efekty działały mocno.
źródło
Oto motyw motywu ekspansjonalnego preprocesora, który robi coś minimalnie interesującego: oblicza dwie aproksymacje liczby pi metodami szeregowymi i porównuje zarówno wartość in, jak
math.h
i zwykłe inkantacje.Nie golfił.
Zakłada, że używasz
gcc
iglibc
może lub nie może współpracować z innymi ustaleniami. Kompilacjatime (1)
z-03
1 na moim MacBooku Intel Core 2 Duo 2,4 GHz zajmuje około 1,0-1,1 sekundy (ocenianego za pomocą ) . Domyślna kompilacja zajmuje około 0,4 sekundy czasu procesora.Niestety, nie mogę dostać się do oceny gcc albo
pow
czytgamma
w czasie kompilatora, która naprawdę pomaga.Po uruchomieniu wynik jest następujący:
co pokazuje, jak powoli zbiega się naiwna seria.
1 Aby uzyskać jak najwięcej ciągłego eliminowania fałdowania i eliminacji podwyrażeń.
źródło