Alternatywą jest zbudowanie dialektu w warstwie C++ za pomocą narzędzia do transformacji programów.
DMS Software Reengineering Toolkit to silnik do transformacji programów, o sile przemysłowej C++ Front End. DMS, używając tego interfejsu, może parsować pełne C++ (nawet ma preprocesor i może zachować większość nieprecyzyjnych dyrektyw preprocesora), automatycznie buduje AST i kompletuje tablice symboli.
Przedni koniec C++ jest dostępny w źródle, z gramatyką wyprowadzoną bezpośrednio ze standardu. Jest technicznie proste dodawanie nowych reguł gramatycznych, w tym tych, które pozwalałyby na składnię ":" jako indeksów tablicowych, jak to opisałeś, i jak implementował Fortran90 +. Następnie można użyć możliwości transformacji programu DMS, aby przekształcić "nową" składnię w "waniliową" C++ do użycia w konwencjonalnych kompilatorach C++. (Ten schemat jest uogólnieniem modelu programowania intencjonalnego "dodaj pojęcia DSL do twojego języka").
W rzeczywistości przeprowadziliśmy koncepcję demonstracji "Vector C++" z wykorzystaniem tego podejścia.
Dodaliśmy wielowymiarowy wektorowy typ danych, którego semantyką pamięci są tylko te elementy tablicy, które są odrębne. To jest inne niż model sekwencyjnych lokalizacji w C++, ale potrzebujesz tego innego semantycznego, jeśli chcesz, aby kompilator/transformator miał swobodę rozmieszczania pamięci arbitralnie, i to jest fundamentalne, jeśli chcesz używać instrukcji maszynowych SIMD i/lub wydajnych dostępów do pamięci podręcznej. wzdłuż różnych osi.
Dodaliśmy dostęp w skalarach i podstrach w stylu Fortran-90, dodaliśmy praktycznie wszystkie operacje przetwarzania tablic F90, dodano znaczną część operacji macierzy APL, wszystko przez dostosowanie gramatyki DMS C++.
Wreszcie, stworzyliśmy dwóch tłumaczy używających możliwości transformacji DMS: jeden mapował znaczną część tego (pamiętajcie, to było demo koncepcji) do C++ w wanilii, abyście mogli skompilować i uruchomić aplikacje Vector C++ na typowej stacji roboczej, a inne odwzorowanie C++ na dialekt PowerPC C++ z rozszerzeniami instrukcji SIMD, i wygenerowaliśmy kod SIMD, który uważaliśmy za całkiem rozsądny. Zajęło nam to około 6 osobo-miesięcy, żeby to wszystko zrobić.
Klient za to ostatecznie wykupiony (jego model biznesowy nie obejmował obsługi niestandardowego kompilatora pomimo jego ciężkiej potrzeby operacji opartych na równoległych/opartych na SIMD), i to marnieje na półce. Zdecydowaliśmy się nie realizować tego na szerszym rynku, ponieważ nie jest jasne, czym tak naprawdę jest rynek. Jestem prawie pewien, że istnieją organizacje, dla których byłoby to cenne.
Punkt jest, naprawdę możesz to zrobić. Jest to prawie niemożliwe przy użyciu metod ad hoc. Jest to technicznie dość proste z wystarczająco silnym systemem transformacji programu. To nie jest spacer w parku.
to jest pomysł. Zasadniczo mogę zastąpić ':' innym binarnym globalnym operatorem, który generuje zasięg i używa ',' do dodania zakresu. Zdaję sobie sprawę z potencjalnych problemów, chcę go wypróbować, jakiegoś szybkiego narzędzia do tworzenia aplikacji. – Anycorn
Powodzenia. Uważaj na awarię w '?:' I etykietach dla specyfikacji dostępu, skrzynek przełączników i (jeśli ich używasz). Chciałbym polecić użycie czegoś takiego jak '..', ponieważ łatwiej byłoby parsować. –