Языковой движок без стандартной библиотеки - PullRequest
1 голос
/ 07 января 2012

Кто-нибудь знает языковой движок (компилятор или интерпретатор, AST, синтаксис и базовую семантику), но без стандартной библиотеки (надеюсь, даже не целых или арифметических).Что-то подобное существует?Я хотел бы иметь возможность реализовать стандартную библиотеку в C ++.Существует ли такая вещь?

1 Ответ

4 голосов
/ 07 января 2012

GCC (и я уверен, что многие другие компиляторы) позволяют вам создавать код без стандартных заголовков и / или библиотек, с флагами -nostdinc (также -nostdinc++ для C ++) и -nostdlib.

Например:

$ cat t.cpp
#include <iostream>

int main()
{
    std::cout << "ouch" << std::endl;
}
$ g++ -nostdinc t.cpp            # Failed compilation
t.cpp:1:20: error: no include path in which to search for iostream
t.cpp: In function ‘int main()’:
t.cpp:5:5: error: ‘cout’ is not a member of ‘std’
t.cpp:5:28: error: ‘endl’ is not a member of ‘std’
$ g++ -nostdinc++ t.cpp          # Failed compilation
t.cpp:1:20: fatal error: iostream: No such file or directory
compilation terminated.
$ g++ -nostdlib t.cpp            # Compiles, but fails to link
/usr/lib/gcc/x86_64-pc-linux-gnu/4.5.3/../../../../x86_64-pc-linux-gnu/bin/ld: warning: cannot find entry symbol _start; defaulting to 0000000000400158
/tmp/ccPPO3l6.o: In function `main':
t.cpp:(.text+0xa): undefined reference to `std::cout'
t.cpp:(.text+0xf): undefined reference to `std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*)'
t.cpp:(.text+0x14): undefined reference to `std::basic_ostream<char, std::char_traits<char> >& std::endl<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&)'
t.cpp:(.text+0x1c): undefined reference to `std::basic_ostream<char, std::char_traits<char> >::operator<<(std::basic_ostream<char, std::char_traits<char> >& (*)(std::basic_ostream<char, std::char_traits<char> >&))'
/tmp/ccPPO3l6.o: In function `__static_initialization_and_destruction_0(int, int)':
t.cpp:(.text+0x4a): undefined reference to `std::ios_base::Init::Init()'
t.cpp:(.text+0x4f): undefined reference to `std::ios_base::Init::~Init()'
t.cpp:(.text+0x54): undefined reference to `__dso_handle'
t.cpp:(.text+0x61): undefined reference to `__cxa_atexit'
collect2: ld returned 1 exit status

Используется для создания таких вещей, как код ядра, который не может использовать библиотеку C.

Удачи в реализациистандартная библиотека, это огромная задача.

...