Uniwersalny język programowania

Uniwersalny język programowania
AN
  • Rejestracja:prawie 19 lat
  • Ostatnio:około 2 godziny
0

Kilka razy zdarzało mi się, że tworzę program w jakimś języku czy jakiejś technologii, a jakiś czas później chcę mieć taki sam program w innej technologii. Czasami zdarza się, że już od początku chciałbym mieć dwa takie same programy, gdzie jeden jest na przykład w Java, a drugi w C#, a oba programy robią dokładnie to samo.

W biznesie to też się zdarza, np. jest portal webowy, a potem apka instalowana na telefonie (i nie jest to PWA, ani apka będąca pełnoekranową przeglądarką webową). Abo choćby przeglądarki internetowe, taka sama przeglądarka jest na PC, ale też jest na iOS (inny GUI, ale funkcjonalność podobna).

Moim zdaniem, w większości przypadków źródła programu można podzielić na dwie części, pierwsza to cześć "obliczeniowa", czyli cała logika, która jest taka sama, niezależnie od tego, w czym program jest zrobiony i to tak szacuję, jest 90% całego projektu. Dopiero pozostałe 10% to część "interfejsowa", czyli wytwarzanie GUI, odczytywanie zdarzeń z GUI, z bazy danych, połączenia sieciowe itp.

Taki przykład z życia wzięty: https://github.com/andrzejlisek/TextPaint
To są tak naprawdę dwa takie same programy w C#, jeden dostosowany do .NET Framework, drugi dostosowany do .NET Core. Część "interfejsowa" to tylko kilka plików (malowanie GUI, zdarzenia GUI, schowek systemowy, odczyt i zapis bitmap), a cała reszta to część "obliczeniowa", w której kody są identyczne w obu programach (ponieważ w tym przypadku, język jest ten sam). Ale załóżmy, że wymyślę sobie, że chciałbym mieć w C++ i Qt, to musiałbym napisać od nowa obie części programu. A potem, jak w części obliczeniowej coś zmienię, to zmiany musiałbym nanosić dwa razy osobno.

Pytanie jest takie: Czy istnieje "język programowania", w którym mogę napisać jakiś fragment programu, a najlepiej klasę obiektu, i ten kod byłby podstawą części obliczeniowej programu? To byłby taki uniwersalny transpilator (konwerter kodu źródłowego na kod źródłowy w innym języku). Jak chce mieć w C#, to robię transpilację do C#, Jak zapragnę mieć w Java, to nie muszę pisać ręcznie, tylko robię transpilację z tego uniwersalnego języka do Java i już mam 80% programu. Jak zapragnę mieć w JavaScript, to transpilacja i już jest.

Oczywiście nie oczekuję konwersji i transpilacji części interfejsowej, bo w każdej technologi obsługa GUI jest tak różna, że nie ma możliwości tego zautomatyzować. Np. chcąc mieć apkę desktopową i webową robiącą to samo, to sposób tworzenia okienka w powiedzmy Qt i sposób tworzenia GUI w HTML+CSS jest zupełnie odmienny i to bym ogarną ręcznie. A częśc obliczeniową to bym napisać w tym "uniwersalnym języku" i automatycznie konwertował do C++ i JavaScript. Potem i tak, większość zmian i ulepszeń jest w części obliczeniowej i wykonywałoby się jednokrotnie.

Ale konwersję klas obliczeniowych to chyba da się zautomatyzować, tym bardziej, że ręcznie da się przerobić niemalże 1:1. Konwerter Java -> C#, czy c#-> Java lub Java->JavaScript to chyba nie jest taka prosta rzecz, ale mając jakiś język uniwersalny, to chyba mógłby istnieć konwerter tego języka na co się chce. Coś na podobnej zasadzie, jak kompilatory GCC, który działa dwuetapowo, że w pierwszym etapie kompiluje program do LLVM, a w drugim etapie konwertuje z LLVM na postać docelową. JRE do Java i CLI do C# robi to samo, czyli konwersja do postaci pośredniej i ostateczna kompilacja w chwili uruchomienia. Jednak konwersja CLI->JRE i JRE->CLI nie jest możliwa.

edytowany 1x, ostatnio: andrzejlisek
LukeJL
  • Rejestracja:około 11 lat
  • Ostatnio:6 minut
  • Postów:8410
2
andrzejlisek napisał(a):

Pytanie jest takie: Czy istnieje "język programowania", w którym mogę napisać jakiś fragment programu, a najlepiej klasę obiektu, i ten kod byłby podstawą części obliczeniowej programu? To byłby taki uniwersalny transpilator (konwerter kodu źródłowego na kod źródłowy w innym języku). Jak chce mieć w C#, to robię transpilację do C#, Jak zapragnę mieć w Java, to nie muszę pisać ręcznie, tylko robię transpilację z tego uniwersalnego języka do Java i już mam 80% programu. Jak zapragnę mieć w JavaScript, to transpilacja i już jest.

A nie lepiej robić odwrotnie?
Piszesz program w jakimkolwiek języku, a potem kompilujesz do low-levelowego targetu, które inne programy rozumieją?
np.

  • kompilacja do natywnej libki
  • do WebAssembly
  • do innego języka będącego targetem (np. do JavaScript, C itp.)
  • do JVM
  • komunikacja w inny sposób np. przez HTTP, wtedy może to być pisane w różnych językach, ale programy i tak mogą ze sobą "gadać"

No i odpowiednie bindingi

Czyli osiągasz cel współpracy między różnymi językami, ale nie bezpośrednio, tylko przez wspólny standard + bindingi.

Albo jeszcze inaczej. Jeśli to język skryptowy (np. często używane są Lua, Python, JavaScript jako języki skryptowe do robienia np. wtyczek do programów), to można zamiast kompilować, po prostu osadzić wirtualną maszynę w programie docelowym. Więc logikę masz w języku skryptowym, który jest w różnych programach osadzany.

Java->JavaScript to chyba nie jest taka prosta rzecz, ale mając jakiś język uniwersalny, to chyba mógłby istnieć konwerter tego języka na co się chce.

Myślałem o tym, żeby zrobić konwerter Pythona na JavaScript. Ale myślę, że nie byłoby to takie proste - trzeba byłoby przekonwertować również bibliotekę standardową. Poza tym różne zewnętrzne biblioteki do Pythona (np. te do Machine Learning?) też nie zawsze są tylko w Pythonie pisane, ale częściowo w C++, więc pytanie co z nimi? (pewnie, C++ też da się kompilować do JS albo Wasm, ale to zwiększałoby komplikację problemu).

Jeszcze rozkminiam też, czy nie dałoby się zamiast kompilować Pythona na JS, to skompilować bajtkod Pythona (pliki *.pyc) na JS, może byłoby łatwiej. Chociaż ten bajtkod też wcale nie jest aż taki niskopoziomowy, więc nie wiem.

Czy istnieje "język programowania"

Taki uniwersalny język programowania albo musiałby być dużym przedsięwzięciem, albo musiałby być bardzo prosty, prymitywny wręcz, żeby łatwo się dało przekompilować.


edytowany 7x, ostatnio: LukeJL
Riddle
Administrator
  • Rejestracja:prawie 15 lat
  • Ostatnio:około 6 godzin
  • Lokalizacja:Laska, z Polski
  • Postów:10056
4

Jest coś takiego jak język Fusion, zaprojektowany z myślą o tym żeby kod napisany w nim dało się transpilować do C, C++, C#, D, Javy, JavaScript, Python, Swift, TypeScript oraz OpenCL. Pewnie kolejne języki jeszcze dojdą.

W języku Fusion są tylko te elementy programistyczne (klasy, tablice, funkcje) które da się łatwo przemapować na odpowiedni element w obsługiwanym języku. Dla przykładu, nie ma liczb unsigned 32-bitowych, bo mimo że C i C++ je mają, to Java i JavaScript ich nie mają, więc liczby unsigned w Fusion są 31-bitowe, żeby dało się je zmapować do tych języków właśnie.

https://github.com/fusionlanguage/fut

edytowany 4x, ostatnio: Riddle
G8
Chyba bardziej jako ciekawostka
G8
  • Rejestracja:około 3 lata
  • Ostatnio:około rok
  • Postów:2000
1

Przede wszystkim żadne konwertery nie mają sensu bo rezultat będzie zawsze kiepski. Co do uniwersalności to jest bardziej kwestia technologii, a nie samego języka jako takiego. Możesz przyjrzeć się rozwiązaniom już istniejącym i może to działać na kilka sposobów:

  • oddzielenie logiki od rzeczy platform specific, czyli masz wspólny core dla każdej platformy i dodatkowo musisz dopisać obsługę każdej platformy, w różny sposób. Tak działa np Kotlin Multiplatform: https://kotlinlang.org/docs/multiplatform.html i o ile kojarzę to chyba Xamarin też kiedyś próbował czegoś takiego

  • dokładnie ten sam kod, który kompliluje się na wszytkie platformy. Np na desktop rezultatem kompilacji jest .exe, na web kod js+html, a na Androida plik apk. Tak działa Flutter: https://flutter.dev/ - w zasadzie to działa trochę analogicznie jak Kotlin, ale rzeczy specyficzne dla platformy są ograniczone do niezbędnego minimum i automatycznie generowane przez framework i jest to tylko minimalny launcher, który ma za zadanie uruchomić Fluttera, czyli kod pisany przez programistę. Więc teoretycznie możesz napisać swój program i niczym więcej się nie przejmować, kompilujesz program na taką platformę jak potrzebujesz (teoretycznie bo zawsze są pewne niuanse, które trzeba brać pod uwagę)

  • jeden plik wynikowy możliwy po kompilacji do uruchomienia na kilku platformach, jak .jar z Javy. To w zasadzie nie wyszło i nie jest możliwe na każdej platformie, bo nie na każdej można zainstalować jdk

    Przy czym jak ostatnio sprawdzałem, to Kotlin jeszcze się nie nadawał do użycia, a Flutter zrobił spory postęp i na dzień dzisiejszy jest już stabilna obsługa wszystkich platform (Windows/Mac/Linux/Android/iOS/Web)

edytowany 6x, ostatnio: gajusz800
KE
  • Rejestracja:ponad 6 lat
  • Ostatnio:około 5 godzin
  • Postów:665
0

Dopiero pozostałe 10% to część "interfejsowa", czyli wytwarzanie GUI, odczytywanie zdarzeń z GUI, z bazy danych, połączenia sieciowe itp.

Na pewno? Mam wrażenie, że jest dokładnie odwrotnie. W moim odczuciu domena aplikacji i to, jaki problem rozwiązuje, to jest zdecydowanie mniejsza część kodu. Większość kodu to klej, który skleja tę logikę ze światem zewnętrznym.

Riddle
Administrator
  • Rejestracja:prawie 15 lat
  • Ostatnio:około 6 godzin
  • Lokalizacja:Laska, z Polski
  • Postów:10056
2
kelog napisał(a):

Dopiero pozostałe 10% to część "interfejsowa", czyli wytwarzanie GUI, odczytywanie zdarzeń z GUI, z bazy danych, połączenia sieciowe itp.

Na pewno? Mam wrażenie, że jest dokładnie odwrotnie. W moim odczuciu domena aplikacji i to, jaki problem rozwiązuje, to jest zdecydowanie mniejsza część kodu. Większość kodu to klej, który skleja tę logikę ze światem zewnętrznym.

Zależy od aplikacji.

Jeśli robisz CRUD'a, to faktycznie. Jeśli robisz jakeś wąskie narzędzie branżowe, to może być tak że domena aplikacji to jest 90%.

jarekr000000
  • Rejestracja:ponad 8 lat
  • Ostatnio:około 8 godzin
  • Lokalizacja:U krasnoludów - pod górą
  • Postów:4707
1
LukeJL napisał(a):

Taki uniwersalny język programowania albo musiałby być dużym przedsięwzięciem, albo musiałby być bardzo prosty, prymitywny wręcz, żeby łatwo się dało przekompilować.

A dlaczego nie może być skomplikowany, szkoda Ci komputera, bo się zmęczy przy kompilowaniu?


jeden i pół terabajta powinno wystarczyć każdemu
Zobacz pozostałe 3 komentarze
jarekr000000
@LukeJL: ale co z tego? Tworzysz taki język co nie ma - koniec. Nawet jak będzie skompilowany do JS.
LukeJL
no nie miał być kompilowany do JSa tylko, ale do wszystkich innych języków. I każdy język ma swoje jakieś quirki. Więc w takim razie i tak przetłumaczenie bezpośredniego języka SuperDuper do 20 różnych języków to albo 20 razy więcej pracy, albo wymyślamy jakąś przejściową formę. I tłumaczymy SuperDuper jedynie do jakiejś prymitywnej przejściowej formy, którą tę formę dałoby się skompilować do każdego innego języka.
jarekr000000
@LukeJL: to niech język od razu będzie przejściową formą.
KamilAdam
@LukeJL: i co w tym złego że tłumaczymy na formę przejściową? W zasadzie wszystkie współczesne kompilatory tak działają bo języki mają mnóstwo cukru składniowego. W takim Haskellu to na oko pół języka to lukier składniowy żeby pisało się wygodniej
LukeJL
@KamilAdam ale ja nie mówię, że to źle.
loza_prowizoryczna
  • Rejestracja:ponad 2 lata
  • Ostatnio:około 9 godzin
  • Postów:1608
0
andrzejlisek napisał(a):

Pytanie jest takie: Czy istnieje "język programowania", w którym mogę napisać jakiś fragment programu, a najlepiej klasę obiektu, i ten kod byłby podstawą części obliczeniowej programu? To byłby taki uniwersalny transpilator (konwerter kodu źródłowego na kod źródłowy w innym języku). Jak chce mieć w C#, to robię transpilację do C#, Jak zapragnę mieć w Java, to nie muszę pisać ręcznie, tylko robię transpilację z tego uniwersalnego języka do Java i już mam 80% programu. Jak zapragnę mieć w JavaScript, to transpilacja i już jest.

Pomysł dobry i możliwe że realizowalny w praktyce ale ja bym zadał sobie inne pytanie: czy jeśli mamy uniwersalny język oprogramowania to czy potrafimy do niego stworzyć uniwersalny zestaw testów?


Przetrzyma wszystko
SL
  • Rejestracja:około 7 lat
  • Ostatnio:34 minuty
  • Postów:878
1

Takim językiem musi być coś co:

  • jest samowystarczalne, żadnych bibliotek linkowanych gdziekolwiek
  • nie ma runtimu/minimalny runtime przez co nie ma problemu z łączeniem różnych modułów z wielu bibliotek w programie wynikowym
  • ma prosty interfejs: proste struktury danych tj. tablica, struktura i w sumie to tyle czyli taka część wspólna wszystkich popularnych języków

Takim językiem mógłby być dowolny język kompilowany do kodu bajtowego LLVM np. C, C++ czy Rust wystawiający interfejs języka C. Takiego kodu można użyć:

  • w innych natywnych językach poprzez interfejs C
  • w Javie poprzez interfejs z C albo GraalVM i projekt Sulong
  • w Pythonie poprzez bindingi
  • JS poprzez WebAssembly i Emscripten

Problem jest taki, że taki interfejs byłby biedny, bo nie miałby wielu dostępu do wielu ficzerów takich jak złożone struktury danych.

Według mnie najlepszy rozwiązaniem jest użycie Rusta (samowystarczalny, wspaniały tooling, szybki) do napisania logiki i użycie jej poprzez biblioteki, które generują przyjemne interfejsy do języków docelowych np. https://github.com/dtolnay/cxx , https://github.com/PyO3/pyo3 , https://developer.mozilla.org/en-US/docs/WebAssembly/Rust_to_Wasm

loza_prowizoryczna
A nie prościej shell?
obscurity
  • Rejestracja:około 6 lat
  • Ostatnio:około 3 godziny
2

No a takim językiem nie jest w zasadzie C++ / Rust? Przecież możesz sobie w nich napisać główną logikę aplikacji i konsumować potem z praktycznie dowolnego języka w postaci libki.
Po co "uniwersalny język" skoro mamy już języki które mogą być używane w dowolnych innych.

No i w zasadzie C# jest takim uniwersalnym językiem poza embedded. Po co ci aplikacja w javie jeśli masz ją już w c#?


"A car won't take your job, another horse driving a car will." - Horse influencer, 1910
edytowany 1x, ostatnio: obscurity
LukeJL
  • Rejestracja:około 11 lat
  • Ostatnio:6 minut
  • Postów:8410
1
obscurity napisał(a):

No a takim językiem nie jest w zasadzie C++ / Rust? Przecież możesz sobie w nich napisać główną logikę aplikacji i konsumować potem z praktycznie dowolnego języka w postaci libki.

Dokładnie. I zapakować do libki natywnej + przekompilować do WebAssembly. A jak coś dalej nie śmiga, to łączyć się po socketach. I już.


G8
  • Rejestracja:około 3 lata
  • Ostatnio:około rok
  • Postów:2000
1

Idąc tym tokiem rozumowania to możesz sobie napisać webserwis i konsumować go w dowolnym języku. Napisz sobie logikę aplikacji, wystaw webserwis i gui możesz mieć w dowolnym języku. Zamiast webserwisu można użyć dowolnej innej metody komunikacji, niekoniecznie po http

edytowany 1x, ostatnio: gajusz800
obscurity
  • Rejestracja:około 6 lat
  • Ostatnio:około 3 godziny
0

no i tak się robi, apki pisane w electronie czy uwp jako frontend a komunikują się z serwisem uruchomionym jako usługa i rpc. Dzięki temu nie mają żadnych ograniczeń w działaniu i sam "backend" może być napisany w dowolnym języku


"A car won't take your job, another horse driving a car will." - Horse influencer, 1910
G8
  • Rejestracja:około 3 lata
  • Ostatnio:około rok
  • Postów:2000
0

Wiem że tak się robi. Nie rozumiem jednak sensu pomysłu uniwersalnego języka, który byłby tłumaczony na inne języki. Gdyby coś takiego powstało nawet, to właśnie logikę byłoby łatwiej przetłumaczyć niz gui, bo wtedy wystarczyłoby przetłumaczyć samą składnię. W przypadku gui, na różnych platformach wymagana może być inna konfiguracja, inne zasoby jak np pliki graficzne i inne pomocnicze itd. Gdyby nawet się udało to zrobić, to te tłumaczenie musiałoby działać w kontekście platformy i frameworka, a nie tylko języka

AN
  • Rejestracja:prawie 19 lat
  • Ostatnio:około 2 godziny
0
loza_prowizoryczna napisał(a):
andrzejlisek napisał(a):

Pytanie jest takie: Czy istnieje "język programowania", w którym mogę napisać jakiś fragment programu, a najlepiej klasę obiektu, i ten kod byłby podstawą części obliczeniowej programu? To byłby taki uniwersalny transpilator (konwerter kodu źródłowego na kod źródłowy w innym języku). Jak chce mieć w C#, to robię transpilację do C#, Jak zapragnę mieć w Java, to nie muszę pisać ręcznie, tylko robię transpilację z tego uniwersalnego języka do Java i już mam 80% programu. Jak zapragnę mieć w JavaScript, to transpilacja i już jest.

Pomysł dobry i możliwe że realizowalny w praktyce ale ja bym zadał sobie inne pytanie: czy jeśli mamy uniwersalny język oprogramowania to czy potrafimy do niego stworzyć uniwersalny zestaw testów?

Jeżeli owe testy i asercje mają dotyczyć tylko logiki obliczeniowej, to one mogłyby być zaimplementowane również w tym uniwersalnym języku, bądź w jednym z języków docelowych. Jeżeli testuje się jakiś algorytm obliczeniowy wraz z przypadkami brzegowymi, to nie ma żadnej różnicy, w jakim języku to będzie, działanie będzie identyczne. A jak testuje się GUI, to test musiałby być w każdym docelowym języku, bo i tak nie da się zrobić uniwersalnego języka do GUI.

AN
  • Rejestracja:prawie 19 lat
  • Ostatnio:około 2 godziny
0
Riddle napisał(a):
kelog napisał(a):

Dopiero pozostałe 10% to część "interfejsowa", czyli wytwarzanie GUI, odczytywanie zdarzeń z GUI, z bazy danych, połączenia sieciowe itp.

Na pewno? Mam wrażenie, że jest dokładnie odwrotnie. W moim odczuciu domena aplikacji i to, jaki problem rozwiązuje, to jest zdecydowanie mniejsza część kodu. Większość kodu to klej, który skleja tę logikę ze światem zewnętrznym.

Zależy od aplikacji.

Jeśli robisz CRUD'a, to faktycznie. Jeśli robisz jakeś wąskie narzędzie branżowe, to może być tak że domena aplikacji to jest 90%.

Przykładowy projekty
https://github.com/andrzejlisek/Cobra1 - emulator polskiego prymitywnego komputera "Cobra 1".
https://github.com/andrzejlisek/XorFile - program generujący pakiety plików (przewidywana mała liczba dużych plików w pakiecie) i generujący dwa pakiety redundatne, gdzie po zgubieniu dowolnych dwóch pakietów da się odtworzyć brakujące.
https://github.com/andrzejlisek/TextPaint - wielofunkcyjny program będący dość nietypowym edytorem tekstu, przeglądarką ANSI-art i terminalem Telnet/SSH.

W przypadku C++ korzystam z Qt, a w przypadku C# korzystam z WinForms i Avalonia. Wszystkie projekty są tak wymyślone, żeby było jak najmniej plików współpracujących z GUI. W razie czego, jak mi się odwidzi i będe chciał zastapić Qt WxWidgets, a WinForms zastąpić MAUI, to wystarczy przerobić te parę funkcji, czyli od początku zrobić formatki i dopisać zdarzenia GUI i tyle, cała reszta, czyli lwia część kodu zostaje bez zmian. Te programy to w mojej opinii raczej są "branżowe" niż zwykłe CRUDy.

edytowany 1x, ostatnio: andrzejlisek
AN
  • Rejestracja:prawie 19 lat
  • Ostatnio:około 2 godziny
0
gajusz800 napisał(a):

Wiem że tak się robi. Nie rozumiem jednak sensu pomysłu uniwersalnego języka, który byłby tłumaczony na inne języki. Gdyby coś takiego powstało nawet, to właśnie logikę byłoby łatwiej przetłumaczyć niz gui, bo wtedy wystarczyłoby przetłumaczyć samą składnię. W przypadku gui, na różnych platformach wymagana może być inna konfiguracja, inne zasoby jak np pliki graficzne i inne pomocnicze itd. Gdyby nawet się udało to zrobić, to te tłumaczenie musiałoby działać w kontekście platformy i frameworka, a nie tylko języka

Od początku podkreslam, że uniwersalny język do napisania całego programu i tak nie jest możliwy. Mi chodzi tylko o uniwersalny język do samej logiki obliczeniowej. Chce mieć apkę w C#+MAUI i w Java+JavaFX. Osobno robię tylko GUI i zdarzenia, a klasy zawierające kod niezależny od GUI robię w tym "uniwersalnym języku" i tylko kopiuję kod wytworzony przez narzędzie transpilujące. Nawet ręcznie pisząc, można "szablonowo" przerobić taką klasę z Java na C# i odwrotnie.

Nawet, taka rzecz, jak bitmapy, to co technologia to ma inne funkcje i inaczej wygląda malowanie na nich. Ale zawsze mozna ręcznie zrobić klasę będącą bitmapą, która ma takie same pola i metody w obu językach, a w sobie miałaby prywatne pole bitmapy typu właściwego dla danej technologii.

obscurity
  • Rejestracja:około 6 lat
  • Ostatnio:około 3 godziny
2

Dokładnie taki był zamysł wirtualnej maszyny javy (JVM) i środowiska uruchomieniowego "wspólnego języka" - CLR czyli Javy i .NET
Piszesz raz, a CLR / JVM zajmuje się przetłumaczeniem tego na kod maszynowy.

Dobrze rozumiem że chcesz stworzyć uniwersalny język żeby przenosić kod między dwoma uniwersalnymi językami?
Po co ci aplikacja w JavaFX skoro masz już w MAUI? Możesz przejść na np uno i wspierać jednym kodem iOS, Android, Windows UWP, MacOS, MacOS-Catalyst, Windows WPF, WinUI, WebAssembly i Linux GtK. Nie tylko logika aplikacji będzie wspólnym kodem ale część odpowiedzialna za GUI też.

andrzejlisek napisał(a):

Ale zawsze mozna ręcznie zrobić klasę będącą bitmapą, która ma takie same pola i metody w obu językach, a w sobie miałaby prywatne pole bitmapy typu właściwego dla danej technologii.

Właśnie to robi MAUI / Uno

andrzejlisek napisał(a):

Taki przykład z życia wzięty: https://github.com/andrzejlisek/TextPaint
To są tak naprawdę dwa takie same programy w C#, jeden dostosowany do .NET Framework, drugi dostosowany do .NET Core. Część "interfejsowa" to tylko kilka plików

Nie przeglądałem kodu ale nie tak się to robi. Po to powstał .NET Standard - wspólny interfejs między Core i Framework. Potem tylko targetujesz oba frameworki na raz i masz wyjściowe projekty ze wspólnej bazy kodu. Ewentualnie w kodzie czasem może być potrzebny jakiś #IF. Masz też polyfille - https://github.com/Sergio0694/PolySharp/


"A car won't take your job, another horse driving a car will." - Horse influencer, 1910
edytowany 2x, ostatnio: obscurity
G8
  • Rejestracja:około 3 lata
  • Ostatnio:około rok
  • Postów:2000
0
andrzejlisek napisał(a):
gajusz800 napisał(a):

Wiem że tak się robi. Nie rozumiem jednak sensu pomysłu uniwersalnego języka, który byłby tłumaczony na inne języki. Gdyby coś takiego powstało nawet, to właśnie logikę byłoby łatwiej przetłumaczyć niz gui, bo wtedy wystarczyłoby przetłumaczyć samą składnię. W przypadku gui, na różnych platformach wymagana może być inna konfiguracja, inne zasoby jak np pliki graficzne i inne pomocnicze itd. Gdyby nawet się udało to zrobić, to te tłumaczenie musiałoby działać w kontekście platformy i frameworka, a nie tylko języka

Od początku podkreslam, że uniwersalny język do napisania całego programu i tak nie jest możliwy. Mi chodzi tylko o uniwersalny język do samej logiki obliczeniowej. Chce mieć apkę w C#+MAUI i w Java+JavaFX. Osobno robię tylko GUI i zdarzenia, a klasy zawierające kod niezależny od GUI robię w tym "uniwersalnym języku" i tylko kopiuję kod wytworzony przez narzędzie transpilujące. Nawet ręcznie pisząc, można "szablonowo" przerobić taką klasę z Java na C# i odwrotnie.

Nawet, taka rzecz, jak bitmapy, to co technologia to ma inne funkcje i inaczej wygląda malowanie na nich. Ale zawsze mozna ręcznie zrobić klasę będącą bitmapą, która ma takie same pola i metody w obu językach, a w sobie miałaby prywatne pole bitmapy typu właściwego dla danej technologii.

Ale po co sobie utrudniać gdy są technologie, gdzie piszesz cały program raz i kompilujesz na każdą platformę ten sam kod, łącznie z GUI? Po co ci potrzebne C# i JavaFX? Potraktuj to jako uniwersalny język programowania, w którym napiszesz cały program.

Jak dotąd to wygląda na to, że walczysz z problemami, które sobie sam wymyśliłeś

edytowany 2x, ostatnio: gajusz800
loza_prowizoryczna
  • Rejestracja:ponad 2 lata
  • Ostatnio:około 9 godzin
  • Postów:1608
0
andrzejlisek napisał(a):

Jeżeli owe testy i asercje mają dotyczyć tylko logiki obliczeniowej, to one mogłyby być zaimplementowane również w tym uniwersalnym języku, bądź w jednym z języków docelowych. Jeżeli testuje się jakiś algorytm obliczeniowy wraz z przypadkami brzegowymi, to nie ma żadnej różnicy, w jakim języku to będzie, działanie będzie identyczne. A jak testuje się GUI, to test musiałby być w każdym docelowym języku, bo i tak nie da się zrobić uniwersalnego języka do GUI.

No ale jeśli uniwersalny język jest wewnętrznie sprzeczny to jak testy w nim napisane udowodnią że są wewnętrznie sprzeczne? To tautologia.


Przetrzyma wszystko
KamilAdam
  • Rejestracja:ponad 6 lat
  • Ostatnio:5 dni
  • Lokalizacja:Silesia/Marki
  • Postów:5505
1

Przypomnę tylko że Scala miała być takim językiem. Czyli kompilowanym zarówno do JVMa jak i do bytecodu .NET. I sprawa rozbiła się o odmienne działanie generyków. Przynajmniej oficjalnie.


Mama called me disappointment, Papa called me fat
Każdego eksperta można zastąpić backendowcem który ma się douczyć po godzinach. Tak zostałem ekspertem AI, Neo4j i Nest.js . Przez mianowanie
loza_prowizoryczna
  • Rejestracja:ponad 2 lata
  • Ostatnio:około 9 godzin
  • Postów:1608
0
KamilAdam napisał(a):

Przypomnę tylko że Scala miała być takim językiem. Czyli kompilowanym zarówno do JVMa jak i do bytecodu .NET. I sprawa rozbiła się o odmienne działanie generyków. Przynajmniej oficjalnie.

No widzisz, wychodzi na to że cechą uniwersalnego języka są niedopowiedzenia. Weź takie C - w cholerę undefined behaviour, różnic w zachowaniach stdlib na różnych archi a to chyba najbardziej uniwersalny język w użyciu.


Przetrzyma wszystko
jarekr000000
  • Rejestracja:ponad 8 lat
  • Ostatnio:około 8 godzin
  • Lokalizacja:U krasnoludów - pod górą
  • Postów:4707
1
KamilAdam napisał(a):

Przypomnę tylko że Scala miała być takim językiem. Czyli kompilowanym zarówno do JVMa jak i do bytecodu .NET. I sprawa rozbiła się o odmienne działanie generyków. Przynajmniej oficjalnie.

To zabawne. Bo scala native działa (bez szału, ale działa), a na x86 wsparcie dla generyków jest nawet gorsze niż w JVM :-)

Ale co do tematu to Scala jest całkiem wieloplatformowa:
a) jvm
b) scalajs - to normalna Scala i jeśli chodzi o język niczego jej nie brakuje (kompilowana do JS), całkiem zresztą się sprawdza (jako alternatywa dla TS)
c) scala native - działa, ale wyraźnie odstaje jakościowo od powyższych

Korzystałem ze Scali, żeby np. mieć te same API na front i na serwerze, takie same walidacje danych i nawet te same obliczenia (kalkulator ubezpieczeń).


jeden i pół terabajta powinno wystarczyć każdemu
edytowany 3x, ostatnio: jarekr000000
G8
Scala jest całkiem wieloplatformowa - no tak słabo, skoro brak wsparcia platform mobilnych
jarekr000000
@gajusz800: akurat działa i to na kilka sposobów. Imo najlepiej sie sprawdzi ionic lub reactnative poprzez scalajs.
KamilAdam
  • Rejestracja:ponad 6 lat
  • Ostatnio:5 dni
  • Lokalizacja:Silesia/Marki
  • Postów:5505
0
jarekr000000 napisał(a):
KamilAdam napisał(a):

Przypomnę tylko że Scala miała być takim językiem. Czyli kompilowanym zarówno do JVMa jak i do bytecodu .NET. I sprawa rozbiła się o odmienne działanie generyków. Przynajmniej oficjalnie.

To zabawne. Bo scala native działa (bez szału, ale działa), a na x86 wsparcie dla generyków jest nawet gorsze niż w JVM :-)

Tak. Błędem było to że chcieli użyć .netowe generyki. Trzeba było je olać i napisac własne od poczatku obok. Z drugiej strony nie wiem co na to M$ który zdaje się na poczatku sponorował projekt. Może taka propozycja padła i dlatego przestał sponsorować ?

jarekr000000 napisał(a):

Korzystałem ze Scali, żeby np. mieć te same API na front i na serwerze, takie same walidacje danych i nawet te same obliczenia (kalkulator ubezpieczeń).

Trafiłem na sytuację gdy domyślny toString był inny na ScalaNative :P A że użyłem tego w teście to albo test przechodził na JVM/JS, albo dla Native :D


Mama called me disappointment, Papa called me fat
Każdego eksperta można zastąpić backendowcem który ma się douczyć po godzinach. Tak zostałem ekspertem AI, Neo4j i Nest.js . Przez mianowanie
edytowany 1x, ostatnio: KamilAdam
mrpawel
  • Rejestracja:około 4 lata
  • Ostatnio:około 4 godziny
  • Postów:10
2

Z dawnych lat pamiętam https://haxe.org, znałem człowieka co się tego uczył w czasach Flasha i ActionScriptu. Ale czy to jest dobre to nie wiem, bo nie korzystałem.

Koziołek
Moderator
  • Rejestracja:prawie 18 lat
  • Ostatnio:około 2 miesiące
  • Lokalizacja:Stacktrace
  • Postów:6821
2

Dla najpopularniejszych języków takich jak C, Java, C#, Python możesz sobie wyrysować logikę w Enterprise Architect i wygenerować kod. Jakość jest „średnia”, ale o dziwo działa. Przy czym dużo zależy jak „głębokie” UMLe chcesz rysować. Jakieś 99% użytkowników kończy na wyrysowaniu zależności i zdefiniowaniu listy metod i własności. Wtedy dostajesz kod z pustymi ciałami, które trzeba wypełnić. Da się jednak wejść głębiej i rozrysować logikę działania poszczególnych metod. Wtedy wygenerowany zostanie bardzo paskudny kod.
Możesz wziąć Web Methods IS, w którym wyklikasz flow i maszyneria wygeneruje odpowiednie klasy. Przy czym tutaj jesteś ograniczony do standardowych komponentów, bo WMIS ma trochę inne zadania.

Przy czym takich narzędzi, które potrafią sobie poradzić z UMLem i przetłumaczyć go na taki czy inny język programowania jest trochę. Stety, niestety kod generowany będzie zawsze paskudnie wyglądać i będzie miał niską czytelność. To przekłada się na koszty związane z utrzymaniem takiego czegoś. A w przypadku błędnego działania trzeba szukać odpowiedzi, czy błąd jest gdzieś w metajęzyku, czy jednak w transpilatorze, a może głębiej w kompilatorze konkretnego języka.


Sięgam tam, gdzie wzrok nie sięga… a tam NullPointerException
obscurity
ciekawe jakby to wyglądało w połączeniu z AI
Koziołek
@obscurity: chyba nijak, ponieważ AI „dobrze” sprawdza się w momencie, gdy albo nie masz pojęcia jak daną rzecz ugryźć i wtedy podpowie rozwiązanie, albo jak chcesz maszynkę, która na podstawie przykładu wygeneruje 100 pól w builderze. Tutaj masz gotowe rozwiązanie, które zamodelowałeś w UML-u i chcesz z niego wygenerować kod. To co AI może zrobić, to próba optymalizacji twojego modelu.
obscurity
lub raczej próba optymalizacji wygenerowanego kodu, akurat chatgpt sobie nawet radzi ze zwiększaniem czytelności kodu
BK
BK
  • Rejestracja:ponad rok
  • Ostatnio:ponad rok
  • Postów:58
0

Kiedyś ktoś chciał stworzyć coś takiego jak uniwersalny język którym mieliby komunikować się wszyscy, a przynajmniej więdzkość ludzi na tej planecie. Ów język nazwali esperanto. Dziś mało kto pamięta o takim tworze. Dlaczego takowy nie ma sensu to można książki o tym pisać.

KamilAdam
  • Rejestracja:ponad 6 lat
  • Ostatnio:5 dni
  • Lokalizacja:Silesia/Marki
  • Postów:5505
0

Mi memoras

BTW teraz mamy de facto 5 czy 6 różnych esperanto Walczących o dominację na świecie. Angielski, hiszpański, rosyjśki, mandaryński, arabski klasyczny (?), i może francuski w paru dziwnych miejscach Afryki.

I podobnie z językami programowania. Na Tiobe 5 topowych języków zgarnia ponad połowe rankingu. Gdzie ranking jest ustalany według ilości informacji w wyszukiwarkach internetowych. Na PyPL wygląda to podobnie, z jeszcze większą dominacją Pythona.
Wniosek - trzeba by zrobić generator z typowanego Pythona żeby to miało szanse chwycić


Mama called me disappointment, Papa called me fat
Każdego eksperta można zastąpić backendowcem który ma się douczyć po godzinach. Tak zostałem ekspertem AI, Neo4j i Nest.js . Przez mianowanie
edytowany 1x, ostatnio: KamilAdam
Zobacz pozostałe 3 komentarze
loza_prowizoryczna
MIT na przedmiotach obowiązkowych uczą tylko Pythona - jeśli z drugiej strony wyborem miałby być R to znaczy że jest jakaś logika w tym wszechświecie.
KamilAdam
@loza_prowizoryczna: ja bym im kazał Perla się uczyć :P Bo jak Perla się nauczą to już wszystkiego się nauczą :D
GO
@loza_prowizoryczna: i jest, python jest ogólnego przeznaczenia więc od razu można też mikrokontrolery programować, jakiś web serwer stawić. Więc jest lepiej w takim przypadku.
GO
@KamilAdam: nadal się nie nauczą mechaniki kwantowej, niezależnie od chęci, nawet znajomość perla nie pomoże.
loza_prowizoryczna
@KamilAdam: Bo jak Perla się nauczą to już wszystkiego się nauczą - wątpię, w moim przypadku ogarnianie jak tako Qt/C++ i (na dokładkę R) pozwoliło wkupić się w współautorstwo publikacji w Nature :D Nie wiem jak teraz ale kultura IT w dziedzinach około medycznych leżała i kwiczała i chyba ci starsi stażem po prostu posiłkowali młodymi i naiwnymi studentami (jeśli takich udało im się znaleźć) do odwalania roboty z danymi za nich.
loza_prowizoryczna
  • Rejestracja:ponad 2 lata
  • Ostatnio:około 9 godzin
  • Postów:1608
0
BurgundowyKangur napisał(a):

Kiedyś ktoś chciał stworzyć coś takiego jak uniwersalny język którym mieliby komunikować się wszyscy, a przynajmniej więdzkość ludzi na tej planecie. Ów język nazwali esperanto. Dziś mało kto pamięta o takim tworze. Dlaczego takowy nie ma sensu to można książki o tym pisać.

To Chomsky jeszcze dycha?


Przetrzyma wszystko
Koziołek
Niestety, bo na starość bredzi o tym, że rossja dobra.
loza_prowizoryczna
To jeszcze nie tak źle, innemu od czarnych dziur się roiło że jeśli się nie przygotujemy to przegramy kolejną międzyplanetarną wojnę o wszystko.
BK
BK
  • Rejestracja:ponad rok
  • Ostatnio:ponad rok
  • Postów:58
0

Uniwersalizm to pewien koncept filozoficzny który od czasów pradawnych jest wdrażany w róznych dziedzinach życia. Właściwie nigdy i nigdzie się nie sprawdził. W naszej branży moda na języki uniwersalne, platformy low code / no code sięga lat 80 ubiegłego wieku. Temat wraca mniej albo bardziej co dekadę. Autorzy popełniają te same błędy co ich poprzednicy.

loza_prowizoryczna
Zgoda, ja też preferuję multiwerse.
Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)