aardappel / lobster

The Lobster Programming Language

Home Page:http://strlen.com/lobster

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Transpiling to C++ fails silently

jinyus opened this issue · comments

lobster --cpp related.lobster runs with no errors but doesn't output the cpp file.

Lobster programming language compiler/runtime (version 2023-11-07T19:22:59-08:00|ec32e23e)

OS: EndeavourOS Linux x86_64 
Kernel: 6.6.1-arch1-1

Here is the output when running with --debug:

lobster --debug --cpp related.lobster
subsystem: builtin
subsystem: compiler
subsystem: file
subsystem: flatbuffers
subsystem: parsedata
subsystem: matrix
lobster version 2023-11-07T19:22:59-08:00|ec32e23e
compiling...
DefaultLoadFile: modules/related.lobster
DefaultLoadFile: /home/dev/programs/lobster/modules/related.lobster
DefaultLoadFile: /home/dev/programs/lobster/dev/../share/Lobster/modules/related.lobster
LoadFileFromAny: modules/related.lobster file not found
DefaultLoadFile: related.lobster
DefaultLoadFile: modules/stdtype.lobster
DefaultLoadFile: /home/dev/programs/lobster/modules/stdtype.lobster
DefaultLoadFile: modules/std.lobster
DefaultLoadFile: /home/dev/programs/lobster/modules/std.lobster
DefaultLoadFile: modules/dictionary.lobster
DefaultLoadFile: /home/dev/programs/lobster/modules/dictionary.lobster
DefaultLoadFile: modules/json.lobster
DefaultLoadFile: /home/dev/programs/lobster/modules/json.lobster
DefaultLoadFile: /home/dev/programs/lobster/dev/../share/Lobster/modules/json.lobster
LoadFileFromAny: modules/json.lobster file not found
DefaultLoadFile: json.lobster
pre-specialization: __top_level_expression() { }
static dispatch: __top_level_expression()
cloning: __top_level_expression
specialization: __top_level_expression()
function start: __top_level_expression() { }
var: TOPN:int
static dispatch: main()
cloning: main
specialization: main()
function start: main() { }
var: json_content:string?
borrow -1: json_content in !=, 0 remain
static dispatch: JSON.parse<T>(json_string:string)->T
cloning: JSON.parse
arg: json_string:string
specialization: JSON.parse<[Post]>(json_string:string)->T
function start: JSON.parse<[Post]>(json_string:string)->T { }
borrow 1: json_content in JSON.parse, 2 remain
borrow -1: json_string in native call, 0 remain
var: flexbuffer:string
var: err:string?
borrow -1: err in ==, 0 remain
borrow -1: flexbuffer in native call, 0 remain
var: value:[Post]?
var: err2:string?
borrow -1: err2 in ==, 0 remain
borrow -1: value in !=, 0 remain
borrow -1: value in return, 0 remain
borrow -1: json_content in JSON.parse, 1 remain
function end JSON.parse<[Post]>(json_string:string)->[Post] returns [Post]
borrow -1: json_content in JSON.parse, 0 remain
var: posts:[Post]
var: start:float
static dispatch: dictionary<K,V>(size:int)
cloning: dictionary
arg: size:int
specialization: dictionary<string,[int]>(size:int)
function start: dictionary<string,[int]>(size:int) { }
pre-specialization: function65() { }
static dispatch: map(xs:A, fun:B)
cloning: map
arg: xs:int
arg: fun:function65()
specialization: map(xs:int, fun:function65())
function start: map(xs:int, fun:function65()) { }
lifetime adjust for constructor to 0/1
lifetime adjust for native call to 1/0
var: r:[]
var: x:int
var: i:int
cloning: function65
specialization: function65()
function start: function65() { }
function end function65()->nil returns nil
borrow -1: r in native call, 0 remain
borrow -1: r in return, 0 remain
function end map(xs:int, fun:function65()->nil)->[nil] returns [nil]
function end dictionary<string,[int]>(size:int)->dictionary<string, [int]> returns dictionary<string, [int]>
var: tag_map:dictionary<string, [int]>
var: post:Post
var: i:int
borrow -1: post in ., 0 remain
var: tag:string
static dispatch: get(this:dictionary<K, V>, key:K)->V?
cloning: get
arg: this:dictionary<string, [int]>
arg: key:string
specialization: get(this:dictionary<string, [int]>, key:string)->V?
function start: get(this:dictionary<string, [int]>, key:string)->V? { }
borrow 1: tag_map in get, 2 remain
borrow 1: tag in get, 2 remain
static dispatch: lookup(this:dictionary<K, V>, key:K)
cloning: lookup
arg: this:dictionary<string, [int]>
arg: key:string
specialization: lookup(this:dictionary<string, [int]>, key:string)
function start: lookup(this:dictionary<string, [int]>, key:string) { }
borrow -1: key in native call, 0 remain
borrow -1: this in ., 0 remain
borrow -1: this in native call, 0 remain
var: h:int
borrow -1: this in ., 0 remain
borrow -1: this in indexing operation, 0 remain
lifetime adjust for indexing operation to 1/0
var: c:chain<string, [int]>?
borrow -1: c in while, 0 remain
borrow -1: c in ., 0 remain
borrow -1: c in ==, 0 remain
borrow -1: key in ==, 0 remain
borrow -1: c in multiple return, 0 remain
lifetime adjust for multiple return to 1/0
borrow -1: c in =, 0 remain
borrow -1: c in ., 0 remain
borrow -1: c in ., 0 remain
lifetime adjust for . to 1/0
borrow -1: c in =, 0 remain
function end lookup(this:dictionary<string, [int]>, key:string)->chain<string, [int]>? returns chain<string, [int]>?
borrow -1: this in this, 0 remain
lifetime adjust for this to 1/0
borrow -1: key in key, 0 remain
lifetime adjust for key to 1/0
var: c:chain<string, [int]>?
borrow -1: c in ., 1 remain
borrow -1: c in and, 0 remain
borrow -1: c in or, 0 remain
lifetime adjust for or to 1/0
borrow -1: tag_map in get, 1 remain
borrow -1: tag in get, 1 remain
function end get(this:dictionary<string, [int]>, key:string)->[int]? returns [int]?
borrow -1: tag_map in get, 0 remain
borrow -1: tag in get, 0 remain
var: indexes:[int]?
borrow -1: indexes in not, 0 remain
static dispatch: set(this:dictionary<K, V>, key:K, value:V)
cloning: set
arg: this:dictionary<string, [int]>
arg: key:string
arg: value:[int]
specialization: set(this:dictionary<string, [int]>, key:string, value:[int])
function start: set(this:dictionary<string, [int]>, key:string, value:[int]) { }
borrow 1: tag_map in set, 2 remain
borrow 1: tag in set, 2 remain
static dispatch: lookup(this:dictionary<string, [int]>, key:string)->chain<string, [int]>?
cloning: lookup
arg: this:dictionary<string, [int]>
arg: key:string
specialization: lookup(this:dictionary<string, [int]>, key:string)->chain<string, [int]>?
function start: lookup(this:dictionary<string, [int]>, key:string)->chain<string, [int]>? { }
borrow -1: key in native call, 0 remain
borrow -1: this in ., 0 remain
borrow -1: this in native call, 0 remain
var: h:int
borrow -1: this in ., 0 remain
borrow -1: this in indexing operation, 0 remain
lifetime adjust for indexing operation to 1/0
var: c:chain<string, [int]>?
borrow -1: c in while, 0 remain
borrow -1: c in ., 0 remain
borrow -1: c in ==, 0 remain
borrow -1: key in ==, 0 remain
borrow -1: c in multiple return, 0 remain
lifetime adjust for multiple return to 1/0
borrow -1: c in =, 0 remain
borrow -1: c in ., 0 remain
borrow -1: c in ., 0 remain
lifetime adjust for . to 1/0
borrow -1: c in =, 0 remain
function end lookup(this:dictionary<string, [int]>, key:string)->(chain<string, [int]>?, int) returns (chain<string, [int]>?, int)
borrow -1: this in this, 0 remain
lifetime adjust for this to 1/0
borrow -1: key in key, 0 remain
lifetime adjust for key to 1/0
var: c:chain<string, [int]>?
var: h:int
borrow -1: c in if, 0 remain
borrow -1: c in ., 0 remain
borrow -1: c in =, 0 remain
borrow -1: value in value, 0 remain
lifetime adjust for value to 1/0
borrow -1: c in =, 0 remain
borrow -1: this in ., 0 remain
borrow -1: this in =, 0 remain
borrow -1: this in ., 0 remain
borrow -1: this in indexing operation, 0 remain
lifetime adjust for indexing operation to 1/0
borrow -1: key in key, 0 remain
lifetime adjust for key to 1/0
borrow -1: value in value, 0 remain
lifetime adjust for value to 1/0
borrow -1: tag_map in set, 1 remain
borrow -1: tag in set, 1 remain
function end set(this:dictionary<string, [int]>, key:string, value:[int]) returns void
borrow -1: tag_map in set, 0 remain
borrow -1: tag in set, 0 remain
borrow -1: indexes in native call, 0 remain
borrow -1: post in for, 0 remain
borrow -1: posts in for, 0 remain
borrow -1: posts in native call, 0 remain
var: posts_count:int
lifetime adjust for constructor to 0/1
lifetime adjust for native call to 1/0
var: all_related_posts:[RelatedPost]
var: post:Post
var: i:int
pre-specialization: function69() { }
static dispatch: map(xs:int, fun:function65()->chain<string, [int]>?)->[chain<string, [int]>?]
cloning: map
arg: xs:int
arg: fun:function69()
specialization: map(xs:int, fun:function69())->[chain<string, [int]>?]
function start: map(xs:int, fun:function69())->[chain<string, [int]>?] { }
lifetime adjust for constructor to 0/1
lifetime adjust for native call to 1/0
var: r:[]
var: x:int
var: i:int
cloning: function69
specialization: function69()
function start: function69() { }
function end function69()->int returns int
borrow -1: r in native call, 0 remain
borrow -1: r in return, 0 remain
function end map(xs:int, fun:function69()->int)->[int] returns [int]
var: tagged_post_count:[int]
borrow -1: post in ., 0 remain
var: tag:string
static dispatch: get(this:dictionary<string, [int]>, key:string)->[int]?
re-using: get(this:dictionary<string, [int]>, key:string)->[int]?
borrow -1: tag_map in get, 0 remain
borrow -1: tag in get, 0 remain
lifetime adjust for get to 0/1
var: index:int
borrow -1: tagged_post_count in indexing operation, 0 remain
borrow -1: post in for, 0 remain
borrow -1: tagged_post_count in indexing operation, 0 remain
pre-specialization: function70() { }
static dispatch: map(xs:int, fun:function69()->int)->[int]
cloning: map
arg: xs:int
arg: fun:function70()
specialization: map(xs:int, fun:function70())->[int]
function start: map(xs:int, fun:function70())->[int] { }
lifetime adjust for constructor to 0/1
lifetime adjust for native call to 1/0
var: r:[]
var: x:int
var: i:int
cloning: function70
specialization: function70()
function start: function70() { }
function end function70()->int returns int
borrow -1: r in native call, 0 remain
borrow -1: r in return, 0 remain
function end map(xs:int, fun:function70()->int)->[int] returns [int]
var: topn:[int]
var: min_tags:int
var: count:int
var: idx:int
var: upper_bound:int
borrow -1: topn in >, 0 remain
borrow -1: topn in indexing operation, 0 remain
borrow -1: topn in indexing operation, 0 remain
borrow -1: topn in indexing operation, 0 remain
borrow -1: topn in indexing operation, 0 remain
var: insert_pos:int
borrow -1: topn in indexing operation, 0 remain
borrow -1: topn in indexing operation, 0 remain
borrow -1: topn in indexing operation, 0 remain
borrow -1: tagged_post_count in for, 0 remain
pre-specialization: function71(j:A) { }
static dispatch: map(xs:int, fun:function70()->int)->[int]
cloning: map
arg: xs:int
arg: fun:function71(j:A)
specialization: map(xs:int, fun:function71(j:A))->[int]
function start: map(xs:int, fun:function71(j:A))->[int] { }
lifetime adjust for constructor to 0/1
lifetime adjust for native call to 1/0
var: r:[]
var: x:int
var: i:int
cloning: function71
arg: j:int
specialization: function71(j:int)
function start: function71(j:int) { }
borrow -1: topn in indexing operation, 0 remain
var: index:int
borrow -1: posts in indexing operation, 1 remain
lifetime adjust for indexing operation to 1/0
function end function71(j:int)->Post returns Post
borrow -1: r in native call, 0 remain
borrow -1: r in return, 0 remain
function end map(xs:int, fun:function71(j:int)->Post)->[Post] returns [Post]
var: top_posts:[Post]
borrow -1: post in ., 0 remain
borrow -1: post in ., 0 remain
lifetime adjust for . to 1/0
borrow -1: post in ., 0 remain
borrow -1: post in ., 0 remain
lifetime adjust for . to 1/0
borrow -1: top_posts in top_posts, 0 remain
lifetime adjust for top_posts to 1/0
borrow -1: all_related_posts in native call, 0 remain
borrow -1: posts in for, 0 remain
var: end:float
lifetime adjust for tostring to 0/1
lifetime adjust for + to 0/1
lifetime adjust for + to 0/1
static dispatch: JSON.encode(value:A)->string
cloning: JSON.encode
arg: value:[RelatedPost]
specialization: JSON.encode(value:[RelatedPost])->string
function start: JSON.encode(value:[RelatedPost])->string { }
borrow 1: all_related_posts in JSON.encode, 2 remain
borrow -1: value in native call, 0 remain
var: flexbuffer:string
borrow -1: flexbuffer in native call, 0 remain
var: json_string:string?
var: err2:string?
borrow -1: err2 in ==, 0 remain
borrow -1: json_string in !=, 0 remain
borrow -1: json_string in return, 0 remain
borrow -1: all_related_posts in JSON.encode, 1 remain
function end JSON.encode(value:[RelatedPost])->string returns string
borrow -1: all_related_posts in JSON.encode, 0 remain
var: related_json:string
borrow -1: related_json in native call, 0 remain
function end main() returns void
function end __top_level_expression() returns void
SF count: orig: 72, cloned: 4
Node count: orig: 469, cloned: 98
Most clones: map/2 (std.lobster:3) -> 61 nodes accross 3 extra clones
Most clones: lookup/2 (dictionary.lobster:24) -> 37 nodes accross 1 extra clones
optimizer: 14 optimizations
time to compile (seconds): 0.001688

As the docs state, it is currently a bit clumsily implemented: https://aardappel.github.io/lobster/implementation.html currently, you MUST compile it from the root of the repo such that it lands in a place where the build files will automaticallly pick it up.

That process will improve at some point I hope :)

Hitting the wall again. I don't have much experience compiling complex C++ projects.

cd dev/compiled_lobster/src

g++ compiled_lobster.cpp -o related -I '../../include' -I '../../src' -I '../../external/SDL/include'



error output:

/usr/bin/ld: /tmp/ccA4QhbG.o: in function `lobster::PushDerefIdxVector1(lobster::VM&, lobster::Value*&, long)':
compiled_lobster.cpp:(.text+0x2d1): undefined reference to `lobster::VM::VMAssert(char const*)'
/usr/bin/ld: compiled_lobster.cpp:(.text+0x311): undefined reference to `lobster::VM::IDXErr(long, long, lobster::RefObj const*)'
/usr/bin/ld: /tmp/ccA4QhbG.o: in function `lobster::GetFieldLVal(lobster::VM&, lobster::Value*&, long)':
compiled_lobster.cpp:(.text+0x3fb): undefined reference to `lobster::VM::IDXErr(long, long, lobster::RefObj const*)'
/usr/bin/ld: /tmp/ccA4QhbG.o: in function `lobster::GetVecLVal(lobster::VM&, lobster::Value*&, long)':
compiled_lobster.cpp:(.text+0x4aa): undefined reference to `lobster::VM::IDXErr(long, long, lobster::RefObj const*)'
/usr/bin/ld: /tmp/ccA4QhbG.o: in function `lobster::U_PUSHSTR(lobster::VM&, lobster::Value*, int)':
compiled_lobster.cpp:(.text+0x663): undefined reference to `lobster::VM::NewString(std::basic_string_view<char, std::char_traits<char> >)'
/usr/bin/ld: /tmp/ccA4QhbG.o: in function `lobster::U_EXIT(lobster::VM&, lobster::Value*, int)':
compiled_lobster.cpp:(.text+0x77b): undefined reference to `lobster::VM::EndEval(lobster::Value*&, lobster::Value const&, lobster::TypeInfo const&)'
/usr/bin/ld: compiled_lobster.cpp:(.text+0x7b5): undefined reference to `lobster::VM::EndEval(lobster::Value*&, lobster::Value const&, lobster::TypeInfo const&)'
/usr/bin/ld: /tmp/ccA4QhbG.o: in function `lobster::U_BCALLRET0(lobster::VM&, lobster::Value*, int, int)':
compiled_lobster.cpp:(.text+0xcb6): undefined reference to `lobster::VM::BCallRetCheck(lobster::Value*, lobster::NativeFun const*)'
/usr/bin/ld: /tmp/ccA4QhbG.o: in function `lobster::U_BCALLRET1(lobster::VM&, lobster::Value*, int, int)':
compiled_lobster.cpp:(.text+0xd7f): undefined reference to `lobster::VM::BCallRetCheck(lobster::Value*, lobster::NativeFun const*)'
/usr/bin/ld: /tmp/ccA4QhbG.o: in function `lobster::U_BCALLRET2(lobster::VM&, lobster::Value*, int, int)':
compiled_lobster.cpp:(.text+0xe5d): undefined reference to `lobster::VM::BCallRetCheck(lobster::Value*, lobster::NativeFun const*)'
/usr/bin/ld: /tmp/ccA4QhbG.o: in function `lobster::U_BCALLRET3(lobster::VM&, lobster::Value*, int, int)':
compiled_lobster.cpp:(.text+0xf56): undefined reference to `lobster::VM::BCallRetCheck(lobster::Value*, lobster::NativeFun const*)'
/usr/bin/ld: /tmp/ccA4QhbG.o: in function `lobster::U_BCALLRET4(lobster::VM&, lobster::Value*, int, int)':
compiled_lobster.cpp:(.text+0x1079): undefined reference to `lobster::VM::BCallRetCheck(lobster::Value*, lobster::NativeFun const*)'
/usr/bin/ld: /tmp/ccA4QhbG.o: in function `lobster::U_ASSERTR(lobster::VM&, lobster::Value*, int, int, int)':
compiled_lobster.cpp:(.text+0x114f): undefined reference to `lobster::VM::Error(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >)'
/usr/bin/ld: /tmp/ccA4QhbG.o: in function `lobster::U_NEWVEC(lobster::VM&, lobster::Value*, int, int)':
compiled_lobster.cpp:(.text+0x1232): undefined reference to `lobster::VM::NewVec(long, long, lobster::type_elem_t)'
/usr/bin/ld: /tmp/ccA4QhbG.o: in function `lobster::U_NEWOBJECT(lobster::VM&, lobster::Value*, int)':
compiled_lobster.cpp:(.text+0x1330): undefined reference to `lobster::VM::NewObject(long, lobster::type_elem_t)'
/usr/bin/ld: /tmp/ccA4QhbG.o: in function `lobster::U_SADDN(lobster::VM&, lobster::Value*, int)':
compiled_lobster.cpp:(.text+0x1464): undefined reference to `lobster::VM::NewString(long)'
/usr/bin/ld: /tmp/ccA4QhbG.o: in function `lobster::U_PUSHFLD(lobster::VM&, lobster::Value*, int)':
compiled_lobster.cpp:(.text+0x1fb9): undefined reference to `lobster::VM::VMAssert(char const*)'
/usr/bin/ld: /tmp/ccA4QhbG.o: in function `lobster::U_ABORT(lobster::VM&, lobster::Value*)':
compiled_lobster.cpp:(.text+0x21ca): undefined reference to `lobster::VM::SeriousError(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >)'
/usr/bin/ld: /tmp/ccA4QhbG.o: in function `main':
compiled_lobster.cpp:(.text+0x8174): undefined reference to `RunCompiledCodeMain'
/usr/bin/ld: /tmp/ccA4QhbG.o: in function `lobster::RefObj::Dec(lobster::VM&)':
compiled_lobster.cpp:(.text._ZN7lobster6RefObj3DecERNS_2VME[_ZN7lobster6RefObj3DecERNS_2VME]+0x30): undefined reference to `lobster::RefObj::DECSTAT(lobster::VM&)'
/usr/bin/ld: compiled_lobster.cpp:(.text._ZN7lobster6RefObj3DecERNS_2VME[_ZN7lobster6RefObj3DecERNS_2VME]+0x4e): undefined reference to `lobster::RefObj::DECDELETE(lobster::VM&)'
/usr/bin/ld: /tmp/ccA4QhbG.o: in function `lobster::VM::DivErr(long)':
compiled_lobster.cpp:(.text._ZN7lobster2VM6DivErrEl[_ZN7lobster2VM6DivErrEl]+0x63): undefined reference to `lobster::VM::Error(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >)'
/usr/bin/ld: /tmp/ccA4QhbG.o: in function `lobster::VM::ToString(lobster::Value const&, lobster::TypeInfo const&)':
compiled_lobster.cpp:(.text._ZN7lobster2VM8ToStringERKNS_5ValueERKNS_8TypeInfoE[_ZN7lobster2VM8ToStringERKNS_5ValueERKNS_8TypeInfoE]+0x65): undefined reference to `lobster::Value::ToString(lobster::VM&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&, lobster::TypeInfo const&, lobster::PrintPrefs&) const'
/usr/bin/ld: compiled_lobster.cpp:(.text._ZN7lobster2VM8ToStringERKNS_5ValueERKNS_8TypeInfoE[_ZN7lobster2VM8ToStringERKNS_5ValueERKNS_8TypeInfoE]+0x8c): undefined reference to `lobster::VM::NewString(std::basic_string_view<char, std::char_traits<char> >)'
collect2: error: ld returned 1 exit status

Again, please just follow the instructions exactly. If you build thru CMake, all the required things will be linked in. Your command-line does not link anything.

Oh, I thought the cmake instructions were just for building the compiler. Works now. 6.5x faster

Woah, I guess this particular benchmark was amendable to optimization..