"Wspólny język" programowania

0

Załóżmy, że rozwijam pewien program napisany na kilka platform w różnych językach programowania, np:
C++, Java, C#

Czyli kod aplikacji jest w dużej części powielony na każdej z tych platform.

Czy istnieje jakieś rozwiązanie programistyczne, by część tego kodu "uwspólnić" - mimo tego, że są to zupełnie różne języki programowania?

Np jednym z rozwiązań mógłby być jakiś konwerter, który dla pewnej "uproszczonej" składni języka C++ potrafi wygenerować kod Java i C#.

Tylko czy taki konwerter istnieje? A może macie inne pomysły na rozwiązanie tego problemu?

2

Czy istnieje jakieś rozwiązanie programistyczne, by część tego kodu "uwspólnić" - mimo tego, że są to zupełnie różne języki programowania?

Mógłbyś napisać bibliotekę ze wspólnym kodem w C (w C++ jest kilka kruczków związanych z dekorowaniem funkcji - da się to obejść jeśli Ci na tym zależy), i używać jej w tych programach w trzech różnych językach.

Tylko czy taki konwerter istnieje? A może macie inne pomysły na rozwiązanie tego problemu?

Taki konwerter napisać ciężko, bo składnię można i przetłumaczyć, ale relacje bibliotek standardowych tych języków nie są 1:1. Możesz się zainteresować jakimś metajęzykiem, np. http://en.wikipedia.org/wiki/HaXe ... - ale tak na prawdę i tak będzie to mniej uniwersalne niż poprzednie podejście.

0
pitoko napisał(a):

Załóżmy, że rozwijam pewien program napisany na kilka platform w różnych językach programowania, np:
C++, Java, C#

Czyli kod aplikacji jest w dużej części powielony na każdej z tych platform.

Czy istnieje jakieś rozwiązanie programistyczne, by część tego kodu "uwspólnić" - mimo tego, że są to zupełnie różne języki programowania?

Np jednym z rozwiązań mógłby być jakiś konwerter, który dla pewnej "uproszczonej" składni języka C++ potrafi wygenerować kod Java i C#.

Tylko czy taki konwerter istnieje? A może macie inne pomysły na rozwiązanie tego problemu?

Pewnie chodzi o Mobile. Nic to nie da. Oszczędności mierne, a i tak będziesz musieć wspierać te 3 platformy.
Zdecyduj się na jedną i taką wspieraj.

0

@pitoko a może da się rozwiązać w inny sposób? Na przykład wydzielając część "wspólną" do osobnej aplikacji która komunikowałaby się z pozostałymi? Komunikacja między aplikacjami pisanymi w różnych technologiach jest dość prosta akurat :)

0

Dzięki za odpowiedzi,
Tak, jest to aplikacja mobilna.
"Wspólny kod" jest raczej zbyt mocno związany z resztą aplikacji bym mógł go wydzielić do osobnej aplikacji.
Generalnie chodzi o to, by po zmianie kodu na jednej platformie, nie trzeba było ręcznie przenosić zmian na pozostałe platformy (jest to dość uciążliwe).
Wiem, że konwerter było by bardzo trudno napisać.
Czyli chyba nic nie wskuram...

0

Powiem ci, że ja miałem podobny problem, ale chodziło o uwspólnianie kodu między JavąME, a Androidem i już przy czymś takim jest ciężko, a co dopiero przy różnych językach.

1

Dla wielu języków, w tym Javy, C# i nawet C++ istnieją kompilatory front-end, które pozwalają wykonać kompilację do języka "prostszego". Otrzymany kod wygląda trochę śmieciarsko, ale jest zwykle trochę bardziej treściwy niż np. obfuscowany. Dla C# i Javy istnieje front-end do C++, a dla C++ do C. Oczywiście w C# i Javie zostanie dorzucony narzut w postaci runtime'a VM. Tak więc da się zejść do wspólnego kodu w C++ lub C i dalej rozwijać projekt tylko za pomocą źródeł bazy. Z kodu Javy i C# można usunąć wywołania pośrednie przez JVM/.NET i dostanie się czysty kod C++ lub C.
Co prawda czytanie listingów i rozwijanie źródeł stanie się horrorem, ale co tam. :)

Żeby było śmieszniej w samym C można zmusić kompilator aby kompilował do źródeł asemblerowych (w wybranej generacji kodu), więc teoretycznie kod ze wszystkich języków da się przewalić aż do czystego asemblera (w najbardziej skrajnej postaci aż do kodu procka 8086 z emulacją arymetyki zmiennopozycyjnejp; to dla masochistów).

0

wydaje mi się że gdyby był łatwy sposób to nie było by miesięcy albo nawet lat przerwy między wydaniem np gry na poszczególne platformy i systemy mobilne...
no i by ludzie nie wychwalali javy za jej multiplatformowość jeśli jednym kliknięciem można było kod w niej napisany zamienić na napisany w innym języku

0

w większych grach twórcy korzystają z silnika gry który jest pisany na kilka platform
wszystkie zmiany są w silniku gry a samą grę tworzy się raz dla wszystkich platform jednocześnie; gra ma grafikę, pliki muzyczne, skrypty gry itd. we wspólnym formacie który jest inaczej interpretowany przez silnik dla każdej platformy; tak samo np shadery mogą być dostosowywane w locie pod konkretne urządzenie
w praktyce wymaga to napisania czegoś w rodzaju relatywnie prostego własnego języka programowania i to raczej pro level - dla mniejszych projektów nie ma sensu
no i gry nie są specjalnie optymalizowane pod konkretną platformę przez co chodzą... no cóż - gorzej niż by mogły ;)

tu masz kilka gotowych rozwiązań silników gier na platformy mobilne: http://mobilegameengines.com/android/2d_game_engines
można pisać w niektórych na androida, iOS, html5 i windows phone a nawet flash playera jednocześnie w 2d i 3d a komercyjne licencje na większość kosztują mniej niż 500$
są też darmowe ale nie spodziewałbym się tutaj zbyt dużych możliwości; zapewne pozwalają tworzyć grę jednego typu zmieniając w zasadzie tylko muzykę i grafikę
zresztą - potestuj; może wcale niczego więcej nie potrzebujesz

0

aha, trochę się zapędziłem i nie wiedząc czemu przyjąłem że robisz grę
oczywiście dla zwykłych aplikacji też istnieją takie "silniki" - musisz tylko poszukać

0
pitoko napisał(a):

Np jednym z rozwiązań mógłby być jakiś konwerter, który dla pewnej "uproszczonej" składni języka C++ potrafi wygenerować kod Java i C#.

Tylko czy taki konwerter istnieje? A może macie inne pomysły na rozwiązanie tego problemu?

Takim konwerterem przełożono kod Andoida z Javy na c#

0

Innym rozwiązaniem może być JVM zaimplementowany w .NET: http://www.ikvm.net/

Albo jeśli chodzi o mobile to: http://www.codenameone.com/

0

Można by napisać wszystkie główne funkcje w C++ zapakować je do dllki i można je wywoływać z poziomu javy i c#.

0

hm... chyba po części dla takich zapotrzebować stworzono web service'y : )

1

Odświeżam post, gdyż w 2017 dostępnych jest już wiele języków natywnie celujących równocześnie w kilka platform mobilnych:

  • Appcelerator - język: JS, platformy: Android/iOS/Windows
  • Corona - język: Lua, platformy: Android/iOS/Windows
  • Delphi - jeden język, wiele platform: Windows/Linux/macOS/iOS/Android
  • Flex - język: AS, platformy: Windows/Linux/Blackberry/OSX/iOS/Android (dzięki AIR)
  • Flutter - język: Dart, platformy: iOS/Android (sam Dart celuje w HTML5)
  • Haxe - jeden język, wiele platform: iOS/Android/HTML5/Flash/Neko VM
  • Kotlin/Native - platformy: Linux/OSX/iOS (sam Kotlin celuje w HTML5/JVM/Android)
  • Qt - język: C++/QML, platformy: Android/iOS/Ubuntu/Windows Mobile
  • React Native - język JS, platformy: iOS/Android/Windows (dzięki React Native Windows)
  • Xamarin - język C#, platformy: iOS/Android/Windows
0

Wiele z nich nie pomoże. Przykładowo Xamarin nie ma dostępu do całego API jak Swift i Objective-C. Jeśli chodzi o rozwiązania oparte na webie (produkujące aplikacje), to znowuż nie mamy dostępu do sprawdzania funkcji samego telefonu (np. dla iOS czy urządzenie jest zrootowane (jailbreak)). Pomocne przy prostych projektach oraz w grach gdzie nie ma potrzeby używać niskopoziomowych operacji, ale u mnie w firmie nie przeszły takie pomysły. Więcej było z tym problemów niż równoczesny rozwój Android/iOS/Windows. Chociaż teraz mobilny Windows upadł to już nie jest taki wielki problem rozwijać aplikację w dwóch językach jednocześnie.

PS. Najnowszy Delphi jest tutaj bardzo obiecujący. Nie masz go na liście.

0

Ale w 80% projektów wspólna baza kodu wystarczy, co znacznie przyspiesza deweloperkę. Windows Mobile i UWP wciąż żyją, więc nie można ich przekreślać. Dodałem do listy Delphi i Flex (oparty na AIR).

1

Po co przekreŝlać, z tymi hybrydami flow jest praktycznie zawsze taki sam - zróbmy apkę mobilną ale ma być tania i wspierać wiele platform, no to jedziemy, apka chwyciła, mamy coraz więcej klientów, coraz większe plany, ale uhm tego, urządzenie X tego nie wspiera, uhm tego, na tej marnej podróbie szajsunga z aliexpress nasza hybrydowa platforma ma buga, uhm tego, Apple wypuściło nowy system niestety obecna wersja naszej platformy crashuje się na nim non-stop, uhm tego, na potrzeby rynku X musimy zaimportować własny system map, niestety autorzy hybrydy nie przewidzieli takiego scenariusza itd.

Jak klient zewnętrzny nie trzaśnie drzwiami to zapada decyzja o natywnym przepisaniu na dwie wiodące platformy co w ostateczności niweluje jakiekolwiek oszczędności i dodatkowo rodzi problemy przy portowaniu funkcjonalności. Klienci chyba też to zauważyli bo po początkowym bumie teraz raczej podejmuje się decyzję o natywnym developmencie od początku.

0

Ma ktoś może doświadczenie z https://www.nativescript.org/ ?

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