Kompilacja kodu online

0

Witam

Jak zrobic cos takiego jak np na stronie http://www.onlinecompiler.net/index.html

a dokladniej , jak uruchomic kompilator " na stronie"

Dzieki za podpowiedzi

Pozdraiwam

0

Dla mnie to jasne, że programy nie są uruchamiane na stronie. W moim pytaniu (może zbyt ogólnie to ująłem) chodzi właśnie o to jaki mechanizm zaprząc do pracy aby nie musieć pisać własnego parsera pascala (w np php). Ideałem byłaby gotowa biblioteka która uruchamia podesłany kod źródłowy i zwraca rezultat jego działania - jeśli jesteś w stanie podpowiedzieć coś konkretnego to byłbym wdzięczny.

0

Tam nie ma żadnego parsera. Kod źródłowy z <textarea> jest kompilowany przez oddzielny proces, nie przez sam skrypt webowy na serwerze.

0

Ale to jedyna metoda jaką na chwilę obecną znam, tzn z textarea "wciągam" treść i ręcznie (kod napisany w php) "wykonuję" program pascalowy. A właśnie chodzi mi o to aby proces usprawnić i być może skorzystać z jakiegoś gotowca gdyż mój parser już jest bardzo rozbudowany a i tak do doskonałości mu BAAARDZO daleko.
Być może jest jakiś mechanizm, który odwali robotę za mnie :)

ps. Informacja jakim procesie wspominasz i jak się do niego dobrać byłaby mile widziana.

1

Zasada działania (najprostsza) takiego systemu:

  1. User wpisuje kod na stronie.
  2. System zapisuje kod do pliku zapisanyplik.kod
  3. System wywołuje kompilatorwybranegojęzyka.exe zapisanyplik.kod
  4. System odbiera komunikaty wysyłane przez kompilator na konsolę i wyświetla na stronie
  5. Jeśli kod wyjścia == 0 to uruchom skompilowany program i wyświetl na stronie, to, co program przekazał do konsoli.

Tutaj nie ma żadnego dodatkowego parsera oprócz tego, co już zostało zrobione dla danego języka programowania. Korzysta się z gotowych kompilatorów, byle działały na danej platformie/architekturze.

0
Ktos napisał(a)
  1. User wpisuje kod na stronie.
  2. System zapisuje kod do pliku zapisanyplik.kod
  3. System wywołuje kompilatorwybranegojęzyka.exe zapisanyplik.kod

Ja bym dodał, że pkt 3 robi się w izolowanym środowisku, tak samo jak i samo uruchomienie kompilatu.

0

To teraz brakuje mi tylko informacji jak na zewnętrznym (wykupionym) serwerze coś takiego uruchomić...
Dodam, że chodzi o serwer Apache.

0

Piszesz byle jaki skrypt do tego i tyle. Musisz mieć tylko poinstalowane kompilatory na serwerze. Sterowanie kompilacją i sama kompilacja jest poza "warstwą sieciową" więc bez znaczenia czy masz tam Apache czy coś innego.

0
mroofka napisał(a)

Dodam, że chodzi o serwer Apache.

Apache to jest serwer WWW (program). Do kompilacji potrzebujesz znacznie więcej. Przede wszystkim na maszynie musi być zainstalowany kompilator i konieczne narzędzia. Do tego musisz mieć możliwość uruchomienia programów w zamkniętym środowisku (takich środowisk musi być tyle, ile jednoczesnych kompilacji dopuszczasz). Jeśli kompilator działa tylko pod systemem Windows (np. Delphi), serwer musi także działać pod tym systemem (lub co najmniej zamknięte środowiska, ale to będzie znacznie trudniejsze do zrealizowania).
Zatem sam hosting WWW to zbyt mało.

0

A jak sprawdzić czy odpowiednie narzędzia są dostępne na serwerze?
Ew jeśli ich nie ma to proszę o podanie nazwy pakietu (ów) jakie należy doinstalować aby wszystko zadziałało poprawnie.

0

A skąd mamy wiedzieć jakie kompilatory chcesz zainstalować ;p ? Masz tam w ogóle dostęp do powłoki ?

0

Na początku napisałem, że chodzi mi głównie o język pascal (choć i c++ nie pogardzę).
Co do dostępu, to mogę mieć dostęp praktycznie nieograniczony.

0

Ale który Pascal? Jest funkcyjny Pascal, obiektowy Pascal i jest Delphi.
Jaki system operacyjny? Pod Linuksem (dominujący system na serwerach) jest FreePascal. Kiedyś był kompilator Delphi, ale chyba umarł śmiercią naturalną, poza tym nie działał zbyt dobrze.

0

To jak masz serwer to instalujesz tam kompilator i piszesz skrypt który uruchamia kompilator z kodem zczytanym z textarea i obsługuje uruchomienie - tj wejście i wyjście i to co zwraca, po czym wysyła na stronę.

0
lukas_gab napisał(a)

To jak masz serwer to instalujesz tam kompilator i piszesz skrypt który uruchamia kompilator z kodem zczytanym z textarea i obsługuje uruchomienie - tj wejście i wyjście i to co zwraca, po czym wysyła na stronę.

A jeśli zrobisz dokładnie tak, podziel się adresem strony, żebyśmy mieli ubaw przy włamywaniu się na Twój serwer ;)

0

Nie mam pojęcia - nie robiłem tego i nie siedzę w takim czymś, ale idea musi być taka. Skrypt co to obsługuje powinien zapewnić bezpieczeństwo.

0

choć i c++ nie pogardzę

do C++, ze względu na kompletność Turinga mechanizmu szablonów, należałoby ograniczyć czasowo proces kompilatora (np. do paru minut). ponieważ złośliwie napisany parulinijkowy program potrafi kompilować się całymi godzinami, łatwo byłoby zapuścić kilka takich procesów i przeprowadzić atak denial-of-service.

0
lukas_gab napisał(a)

Nie mam pojęcia - nie robiłem tego i nie siedzę w takim czymś, ale idea musi być taka. Skrypt co to obsługuje powinien zapewnić bezpieczeństwo.

To może zanim przystąpisz do prac zainteresuj się bezpieczeństwem oraz zanajom się z mechanizmami systemu operacyjnego. Sama idea jest dość trywialna, ale o ile nie robisz jedynie PoC dla siebie, to musisz zatroszczyć się o szereg innych rzeczy aby uczynić całość w miarę bezpieczną. Nie skacz od razu na głęboką wodę, bo zazwyczaj źle się to kończy.

0

najłatwiej użyć api z ideone. wysłałem linka z resztą w swoim pierwszym poście. ideone jest szybkie więc nie powinno być żadnych problemów

0
Kumashiro napisał(a)

Ale który Pascal? Jest funkcyjny Pascal, obiektowy Pascal i jest Delphi.
Jaki system operacyjny? Pod Linuksem (dominujący system na serwerach) jest FreePascal. Kiedyś był kompilator Delphi, ale chyba umarł śmiercią naturalną, poza tym nie działał zbyt dobrze.

Interesuje mnie pascal funkcyjny (choć miło by było mieć obsługę bardziej rozbudowanych rekordów). System Linux.

Doprecyzuję jeszcze problem "bezpieczeństwa". Wszystko będzie działało w środowisku zamkniętym, każdy testowany program będzie "wiadomoczyj". To oczywiste, że takich mechanizmów nie puszcza się w świat bez żadnych zabezpieczeń.

Azarien napisał(a)

...

Każdy program będzie miał wykonać coś i zakończyć pracę - nie ma możliwości aby ktoś podłożył coś złośliwego. Ograniczenie czasowe byłoby mile widziane bo ktoś może przypadkowo (niechcący) wprowadzić niekończący się kod ale tym będę się zajmował jak w ogóle uda mi się coś takiego uruchomić.

krwq napisał(a)

...

Oglądam ideone, równocześnie szukam czegoś bardziej przyjaznego.

0
mroofka napisał(a)

Interesuje mnie pascal funkcyjny (choć miło by było mieć obsługę bardziej rozbudowanych rekordów). System Linux.

FreePascal jest tym, czego szukasz. Jest zgodny z Turbo Pascal 7 i ponoć zna też Delphi, ale nie wiem w jakim stopniu.

mroofka napisał(a)

Doprecyzuję jeszcze problem "bezpieczeństwa". Wszystko będzie działało w środowisku zamkniętym, każdy testowany program będzie "wiadomoczyj". To oczywiste, że takich mechanizmów nie puszcza się w świat bez żadnych zabezpieczeń.

Powinieneś raczej kompilować i uruchamiać każdy program co najmniej w oddzielnym chroot, z limitami itp.

mroofka napisał(a)

nie ma możliwości aby ktoś podłożył coś złośliwego.

Słynne Ostatnie Słowa...

0

Każdy program będzie miał wykonać coś i zakończyć pracę - nie ma możliwości aby ktoś podłożył coś złośliwego.
Jest możliwość, aby ktoś podłożył złośliwy kod C++, który będzie się kompilował dłuuugo. Jedyną złośliwością będzie nadmiarowe obciążenie serwera, ale tego chyba też nie chcemy.
spróbUj skompilować ten poprawny program:

template<int Depth, int A, typename B>
struct K17 { 
static const int x =
K17 <Depth+1, 0, K17<Depth,A,B> >::x
+ K17 <Depth+1, 1, K17<Depth,A,B> >::x
+ K17 <Depth+1, 2, K17<Depth,A,B> >::x
+ K17 <Depth+1, 3, K17<Depth,A,B> >::x
+ K17 <Depth+1, 4, K17<Depth,A,B> >::x;
};
template <int A, typename B>
struct K17 <16,A,B> { static const int x = 1;
};
static const int z = K17 <0,0,int>::x;
int main(void) { } 
0
Kumashiro napisał(a)

Słynne Ostatnie Słowa...

Azarien napisał(a)

...

nie mam w tej chwili jak wypróbować ale twój kod nie powinien się skompilować - brakuje return

both:
kilka słów dodatkowych wyjaśnień, przez stronę będą zbierane programy które wstępnie są już "obrabiane" a potwierdzenie uruchomienia każdego z nich (tak aby zobaczyć rezultat działania) i tak będę uruchamiał "ręcznie" - ma mi to zaoszczędzić kopiowania do zwykłego kompilatora

0
mroofka napisał(a)

przez stronę będą zbierane programy które wstępnie są już "obrabiane" a potwierdzenie uruchomienia każdego z nich (tak aby zobaczyć rezultat działania) i tak będę uruchamiał "ręcznie" - ma mi to zaoszczędzić kopiowania do zwykłego kompilatora

huh?

0
Kumashiro napisał(a)

huh?

różni ludzie różne potrzeby :)

Czyżby temat padł? Jeśli ktoś może coś jeszcze podpowiedzieć będę wdzięczny.

1 użytkowników online, w tym zalogowanych: 0, gości: 1